zhaocaimao_lcd_final

This commit is contained in:
2026-06-26 14:58:59 +08:00
parent 537033cbbd
commit 23bef680ed
7 changed files with 11976 additions and 19992 deletions

View File

@@ -6,6 +6,7 @@
typedef struct {
uint16_t icon_id;
uint16_t frame_index;
uint16_t x;
uint16_t y;
} icon_draw_t;
@@ -29,7 +30,7 @@ static const icon_image_source_t *write_get_icon(uint16_t icon_id)
#endif
}
static const eye_image_frame_t *write_get_frame(uint16_t image_id)
static const eye_image_frame_t *write_get_frame(uint16_t image_id, uint16_t frame_index)
{
if (image_id >= EYE_IMAGE_SOURCE_COUNT) {
return 0;
@@ -40,8 +41,11 @@ static const eye_image_frame_t *write_get_frame(uint16_t image_id)
if (source->frame_count == 0) {
return 0;
}
if (frame_index >= source->frame_count) {
return 0;
}
return &source->frames[0];
return &source->frames[frame_index];
}
static void lcd_overlay_logic(uint16_t *pixel_buffer, uint16_t row_start, uint16_t row_count, const icon_draw_t *icons, uint32_t icon_count)
@@ -53,14 +57,14 @@ static void lcd_overlay_logic(uint16_t *pixel_buffer, uint16_t row_start, uint16
if (icon == 0 || icon->width == 0 || icon->height == 0) {
continue;
}
if (icon->frame_count == 0) {
if (icon->frame_count == 0 || draw->frame_index >= icon->frame_count) {
continue;
}
if (draw->x >= LCD_WIDTH || draw->y >= LCD_HEIGHT) {
continue;
}
const eye_image_frame_t *frame = &icon->frames[0];
const eye_image_frame_t *frame = &icon->frames[draw->frame_index];
if (frame->runs == 0 || frame->run_count == 0) {
continue;
@@ -176,10 +180,29 @@ static void lcd_draw_image(const rle_structure_t *runs, uint32_t run_count, cons
}
}
void lcd_play_image(uint16_t image_id, uint16_t icon_id, uint16_t x, uint16_t y, uint32_t delay_ms)
void clear(void)
{
const icon_draw_t icon = {icon_id, x, y};
const eye_image_frame_t *frame = write_get_frame(image_id);
enum { ROWS_PER_TRANSFER = 8 };
enum { PIXELS_PER_TRANSFER = LCD_WIDTH * ROWS_PER_TRANSFER };
static uint16_t pixel_buffer[PIXELS_PER_TRANSFER];
lcd_set_window(0, 0, LCD_WIDTH - 1, LCD_HEIGHT - 1);
for (uint16_t row_start = 0; row_start < LCD_HEIGHT; row_start += ROWS_PER_TRANSFER) {
uint16_t row_count = LCD_HEIGHT - row_start;
if (row_count > ROWS_PER_TRANSFER) {
row_count = ROWS_PER_TRANSFER;
}
lcd_write_pixels(pixel_buffer, (uint32_t)LCD_WIDTH * row_count * 2);
}
}
void lcd_play_image(uint16_t image_id, uint16_t frame_index, uint16_t icon_id, uint16_t icon_frame_index, uint16_t x, uint16_t y, uint32_t delay_ms)
{
const icon_draw_t icon = {icon_id, icon_frame_index, x, y};
const eye_image_frame_t *frame = write_get_frame(image_id, frame_index);
const icon_draw_t *icons = icon_id == LCD_NO_ICON ? 0 : &icon;
uint32_t icon_count = icon_id == LCD_NO_ICON ? 0 : 1;