diff options
Diffstat (limited to 'shared-module/displayio/TileGrid.c')
| -rw-r--r-- | shared-module/displayio/TileGrid.c | 54 |
1 files changed, 43 insertions, 11 deletions
diff --git a/shared-module/displayio/TileGrid.c b/shared-module/displayio/TileGrid.c index f34d2fc52..45b05110f 100644 --- a/shared-module/displayio/TileGrid.c +++ b/shared-module/displayio/TileGrid.c @@ -67,14 +67,30 @@ void common_hal_displayio_tilegrid_construct(displayio_tilegrid_t *self, mp_obj_ self->bitmap = bitmap; self->pixel_shader = pixel_shader; self->in_group = false; - self->first_draw = true; + self->hidden = false; + self->hidden_by_parent = false; + self->previous_area.x1 = 0xffff; + self->previous_area.x2 = self->previous_area.x1; self->flip_x = false; self->flip_y = false; self->transpose_xy = false; } + +bool common_hal_displayio_tilegrid_get_hidden(displayio_tilegrid_t* self) { + return self->hidden; +} + +void common_hal_displayio_tilegrid_set_hidden(displayio_tilegrid_t* self, bool hidden) { + self->hidden = hidden; +} + +void displayio_tilegrid_set_hidden_by_parent(displayio_tilegrid_t *self, bool hidden) { + self->hidden_by_parent = hidden; +} + bool displayio_tilegrid_get_previous_area(displayio_tilegrid_t *self, displayio_area_t* area) { - if (self->first_draw) { + if (self->previous_area.x1 == self->previous_area.x2) { return false; } displayio_area_copy(&self->previous_area, area); @@ -138,12 +154,10 @@ void displayio_tilegrid_update_transform(displayio_tilegrid_t *self, self->in_group = absolute_transform != NULL; self->absolute_transform = absolute_transform; if (absolute_transform != NULL) { - self->moved = !self->first_draw; + self->moved = true; _update_current_x(self); _update_current_y(self); - } else { - self->first_draw = true; } } @@ -155,7 +169,7 @@ void common_hal_displayio_tilegrid_set_x(displayio_tilegrid_t *self, mp_int_t x) return; } - self->moved = !self->first_draw; + self->moved = true; self->x = x; if (self->absolute_transform != NULL) { @@ -170,7 +184,7 @@ void common_hal_displayio_tilegrid_set_y(displayio_tilegrid_t *self, mp_int_t y) if (self->y == y) { return; } - self->moved = !self->first_draw; + self->moved = true; self->y = y; if (self->absolute_transform != NULL) { _update_current_y(self); @@ -306,6 +320,11 @@ bool displayio_tilegrid_fill_area(displayio_tilegrid_t *self, const _displayio_c return false; } + bool hidden = self->hidden || self->hidden_by_parent; + if (hidden) { + return false; + } + displayio_area_t overlap; if (!displayio_area_compute_overlap(area, &self->current_area, &overlap)) { return false; @@ -455,14 +474,17 @@ bool displayio_tilegrid_fill_area(displayio_tilegrid_t *self, const _displayio_c } void displayio_tilegrid_finish_refresh(displayio_tilegrid_t *self) { - if (self->moved || self->first_draw) { + bool first_draw = self->previous_area.x1 == self->previous_area.x2; + bool hidden = self->hidden || self->hidden_by_parent; + if (!first_draw && hidden) { + self->previous_area.x2 = self->previous_area.x1; + } else if (self->moved || first_draw) { displayio_area_copy(&self->current_area, &self->previous_area); } self->moved = false; self->full_change = false; self->partial_change = false; - self->first_draw = false; if (MP_OBJ_IS_TYPE(self->pixel_shader, &displayio_palette_type)) { displayio_palette_finish_refresh(self->pixel_shader); } else if (MP_OBJ_IS_TYPE(self->pixel_shader, &displayio_colorconverter_type)) { @@ -481,7 +503,17 @@ void displayio_tilegrid_finish_refresh(displayio_tilegrid_t *self) { } displayio_area_t* displayio_tilegrid_get_refresh_areas(displayio_tilegrid_t *self, displayio_area_t* tail) { - if (self->moved && !self->first_draw) { + bool first_draw = self->previous_area.x1 == self->previous_area.x2; + bool hidden = self->hidden || self->hidden_by_parent; + // Check hidden first because it trumps all other changes. + if (hidden) { + if (!first_draw) { + self->previous_area.next = tail; + return &self->previous_area; + } else { + return tail; + } + } else if (self->moved && !first_draw) { displayio_area_union(&self->previous_area, &self->current_area, &self->dirty_area); if (displayio_area_size(&self->dirty_area) <= 2U * self->pixel_width * self->pixel_height) { self->dirty_area.next = tail; @@ -512,7 +544,7 @@ displayio_area_t* displayio_tilegrid_get_refresh_areas(displayio_tilegrid_t *sel displayio_palette_needs_refresh(self->pixel_shader)) || (MP_OBJ_IS_TYPE(self->pixel_shader, &displayio_colorconverter_type) && displayio_colorconverter_needs_refresh(self->pixel_shader)); - if (self->full_change || self->first_draw) { + if (self->full_change || first_draw) { self->current_area.next = tail; return &self->current_area; } |
