Merge pull request #6363 from FoamyGuy/hidden_vectorio

Hidden vectorio
This commit is contained in:
Scott Shawcroft 2022-05-18 09:00:13 -07:00 committed by GitHub
commit f975c97c63
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 45 additions and 24 deletions

View File

@ -78,6 +78,7 @@ vectorio_draw_protocol_impl_t vectorio_vector_shape_draw_protocol_impl = {
.draw_update_transform = (draw_update_transform_fun)vectorio_vector_shape_update_transform, .draw_update_transform = (draw_update_transform_fun)vectorio_vector_shape_update_transform,
.draw_finish_refresh = (draw_finish_refresh_fun)vectorio_vector_shape_finish_refresh, .draw_finish_refresh = (draw_finish_refresh_fun)vectorio_vector_shape_finish_refresh,
.draw_get_refresh_areas = (draw_get_refresh_areas_fun)vectorio_vector_shape_get_refresh_areas, .draw_get_refresh_areas = (draw_get_refresh_areas_fun)vectorio_vector_shape_get_refresh_areas,
.draw_set_dirty = (draw_set_dirty_fun)common_hal_vectorio_vector_shape_set_dirty,
}; };
// Stub checker does not approve of these shared properties. // Stub checker does not approve of these shared properties.

View File

@ -17,6 +17,7 @@ typedef bool (*draw_fill_area_fun)(mp_obj_t draw_protocol_self, const _displayio
typedef bool (*draw_get_dirty_area_fun)(mp_obj_t draw_protocol_self, displayio_area_t *current_dirty_area); typedef bool (*draw_get_dirty_area_fun)(mp_obj_t draw_protocol_self, displayio_area_t *current_dirty_area);
typedef void (*draw_update_transform_fun)(mp_obj_t draw_protocol_self, displayio_buffer_transform_t *group_transform); typedef void (*draw_update_transform_fun)(mp_obj_t draw_protocol_self, displayio_buffer_transform_t *group_transform);
typedef void (*draw_finish_refresh_fun)(mp_obj_t draw_protocol_self); typedef void (*draw_finish_refresh_fun)(mp_obj_t draw_protocol_self);
typedef void (*draw_set_dirty_fun)(mp_obj_t draw_protocol_self);
typedef displayio_area_t *(*draw_get_refresh_areas_fun)(mp_obj_t draw_protocol_self, displayio_area_t *tail); typedef displayio_area_t *(*draw_get_refresh_areas_fun)(mp_obj_t draw_protocol_self, displayio_area_t *tail);
typedef struct _vectorio_draw_protocol_impl_t { typedef struct _vectorio_draw_protocol_impl_t {
@ -25,6 +26,7 @@ typedef struct _vectorio_draw_protocol_impl_t {
draw_update_transform_fun draw_update_transform; draw_update_transform_fun draw_update_transform;
draw_finish_refresh_fun draw_finish_refresh; draw_finish_refresh_fun draw_finish_refresh;
draw_get_refresh_areas_fun draw_get_refresh_areas; draw_get_refresh_areas_fun draw_get_refresh_areas;
draw_set_dirty_fun draw_set_dirty;
} vectorio_draw_protocol_impl_t; } vectorio_draw_protocol_impl_t;
// Draw protocol // Draw protocol

View File

@ -66,6 +66,14 @@ void common_hal_displayio_group_set_hidden(displayio_group_t *self, bool hidden)
displayio_group_set_hidden_by_parent(layer, hidden); displayio_group_set_hidden_by_parent(layer, hidden);
continue; continue;
} }
#if CIRCUITPY_VECTORIO
const vectorio_draw_protocol_t *draw_protocol = mp_proto_get(MP_QSTR_protocol_draw, self->members->items[i]);
if (draw_protocol != NULL) {
layer = draw_protocol->draw_get_protocol_self(self->members->items[i]);
draw_protocol->draw_protocol_impl->draw_set_dirty(layer);
continue;
}
#endif
} }
} }
@ -92,6 +100,14 @@ void displayio_group_set_hidden_by_parent(displayio_group_t *self, bool hidden)
displayio_group_set_hidden_by_parent(layer, hidden); displayio_group_set_hidden_by_parent(layer, hidden);
continue; continue;
} }
#if CIRCUITPY_VECTORIO
const vectorio_draw_protocol_t *draw_protocol = mp_proto_get(MP_QSTR_protocol_draw, self->members->items[i]);
if (draw_protocol != NULL) {
layer = draw_protocol->draw_get_protocol_self(self->members->items[i]);
draw_protocol->draw_protocol_impl->draw_set_dirty(layer);
continue;
}
#endif
} }
} }
@ -358,33 +374,35 @@ void displayio_group_construct(displayio_group_t *self, mp_obj_list_t *members,
bool displayio_group_fill_area(displayio_group_t *self, const _displayio_colorspace_t *colorspace, const displayio_area_t *area, uint32_t *mask, uint32_t *buffer) { bool displayio_group_fill_area(displayio_group_t *self, const _displayio_colorspace_t *colorspace, const displayio_area_t *area, uint32_t *mask, uint32_t *buffer) {
// Track if any of the layers finishes filling in the given area. We can ignore any remaining // Track if any of the layers finishes filling in the given area. We can ignore any remaining
// layers at that point. // layers at that point.
for (int32_t i = self->members->len - 1; i >= 0; i--) { if (self->hidden == false) {
mp_obj_t layer; for (int32_t i = self->members->len - 1; i >= 0; i--) {
#if CIRCUITPY_VECTORIO mp_obj_t layer;
const vectorio_draw_protocol_t *draw_protocol = mp_proto_get(MP_QSTR_protocol_draw, self->members->items[i]); #if CIRCUITPY_VECTORIO
if (draw_protocol != NULL) { const vectorio_draw_protocol_t *draw_protocol = mp_proto_get(MP_QSTR_protocol_draw, self->members->items[i]);
layer = draw_protocol->draw_get_protocol_self(self->members->items[i]); if (draw_protocol != NULL) {
if (draw_protocol->draw_protocol_impl->draw_fill_area(layer, colorspace, area, mask, buffer)) { layer = draw_protocol->draw_get_protocol_self(self->members->items[i]);
return true; if (draw_protocol->draw_protocol_impl->draw_fill_area(layer, colorspace, area, mask, buffer)) {
return true;
}
continue;
} }
continue; #endif
} layer = mp_obj_cast_to_native_base(
#endif self->members->items[i], &displayio_tilegrid_type);
layer = mp_obj_cast_to_native_base( if (layer != MP_OBJ_NULL) {
self->members->items[i], &displayio_tilegrid_type); if (displayio_tilegrid_fill_area(layer, colorspace, area, mask, buffer)) {
if (layer != MP_OBJ_NULL) { return true;
if (displayio_tilegrid_fill_area(layer, colorspace, area, mask, buffer)) { }
return true; continue;
} }
continue; layer = mp_obj_cast_to_native_base(
} self->members->items[i], &displayio_group_type);
layer = mp_obj_cast_to_native_base( if (layer != MP_OBJ_NULL) {
self->members->items[i], &displayio_group_type); if (displayio_group_fill_area(layer, colorspace, area, mask, buffer)) {
if (layer != MP_OBJ_NULL) { return true;
if (displayio_group_fill_area(layer, colorspace, area, mask, buffer)) { }
return true; continue;
} }
continue;
} }
} }
return false; return false;