zhaocaimao_lcd_final
This commit is contained in:
37
main/write.c
37
main/write.c
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user