Skip to content

Commit 4fb7d44

Browse files
committed
pixel_shader back to required on TileGrid. TPM init with no tilegrid or width/height, internal bind function is used to bind a TileGrid to a TilePaletteMapper when the TileGrid is init with or has pixel_shader set to a TPM
1 parent 6f9b534 commit 4fb7d44

File tree

7 files changed

+42
-38
lines changed

7 files changed

+42
-38
lines changed

shared-bindings/displayio/TileGrid.c

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ void displayio_tilegrid_validate_pixel_shader(mp_obj_t pixel_shader) {
6868
//| tile_width and tile_height match the height of the bitmap by default.
6969
//|
7070
//| :param Bitmap,OnDiskBitmap bitmap: The bitmap storing one or more tiles.
71-
//| :param Optional[ColorConverter,Palette] pixel_shader: The pixel shader that produces colors from values
71+
//| :param ColorConverter,Palette pixel_shader: The pixel shader that produces colors from values
7272
//| :param int width: Width of the grid in tiles.
7373
//| :param int height: Height of the grid in tiles.
7474
//| :param int tile_width: Width of a single tile in pixels. Defaults to the full Bitmap and must evenly divide into the Bitmap's dimensions.
@@ -81,7 +81,7 @@ static mp_obj_t displayio_tilegrid_make_new(const mp_obj_type_t *type, size_t n_
8181
enum { ARG_bitmap, ARG_pixel_shader, ARG_width, ARG_height, ARG_tile_width, ARG_tile_height, ARG_default_tile, ARG_x, ARG_y };
8282
static const mp_arg_t allowed_args[] = {
8383
{ MP_QSTR_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ },
84-
{ MP_QSTR_pixel_shader, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = mp_const_none} },
84+
{ MP_QSTR_pixel_shader, MP_ARG_OBJ | MP_ARG_KW_ONLY | MP_ARG_REQUIRED },
8585
{ MP_QSTR_width, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 1} },
8686
{ MP_QSTR_height, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 1} },
8787
{ MP_QSTR_tile_width, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 0} },
@@ -109,9 +109,7 @@ static mp_obj_t displayio_tilegrid_make_new(const mp_obj_type_t *type, size_t n_
109109
mp_raise_TypeError_varg(MP_ERROR_TEXT("unsupported %q type"), MP_QSTR_bitmap);
110110
}
111111
mp_obj_t pixel_shader = args[ARG_pixel_shader].u_obj;
112-
if (pixel_shader != mp_const_none) {
113-
displayio_tilegrid_validate_pixel_shader(pixel_shader);
114-
}
112+
displayio_tilegrid_validate_pixel_shader(pixel_shader);
115113
uint16_t tile_width = args[ARG_tile_width].u_int;
116114
if (tile_width == 0) {
117115
tile_width = bitmap_width;

shared-bindings/tilepalettemapper/TilePaletteMapper.c

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,22 +22,20 @@
2222
//| bitmap with a wider array of colors."""
2323
//|
2424
//| def __init__(
25-
//| self, palette: displayio.Palette, input_color_count: int, tilegrid: displayio.TileGrid
25+
//| self, palette: displayio.Palette, input_color_count: int
2626
//| ) -> None:
2727
//| """Create a TilePaletteMApper object to store a set of color mappings for tiles.
2828
//|
2929
//| :param Union[displayio.Palette, displayio.ColorConverter] pixel_shader:
3030
//| The palette or ColorConverter to get mapped colors from.
31-
//| :param int input_color_count: The number of colors in in the input bitmap.
32-
//| :param TileGrid tilegrid: The tilegrid to use with the TilePaletteMapper"""
31+
//| :param int input_color_count: The number of colors in in the input bitmap."""
3332
//|
3433

3534
static mp_obj_t tilepalettemapper_tilepalettemapper_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) {
36-
enum { ARG_pixel_shader, ARG_input_color_count, ARG_tilegrid };
35+
enum { ARG_pixel_shader, ARG_input_color_count };
3736
static const mp_arg_t allowed_args[] = {
3837
{ MP_QSTR_pixel_shader, MP_ARG_OBJ | MP_ARG_REQUIRED },
3938
{ MP_QSTR_input_color_count, MP_ARG_INT | MP_ARG_REQUIRED },
40-
{ MP_QSTR_tilegrid, MP_ARG_OBJ | MP_ARG_REQUIRED },
4139

4240
};
4341
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
@@ -47,13 +45,9 @@ static mp_obj_t tilepalettemapper_tilepalettemapper_make_new(const mp_obj_type_t
4745
mp_raise_TypeError_varg(MP_ERROR_TEXT("unsupported %q type"), MP_QSTR_pixel_shader);
4846
}
4947

50-
mp_obj_t tilegrid = args[ARG_tilegrid].u_obj;
51-
if (!mp_obj_is_type(tilegrid, &displayio_tilegrid_type)) {
52-
mp_raise_TypeError_varg(MP_ERROR_TEXT("unsupported %q type"), MP_QSTR_tilegrid);
53-
}
5448

5549
tilepalettemapper_tilepalettemapper_t *self = mp_obj_malloc(tilepalettemapper_tilepalettemapper_t, &tilepalettemapper_tilepalettemapper_type);
56-
common_hal_tilepalettemapper_tilepalettemapper_construct(self, pixel_shader, args[ARG_input_color_count].u_int, tilegrid);
50+
common_hal_tilepalettemapper_tilepalettemapper_construct(self, pixel_shader, args[ARG_input_color_count].u_int);
5751

5852
return MP_OBJ_FROM_PTR(self);
5953
}

shared-bindings/tilepalettemapper/TilePaletteMapper.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
extern const mp_obj_type_t tilepalettemapper_tilepalettemapper_type;
99

1010
void common_hal_tilepalettemapper_tilepalettemapper_construct(tilepalettemapper_tilepalettemapper_t *self,
11-
mp_obj_t paltte, uint16_t input_color_count, mp_obj_t tilegrid);
11+
mp_obj_t paltte, uint16_t input_color_count);
1212

1313

1414
uint16_t common_hal_tilepalettemapper_tilepalettemapper_get_width(tilepalettemapper_tilepalettemapper_t *self);

shared-module/displayio/Group.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -258,9 +258,6 @@ static void _add_layer(displayio_group_t *self, mp_obj_t layer) {
258258
mp_obj_t native_layer = mp_obj_cast_to_native_base(layer, &displayio_tilegrid_type);
259259
if (native_layer != MP_OBJ_NULL) {
260260
displayio_tilegrid_t *tilegrid = native_layer;
261-
if (tilegrid->pixel_shader == mp_const_none) {
262-
mp_raise_ValueError(MP_ERROR_TEXT("TileGrid must have a pixel_shader"));
263-
}
264261
if (tilegrid->in_group) {
265262
mp_raise_ValueError(MP_ERROR_TEXT("Layer already in a group"));
266263
} else {

shared-module/displayio/TileGrid.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,11 @@ void common_hal_displayio_tilegrid_construct(displayio_tilegrid_t *self, mp_obj_
8181
self->flip_y = false;
8282
self->transpose_xy = false;
8383
self->absolute_transform = NULL;
84+
#if CIRCUITPY_TILEPALETTEMAPPER
85+
if (mp_obj_is_type(self->pixel_shader, &tilepalettemapper_tilepalettemapper_type)) {
86+
tilepalettemapper_tilepalettemapper_bind(self->pixel_shader, self);
87+
}
88+
#endif
8489
}
8590

8691

@@ -231,6 +236,11 @@ mp_obj_t common_hal_displayio_tilegrid_get_pixel_shader(displayio_tilegrid_t *se
231236
void common_hal_displayio_tilegrid_set_pixel_shader(displayio_tilegrid_t *self, mp_obj_t pixel_shader) {
232237
self->pixel_shader = pixel_shader;
233238
self->full_change = true;
239+
#if CIRCUITPY_TILEPALETTEMAPPER
240+
if (mp_obj_is_type(self->pixel_shader, &tilepalettemapper_tilepalettemapper_type)) {
241+
tilepalettemapper_tilepalettemapper_bind(self->pixel_shader, self);
242+
}
243+
#endif
234244
}
235245

236246
mp_obj_t common_hal_displayio_tilegrid_get_bitmap(displayio_tilegrid_t *self) {

shared-module/tilepalettemapper/TilePaletteMapper.c

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -11,27 +11,9 @@
1111
#include "shared-bindings/displayio/TileGrid.h"
1212

1313
void common_hal_tilepalettemapper_tilepalettemapper_construct(tilepalettemapper_tilepalettemapper_t *self,
14-
mp_obj_t pixel_shader, uint16_t input_color_count, mp_obj_t tilegrid) {
15-
self->tilegrid = tilegrid;
14+
mp_obj_t pixel_shader, uint16_t input_color_count) {
1615
self->pixel_shader = pixel_shader;
17-
self->width_in_tiles = common_hal_displayio_tilegrid_get_width(tilegrid);
18-
self->height_in_tiles = common_hal_displayio_tilegrid_get_height(tilegrid);
1916
self->input_color_count = input_color_count;
20-
int mappings_len = self->width_in_tiles * self->height_in_tiles;
21-
self->tile_mappings = (uint32_t **)m_malloc(mappings_len * sizeof(uint32_t *));
22-
for (int i = 0; i < mappings_len; i++) {
23-
self->tile_mappings[i] = (uint32_t *)m_malloc_without_collect(input_color_count * sizeof(uint32_t));
24-
if (mp_obj_is_type(self->pixel_shader, &displayio_palette_type)) {
25-
for (uint16_t j = 0; j < input_color_count; j++) {
26-
self->tile_mappings[i][j] = j;
27-
}
28-
} else if (mp_obj_is_type(self->pixel_shader, &displayio_colorconverter_type)) {
29-
for (uint16_t j = 0; j < input_color_count; j++) {
30-
self->tile_mappings[i][j] = 0;
31-
}
32-
}
33-
}
34-
common_hal_displayio_tilegrid_set_pixel_shader(self->tilegrid, self);
3517
}
3618

3719
uint16_t common_hal_tilepalettemapper_tilepalettemapper_get_width(tilepalettemapper_tilepalettemapper_t *self) {
@@ -95,3 +77,24 @@ void tilepalettemapper_tilepalettemapper_get_color(tilepalettemapper_tilepalette
9577
}
9678

9779
}
80+
81+
void tilepalettemapper_tilepalettemapper_bind(tilepalettemapper_tilepalettemapper_t *self, displayio_tilegrid_t *tilegrid) {
82+
self->tilegrid = tilegrid;
83+
self->width_in_tiles = common_hal_displayio_tilegrid_get_width(tilegrid);
84+
self->height_in_tiles = common_hal_displayio_tilegrid_get_height(tilegrid);
85+
86+
int mappings_len = self->width_in_tiles * self->height_in_tiles;
87+
self->tile_mappings = (uint32_t **)m_malloc(mappings_len * sizeof(uint32_t *));
88+
for (int i = 0; i < mappings_len; i++) {
89+
self->tile_mappings[i] = (uint32_t *)m_malloc_without_collect(self->input_color_count * sizeof(uint32_t));
90+
if (mp_obj_is_type(self->pixel_shader, &displayio_palette_type)) {
91+
for (uint16_t j = 0; j < self->input_color_count; j++) {
92+
self->tile_mappings[i][j] = j;
93+
}
94+
} else if (mp_obj_is_type(self->pixel_shader, &displayio_colorconverter_type)) {
95+
for (uint16_t j = 0; j < self->input_color_count; j++) {
96+
self->tile_mappings[i][j] = 0;
97+
}
98+
}
99+
}
100+
}

shared-module/tilepalettemapper/TilePaletteMapper.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
#include "py/obj.h"
1414
#include "shared-module/displayio/Palette.h"
15+
#include "shared-module/displayio/TileGrid.h"
1516

1617
typedef struct {
1718
mp_obj_base_t base;
@@ -24,3 +25,4 @@ typedef struct {
2425
} tilepalettemapper_tilepalettemapper_t;
2526

2627
void tilepalettemapper_tilepalettemapper_get_color(tilepalettemapper_tilepalettemapper_t *self, const _displayio_colorspace_t *colorspace, displayio_input_pixel_t *input_pixel, displayio_output_pixel_t *output_color, uint16_t x_tile_index, uint16_t y_tile_index);
28+
void tilepalettemapper_tilepalettemapper_bind(tilepalettemapper_tilepalettemapper_t *self, displayio_tilegrid_t *tilegrid);

0 commit comments

Comments
 (0)