From 666a5ff04cf5c0ee1bedf768830beb9f45dcdfaf Mon Sep 17 00:00:00 2001 From: foamyguy Date: Sat, 9 Apr 2022 10:09:46 -0500 Subject: [PATCH 1/7] trying to make vectorio shape hidable --- shared-module/displayio/Group.c | 58 +++++++++++++++++++-------------- 1 file changed, 34 insertions(+), 24 deletions(-) diff --git a/shared-module/displayio/Group.c b/shared-module/displayio/Group.c index b9179f0a00c31..28d3d8973537c 100644 --- a/shared-module/displayio/Group.c +++ b/shared-module/displayio/Group.c @@ -358,35 +358,45 @@ 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) { // Track if any of the layers finishes filling in the given area. We can ignore any remaining // layers at that point. - for (int32_t i = self->members->len - 1; i >= 0; i--) { - mp_obj_t layer; - #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]); - if (draw_protocol->draw_protocol_impl->draw_fill_area(layer, colorspace, area, mask, buffer)) { - return true; + //mp_printf(&mp_plat_print, "inside fill area \n"); + //mp_printf(&mp_plat_print, "%d \n", self->hidden); + //mp_printf(&mp_plat_print, "\n"); + + //mp_printf(&mp_plat_print, "inside fill area \n"); + if (self->hidden == false){ + //mp_printf(&mp_plat_print, "not hidden\n"); + for (int32_t i = self->members->len - 1; i >= 0; i--) { + mp_obj_t layer; + #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]); + 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( - self->members->items[i], &displayio_tilegrid_type); - if (layer != MP_OBJ_NULL) { - if (displayio_tilegrid_fill_area(layer, colorspace, area, mask, buffer)) { - return true; + #endif + layer = mp_obj_cast_to_native_base( + self->members->items[i], &displayio_tilegrid_type); + if (layer != MP_OBJ_NULL) { + 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); - if (layer != MP_OBJ_NULL) { - if (displayio_group_fill_area(layer, colorspace, area, mask, buffer)) { - return true; + layer = mp_obj_cast_to_native_base( + self->members->items[i], &displayio_group_type); + if (layer != MP_OBJ_NULL) { + if (displayio_group_fill_area(layer, colorspace, area, mask, buffer)) { + return true; + } + continue; } - continue; } } + + return false; } From b03968aee5a5ad473afb1d4d6273c8f0aea774f7 Mon Sep 17 00:00:00 2001 From: foamyguy Date: Sat, 7 May 2022 11:49:07 -0500 Subject: [PATCH 2/7] hide vectorio objects if their containing group is hidden --- shared-module/displayio/Group.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/shared-module/displayio/Group.c b/shared-module/displayio/Group.c index 28d3d8973537c..613e75e00b514 100644 --- a/shared-module/displayio/Group.c +++ b/shared-module/displayio/Group.c @@ -32,6 +32,9 @@ #if CIRCUITPY_VECTORIO #include "shared-bindings/vectorio/VectorShape.h" +#include "shared-bindings/vectorio/Circle.h" +#include "shared-bindings/vectorio/Rectangle.h" +#include "shared-bindings/vectorio/Polygon.h" #endif @@ -66,6 +69,26 @@ void common_hal_displayio_group_set_hidden(displayio_group_t *self, bool hidden) displayio_group_set_hidden_by_parent(layer, hidden); continue; } + #if CIRCUITPY_VECTORIO + layer = mp_obj_cast_to_native_base( + self->members->items[i], &vectorio_circle_type); + if (layer != MP_OBJ_NULL) { + common_hal_vectorio_vector_shape_set_dirty(common_hal_vectorio_circle_get_draw_protocol(layer)); + continue; + } + layer = mp_obj_cast_to_native_base( + self->members->items[i], &vectorio_rectangle_type); + if (layer != MP_OBJ_NULL) { + common_hal_vectorio_vector_shape_set_dirty(common_hal_vectorio_rectangle_get_draw_protocol(layer)); + continue; + } + layer = mp_obj_cast_to_native_base( + self->members->items[i], &vectorio_polygon_type); + if (layer != MP_OBJ_NULL) { + common_hal_vectorio_vector_shape_set_dirty(common_hal_vectorio_polygon_get_draw_protocol(layer)); + continue; + } + #endif } } From d1aab89a5933e36ca5041e5ab5ced1884345e919 Mon Sep 17 00:00:00 2001 From: foamyguy Date: Sat, 7 May 2022 11:57:27 -0500 Subject: [PATCH 3/7] remove prints and extra whitespace --- shared-module/displayio/Group.c | 8 -------- 1 file changed, 8 deletions(-) diff --git a/shared-module/displayio/Group.c b/shared-module/displayio/Group.c index 613e75e00b514..083e04678bfb2 100644 --- a/shared-module/displayio/Group.c +++ b/shared-module/displayio/Group.c @@ -381,13 +381,7 @@ 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) { // Track if any of the layers finishes filling in the given area. We can ignore any remaining // layers at that point. - //mp_printf(&mp_plat_print, "inside fill area \n"); - //mp_printf(&mp_plat_print, "%d \n", self->hidden); - //mp_printf(&mp_plat_print, "\n"); - - //mp_printf(&mp_plat_print, "inside fill area \n"); if (self->hidden == false){ - //mp_printf(&mp_plat_print, "not hidden\n"); for (int32_t i = self->members->len - 1; i >= 0; i--) { mp_obj_t layer; #if CIRCUITPY_VECTORIO @@ -418,8 +412,6 @@ bool displayio_group_fill_area(displayio_group_t *self, const _displayio_colorsp } } } - - return false; } From c77dc3c8284916030987dd5ded7c10cdce9aa998 Mon Sep 17 00:00:00 2001 From: foamyguy Date: Sat, 7 May 2022 11:59:26 -0500 Subject: [PATCH 4/7] code format --- shared-module/displayio/Group.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/shared-module/displayio/Group.c b/shared-module/displayio/Group.c index 083e04678bfb2..73dea2360610b 100644 --- a/shared-module/displayio/Group.c +++ b/shared-module/displayio/Group.c @@ -71,19 +71,19 @@ void common_hal_displayio_group_set_hidden(displayio_group_t *self, bool hidden) } #if CIRCUITPY_VECTORIO layer = mp_obj_cast_to_native_base( - self->members->items[i], &vectorio_circle_type); + self->members->items[i], &vectorio_circle_type); if (layer != MP_OBJ_NULL) { common_hal_vectorio_vector_shape_set_dirty(common_hal_vectorio_circle_get_draw_protocol(layer)); continue; } layer = mp_obj_cast_to_native_base( - self->members->items[i], &vectorio_rectangle_type); + self->members->items[i], &vectorio_rectangle_type); if (layer != MP_OBJ_NULL) { common_hal_vectorio_vector_shape_set_dirty(common_hal_vectorio_rectangle_get_draw_protocol(layer)); continue; } layer = mp_obj_cast_to_native_base( - self->members->items[i], &vectorio_polygon_type); + self->members->items[i], &vectorio_polygon_type); if (layer != MP_OBJ_NULL) { common_hal_vectorio_vector_shape_set_dirty(common_hal_vectorio_polygon_get_draw_protocol(layer)); continue; @@ -381,7 +381,7 @@ 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) { // Track if any of the layers finishes filling in the given area. We can ignore any remaining // layers at that point. - if (self->hidden == false){ + if (self->hidden == false) { for (int32_t i = self->members->len - 1; i >= 0; i--) { mp_obj_t layer; #if CIRCUITPY_VECTORIO From 330e01d8e0bb379e38ba1fc173e61d6a92e340c6 Mon Sep 17 00:00:00 2001 From: foamyguy Date: Sat, 7 May 2022 12:27:36 -0500 Subject: [PATCH 5/7] handle groups inside of groups with vectorio hidden --- shared-module/displayio/Group.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/shared-module/displayio/Group.c b/shared-module/displayio/Group.c index 73dea2360610b..21b4b2410f29c 100644 --- a/shared-module/displayio/Group.c +++ b/shared-module/displayio/Group.c @@ -115,6 +115,26 @@ void displayio_group_set_hidden_by_parent(displayio_group_t *self, bool hidden) displayio_group_set_hidden_by_parent(layer, hidden); continue; } + #if CIRCUITPY_VECTORIO + layer = mp_obj_cast_to_native_base( + self->members->items[i], &vectorio_circle_type); + if (layer != MP_OBJ_NULL) { + common_hal_vectorio_vector_shape_set_dirty(common_hal_vectorio_circle_get_draw_protocol(layer)); + continue; + } + layer = mp_obj_cast_to_native_base( + self->members->items[i], &vectorio_rectangle_type); + if (layer != MP_OBJ_NULL) { + common_hal_vectorio_vector_shape_set_dirty(common_hal_vectorio_rectangle_get_draw_protocol(layer)); + continue; + } + layer = mp_obj_cast_to_native_base( + self->members->items[i], &vectorio_polygon_type); + if (layer != MP_OBJ_NULL) { + common_hal_vectorio_vector_shape_set_dirty(common_hal_vectorio_polygon_get_draw_protocol(layer)); + continue; + } + #endif } } From b6a5f421a9b7e3e27534a022c1642e83d7bffdb0 Mon Sep 17 00:00:00 2001 From: foamyguy Date: Sun, 8 May 2022 12:02:59 -0500 Subject: [PATCH 6/7] use draw protocol impl --- shared-bindings/vectorio/VectorShape.c | 1 + shared-bindings/vectorio/__init__.h | 2 ++ shared-module/displayio/Group.c | 20 ++++---------------- 3 files changed, 7 insertions(+), 16 deletions(-) diff --git a/shared-bindings/vectorio/VectorShape.c b/shared-bindings/vectorio/VectorShape.c index fe6be555cd922..6a3e192cb9afe 100644 --- a/shared-bindings/vectorio/VectorShape.c +++ b/shared-bindings/vectorio/VectorShape.c @@ -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_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_set_dirty = (draw_set_dirty_fun)common_hal_vectorio_vector_shape_set_dirty, }; // Stub checker does not approve of these shared properties. diff --git a/shared-bindings/vectorio/__init__.h b/shared-bindings/vectorio/__init__.h index a34195de26a15..d4f10c926cdef 100644 --- a/shared-bindings/vectorio/__init__.h +++ b/shared-bindings/vectorio/__init__.h @@ -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 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_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 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_finish_refresh_fun draw_finish_refresh; draw_get_refresh_areas_fun draw_get_refresh_areas; + draw_set_dirty_fun draw_set_dirty; } vectorio_draw_protocol_impl_t; // Draw protocol diff --git a/shared-module/displayio/Group.c b/shared-module/displayio/Group.c index 21b4b2410f29c..40f34a833683e 100644 --- a/shared-module/displayio/Group.c +++ b/shared-module/displayio/Group.c @@ -70,22 +70,10 @@ void common_hal_displayio_group_set_hidden(displayio_group_t *self, bool hidden) continue; } #if CIRCUITPY_VECTORIO - layer = mp_obj_cast_to_native_base( - self->members->items[i], &vectorio_circle_type); - if (layer != MP_OBJ_NULL) { - common_hal_vectorio_vector_shape_set_dirty(common_hal_vectorio_circle_get_draw_protocol(layer)); - continue; - } - layer = mp_obj_cast_to_native_base( - self->members->items[i], &vectorio_rectangle_type); - if (layer != MP_OBJ_NULL) { - common_hal_vectorio_vector_shape_set_dirty(common_hal_vectorio_rectangle_get_draw_protocol(layer)); - continue; - } - layer = mp_obj_cast_to_native_base( - self->members->items[i], &vectorio_polygon_type); - if (layer != MP_OBJ_NULL) { - common_hal_vectorio_vector_shape_set_dirty(common_hal_vectorio_polygon_get_draw_protocol(layer)); + 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 From 1c564764d6403ff75420d597a0ee25c290a1b296 Mon Sep 17 00:00:00 2001 From: foamyguy Date: Sun, 8 May 2022 12:14:28 -0500 Subject: [PATCH 7/7] use draw protocol impl in parent hidden too --- shared-module/displayio/Group.c | 23 ++++------------------- 1 file changed, 4 insertions(+), 19 deletions(-) diff --git a/shared-module/displayio/Group.c b/shared-module/displayio/Group.c index 40f34a833683e..1a4e4eafb56b0 100644 --- a/shared-module/displayio/Group.c +++ b/shared-module/displayio/Group.c @@ -32,9 +32,6 @@ #if CIRCUITPY_VECTORIO #include "shared-bindings/vectorio/VectorShape.h" -#include "shared-bindings/vectorio/Circle.h" -#include "shared-bindings/vectorio/Rectangle.h" -#include "shared-bindings/vectorio/Polygon.h" #endif @@ -104,22 +101,10 @@ void displayio_group_set_hidden_by_parent(displayio_group_t *self, bool hidden) continue; } #if CIRCUITPY_VECTORIO - layer = mp_obj_cast_to_native_base( - self->members->items[i], &vectorio_circle_type); - if (layer != MP_OBJ_NULL) { - common_hal_vectorio_vector_shape_set_dirty(common_hal_vectorio_circle_get_draw_protocol(layer)); - continue; - } - layer = mp_obj_cast_to_native_base( - self->members->items[i], &vectorio_rectangle_type); - if (layer != MP_OBJ_NULL) { - common_hal_vectorio_vector_shape_set_dirty(common_hal_vectorio_rectangle_get_draw_protocol(layer)); - continue; - } - layer = mp_obj_cast_to_native_base( - self->members->items[i], &vectorio_polygon_type); - if (layer != MP_OBJ_NULL) { - common_hal_vectorio_vector_shape_set_dirty(common_hal_vectorio_polygon_get_draw_protocol(layer)); + 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