Skip to content

Commit c9f036e

Browse files
committed
Store the original layer in Group
As is we would return the native superclass object only. Fixes adafruit#1551
1 parent 35e3d99 commit c9f036e

3 files changed

Lines changed: 30 additions & 15 deletions

File tree

shared-module/displayio/Group.c

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
#include "shared-bindings/displayio/TileGrid.h"
3131

3232
void common_hal_displayio_group_construct(displayio_group_t* self, uint32_t max_size, uint32_t scale) {
33-
mp_obj_t* children = m_new(mp_obj_t, max_size);
33+
displayio_group_child_t* children = m_new(displayio_group_child_t, max_size);
3434
displayio_group_construct(self, children, max_size, scale);
3535
}
3636

@@ -76,19 +76,21 @@ void common_hal_displayio_group_insert(displayio_group_t* self, size_t index, mp
7676
for (size_t i = index; i < self->size; i++) {
7777
self->children[i + 1] = self->children[i];
7878
}
79-
self->children[index] = native_layer;
79+
self->children[index].native = native_layer;
80+
self->children[index].original = layer;
8081
self->size++;
8182
self->needs_refresh = true;
8283
}
8384

8485
mp_obj_t common_hal_displayio_group_pop(displayio_group_t* self, size_t index) {
8586
self->size--;
86-
mp_obj_t item = self->children[index];
87+
mp_obj_t item = self->children[index].original;
8788
// Shift everything left.
8889
for (size_t i = index; i < self->size; i++) {
8990
self->children[i] = self->children[i + 1];
9091
}
91-
self->children[self->size] = NULL;
92+
self->children[self->size].native = NULL;
93+
self->children[self->size].original = NULL;
9294
self->needs_refresh = true;
9395
return item;
9496
}
@@ -98,15 +100,23 @@ size_t common_hal_displayio_group_get_len(displayio_group_t* self) {
98100
}
99101

100102
mp_obj_t common_hal_displayio_group_get(displayio_group_t* self, size_t index) {
101-
return MP_OBJ_FROM_PTR(self->children[index]);
103+
return self->children[index].original;
102104
}
103105

104106
void common_hal_displayio_group_set(displayio_group_t* self, size_t index, mp_obj_t layer) {
105-
self->children[index] = layer;
107+
mp_obj_t native_layer = mp_instance_cast_to_native_base(layer, &displayio_group_type);
108+
if (native_layer == MP_OBJ_NULL) {
109+
native_layer = mp_instance_cast_to_native_base(layer, &displayio_tilegrid_type);
110+
}
111+
if (native_layer == MP_OBJ_NULL) {
112+
mp_raise_ValueError(translate("Layer must be a Group or TileGrid subclass."));
113+
}
114+
self->children[index].native = native_layer;
115+
self->children[index].original = layer;
106116
self->needs_refresh = true;
107117
}
108118

109-
void displayio_group_construct(displayio_group_t* self, mp_obj_t* child_array, uint32_t max_size, uint32_t scale) {
119+
void displayio_group_construct(displayio_group_t* self, displayio_group_child_t* child_array, uint32_t max_size, uint32_t scale) {
110120
self->x = 0;
111121
self->y = 0;
112122
self->children = child_array;
@@ -121,7 +131,7 @@ bool displayio_group_get_pixel(displayio_group_t *self, int16_t x, int16_t y, ui
121131
x /= self->scale;
122132
y /= self->scale;
123133
for (int32_t i = self->size - 1; i >= 0 ; i--) {
124-
mp_obj_t layer = self->children[i];
134+
mp_obj_t layer = self->children[i].native;
125135
if (MP_OBJ_IS_TYPE(layer, &displayio_tilegrid_type)) {
126136
if (displayio_tilegrid_get_pixel(layer, x, y, pixel)) {
127137
return true;
@@ -140,7 +150,7 @@ bool displayio_group_needs_refresh(displayio_group_t *self) {
140150
return true;
141151
}
142152
for (int32_t i = self->size - 1; i >= 0 ; i--) {
143-
mp_obj_t layer = self->children[i];
153+
mp_obj_t layer = self->children[i].native;
144154
if (MP_OBJ_IS_TYPE(layer, &displayio_tilegrid_type)) {
145155
if (displayio_tilegrid_needs_refresh(layer)) {
146156
return true;
@@ -157,7 +167,7 @@ bool displayio_group_needs_refresh(displayio_group_t *self) {
157167
void displayio_group_finish_refresh(displayio_group_t *self) {
158168
self->needs_refresh = false;
159169
for (int32_t i = self->size - 1; i >= 0 ; i--) {
160-
mp_obj_t layer = self->children[i];
170+
mp_obj_t layer = self->children[i].native;
161171
if (MP_OBJ_IS_TYPE(layer, &displayio_tilegrid_type)) {
162172
displayio_tilegrid_finish_refresh(layer);
163173
} else if (MP_OBJ_IS_TYPE(layer, &displayio_group_type)) {

shared-module/displayio/Group.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,18 +32,23 @@
3232

3333
#include "py/obj.h"
3434

35+
typedef struct {
36+
mp_obj_t native;
37+
mp_obj_t original;
38+
} displayio_group_child_t;
39+
3540
typedef struct {
3641
mp_obj_base_t base;
3742
int16_t x;
3843
int16_t y;
3944
uint16_t scale;
4045
uint16_t size;
4146
uint16_t max_size;
42-
mp_obj_t* children;
47+
displayio_group_child_t* children;
4348
bool needs_refresh;
4449
} displayio_group_t;
4550

46-
void displayio_group_construct(displayio_group_t* self, mp_obj_t* child_array, uint32_t max_size, uint32_t scale);
51+
void displayio_group_construct(displayio_group_t* self, displayio_group_child_t* child_array, uint32_t max_size, uint32_t scale);
4752
bool displayio_group_get_pixel(displayio_group_t *group, int16_t x, int16_t y, uint16_t *pixel);
4853
bool displayio_group_needs_refresh(displayio_group_t *self);
4954
void displayio_group_finish_refresh(displayio_group_t *self);

supervisor/shared/display.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -172,9 +172,9 @@ displayio_tilegrid_t blinka_sprite = {
172172
.inline_tiles = true
173173
};
174174

175-
mp_obj_t splash_children[2] = {
176-
&blinka_sprite,
177-
&supervisor_terminal_text_grid
175+
displayio_group_child_t splash_children[2] = {
176+
{&blinka_sprite, &blinka_sprite},
177+
{&supervisor_terminal_text_grid, &supervisor_terminal_text_grid}
178178
};
179179

180180
displayio_group_t circuitpython_splash = {

0 commit comments

Comments
 (0)