Skip to content

Commit 01da5c7

Browse files
committed
make TilePaletteMapper accept TileGrid as arg, make pixel_shader optional on TileGrid init, make TPM mark single tile dirty instead of whole TileGrid when mapping is changed.
1 parent 66093e8 commit 01da5c7

File tree

9 files changed

+86
-67
lines changed

9 files changed

+86
-67
lines changed

locale/circuitpython.pot

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1056,7 +1056,8 @@ msgstr ""
10561056
msgid "File exists"
10571057
msgstr ""
10581058

1059-
#: shared-module/lvfontio/OnDiskFont.c shared-module/os/getenv.c
1059+
#: shared-bindings/supervisor/__init__.c shared-module/lvfontio/OnDiskFont.c
1060+
#: shared-module/os/getenv.c
10601061
msgid "File not found"
10611062
msgstr ""
10621063

@@ -1251,6 +1252,7 @@ msgstr ""
12511252
#: ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2040.c py/argcheck.c
12521253
#: shared-bindings/digitalio/DigitalInOut.c
12531254
#: shared-bindings/epaperdisplay/EPaperDisplay.c shared-bindings/pwmio/PWMOut.c
1255+
#: shared-bindings/supervisor/__init__.c
12541256
#: shared-module/aurora_epaper/aurora_framebuffer.c
12551257
#: shared-module/lvfontio/OnDiskFont.c
12561258
msgid "Invalid %q"
@@ -2068,6 +2070,10 @@ msgstr ""
20682070
msgid "Tile width must exactly divide bitmap width"
20692071
msgstr ""
20702072

2073+
#: shared-module/displayio/Group.c
2074+
msgid "TileGrid must have a pixel_shader"
2075+
msgstr ""
2076+
20712077
#: shared-bindings/alarm/time/TimeAlarm.c
20722078
msgid "Time is in the past."
20732079
msgstr ""
@@ -2591,16 +2597,16 @@ msgstr ""
25912597
msgid "bits must be 32 or less"
25922598
msgstr ""
25932599

2600+
#: shared-bindings/audiofreeverb/Freeverb.c
2601+
msgid "bits_per_sample must be 16"
2602+
msgstr ""
2603+
25942604
#: shared-bindings/audiodelays/Chorus.c shared-bindings/audiodelays/Echo.c
25952605
#: shared-bindings/audiodelays/MultiTapDelay.c
25962606
#: shared-bindings/audiodelays/PitchShift.c
25972607
#: shared-bindings/audiofilters/Distortion.c
2598-
#: shared-bindings/audiodelays/Reverb.c
2599-
msgid "bits_per_sample must be 16"
2600-
msgstr ""
2601-
2602-
#: shared-bindings/audiodelays/Echo.c shared-bindings/audiofilters/Distortion.c
2603-
#: shared-bindings/audiofilters/Filter.c shared-bindings/audiomixer/Mixer.c
2608+
#: shared-bindings/audiofilters/Filter.c shared-bindings/audiofilters/Phaser.c
2609+
#: shared-bindings/audiomixer/Mixer.c
26042610
msgid "bits_per_sample must be 8 or 16"
26052611
msgstr ""
26062612

@@ -4017,7 +4023,7 @@ msgstr ""
40174023
msgid "rsplit(None,n)"
40184024
msgstr ""
40194025

4020-
#: shared-bindings/audiodelays/Reverb.c
4026+
#: shared-bindings/audiofreeverb/Freeverb.c
40214027
msgid "samples_signed must be true"
40224028
msgstr ""
40234029

shared-bindings/displayio/TileGrid.c

Lines changed: 5 additions & 3 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 ColorConverter,Palette pixel_shader: The pixel shader that produces colors from values
71+
//| :param Optional[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 | MP_ARG_REQUIRED },
84+
{ MP_QSTR_pixel_shader, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = mp_const_none} },
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,7 +109,9 @@ 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-
displayio_tilegrid_validate_pixel_shader(pixel_shader);
112+
if (pixel_shader != mp_const_none) {
113+
displayio_tilegrid_validate_pixel_shader(pixel_shader);
114+
}
113115
uint16_t tile_width = args[ARG_tile_width].u_int;
114116
if (tile_width == 0) {
115117
tile_width = bitmap_width;

shared-bindings/tilepalettemapper/TilePaletteMapper.c

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include "shared-bindings/util.h"
1313
#include "shared-bindings/displayio/Palette.h"
1414
#include "shared-bindings/displayio/ColorConverter.h"
15+
#include "shared-bindings/displayio/TileGrid.h"
1516
#include "shared-bindings/tilepalettemapper/TilePaletteMapper.h"
1617

1718
//| class TilePaletteMapper:
@@ -21,33 +22,38 @@
2122
//| bitmap with a wider array of colors."""
2223
//|
2324
//| def __init__(
24-
//| self, palette: displayio.Palette, input_color_count: int, width: int, height: int
25+
//| self, palette: displayio.Palette, input_color_count: int, tilegrid: TileGrid
2526
//| ) -> None:
2627
//| """Create a TilePaletteMApper object to store a set of color mappings for tiles.
2728
//|
2829
//| :param Union[displayio.Palette, displayio.ColorConverter] pixel_shader:
2930
//| The palette or ColorConverter to get mapped colors from.
3031
//| :param int input_color_count: The number of colors in in the input bitmap.
31-
//| :param int width: The width of the grid in tiles.
32-
//| :param int height: The height of the grid in tiles."""
32+
//| :param TileGrid tilegrid: The tilegrid to use with the TilePaletteMapper
3333
//|
3434

3535
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_width, ARG_height };
36+
enum { ARG_pixel_shader, ARG_input_color_count, ARG_tilegrid };
3737
static const mp_arg_t allowed_args[] = {
3838
{ MP_QSTR_pixel_shader, MP_ARG_OBJ | MP_ARG_REQUIRED },
3939
{ MP_QSTR_input_color_count, MP_ARG_INT | MP_ARG_REQUIRED },
40-
{ MP_QSTR_width, MP_ARG_INT | MP_ARG_REQUIRED },
41-
{ MP_QSTR_height, MP_ARG_INT | MP_ARG_REQUIRED },
40+
{ MP_QSTR_tilegrid, MP_ARG_OBJ | MP_ARG_REQUIRED },
41+
4242
};
4343
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
4444
mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
4545
mp_obj_t pixel_shader = args[ARG_pixel_shader].u_obj;
4646
if (!mp_obj_is_type(pixel_shader, &displayio_palette_type) && !mp_obj_is_type(pixel_shader, &displayio_colorconverter_type)) {
4747
mp_raise_TypeError_varg(MP_ERROR_TEXT("unsupported %q type"), MP_QSTR_pixel_shader);
4848
}
49+
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+
}
54+
4955
tilepalettemapper_tilepalettemapper_t *self = mp_obj_malloc(tilepalettemapper_tilepalettemapper_t, &tilepalettemapper_tilepalettemapper_type);
50-
common_hal_tilepalettemapper_tilepalettemapper_construct(self, pixel_shader, args[ARG_input_color_count].u_int, args[ARG_width].u_int, args[ARG_height].u_int);
56+
common_hal_tilepalettemapper_tilepalettemapper_construct(self, pixel_shader, args[ARG_input_color_count].u_int, tilegrid);
5157

5258
return MP_OBJ_FROM_PTR(self);
5359
}
@@ -87,6 +93,17 @@ MP_DEFINE_CONST_FUN_OBJ_1(tilepalettemapper_tilepalettemapper_get_pixel_shader_o
8793
MP_PROPERTY_GETTER(tilepalettemapper_tilepalettemapper_palette_obj,
8894
(mp_obj_t)&tilepalettemapper_tilepalettemapper_get_pixel_shader_obj);
8995

96+
//| tilegrid: displayio.TileGrid
97+
//| """The tilegrid that the TilePaletteMapper is used on."""
98+
//|
99+
static mp_obj_t tilepalettemapper_tilepalettemapper_obj_get_tilegrid(mp_obj_t self_in) {
100+
tilepalettemapper_tilepalettemapper_t *self = MP_OBJ_TO_PTR(self_in);
101+
return common_hal_tilepalettemapper_tilepalettemapper_get_tilegrid(self);
102+
}
103+
MP_DEFINE_CONST_FUN_OBJ_1(tilepalettemapper_tilepalettemapper_get_tilegrid_obj, tilepalettemapper_tilepalettemapper_obj_get_tilegrid);
104+
105+
MP_PROPERTY_GETTER(tilepalettemapper_tilepalettemapper_tilegrid_obj,
106+
(mp_obj_t)&tilepalettemapper_tilepalettemapper_get_tilegrid_obj);
90107

91108
//| def __getitem__(self, index: Union[Tuple[int, int], int]) -> Tuple[int]:
92109
//| """Returns the mapping for the given index. The index can either be an x,y tuple or an int equal

shared-bindings/tilepalettemapper/TilePaletteMapper.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,12 @@
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, uint16_t bitmap_width_in_tiles, uint16_t bitmap_height_in_tiles);
11+
mp_obj_t paltte, uint16_t input_color_count, mp_obj_t tilegrid);
1212

1313

1414
uint16_t common_hal_tilepalettemapper_tilepalettemapper_get_width(tilepalettemapper_tilepalettemapper_t *self);
1515
uint16_t common_hal_tilepalettemapper_tilepalettemapper_get_height(tilepalettemapper_tilepalettemapper_t *self);
1616
mp_obj_t common_hal_tilepalettemapper_tilepalettemapper_get_pixel_shader(tilepalettemapper_tilepalettemapper_t *self);
17+
mp_obj_t common_hal_tilepalettemapper_tilepalettemapper_get_tilegrid(tilepalettemapper_tilepalettemapper_t *self);
1718
mp_obj_t common_hal_tilepalettemapper_tilepalettemapper_get_mapping(tilepalettemapper_tilepalettemapper_t *self, uint16_t x, uint16_t y);
1819
void common_hal_tilepalettemapper_tilepalettemapper_set_mapping(tilepalettemapper_tilepalettemapper_t *self, uint16_t x, uint16_t y, size_t len, mp_obj_t *items);

shared-module/displayio/Group.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,9 @@ 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+
}
261264
if (tilegrid->in_group) {
262265
mp_raise_ValueError(MP_ERROR_TEXT("Layer already in a group"));
263266
} else {

shared-module/displayio/TileGrid.c

Lines changed: 23 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -275,25 +275,7 @@ uint16_t common_hal_displayio_tilegrid_get_tile(displayio_tilegrid_t *self, uint
275275
}
276276
}
277277

278-
void common_hal_displayio_tilegrid_set_tile(displayio_tilegrid_t *self, uint16_t x, uint16_t y, uint16_t tile_index) {
279-
if (tile_index >= self->tiles_in_bitmap) {
280-
mp_raise_ValueError(MP_ERROR_TEXT("Tile index out of bounds"));
281-
}
282-
283-
void *tiles = self->tiles;
284-
if (self->inline_tiles) {
285-
tiles = &self->tiles;
286-
}
287-
if (tiles == NULL) {
288-
return;
289-
}
290-
291-
uint32_t index = y * self->width_in_tiles + x;
292-
if (self->tiles_in_bitmap > 255) {
293-
((uint16_t *)tiles)[index] = tile_index;
294-
} else {
295-
((uint8_t *)tiles)[index] = (uint8_t)tile_index;
296-
}
278+
void displayio_tilegrid_mark_tile_dirty(displayio_tilegrid_t *self, uint16_t x, uint16_t y) {
297279
displayio_area_t temp_area;
298280
displayio_area_t *tile_area;
299281
if (!self->partial_change) {
@@ -318,6 +300,28 @@ void common_hal_displayio_tilegrid_set_tile(displayio_tilegrid_t *self, uint16_t
318300
displayio_area_union(&self->dirty_area, &temp_area, &self->dirty_area);
319301
}
320302

303+
}
304+
305+
void common_hal_displayio_tilegrid_set_tile(displayio_tilegrid_t *self, uint16_t x, uint16_t y, uint16_t tile_index) {
306+
if (tile_index >= self->tiles_in_bitmap) {
307+
mp_raise_ValueError(MP_ERROR_TEXT("Tile index out of bounds"));
308+
}
309+
310+
void *tiles = self->tiles;
311+
if (self->inline_tiles) {
312+
tiles = &self->tiles;
313+
}
314+
if (tiles == NULL) {
315+
return;
316+
}
317+
318+
uint32_t index = y * self->width_in_tiles + x;
319+
if (self->tiles_in_bitmap > 255) {
320+
((uint16_t *)tiles)[index] = tile_index;
321+
} else {
322+
((uint8_t *)tiles)[index] = (uint8_t)tile_index;
323+
}
324+
displayio_tilegrid_mark_tile_dirty(self, x, y);
321325
self->partial_change = true;
322326
}
323327

@@ -613,11 +617,6 @@ void displayio_tilegrid_finish_refresh(displayio_tilegrid_t *self) {
613617
} else if (mp_obj_is_type(self->pixel_shader, &displayio_colorconverter_type)) {
614618
displayio_colorconverter_finish_refresh(self->pixel_shader);
615619
}
616-
#if CIRCUITPY_TILEPALETTEMAPPER
617-
if (mp_obj_is_type(self->pixel_shader, &tilepalettemapper_tilepalettemapper_type)) {
618-
tilepalettemapper_tilepalettemapper_finish_refresh(self->pixel_shader);
619-
}
620-
#endif
621620
if (mp_obj_is_type(self->bitmap, &displayio_bitmap_type)) {
622621
displayio_bitmap_finish_refresh(self->bitmap);
623622
} else if (mp_obj_is_type(self->bitmap, &displayio_ondiskbitmap_type)) {
@@ -671,11 +670,6 @@ displayio_area_t *displayio_tilegrid_get_refresh_areas(displayio_tilegrid_t *sel
671670
displayio_palette_needs_refresh(self->pixel_shader)) ||
672671
(mp_obj_is_type(self->pixel_shader, &displayio_colorconverter_type) &&
673672
displayio_colorconverter_needs_refresh(self->pixel_shader));
674-
#if CIRCUITPY_TILEPALETTEMAPPER
675-
self->full_change = self->full_change ||
676-
(mp_obj_is_type(self->pixel_shader, &tilepalettemapper_tilepalettemapper_type) &&
677-
tilepalettemapper_tilepalettemapper_needs_refresh(self->pixel_shader));
678-
#endif
679673

680674
if (self->full_change || first_draw) {
681675
self->current_area.next = tail;

shared-module/displayio/TileGrid.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,3 +68,5 @@ void displayio_tilegrid_finish_refresh(displayio_tilegrid_t *self);
6868

6969
bool displayio_tilegrid_get_rendered_hidden(displayio_tilegrid_t *self);
7070
void displayio_tilegrid_validate_pixel_shader(mp_obj_t pixel_shader);
71+
72+
void displayio_tilegrid_mark_tile_dirty(displayio_tilegrid_t *self, uint16_t x, uint16_t y);

shared-module/tilepalettemapper/TilePaletteMapper.c

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,16 @@
88
#include "shared-bindings/tilepalettemapper/TilePaletteMapper.h"
99
#include "shared-bindings/displayio/Palette.h"
1010
#include "shared-bindings/displayio/ColorConverter.h"
11+
#include "shared-bindings/displayio/TileGrid.h"
1112

1213
void common_hal_tilepalettemapper_tilepalettemapper_construct(tilepalettemapper_tilepalettemapper_t *self,
13-
mp_obj_t pixel_shader, uint16_t input_color_count, uint16_t width, uint16_t height) {
14-
14+
mp_obj_t pixel_shader, uint16_t input_color_count, mp_obj_t tilegrid) {
15+
self->tilegrid = tilegrid;
1516
self->pixel_shader = pixel_shader;
16-
self->width_in_tiles = width;
17-
self->height_in_tiles = height;
17+
self->width_in_tiles = common_hal_displayio_tilegrid_get_width(tilegrid);
18+
self->height_in_tiles = common_hal_displayio_tilegrid_get_height(tilegrid);
1819
self->input_color_count = input_color_count;
19-
self->needs_refresh = false;
20-
int mappings_len = width * height;
20+
int mappings_len = self->width_in_tiles * self->height_in_tiles;
2121
self->tile_mappings = (uint32_t **)m_malloc(mappings_len * sizeof(uint32_t *));
2222
for (int i = 0; i < mappings_len; i++) {
2323
self->tile_mappings[i] = (uint32_t *)m_malloc_without_collect(input_color_count * sizeof(uint32_t));
@@ -31,6 +31,7 @@ void common_hal_tilepalettemapper_tilepalettemapper_construct(tilepalettemapper_
3131
}
3232
}
3333
}
34+
common_hal_displayio_tilegrid_set_pixel_shader(self->tilegrid, self);
3435
}
3536

3637
uint16_t common_hal_tilepalettemapper_tilepalettemapper_get_width(tilepalettemapper_tilepalettemapper_t *self) {
@@ -45,6 +46,10 @@ mp_obj_t common_hal_tilepalettemapper_tilepalettemapper_get_pixel_shader(tilepal
4546
return self->pixel_shader;
4647
}
4748

49+
mp_obj_t common_hal_tilepalettemapper_tilepalettemapper_get_tilegrid(tilepalettemapper_tilepalettemapper_t *self) {
50+
return self->tilegrid;
51+
}
52+
4853
mp_obj_t common_hal_tilepalettemapper_tilepalettemapper_get_mapping(tilepalettemapper_tilepalettemapper_t *self, uint16_t x, uint16_t y) {
4954
int index = x + y * self->width_in_tiles;
5055
mp_obj_t result[self->input_color_count];
@@ -67,7 +72,7 @@ void common_hal_tilepalettemapper_tilepalettemapper_set_mapping(tilepalettemappe
6772
mp_arg_validate_int_range(mapping_val, 0, palette_max, MP_QSTR_mapping_value);
6873
self->tile_mappings[y * self->width_in_tiles + x][i] = mapping_val;
6974
}
70-
self->needs_refresh = true;
75+
displayio_tilegrid_mark_tile_dirty(self->tilegrid, x, y);
7176
}
7277

7378
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) {
@@ -90,11 +95,3 @@ void tilepalettemapper_tilepalettemapper_get_color(tilepalettemapper_tilepalette
9095
}
9196

9297
}
93-
94-
bool tilepalettemapper_tilepalettemapper_needs_refresh(tilepalettemapper_tilepalettemapper_t *self) {
95-
return self->needs_refresh;
96-
}
97-
98-
void tilepalettemapper_tilepalettemapper_finish_refresh(tilepalettemapper_tilepalettemapper_t *self) {
99-
self->needs_refresh = false;
100-
}

shared-module/tilepalettemapper/TilePaletteMapper.h

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,11 @@
1616
typedef struct {
1717
mp_obj_base_t base;
1818
mp_obj_t pixel_shader;
19+
mp_obj_t tilegrid;
1920
uint16_t width_in_tiles;
2021
uint16_t height_in_tiles;
2122
uint16_t input_color_count;
2223
uint32_t **tile_mappings;
23-
bool needs_refresh;
2424
} tilepalettemapper_tilepalettemapper_t;
2525

26-
bool tilepalettemapper_tilepalettemapper_needs_refresh(tilepalettemapper_tilepalettemapper_t *self);
27-
void tilepalettemapper_tilepalettemapper_finish_refresh(tilepalettemapper_tilepalettemapper_t *self);
28-
2926
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);

0 commit comments

Comments
 (0)