From 01da5c7c885dada1e14b1a25694ddbac78270725 Mon Sep 17 00:00:00 2001 From: foamyguy Date: Wed, 7 May 2025 15:24:32 -0500 Subject: [PATCH 1/7] 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. --- locale/circuitpython.pot | 22 +++++--- shared-bindings/displayio/TileGrid.c | 8 +-- .../tilepalettemapper/TilePaletteMapper.c | 31 ++++++++--- .../tilepalettemapper/TilePaletteMapper.h | 3 +- shared-module/displayio/Group.c | 3 ++ shared-module/displayio/TileGrid.c | 52 ++++++++----------- shared-module/displayio/TileGrid.h | 2 + .../tilepalettemapper/TilePaletteMapper.c | 27 +++++----- .../tilepalettemapper/TilePaletteMapper.h | 5 +- 9 files changed, 86 insertions(+), 67 deletions(-) diff --git a/locale/circuitpython.pot b/locale/circuitpython.pot index 6beb320527e43..25908c7ec9e43 100644 --- a/locale/circuitpython.pot +++ b/locale/circuitpython.pot @@ -1056,7 +1056,8 @@ msgstr "" msgid "File exists" msgstr "" -#: shared-module/lvfontio/OnDiskFont.c shared-module/os/getenv.c +#: shared-bindings/supervisor/__init__.c shared-module/lvfontio/OnDiskFont.c +#: shared-module/os/getenv.c msgid "File not found" msgstr "" @@ -1251,6 +1252,7 @@ msgstr "" #: ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2040.c py/argcheck.c #: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/epaperdisplay/EPaperDisplay.c shared-bindings/pwmio/PWMOut.c +#: shared-bindings/supervisor/__init__.c #: shared-module/aurora_epaper/aurora_framebuffer.c #: shared-module/lvfontio/OnDiskFont.c msgid "Invalid %q" @@ -2068,6 +2070,10 @@ msgstr "" msgid "Tile width must exactly divide bitmap width" msgstr "" +#: shared-module/displayio/Group.c +msgid "TileGrid must have a pixel_shader" +msgstr "" + #: shared-bindings/alarm/time/TimeAlarm.c msgid "Time is in the past." msgstr "" @@ -2591,16 +2597,16 @@ msgstr "" msgid "bits must be 32 or less" msgstr "" +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "bits_per_sample must be 16" +msgstr "" + #: shared-bindings/audiodelays/Chorus.c shared-bindings/audiodelays/Echo.c #: shared-bindings/audiodelays/MultiTapDelay.c #: shared-bindings/audiodelays/PitchShift.c #: shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiodelays/Reverb.c -msgid "bits_per_sample must be 16" -msgstr "" - -#: shared-bindings/audiodelays/Echo.c shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiofilters/Filter.c shared-bindings/audiomixer/Mixer.c +#: shared-bindings/audiofilters/Filter.c shared-bindings/audiofilters/Phaser.c +#: shared-bindings/audiomixer/Mixer.c msgid "bits_per_sample must be 8 or 16" msgstr "" @@ -4017,7 +4023,7 @@ msgstr "" msgid "rsplit(None,n)" msgstr "" -#: shared-bindings/audiodelays/Reverb.c +#: shared-bindings/audiofreeverb/Freeverb.c msgid "samples_signed must be true" msgstr "" diff --git a/shared-bindings/displayio/TileGrid.c b/shared-bindings/displayio/TileGrid.c index eddf3f66c4ec0..36ba1361de242 100644 --- a/shared-bindings/displayio/TileGrid.c +++ b/shared-bindings/displayio/TileGrid.c @@ -68,7 +68,7 @@ void displayio_tilegrid_validate_pixel_shader(mp_obj_t pixel_shader) { //| tile_width and tile_height match the height of the bitmap by default. //| //| :param Bitmap,OnDiskBitmap bitmap: The bitmap storing one or more tiles. -//| :param ColorConverter,Palette pixel_shader: The pixel shader that produces colors from values +//| :param Optional[ColorConverter,Palette] pixel_shader: The pixel shader that produces colors from values //| :param int width: Width of the grid in tiles. //| :param int height: Height of the grid in tiles. //| :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_ enum { ARG_bitmap, ARG_pixel_shader, ARG_width, ARG_height, ARG_tile_width, ARG_tile_height, ARG_default_tile, ARG_x, ARG_y }; static const mp_arg_t allowed_args[] = { { MP_QSTR_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ }, - { MP_QSTR_pixel_shader, MP_ARG_OBJ | MP_ARG_KW_ONLY | MP_ARG_REQUIRED }, + { MP_QSTR_pixel_shader, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = mp_const_none} }, { MP_QSTR_width, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 1} }, { MP_QSTR_height, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 1} }, { 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_ mp_raise_TypeError_varg(MP_ERROR_TEXT("unsupported %q type"), MP_QSTR_bitmap); } mp_obj_t pixel_shader = args[ARG_pixel_shader].u_obj; - displayio_tilegrid_validate_pixel_shader(pixel_shader); + if (pixel_shader != mp_const_none) { + displayio_tilegrid_validate_pixel_shader(pixel_shader); + } uint16_t tile_width = args[ARG_tile_width].u_int; if (tile_width == 0) { tile_width = bitmap_width; diff --git a/shared-bindings/tilepalettemapper/TilePaletteMapper.c b/shared-bindings/tilepalettemapper/TilePaletteMapper.c index 88189de549dbb..cf18e37ba120f 100644 --- a/shared-bindings/tilepalettemapper/TilePaletteMapper.c +++ b/shared-bindings/tilepalettemapper/TilePaletteMapper.c @@ -12,6 +12,7 @@ #include "shared-bindings/util.h" #include "shared-bindings/displayio/Palette.h" #include "shared-bindings/displayio/ColorConverter.h" +#include "shared-bindings/displayio/TileGrid.h" #include "shared-bindings/tilepalettemapper/TilePaletteMapper.h" //| class TilePaletteMapper: @@ -21,24 +22,23 @@ //| bitmap with a wider array of colors.""" //| //| def __init__( -//| self, palette: displayio.Palette, input_color_count: int, width: int, height: int +//| self, palette: displayio.Palette, input_color_count: int, tilegrid: TileGrid //| ) -> None: //| """Create a TilePaletteMApper object to store a set of color mappings for tiles. //| //| :param Union[displayio.Palette, displayio.ColorConverter] pixel_shader: //| The palette or ColorConverter to get mapped colors from. //| :param int input_color_count: The number of colors in in the input bitmap. -//| :param int width: The width of the grid in tiles. -//| :param int height: The height of the grid in tiles.""" +//| :param TileGrid tilegrid: The tilegrid to use with the TilePaletteMapper //| 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) { - enum { ARG_pixel_shader, ARG_input_color_count, ARG_width, ARG_height }; + enum { ARG_pixel_shader, ARG_input_color_count, ARG_tilegrid }; static const mp_arg_t allowed_args[] = { { MP_QSTR_pixel_shader, MP_ARG_OBJ | MP_ARG_REQUIRED }, { MP_QSTR_input_color_count, MP_ARG_INT | MP_ARG_REQUIRED }, - { MP_QSTR_width, MP_ARG_INT | MP_ARG_REQUIRED }, - { MP_QSTR_height, MP_ARG_INT | MP_ARG_REQUIRED }, + { MP_QSTR_tilegrid, MP_ARG_OBJ | MP_ARG_REQUIRED }, + }; mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); @@ -46,8 +46,14 @@ static mp_obj_t tilepalettemapper_tilepalettemapper_make_new(const mp_obj_type_t if (!mp_obj_is_type(pixel_shader, &displayio_palette_type) && !mp_obj_is_type(pixel_shader, &displayio_colorconverter_type)) { mp_raise_TypeError_varg(MP_ERROR_TEXT("unsupported %q type"), MP_QSTR_pixel_shader); } + + mp_obj_t tilegrid = args[ARG_tilegrid].u_obj; + if (!mp_obj_is_type(tilegrid, &displayio_tilegrid_type)) { + mp_raise_TypeError_varg(MP_ERROR_TEXT("unsupported %q type"), MP_QSTR_tilegrid); + } + tilepalettemapper_tilepalettemapper_t *self = mp_obj_malloc(tilepalettemapper_tilepalettemapper_t, &tilepalettemapper_tilepalettemapper_type); - 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); + common_hal_tilepalettemapper_tilepalettemapper_construct(self, pixel_shader, args[ARG_input_color_count].u_int, tilegrid); return MP_OBJ_FROM_PTR(self); } @@ -87,6 +93,17 @@ MP_DEFINE_CONST_FUN_OBJ_1(tilepalettemapper_tilepalettemapper_get_pixel_shader_o MP_PROPERTY_GETTER(tilepalettemapper_tilepalettemapper_palette_obj, (mp_obj_t)&tilepalettemapper_tilepalettemapper_get_pixel_shader_obj); +//| tilegrid: displayio.TileGrid +//| """The tilegrid that the TilePaletteMapper is used on.""" +//| +static mp_obj_t tilepalettemapper_tilepalettemapper_obj_get_tilegrid(mp_obj_t self_in) { + tilepalettemapper_tilepalettemapper_t *self = MP_OBJ_TO_PTR(self_in); + return common_hal_tilepalettemapper_tilepalettemapper_get_tilegrid(self); +} +MP_DEFINE_CONST_FUN_OBJ_1(tilepalettemapper_tilepalettemapper_get_tilegrid_obj, tilepalettemapper_tilepalettemapper_obj_get_tilegrid); + +MP_PROPERTY_GETTER(tilepalettemapper_tilepalettemapper_tilegrid_obj, + (mp_obj_t)&tilepalettemapper_tilepalettemapper_get_tilegrid_obj); //| def __getitem__(self, index: Union[Tuple[int, int], int]) -> Tuple[int]: //| """Returns the mapping for the given index. The index can either be an x,y tuple or an int equal diff --git a/shared-bindings/tilepalettemapper/TilePaletteMapper.h b/shared-bindings/tilepalettemapper/TilePaletteMapper.h index 3fa1ab1e3a5cc..2063dc4e8848e 100644 --- a/shared-bindings/tilepalettemapper/TilePaletteMapper.h +++ b/shared-bindings/tilepalettemapper/TilePaletteMapper.h @@ -8,11 +8,12 @@ extern const mp_obj_type_t tilepalettemapper_tilepalettemapper_type; void common_hal_tilepalettemapper_tilepalettemapper_construct(tilepalettemapper_tilepalettemapper_t *self, - mp_obj_t paltte, uint16_t input_color_count, uint16_t bitmap_width_in_tiles, uint16_t bitmap_height_in_tiles); + mp_obj_t paltte, uint16_t input_color_count, mp_obj_t tilegrid); uint16_t common_hal_tilepalettemapper_tilepalettemapper_get_width(tilepalettemapper_tilepalettemapper_t *self); uint16_t common_hal_tilepalettemapper_tilepalettemapper_get_height(tilepalettemapper_tilepalettemapper_t *self); mp_obj_t common_hal_tilepalettemapper_tilepalettemapper_get_pixel_shader(tilepalettemapper_tilepalettemapper_t *self); +mp_obj_t common_hal_tilepalettemapper_tilepalettemapper_get_tilegrid(tilepalettemapper_tilepalettemapper_t *self); mp_obj_t common_hal_tilepalettemapper_tilepalettemapper_get_mapping(tilepalettemapper_tilepalettemapper_t *self, uint16_t x, uint16_t y); void common_hal_tilepalettemapper_tilepalettemapper_set_mapping(tilepalettemapper_tilepalettemapper_t *self, uint16_t x, uint16_t y, size_t len, mp_obj_t *items); diff --git a/shared-module/displayio/Group.c b/shared-module/displayio/Group.c index e2a1a527062b8..f4a984c0dff19 100644 --- a/shared-module/displayio/Group.c +++ b/shared-module/displayio/Group.c @@ -258,6 +258,9 @@ static void _add_layer(displayio_group_t *self, mp_obj_t layer) { mp_obj_t native_layer = mp_obj_cast_to_native_base(layer, &displayio_tilegrid_type); if (native_layer != MP_OBJ_NULL) { displayio_tilegrid_t *tilegrid = native_layer; + if (tilegrid->pixel_shader == mp_const_none) { + mp_raise_ValueError(MP_ERROR_TEXT("TileGrid must have a pixel_shader")); + } if (tilegrid->in_group) { mp_raise_ValueError(MP_ERROR_TEXT("Layer already in a group")); } else { diff --git a/shared-module/displayio/TileGrid.c b/shared-module/displayio/TileGrid.c index cfa97130b6aa0..b97f52ebac022 100644 --- a/shared-module/displayio/TileGrid.c +++ b/shared-module/displayio/TileGrid.c @@ -275,25 +275,7 @@ uint16_t common_hal_displayio_tilegrid_get_tile(displayio_tilegrid_t *self, uint } } -void common_hal_displayio_tilegrid_set_tile(displayio_tilegrid_t *self, uint16_t x, uint16_t y, uint16_t tile_index) { - if (tile_index >= self->tiles_in_bitmap) { - mp_raise_ValueError(MP_ERROR_TEXT("Tile index out of bounds")); - } - - void *tiles = self->tiles; - if (self->inline_tiles) { - tiles = &self->tiles; - } - if (tiles == NULL) { - return; - } - - uint32_t index = y * self->width_in_tiles + x; - if (self->tiles_in_bitmap > 255) { - ((uint16_t *)tiles)[index] = tile_index; - } else { - ((uint8_t *)tiles)[index] = (uint8_t)tile_index; - } +void displayio_tilegrid_mark_tile_dirty(displayio_tilegrid_t *self, uint16_t x, uint16_t y) { displayio_area_t temp_area; displayio_area_t *tile_area; if (!self->partial_change) { @@ -318,6 +300,28 @@ void common_hal_displayio_tilegrid_set_tile(displayio_tilegrid_t *self, uint16_t displayio_area_union(&self->dirty_area, &temp_area, &self->dirty_area); } +} + +void common_hal_displayio_tilegrid_set_tile(displayio_tilegrid_t *self, uint16_t x, uint16_t y, uint16_t tile_index) { + if (tile_index >= self->tiles_in_bitmap) { + mp_raise_ValueError(MP_ERROR_TEXT("Tile index out of bounds")); + } + + void *tiles = self->tiles; + if (self->inline_tiles) { + tiles = &self->tiles; + } + if (tiles == NULL) { + return; + } + + uint32_t index = y * self->width_in_tiles + x; + if (self->tiles_in_bitmap > 255) { + ((uint16_t *)tiles)[index] = tile_index; + } else { + ((uint8_t *)tiles)[index] = (uint8_t)tile_index; + } + displayio_tilegrid_mark_tile_dirty(self, x, y); self->partial_change = true; } @@ -613,11 +617,6 @@ void displayio_tilegrid_finish_refresh(displayio_tilegrid_t *self) { } else if (mp_obj_is_type(self->pixel_shader, &displayio_colorconverter_type)) { displayio_colorconverter_finish_refresh(self->pixel_shader); } - #if CIRCUITPY_TILEPALETTEMAPPER - if (mp_obj_is_type(self->pixel_shader, &tilepalettemapper_tilepalettemapper_type)) { - tilepalettemapper_tilepalettemapper_finish_refresh(self->pixel_shader); - } - #endif if (mp_obj_is_type(self->bitmap, &displayio_bitmap_type)) { displayio_bitmap_finish_refresh(self->bitmap); } 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 displayio_palette_needs_refresh(self->pixel_shader)) || (mp_obj_is_type(self->pixel_shader, &displayio_colorconverter_type) && displayio_colorconverter_needs_refresh(self->pixel_shader)); - #if CIRCUITPY_TILEPALETTEMAPPER - self->full_change = self->full_change || - (mp_obj_is_type(self->pixel_shader, &tilepalettemapper_tilepalettemapper_type) && - tilepalettemapper_tilepalettemapper_needs_refresh(self->pixel_shader)); - #endif if (self->full_change || first_draw) { self->current_area.next = tail; diff --git a/shared-module/displayio/TileGrid.h b/shared-module/displayio/TileGrid.h index 400ade5359827..0051cc0ebf19d 100644 --- a/shared-module/displayio/TileGrid.h +++ b/shared-module/displayio/TileGrid.h @@ -68,3 +68,5 @@ void displayio_tilegrid_finish_refresh(displayio_tilegrid_t *self); bool displayio_tilegrid_get_rendered_hidden(displayio_tilegrid_t *self); void displayio_tilegrid_validate_pixel_shader(mp_obj_t pixel_shader); + +void displayio_tilegrid_mark_tile_dirty(displayio_tilegrid_t *self, uint16_t x, uint16_t y); diff --git a/shared-module/tilepalettemapper/TilePaletteMapper.c b/shared-module/tilepalettemapper/TilePaletteMapper.c index fb784fd441b9b..31447eb1963b5 100644 --- a/shared-module/tilepalettemapper/TilePaletteMapper.c +++ b/shared-module/tilepalettemapper/TilePaletteMapper.c @@ -8,16 +8,16 @@ #include "shared-bindings/tilepalettemapper/TilePaletteMapper.h" #include "shared-bindings/displayio/Palette.h" #include "shared-bindings/displayio/ColorConverter.h" +#include "shared-bindings/displayio/TileGrid.h" void common_hal_tilepalettemapper_tilepalettemapper_construct(tilepalettemapper_tilepalettemapper_t *self, - mp_obj_t pixel_shader, uint16_t input_color_count, uint16_t width, uint16_t height) { - + mp_obj_t pixel_shader, uint16_t input_color_count, mp_obj_t tilegrid) { + self->tilegrid = tilegrid; self->pixel_shader = pixel_shader; - self->width_in_tiles = width; - self->height_in_tiles = height; + self->width_in_tiles = common_hal_displayio_tilegrid_get_width(tilegrid); + self->height_in_tiles = common_hal_displayio_tilegrid_get_height(tilegrid); self->input_color_count = input_color_count; - self->needs_refresh = false; - int mappings_len = width * height; + int mappings_len = self->width_in_tiles * self->height_in_tiles; self->tile_mappings = (uint32_t **)m_malloc(mappings_len * sizeof(uint32_t *)); for (int i = 0; i < mappings_len; i++) { 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_ } } } + common_hal_displayio_tilegrid_set_pixel_shader(self->tilegrid, self); } 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 return self->pixel_shader; } +mp_obj_t common_hal_tilepalettemapper_tilepalettemapper_get_tilegrid(tilepalettemapper_tilepalettemapper_t *self) { + return self->tilegrid; +} + mp_obj_t common_hal_tilepalettemapper_tilepalettemapper_get_mapping(tilepalettemapper_tilepalettemapper_t *self, uint16_t x, uint16_t y) { int index = x + y * self->width_in_tiles; mp_obj_t result[self->input_color_count]; @@ -67,7 +72,7 @@ void common_hal_tilepalettemapper_tilepalettemapper_set_mapping(tilepalettemappe mp_arg_validate_int_range(mapping_val, 0, palette_max, MP_QSTR_mapping_value); self->tile_mappings[y * self->width_in_tiles + x][i] = mapping_val; } - self->needs_refresh = true; + displayio_tilegrid_mark_tile_dirty(self->tilegrid, x, y); } 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 } } - -bool tilepalettemapper_tilepalettemapper_needs_refresh(tilepalettemapper_tilepalettemapper_t *self) { - return self->needs_refresh; -} - -void tilepalettemapper_tilepalettemapper_finish_refresh(tilepalettemapper_tilepalettemapper_t *self) { - self->needs_refresh = false; -} diff --git a/shared-module/tilepalettemapper/TilePaletteMapper.h b/shared-module/tilepalettemapper/TilePaletteMapper.h index 98226ae7e04fa..a56043f867aca 100644 --- a/shared-module/tilepalettemapper/TilePaletteMapper.h +++ b/shared-module/tilepalettemapper/TilePaletteMapper.h @@ -16,14 +16,11 @@ typedef struct { mp_obj_base_t base; mp_obj_t pixel_shader; + mp_obj_t tilegrid; uint16_t width_in_tiles; uint16_t height_in_tiles; uint16_t input_color_count; uint32_t **tile_mappings; - bool needs_refresh; } tilepalettemapper_tilepalettemapper_t; -bool tilepalettemapper_tilepalettemapper_needs_refresh(tilepalettemapper_tilepalettemapper_t *self); -void tilepalettemapper_tilepalettemapper_finish_refresh(tilepalettemapper_tilepalettemapper_t *self); - 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); From f2de64c8835649a4e1dc24ee849e23f7801d0e4d Mon Sep 17 00:00:00 2001 From: foamyguy Date: Wed, 7 May 2025 16:21:17 -0500 Subject: [PATCH 2/7] set partial_change flag from mark_tile_dirty --- shared-module/displayio/TileGrid.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/shared-module/displayio/TileGrid.c b/shared-module/displayio/TileGrid.c index b97f52ebac022..a1a37bf4d293e 100644 --- a/shared-module/displayio/TileGrid.c +++ b/shared-module/displayio/TileGrid.c @@ -299,7 +299,7 @@ void displayio_tilegrid_mark_tile_dirty(displayio_tilegrid_t *self, uint16_t x, if (self->partial_change) { displayio_area_union(&self->dirty_area, &temp_area, &self->dirty_area); } - + self->partial_change = true; } void common_hal_displayio_tilegrid_set_tile(displayio_tilegrid_t *self, uint16_t x, uint16_t y, uint16_t tile_index) { @@ -322,7 +322,6 @@ void common_hal_displayio_tilegrid_set_tile(displayio_tilegrid_t *self, uint16_t ((uint8_t *)tiles)[index] = (uint8_t)tile_index; } displayio_tilegrid_mark_tile_dirty(self, x, y); - self->partial_change = true; } void common_hal_displayio_tilegrid_set_all_tiles(displayio_tilegrid_t *self, uint16_t tile_index) { From eb7fc97fb2c507c4c09f450337062a25709978a2 Mon Sep 17 00:00:00 2001 From: foamyguy Date: Wed, 7 May 2025 18:59:19 -0500 Subject: [PATCH 3/7] fix docstring triple quote. --- shared-bindings/tilepalettemapper/TilePaletteMapper.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared-bindings/tilepalettemapper/TilePaletteMapper.c b/shared-bindings/tilepalettemapper/TilePaletteMapper.c index cf18e37ba120f..ce78738f90397 100644 --- a/shared-bindings/tilepalettemapper/TilePaletteMapper.c +++ b/shared-bindings/tilepalettemapper/TilePaletteMapper.c @@ -29,7 +29,7 @@ //| :param Union[displayio.Palette, displayio.ColorConverter] pixel_shader: //| The palette or ColorConverter to get mapped colors from. //| :param int input_color_count: The number of colors in in the input bitmap. -//| :param TileGrid tilegrid: The tilegrid to use with the TilePaletteMapper +//| :param TileGrid tilegrid: The tilegrid to use with the TilePaletteMapper""" //| 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) { From 1b894c5e4efef752c70b9a403c4f87d9b6703dfc Mon Sep 17 00:00:00 2001 From: foamyguy Date: Thu, 8 May 2025 07:55:55 -0500 Subject: [PATCH 4/7] fix TileGrid type in docstring --- shared-bindings/tilepalettemapper/TilePaletteMapper.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/shared-bindings/tilepalettemapper/TilePaletteMapper.c b/shared-bindings/tilepalettemapper/TilePaletteMapper.c index ce78738f90397..f1ac89807c8e0 100644 --- a/shared-bindings/tilepalettemapper/TilePaletteMapper.c +++ b/shared-bindings/tilepalettemapper/TilePaletteMapper.c @@ -22,7 +22,7 @@ //| bitmap with a wider array of colors.""" //| //| def __init__( -//| self, palette: displayio.Palette, input_color_count: int, tilegrid: TileGrid +//| self, palette: displayio.Palette, input_color_count: int, tilegrid: displayio.TileGrid //| ) -> None: //| """Create a TilePaletteMApper object to store a set of color mappings for tiles. //| @@ -94,7 +94,7 @@ MP_PROPERTY_GETTER(tilepalettemapper_tilepalettemapper_palette_obj, (mp_obj_t)&tilepalettemapper_tilepalettemapper_get_pixel_shader_obj); //| tilegrid: displayio.TileGrid -//| """The tilegrid that the TilePaletteMapper is used on.""" +//| """The TileGrid that the TilePaletteMapper is used with.""" //| static mp_obj_t tilepalettemapper_tilepalettemapper_obj_get_tilegrid(mp_obj_t self_in) { tilepalettemapper_tilepalettemapper_t *self = MP_OBJ_TO_PTR(self_in); From 4fb7d447144c2a9d821d68ac855af4e3125b337a Mon Sep 17 00:00:00 2001 From: foamyguy Date: Thu, 8 May 2025 18:08:56 -0500 Subject: [PATCH 5/7] 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 --- shared-bindings/displayio/TileGrid.c | 8 ++-- .../tilepalettemapper/TilePaletteMapper.c | 14 ++----- .../tilepalettemapper/TilePaletteMapper.h | 2 +- shared-module/displayio/Group.c | 3 -- shared-module/displayio/TileGrid.c | 10 +++++ .../tilepalettemapper/TilePaletteMapper.c | 41 ++++++++++--------- .../tilepalettemapper/TilePaletteMapper.h | 2 + 7 files changed, 42 insertions(+), 38 deletions(-) diff --git a/shared-bindings/displayio/TileGrid.c b/shared-bindings/displayio/TileGrid.c index 36ba1361de242..eddf3f66c4ec0 100644 --- a/shared-bindings/displayio/TileGrid.c +++ b/shared-bindings/displayio/TileGrid.c @@ -68,7 +68,7 @@ void displayio_tilegrid_validate_pixel_shader(mp_obj_t pixel_shader) { //| tile_width and tile_height match the height of the bitmap by default. //| //| :param Bitmap,OnDiskBitmap bitmap: The bitmap storing one or more tiles. -//| :param Optional[ColorConverter,Palette] pixel_shader: The pixel shader that produces colors from values +//| :param ColorConverter,Palette pixel_shader: The pixel shader that produces colors from values //| :param int width: Width of the grid in tiles. //| :param int height: Height of the grid in tiles. //| :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_ enum { ARG_bitmap, ARG_pixel_shader, ARG_width, ARG_height, ARG_tile_width, ARG_tile_height, ARG_default_tile, ARG_x, ARG_y }; static const mp_arg_t allowed_args[] = { { MP_QSTR_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ }, - { MP_QSTR_pixel_shader, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = mp_const_none} }, + { MP_QSTR_pixel_shader, MP_ARG_OBJ | MP_ARG_KW_ONLY | MP_ARG_REQUIRED }, { MP_QSTR_width, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 1} }, { MP_QSTR_height, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 1} }, { 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_ mp_raise_TypeError_varg(MP_ERROR_TEXT("unsupported %q type"), MP_QSTR_bitmap); } mp_obj_t pixel_shader = args[ARG_pixel_shader].u_obj; - if (pixel_shader != mp_const_none) { - displayio_tilegrid_validate_pixel_shader(pixel_shader); - } + displayio_tilegrid_validate_pixel_shader(pixel_shader); uint16_t tile_width = args[ARG_tile_width].u_int; if (tile_width == 0) { tile_width = bitmap_width; diff --git a/shared-bindings/tilepalettemapper/TilePaletteMapper.c b/shared-bindings/tilepalettemapper/TilePaletteMapper.c index f1ac89807c8e0..3b115546970c9 100644 --- a/shared-bindings/tilepalettemapper/TilePaletteMapper.c +++ b/shared-bindings/tilepalettemapper/TilePaletteMapper.c @@ -22,22 +22,20 @@ //| bitmap with a wider array of colors.""" //| //| def __init__( -//| self, palette: displayio.Palette, input_color_count: int, tilegrid: displayio.TileGrid +//| self, palette: displayio.Palette, input_color_count: int //| ) -> None: //| """Create a TilePaletteMApper object to store a set of color mappings for tiles. //| //| :param Union[displayio.Palette, displayio.ColorConverter] pixel_shader: //| The palette or ColorConverter to get mapped colors from. -//| :param int input_color_count: The number of colors in in the input bitmap. -//| :param TileGrid tilegrid: The tilegrid to use with the TilePaletteMapper""" +//| :param int input_color_count: The number of colors in in the input bitmap.""" //| 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) { - enum { ARG_pixel_shader, ARG_input_color_count, ARG_tilegrid }; + enum { ARG_pixel_shader, ARG_input_color_count }; static const mp_arg_t allowed_args[] = { { MP_QSTR_pixel_shader, MP_ARG_OBJ | MP_ARG_REQUIRED }, { MP_QSTR_input_color_count, MP_ARG_INT | MP_ARG_REQUIRED }, - { MP_QSTR_tilegrid, MP_ARG_OBJ | MP_ARG_REQUIRED }, }; 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 mp_raise_TypeError_varg(MP_ERROR_TEXT("unsupported %q type"), MP_QSTR_pixel_shader); } - mp_obj_t tilegrid = args[ARG_tilegrid].u_obj; - if (!mp_obj_is_type(tilegrid, &displayio_tilegrid_type)) { - mp_raise_TypeError_varg(MP_ERROR_TEXT("unsupported %q type"), MP_QSTR_tilegrid); - } tilepalettemapper_tilepalettemapper_t *self = mp_obj_malloc(tilepalettemapper_tilepalettemapper_t, &tilepalettemapper_tilepalettemapper_type); - common_hal_tilepalettemapper_tilepalettemapper_construct(self, pixel_shader, args[ARG_input_color_count].u_int, tilegrid); + common_hal_tilepalettemapper_tilepalettemapper_construct(self, pixel_shader, args[ARG_input_color_count].u_int); return MP_OBJ_FROM_PTR(self); } diff --git a/shared-bindings/tilepalettemapper/TilePaletteMapper.h b/shared-bindings/tilepalettemapper/TilePaletteMapper.h index 2063dc4e8848e..ef0d949591722 100644 --- a/shared-bindings/tilepalettemapper/TilePaletteMapper.h +++ b/shared-bindings/tilepalettemapper/TilePaletteMapper.h @@ -8,7 +8,7 @@ extern const mp_obj_type_t tilepalettemapper_tilepalettemapper_type; void common_hal_tilepalettemapper_tilepalettemapper_construct(tilepalettemapper_tilepalettemapper_t *self, - mp_obj_t paltte, uint16_t input_color_count, mp_obj_t tilegrid); + mp_obj_t paltte, uint16_t input_color_count); uint16_t common_hal_tilepalettemapper_tilepalettemapper_get_width(tilepalettemapper_tilepalettemapper_t *self); diff --git a/shared-module/displayio/Group.c b/shared-module/displayio/Group.c index f4a984c0dff19..e2a1a527062b8 100644 --- a/shared-module/displayio/Group.c +++ b/shared-module/displayio/Group.c @@ -258,9 +258,6 @@ static void _add_layer(displayio_group_t *self, mp_obj_t layer) { mp_obj_t native_layer = mp_obj_cast_to_native_base(layer, &displayio_tilegrid_type); if (native_layer != MP_OBJ_NULL) { displayio_tilegrid_t *tilegrid = native_layer; - if (tilegrid->pixel_shader == mp_const_none) { - mp_raise_ValueError(MP_ERROR_TEXT("TileGrid must have a pixel_shader")); - } if (tilegrid->in_group) { mp_raise_ValueError(MP_ERROR_TEXT("Layer already in a group")); } else { diff --git a/shared-module/displayio/TileGrid.c b/shared-module/displayio/TileGrid.c index a1a37bf4d293e..b5c691ccbd6ce 100644 --- a/shared-module/displayio/TileGrid.c +++ b/shared-module/displayio/TileGrid.c @@ -81,6 +81,11 @@ void common_hal_displayio_tilegrid_construct(displayio_tilegrid_t *self, mp_obj_ self->flip_y = false; self->transpose_xy = false; self->absolute_transform = NULL; + #if CIRCUITPY_TILEPALETTEMAPPER + if (mp_obj_is_type(self->pixel_shader, &tilepalettemapper_tilepalettemapper_type)) { + tilepalettemapper_tilepalettemapper_bind(self->pixel_shader, self); + } + #endif } @@ -231,6 +236,11 @@ mp_obj_t common_hal_displayio_tilegrid_get_pixel_shader(displayio_tilegrid_t *se void common_hal_displayio_tilegrid_set_pixel_shader(displayio_tilegrid_t *self, mp_obj_t pixel_shader) { self->pixel_shader = pixel_shader; self->full_change = true; + #if CIRCUITPY_TILEPALETTEMAPPER + if (mp_obj_is_type(self->pixel_shader, &tilepalettemapper_tilepalettemapper_type)) { + tilepalettemapper_tilepalettemapper_bind(self->pixel_shader, self); + } + #endif } mp_obj_t common_hal_displayio_tilegrid_get_bitmap(displayio_tilegrid_t *self) { diff --git a/shared-module/tilepalettemapper/TilePaletteMapper.c b/shared-module/tilepalettemapper/TilePaletteMapper.c index 31447eb1963b5..b1d1eb24c6f87 100644 --- a/shared-module/tilepalettemapper/TilePaletteMapper.c +++ b/shared-module/tilepalettemapper/TilePaletteMapper.c @@ -11,27 +11,9 @@ #include "shared-bindings/displayio/TileGrid.h" void common_hal_tilepalettemapper_tilepalettemapper_construct(tilepalettemapper_tilepalettemapper_t *self, - mp_obj_t pixel_shader, uint16_t input_color_count, mp_obj_t tilegrid) { - self->tilegrid = tilegrid; + mp_obj_t pixel_shader, uint16_t input_color_count) { self->pixel_shader = pixel_shader; - self->width_in_tiles = common_hal_displayio_tilegrid_get_width(tilegrid); - self->height_in_tiles = common_hal_displayio_tilegrid_get_height(tilegrid); self->input_color_count = input_color_count; - int mappings_len = self->width_in_tiles * self->height_in_tiles; - self->tile_mappings = (uint32_t **)m_malloc(mappings_len * sizeof(uint32_t *)); - for (int i = 0; i < mappings_len; i++) { - self->tile_mappings[i] = (uint32_t *)m_malloc_without_collect(input_color_count * sizeof(uint32_t)); - if (mp_obj_is_type(self->pixel_shader, &displayio_palette_type)) { - for (uint16_t j = 0; j < input_color_count; j++) { - self->tile_mappings[i][j] = j; - } - } else if (mp_obj_is_type(self->pixel_shader, &displayio_colorconverter_type)) { - for (uint16_t j = 0; j < input_color_count; j++) { - self->tile_mappings[i][j] = 0; - } - } - } - common_hal_displayio_tilegrid_set_pixel_shader(self->tilegrid, self); } uint16_t common_hal_tilepalettemapper_tilepalettemapper_get_width(tilepalettemapper_tilepalettemapper_t *self) { @@ -95,3 +77,24 @@ void tilepalettemapper_tilepalettemapper_get_color(tilepalettemapper_tilepalette } } + +void tilepalettemapper_tilepalettemapper_bind(tilepalettemapper_tilepalettemapper_t *self, displayio_tilegrid_t *tilegrid) { + self->tilegrid = tilegrid; + self->width_in_tiles = common_hal_displayio_tilegrid_get_width(tilegrid); + self->height_in_tiles = common_hal_displayio_tilegrid_get_height(tilegrid); + + int mappings_len = self->width_in_tiles * self->height_in_tiles; + self->tile_mappings = (uint32_t **)m_malloc(mappings_len * sizeof(uint32_t *)); + for (int i = 0; i < mappings_len; i++) { + self->tile_mappings[i] = (uint32_t *)m_malloc_without_collect(self->input_color_count * sizeof(uint32_t)); + if (mp_obj_is_type(self->pixel_shader, &displayio_palette_type)) { + for (uint16_t j = 0; j < self->input_color_count; j++) { + self->tile_mappings[i][j] = j; + } + } else if (mp_obj_is_type(self->pixel_shader, &displayio_colorconverter_type)) { + for (uint16_t j = 0; j < self->input_color_count; j++) { + self->tile_mappings[i][j] = 0; + } + } + } +} diff --git a/shared-module/tilepalettemapper/TilePaletteMapper.h b/shared-module/tilepalettemapper/TilePaletteMapper.h index a56043f867aca..d1f535eda11bb 100644 --- a/shared-module/tilepalettemapper/TilePaletteMapper.h +++ b/shared-module/tilepalettemapper/TilePaletteMapper.h @@ -12,6 +12,7 @@ #include "py/obj.h" #include "shared-module/displayio/Palette.h" +#include "shared-module/displayio/TileGrid.h" typedef struct { mp_obj_base_t base; @@ -24,3 +25,4 @@ typedef struct { } tilepalettemapper_tilepalettemapper_t; 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); +void tilepalettemapper_tilepalettemapper_bind(tilepalettemapper_tilepalettemapper_t *self, displayio_tilegrid_t *tilegrid); From 04b98ed71fc92315018d78b1704e7baf67d93c4e Mon Sep 17 00:00:00 2001 From: foamyguy Date: Fri, 9 May 2025 09:56:34 -0500 Subject: [PATCH 6/7] fix pixel_shader property name, add tilegrid property and set tilegrid to None before it is bound, disallow TPM from being bound multiple times. --- locale/circuitpython.pot | 4 ++-- shared-bindings/tilepalettemapper/TilePaletteMapper.c | 5 +++-- shared-module/tilepalettemapper/TilePaletteMapper.c | 4 ++++ 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/locale/circuitpython.pot b/locale/circuitpython.pot index 25908c7ec9e43..6dc0262d2f629 100644 --- a/locale/circuitpython.pot +++ b/locale/circuitpython.pot @@ -2070,8 +2070,8 @@ msgstr "" msgid "Tile width must exactly divide bitmap width" msgstr "" -#: shared-module/displayio/Group.c -msgid "TileGrid must have a pixel_shader" +#: shared-module/tilepalettemapper/TilePaletteMapper.c +msgid "TilePaletteMapper may only be bound to a TileGrid once" msgstr "" #: shared-bindings/alarm/time/TimeAlarm.c diff --git a/shared-bindings/tilepalettemapper/TilePaletteMapper.c b/shared-bindings/tilepalettemapper/TilePaletteMapper.c index 3b115546970c9..ed3e928957f9f 100644 --- a/shared-bindings/tilepalettemapper/TilePaletteMapper.c +++ b/shared-bindings/tilepalettemapper/TilePaletteMapper.c @@ -84,7 +84,7 @@ static mp_obj_t tilepalettemapper_tilepalettemapper_obj_get_pixel_shader(mp_obj_ } MP_DEFINE_CONST_FUN_OBJ_1(tilepalettemapper_tilepalettemapper_get_pixel_shader_obj, tilepalettemapper_tilepalettemapper_obj_get_pixel_shader); -MP_PROPERTY_GETTER(tilepalettemapper_tilepalettemapper_palette_obj, +MP_PROPERTY_GETTER(tilepalettemapper_tilepalettemapper_pixel_shader_obj, (mp_obj_t)&tilepalettemapper_tilepalettemapper_get_pixel_shader_obj); //| tilegrid: displayio.TileGrid @@ -165,7 +165,8 @@ static mp_obj_t tilepalettemapper_subscr(mp_obj_t self_in, mp_obj_t index_obj, m static const mp_rom_map_elem_t tilepalettemapper_tilepalettemapper_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_width), MP_ROM_PTR(&tilepalettemapper_tilepalettemapper_width_obj) }, { MP_ROM_QSTR(MP_QSTR_height), MP_ROM_PTR(&tilepalettemapper_tilepalettemapper_height_obj) }, - { MP_ROM_QSTR(MP_QSTR_palette), MP_ROM_PTR(&tilepalettemapper_tilepalettemapper_palette_obj) }, + { MP_ROM_QSTR(MP_QSTR_pixel_shader), MP_ROM_PTR(&tilepalettemapper_tilepalettemapper_pixel_shader_obj) }, + { MP_ROM_QSTR(MP_QSTR_tilegrid), MP_ROM_PTR(&tilepalettemapper_tilepalettemapper_tilegrid_obj) }, }; static MP_DEFINE_CONST_DICT(tilepalettemapper_tilepalettemapper_locals_dict, tilepalettemapper_tilepalettemapper_locals_dict_table); diff --git a/shared-module/tilepalettemapper/TilePaletteMapper.c b/shared-module/tilepalettemapper/TilePaletteMapper.c index b1d1eb24c6f87..13711b2c2537d 100644 --- a/shared-module/tilepalettemapper/TilePaletteMapper.c +++ b/shared-module/tilepalettemapper/TilePaletteMapper.c @@ -14,6 +14,7 @@ void common_hal_tilepalettemapper_tilepalettemapper_construct(tilepalettemapper_ mp_obj_t pixel_shader, uint16_t input_color_count) { self->pixel_shader = pixel_shader; self->input_color_count = input_color_count; + self->tilegrid = mp_const_none; } uint16_t common_hal_tilepalettemapper_tilepalettemapper_get_width(tilepalettemapper_tilepalettemapper_t *self) { @@ -79,6 +80,9 @@ void tilepalettemapper_tilepalettemapper_get_color(tilepalettemapper_tilepalette } void tilepalettemapper_tilepalettemapper_bind(tilepalettemapper_tilepalettemapper_t *self, displayio_tilegrid_t *tilegrid) { + if (self->tilegrid != mp_const_none) { + mp_raise_RuntimeError(MP_ERROR_TEXT("TilePaletteMapper may only be bound to a TileGrid once")); + } self->tilegrid = tilegrid; self->width_in_tiles = common_hal_displayio_tilegrid_get_width(tilegrid); self->height_in_tiles = common_hal_displayio_tilegrid_get_height(tilegrid); From 6fcdf1418d3f9153adc1bcc64e6daa8cf667927b Mon Sep 17 00:00:00 2001 From: foamyguy Date: Fri, 9 May 2025 12:15:36 -0500 Subject: [PATCH 7/7] disable tilepalettemapper for overflowing boards --- ports/espressif/boards/ai_thinker_esp32-c3s/mpconfigboard.mk | 1 + ports/espressif/boards/beetle-esp32-c3/mpconfigboard.mk | 1 + ports/espressif/boards/lolin_c3_mini/mpconfigboard.mk | 1 + ports/espressif/boards/microdev_micro_c3/mpconfigboard.mk | 1 + 4 files changed, 4 insertions(+) diff --git a/ports/espressif/boards/ai_thinker_esp32-c3s/mpconfigboard.mk b/ports/espressif/boards/ai_thinker_esp32-c3s/mpconfigboard.mk index f907853f2382e..366586c1d5568 100644 --- a/ports/espressif/boards/ai_thinker_esp32-c3s/mpconfigboard.mk +++ b/ports/espressif/boards/ai_thinker_esp32-c3s/mpconfigboard.mk @@ -10,3 +10,4 @@ CIRCUITPY_ESP_FLASH_SIZE = 4MB CIRCUITPY_LEGACY_4MB_FLASH_LAYOUT = 1 CIRCUITPY_ESP_USB_SERIAL_JTAG = 0 +CIRCUITPY_TILEPALETTEMAPPER = 0 diff --git a/ports/espressif/boards/beetle-esp32-c3/mpconfigboard.mk b/ports/espressif/boards/beetle-esp32-c3/mpconfigboard.mk index a03e6c32eb2c6..4341584e4cef3 100644 --- a/ports/espressif/boards/beetle-esp32-c3/mpconfigboard.mk +++ b/ports/espressif/boards/beetle-esp32-c3/mpconfigboard.mk @@ -11,3 +11,4 @@ CIRCUITPY_ESP_FLASH_SIZE=4MB CIRCUITPY_LEGACY_4MB_FLASH_LAYOUT = 1 CIRCUITPY_ESP_USB_SERIAL_JTAG = 1 +CIRCUITPY_TILEPALETTEMAPPER = 0 diff --git a/ports/espressif/boards/lolin_c3_mini/mpconfigboard.mk b/ports/espressif/boards/lolin_c3_mini/mpconfigboard.mk index 36dc38883ff39..2481a95928bda 100644 --- a/ports/espressif/boards/lolin_c3_mini/mpconfigboard.mk +++ b/ports/espressif/boards/lolin_c3_mini/mpconfigboard.mk @@ -10,3 +10,4 @@ CIRCUITPY_ESP_FLASH_SIZE=4MB CIRCUITPY_LEGACY_4MB_FLASH_LAYOUT = 1 CIRCUITPY_ESP_USB_SERIAL_JTAG = 1 +CIRCUITPY_TILEPALETTEMAPPER = 0 diff --git a/ports/espressif/boards/microdev_micro_c3/mpconfigboard.mk b/ports/espressif/boards/microdev_micro_c3/mpconfigboard.mk index b2ea6005db53a..fa51216e911a1 100644 --- a/ports/espressif/boards/microdev_micro_c3/mpconfigboard.mk +++ b/ports/espressif/boards/microdev_micro_c3/mpconfigboard.mk @@ -10,3 +10,4 @@ CIRCUITPY_ESP_FLASH_SIZE = 4MB CIRCUITPY_LEGACY_4MB_FLASH_LAYOUT = 1 CIRCUITPY_ESP_USB_SERIAL_JTAG = 1 +CIRCUITPY_TILEPALETTEMAPPER = 0 pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy