@@ -67,14 +67,30 @@ void common_hal_displayio_tilegrid_construct(displayio_tilegrid_t *self, mp_obj_
6767 self -> bitmap = bitmap ;
6868 self -> pixel_shader = pixel_shader ;
6969 self -> in_group = false;
70- self -> first_draw = true;
70+ self -> hidden = false;
71+ self -> hidden_by_parent = false;
72+ self -> previous_area .x1 = 0xffff ;
73+ self -> previous_area .x2 = self -> previous_area .x1 ;
7174 self -> flip_x = false;
7275 self -> flip_y = false;
7376 self -> transpose_xy = false;
7477}
7578
79+
80+ bool common_hal_displayio_tilegrid_get_hidden (displayio_tilegrid_t * self ) {
81+ return self -> hidden ;
82+ }
83+
84+ void common_hal_displayio_tilegrid_set_hidden (displayio_tilegrid_t * self , bool hidden ) {
85+ self -> hidden = hidden ;
86+ }
87+
88+ void displayio_tilegrid_set_hidden_by_parent (displayio_tilegrid_t * self , bool hidden ) {
89+ self -> hidden_by_parent = hidden ;
90+ }
91+
7692bool displayio_tilegrid_get_previous_area (displayio_tilegrid_t * self , displayio_area_t * area ) {
77- if (self -> first_draw ) {
93+ if (self -> previous_area . x1 == self -> previous_area . x2 ) {
7894 return false;
7995 }
8096 displayio_area_copy (& self -> previous_area , area );
@@ -138,12 +154,10 @@ void displayio_tilegrid_update_transform(displayio_tilegrid_t *self,
138154 self -> in_group = absolute_transform != NULL ;
139155 self -> absolute_transform = absolute_transform ;
140156 if (absolute_transform != NULL ) {
141- self -> moved = ! self -> first_draw ;
157+ self -> moved = true ;
142158
143159 _update_current_x (self );
144160 _update_current_y (self );
145- } else {
146- self -> first_draw = true;
147161 }
148162}
149163
@@ -155,7 +169,7 @@ void common_hal_displayio_tilegrid_set_x(displayio_tilegrid_t *self, mp_int_t x)
155169 return ;
156170 }
157171
158- self -> moved = ! self -> first_draw ;
172+ self -> moved = true ;
159173
160174 self -> x = x ;
161175 if (self -> absolute_transform != NULL ) {
@@ -170,7 +184,7 @@ void common_hal_displayio_tilegrid_set_y(displayio_tilegrid_t *self, mp_int_t y)
170184 if (self -> y == y ) {
171185 return ;
172186 }
173- self -> moved = ! self -> first_draw ;
187+ self -> moved = true ;
174188 self -> y = y ;
175189 if (self -> absolute_transform != NULL ) {
176190 _update_current_y (self );
@@ -306,6 +320,11 @@ bool displayio_tilegrid_fill_area(displayio_tilegrid_t *self, const _displayio_c
306320 return false;
307321 }
308322
323+ bool hidden = self -> hidden || self -> hidden_by_parent ;
324+ if (hidden ) {
325+ return false;
326+ }
327+
309328 displayio_area_t overlap ;
310329 if (!displayio_area_compute_overlap (area , & self -> current_area , & overlap )) {
311330 return false;
@@ -455,14 +474,17 @@ bool displayio_tilegrid_fill_area(displayio_tilegrid_t *self, const _displayio_c
455474}
456475
457476void displayio_tilegrid_finish_refresh (displayio_tilegrid_t * self ) {
458- if (self -> moved || self -> first_draw ) {
477+ bool first_draw = self -> previous_area .x1 == self -> previous_area .x2 ;
478+ bool hidden = self -> hidden || self -> hidden_by_parent ;
479+ if (!first_draw && hidden ) {
480+ self -> previous_area .x2 = self -> previous_area .x1 ;
481+ } else if (self -> moved || first_draw ) {
459482 displayio_area_copy (& self -> current_area , & self -> previous_area );
460483 }
461484
462485 self -> moved = false;
463486 self -> full_change = false;
464487 self -> partial_change = false;
465- self -> first_draw = false;
466488 if (MP_OBJ_IS_TYPE (self -> pixel_shader , & displayio_palette_type )) {
467489 displayio_palette_finish_refresh (self -> pixel_shader );
468490 } 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) {
481503}
482504
483505displayio_area_t * displayio_tilegrid_get_refresh_areas (displayio_tilegrid_t * self , displayio_area_t * tail ) {
484- if (self -> moved && !self -> first_draw ) {
506+ bool first_draw = self -> previous_area .x1 == self -> previous_area .x2 ;
507+ bool hidden = self -> hidden || self -> hidden_by_parent ;
508+ // Check hidden first because it trumps all other changes.
509+ if (hidden ) {
510+ if (!first_draw ) {
511+ self -> previous_area .next = tail ;
512+ return & self -> previous_area ;
513+ } else {
514+ return tail ;
515+ }
516+ } else if (self -> moved && !first_draw ) {
485517 displayio_area_union (& self -> previous_area , & self -> current_area , & self -> dirty_area );
486518 if (displayio_area_size (& self -> dirty_area ) <= 2U * self -> pixel_width * self -> pixel_height ) {
487519 self -> dirty_area .next = tail ;
@@ -512,7 +544,7 @@ displayio_area_t* displayio_tilegrid_get_refresh_areas(displayio_tilegrid_t *sel
512544 displayio_palette_needs_refresh (self -> pixel_shader )) ||
513545 (MP_OBJ_IS_TYPE (self -> pixel_shader , & displayio_colorconverter_type ) &&
514546 displayio_colorconverter_needs_refresh (self -> pixel_shader ));
515- if (self -> full_change || self -> first_draw ) {
547+ if (self -> full_change || first_draw ) {
516548 self -> current_area .next = tail ;
517549 return & self -> current_area ;
518550 }
0 commit comments