From c9f036ed405f8e5ddf34dd2e15ad4074a270c3c4 Mon Sep 17 00:00:00 2001 From: Scott Shawcroft Date: Fri, 15 Feb 2019 14:29:59 -0800 Subject: [PATCH] Store the original layer in Group As is we would return the native superclass object only. Fixes #1551 --- shared-module/displayio/Group.c | 30 ++++++++++++++++++++---------- shared-module/displayio/Group.h | 9 +++++++-- supervisor/shared/display.c | 6 +++--- 3 files changed, 30 insertions(+), 15 deletions(-) diff --git a/shared-module/displayio/Group.c b/shared-module/displayio/Group.c index b48057d1bc..f6bc92dc74 100644 --- a/shared-module/displayio/Group.c +++ b/shared-module/displayio/Group.c @@ -30,7 +30,7 @@ #include "shared-bindings/displayio/TileGrid.h" void common_hal_displayio_group_construct(displayio_group_t* self, uint32_t max_size, uint32_t scale) { - mp_obj_t* children = m_new(mp_obj_t, max_size); + displayio_group_child_t* children = m_new(displayio_group_child_t, max_size); displayio_group_construct(self, children, max_size, scale); } @@ -76,19 +76,21 @@ void common_hal_displayio_group_insert(displayio_group_t* self, size_t index, mp for (size_t i = index; i < self->size; i++) { self->children[i + 1] = self->children[i]; } - self->children[index] = native_layer; + self->children[index].native = native_layer; + self->children[index].original = layer; self->size++; self->needs_refresh = true; } mp_obj_t common_hal_displayio_group_pop(displayio_group_t* self, size_t index) { self->size--; - mp_obj_t item = self->children[index]; + mp_obj_t item = self->children[index].original; // Shift everything left. for (size_t i = index; i < self->size; i++) { self->children[i] = self->children[i + 1]; } - self->children[self->size] = NULL; + self->children[self->size].native = NULL; + self->children[self->size].original = NULL; self->needs_refresh = true; return item; } @@ -98,15 +100,23 @@ size_t common_hal_displayio_group_get_len(displayio_group_t* self) { } mp_obj_t common_hal_displayio_group_get(displayio_group_t* self, size_t index) { - return MP_OBJ_FROM_PTR(self->children[index]); + return self->children[index].original; } void common_hal_displayio_group_set(displayio_group_t* self, size_t index, mp_obj_t layer) { - self->children[index] = layer; + mp_obj_t native_layer = mp_instance_cast_to_native_base(layer, &displayio_group_type); + if (native_layer == MP_OBJ_NULL) { + native_layer = mp_instance_cast_to_native_base(layer, &displayio_tilegrid_type); + } + if (native_layer == MP_OBJ_NULL) { + mp_raise_ValueError(translate("Layer must be a Group or TileGrid subclass.")); + } + self->children[index].native = native_layer; + self->children[index].original = layer; self->needs_refresh = true; } -void displayio_group_construct(displayio_group_t* self, mp_obj_t* child_array, uint32_t max_size, uint32_t scale) { +void displayio_group_construct(displayio_group_t* self, displayio_group_child_t* child_array, uint32_t max_size, uint32_t scale) { self->x = 0; self->y = 0; self->children = child_array; @@ -121,7 +131,7 @@ bool displayio_group_get_pixel(displayio_group_t *self, int16_t x, int16_t y, ui x /= self->scale; y /= self->scale; for (int32_t i = self->size - 1; i >= 0 ; i--) { - mp_obj_t layer = self->children[i]; + mp_obj_t layer = self->children[i].native; if (MP_OBJ_IS_TYPE(layer, &displayio_tilegrid_type)) { if (displayio_tilegrid_get_pixel(layer, x, y, pixel)) { return true; @@ -140,7 +150,7 @@ bool displayio_group_needs_refresh(displayio_group_t *self) { return true; } for (int32_t i = self->size - 1; i >= 0 ; i--) { - mp_obj_t layer = self->children[i]; + mp_obj_t layer = self->children[i].native; if (MP_OBJ_IS_TYPE(layer, &displayio_tilegrid_type)) { if (displayio_tilegrid_needs_refresh(layer)) { return true; @@ -157,7 +167,7 @@ bool displayio_group_needs_refresh(displayio_group_t *self) { void displayio_group_finish_refresh(displayio_group_t *self) { self->needs_refresh = false; for (int32_t i = self->size - 1; i >= 0 ; i--) { - mp_obj_t layer = self->children[i]; + mp_obj_t layer = self->children[i].native; if (MP_OBJ_IS_TYPE(layer, &displayio_tilegrid_type)) { displayio_tilegrid_finish_refresh(layer); } else if (MP_OBJ_IS_TYPE(layer, &displayio_group_type)) { diff --git a/shared-module/displayio/Group.h b/shared-module/displayio/Group.h index 265cb4e22b..61409959d8 100644 --- a/shared-module/displayio/Group.h +++ b/shared-module/displayio/Group.h @@ -32,6 +32,11 @@ #include "py/obj.h" +typedef struct { + mp_obj_t native; + mp_obj_t original; +} displayio_group_child_t; + typedef struct { mp_obj_base_t base; int16_t x; @@ -39,11 +44,11 @@ typedef struct { uint16_t scale; uint16_t size; uint16_t max_size; - mp_obj_t* children; + displayio_group_child_t* children; bool needs_refresh; } displayio_group_t; -void displayio_group_construct(displayio_group_t* self, mp_obj_t* child_array, uint32_t max_size, uint32_t scale); +void displayio_group_construct(displayio_group_t* self, displayio_group_child_t* child_array, uint32_t max_size, uint32_t scale); bool displayio_group_get_pixel(displayio_group_t *group, int16_t x, int16_t y, uint16_t *pixel); bool displayio_group_needs_refresh(displayio_group_t *self); void displayio_group_finish_refresh(displayio_group_t *self); diff --git a/supervisor/shared/display.c b/supervisor/shared/display.c index 679354473c..e1400426e9 100644 --- a/supervisor/shared/display.c +++ b/supervisor/shared/display.c @@ -172,9 +172,9 @@ displayio_tilegrid_t blinka_sprite = { .inline_tiles = true }; -mp_obj_t splash_children[2] = { - &blinka_sprite, - &supervisor_terminal_text_grid +displayio_group_child_t splash_children[2] = { + {&blinka_sprite, &blinka_sprite}, + {&supervisor_terminal_text_grid, &supervisor_terminal_text_grid} }; displayio_group_t circuitpython_splash = {