From 8d43a2cda62e2e373f233beb113277d862b0378a Mon Sep 17 00:00:00 2001 From: foamyguy Date: Tue, 4 Mar 2025 17:39:02 -0600 Subject: [PATCH 01/14] adding tilepalettemapper --- py/circuitpy_defns.mk | 5 + py/circuitpy_mpconfig.mk | 3 + shared-bindings/displayio/TileGrid.c | 17 +- .../tilepalettemapper/TilePaletteMapper.c | 150 ++++++++++++++++++ .../tilepalettemapper/TilePaletteMapper.h | 18 +++ shared-bindings/tilepalettemapper/__init__.c | 22 +++ shared-bindings/tilepalettemapper/__init__.h | 0 shared-module/displayio/TileGrid.c | 8 + .../tilepalettemapper/TilePaletteMapper.c | 66 ++++++++ .../tilepalettemapper/TilePaletteMapper.h | 21 +++ shared-module/tilepalettemapper/__init__.c | 0 shared-module/tilepalettemapper/__init__.h | 0 12 files changed, 309 insertions(+), 1 deletion(-) create mode 100644 shared-bindings/tilepalettemapper/TilePaletteMapper.c create mode 100644 shared-bindings/tilepalettemapper/TilePaletteMapper.h create mode 100644 shared-bindings/tilepalettemapper/__init__.c create mode 100644 shared-bindings/tilepalettemapper/__init__.h create mode 100644 shared-module/tilepalettemapper/TilePaletteMapper.c create mode 100644 shared-module/tilepalettemapper/TilePaletteMapper.h create mode 100644 shared-module/tilepalettemapper/__init__.c create mode 100644 shared-module/tilepalettemapper/__init__.h diff --git a/py/circuitpy_defns.mk b/py/circuitpy_defns.mk index 5fb9a932ad95b..bcf86375baa21 100644 --- a/py/circuitpy_defns.mk +++ b/py/circuitpy_defns.mk @@ -396,6 +396,9 @@ endif ifeq ($(CIRCUITPY_FONTIO),1) SRC_PATTERNS += fontio/% endif +ifeq ($(CIRCUITPY_TILEPALETTEMAPPER),1) +SRC_PATTERNS += tilepalettemapper/% +endif ifeq ($(CIRCUITPY_TIME),1) SRC_PATTERNS += time/% endif @@ -733,6 +736,8 @@ SRC_SHARED_MODULE_ALL = \ synthio/__init__.c \ terminalio/Terminal.c \ terminalio/__init__.c \ + tilepalettemapper/__init__.c \ + tilepalettemapper/TilePaletteMapper.c \ time/__init__.c \ traceback/__init__.c \ uheap/__init__.c \ diff --git a/py/circuitpy_mpconfig.mk b/py/circuitpy_mpconfig.mk index 3a240ba1e1db7..dab812ba9186c 100644 --- a/py/circuitpy_mpconfig.mk +++ b/py/circuitpy_mpconfig.mk @@ -555,6 +555,9 @@ CFLAGS += -DCIRCUITPY_TERMINALIO=$(CIRCUITPY_TERMINALIO) CIRCUITPY_FONTIO ?= $(call enable-if-all,$(CIRCUITPY_DISPLAYIO) $(CIRCUITPY_TERMINALIO)) CFLAGS += -DCIRCUITPY_FONTIO=$(CIRCUITPY_FONTIO) +CIRCUITPY_TILEPALETTEMAPPER ?= $(CIRCUITPY_FULL_BUILD) +CFLAGS += -DCIRCUITPY_TILEPALETTEMAPPER=$(CIRCUITPY_TILEPALETTEMAPPER) + CIRCUITPY_TIME ?= 1 CFLAGS += -DCIRCUITPY_TIME=$(CIRCUITPY_TIME) diff --git a/shared-bindings/displayio/TileGrid.c b/shared-bindings/displayio/TileGrid.c index 99f1699fbe89c..9c9004fa3363a 100644 --- a/shared-bindings/displayio/TileGrid.c +++ b/shared-bindings/displayio/TileGrid.c @@ -17,6 +17,10 @@ #include "shared-bindings/displayio/ColorConverter.h" #include "shared-bindings/displayio/OnDiskBitmap.h" #include "shared-bindings/displayio/Palette.h" +#ifdef CIRCUITPY_TILEPALETTEMAPPER +#include "shared-bindings/tilepalettemapper/TilePaletteMapper.h" +#endif + //| class TileGrid: //| """A grid of tiles sourced out of one bitmap @@ -323,8 +327,19 @@ MP_DEFINE_CONST_FUN_OBJ_1(displayio_tilegrid_get_pixel_shader_obj, displayio_til static mp_obj_t displayio_tilegrid_obj_set_pixel_shader(mp_obj_t self_in, mp_obj_t pixel_shader) { displayio_tilegrid_t *self = native_tilegrid(self_in); + bool valid_type = true; 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); + valid_type = false; + } + mp_printf(&mp_plat_print, "checking tilepalettemapper\n"); + #ifdef CIRCUITPY_TILEPALETTEMAPPER + mp_printf(&mp_plat_print, "tilepalettemapper enabled inside set pixel shader\n"); + if (mp_obj_is_type(pixel_shader, &tilepalettemapper_tilepalettemapper_type)) { + valid_type = true; + } + #endif + if (!valid_type) { + mp_raise_TypeError_varg(MP_ERROR_TEXT("unsupported %q type"), MP_QSTR_pixel_shader); } common_hal_displayio_tilegrid_set_pixel_shader(self, pixel_shader); diff --git a/shared-bindings/tilepalettemapper/TilePaletteMapper.c b/shared-bindings/tilepalettemapper/TilePaletteMapper.c new file mode 100644 index 0000000000000..929e93533c8ac --- /dev/null +++ b/shared-bindings/tilepalettemapper/TilePaletteMapper.c @@ -0,0 +1,150 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2017 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT +#include +#include +#include "shared/runtime/context_manager_helpers.h" +#include "py/binary.h" +#include "py/objproperty.h" +#include "py/runtime.h" +#include "shared-bindings/util.h" +#include "shared-bindings/displayio/Palette.h" +#include "shared-bindings/tilepalettemapper/TilePaletteMapper.h" + +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_palette, ARG_width, ARG_height }; + static const mp_arg_t allowed_args[] = { + { MP_QSTR_palette, MP_ARG_OBJ | MP_ARG_REQUIRED }, + { MP_QSTR_width, MP_ARG_INT | MP_ARG_REQUIRED, {.u_int = 1} }, + { MP_QSTR_height, MP_ARG_INT | MP_ARG_REQUIRED, {.u_int = 1} }, +}; + 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); + mp_obj_t palette = args[ARG_palette].u_obj; + if (!mp_obj_is_type(palette, &displayio_palette_type)) { + mp_raise_TypeError_varg(MP_ERROR_TEXT("unsupported %q type"), MP_QSTR_pixel_shader); + } + tilepalettemapper_tilepalettemapper_t *self = mp_obj_malloc(tilepalettemapper_tilepalettemapper_t, &tilepalettemapper_tilepalettemapper_type); + common_hal_tilepalettemapper_tilepalettemapper_construct(self, palette, args[ARG_width].u_int, args[ARG_height].u_int); + + return MP_OBJ_FROM_PTR(self); +} + +//| width: int +//| """Width of the tile palette mapper in tiles.""" +static mp_obj_t tilepalettemapper_tilepalettemapper_obj_get_width(mp_obj_t self_in) { + tilepalettemapper_tilepalettemapper_t *self = MP_OBJ_TO_PTR(self_in); + return MP_OBJ_NEW_SMALL_INT(common_hal_tilepalettemapper_tilepalettemapper_get_width(self)); +} +MP_DEFINE_CONST_FUN_OBJ_1(tilepalettemapper_tilepalettemapper_get_width_obj, tilepalettemapper_tilepalettemapper_obj_get_width); + +MP_PROPERTY_GETTER(tilepalettemapper_tilepalettemapper_width_obj, + (mp_obj_t)&tilepalettemapper_tilepalettemapper_get_width_obj); + +//| height: int +//| """Height of the tile palette mapper in tiles.""" +static mp_obj_t tilepalettemapper_tilepalettemapper_obj_get_height(mp_obj_t self_in) { + tilepalettemapper_tilepalettemapper_t *self = MP_OBJ_TO_PTR(self_in); + return MP_OBJ_NEW_SMALL_INT(common_hal_tilepalettemapper_tilepalettemapper_get_height(self)); +} +MP_DEFINE_CONST_FUN_OBJ_1(tilepalettemapper_tilepalettemapper_get_height_obj, tilepalettemapper_tilepalettemapper_obj_get_height); + +MP_PROPERTY_GETTER(tilepalettemapper_tilepalettemapper_height_obj, + (mp_obj_t)&tilepalettemapper_tilepalettemapper_get_height_obj); + + +//| palette: displayio.Palette +//| """The palette that the mapper uses.""" +static mp_obj_t tilepalettemapper_tilepalettemapper_obj_get_palette(mp_obj_t self_in) { + tilepalettemapper_tilepalettemapper_t *self = MP_OBJ_TO_PTR(self_in); + return common_hal_tilepalettemapper_tilepalettemapper_get_palette(self); +} +MP_DEFINE_CONST_FUN_OBJ_1(tilepalettemapper_tilepalettemapper_get_palette_obj, tilepalettemapper_tilepalettemapper_obj_get_palette); + +MP_PROPERTY_GETTER(tilepalettemapper_tilepalettemapper_palette_obj, + (mp_obj_t)&tilepalettemapper_tilepalettemapper_get_palette_obj); + + +//| def __getitem__(self, index: Union[Tuple[int, int], int]) -> List[int]: +//| """Returns the mapping for the given index. The index can either be an x,y tuple or an int equal +//| to ``y * width + x``. +//| +//| This allows you to:: +//| +//| print(tpm[0])""" +//| ... +//| +//| def __setitem__(self, index: Union[Tuple[int, int], int], value: List[int]) -> None: +//| """Sets the mapping at the given tile index. The index can either be an x,y tuple or an int equal +//| to ``y * width + x``. +//| +//| This allows you to:: +//| +//| tpm[0] = [1,0] +//| +//| or:: +//| +//| tpm[0,0] = [1,0]""" +//| ... +//| +//| +static mp_obj_t tilepalettemapper_subscr(mp_obj_t self_in, mp_obj_t index_obj, mp_obj_t value_obj) { + tilepalettemapper_tilepalettemapper_t *self = MP_OBJ_TO_PTR(self_in); + if (mp_obj_is_type(index_obj, &mp_type_slice)) { + mp_raise_NotImplementedError(MP_ERROR_TEXT("Slices not supported")); + } else { + uint16_t x = 0; + uint16_t y = 0; + if (mp_obj_is_small_int(index_obj)) { + mp_int_t i = MP_OBJ_SMALL_INT_VALUE(index_obj); + uint16_t width = common_hal_tilepalettemapper_tilepalettemapper_get_width(self); + x = i % width; + y = i / width; + } else { + mp_obj_t *items; + mp_obj_get_array_fixed_n(index_obj, 2, &items); + x = mp_obj_get_int(items[0]); + y = mp_obj_get_int(items[1]); + } + if (x >= common_hal_tilepalettemapper_tilepalettemapper_get_width(self) || + y >= common_hal_tilepalettemapper_tilepalettemapper_get_height(self)) { + mp_raise_IndexError(MP_ERROR_TEXT("Tile index out of bounds")); + } + + if (value_obj == MP_OBJ_SENTINEL) { + // load + return common_hal_tilepalettemapper_tilepalettemapper_get_mapping(self, x, y); + } else if (value_obj == mp_const_none) { + return MP_OBJ_NULL; // op not supported + } else { + size_t len = 0; + mp_obj_t *items; + mp_obj_list_get(value_obj, &len, &items); + uint32_t palette_len = common_hal_displayio_palette_get_len(self->palette); + + mp_arg_validate_int_range(len, 0, palette_len, MP_QSTR_mapping_length); + common_hal_tilepalettemapper_tilepalettemapper_set_mapping(self, x, y, len, items); + } + } + return mp_const_none; +} + + +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) }, +}; +static MP_DEFINE_CONST_DICT(tilepalettemapper_tilepalettemapper_locals_dict, tilepalettemapper_tilepalettemapper_locals_dict_table); + +MP_DEFINE_CONST_OBJ_TYPE( + tilepalettemapper_tilepalettemapper_type, + MP_QSTR_TilePaletteMapper, + MP_TYPE_FLAG_HAS_SPECIAL_ACCESSORS, + make_new, tilepalettemapper_tilepalettemapper_make_new, + locals_dict, &tilepalettemapper_tilepalettemapper_locals_dict, + subscr, tilepalettemapper_subscr, + iter, mp_obj_generic_subscript_getiter + ); diff --git a/shared-bindings/tilepalettemapper/TilePaletteMapper.h b/shared-bindings/tilepalettemapper/TilePaletteMapper.h new file mode 100644 index 0000000000000..e90a777dc91c9 --- /dev/null +++ b/shared-bindings/tilepalettemapper/TilePaletteMapper.h @@ -0,0 +1,18 @@ +// +// Created by timc on 3/4/25. +// +#include "shared-module/tilepalettemapper/TilePaletteMapper.h" + +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 bitmap_width_in_tiles, uint16_t bitmap_height_in_tiles); + + +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_palette(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); + +uint32_t common_hal_tilepalettemapper_tilepalettemapper_get_color(tilepalettemapper_tilepalettemapper_t *self, uint16_t tile_index, uint32_t palette_index); \ No newline at end of file diff --git a/shared-bindings/tilepalettemapper/__init__.c b/shared-bindings/tilepalettemapper/__init__.c new file mode 100644 index 0000000000000..fa3b2b92b0ba5 --- /dev/null +++ b/shared-bindings/tilepalettemapper/__init__.c @@ -0,0 +1,22 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Tim Cocks +// +// SPDX-License-Identifier: MIT +#include "py/obj.h" +#include "shared-bindings/tilepalettemapper/TilePaletteMapper.h" + + +static const mp_rom_map_elem_t tilepalettemapper_module_globals_table[] = { + { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_tilepalettemapper) }, + { MP_ROM_QSTR(MP_QSTR_TilePaletteMapper), MP_ROM_PTR(&tilepalettemapper_tilepalettemapper_type) }, +}; +//mp_printf(&mp_plat_print, tilepalettemapper_module_globals_table[0]) +static MP_DEFINE_CONST_DICT(tilepalettemapper_module_globals, tilepalettemapper_module_globals_table); + +const mp_obj_module_t tilepalettemapper_module = { + .base = {&mp_type_module }, + .globals = (mp_obj_dict_t *)&tilepalettemapper_module_globals, +}; + +MP_REGISTER_MODULE(MP_QSTR_tilepalettemapper, tilepalettemapper_module); diff --git a/shared-bindings/tilepalettemapper/__init__.h b/shared-bindings/tilepalettemapper/__init__.h new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/shared-module/displayio/TileGrid.c b/shared-module/displayio/TileGrid.c index 926637c11fbdd..b418bb34e61e1 100644 --- a/shared-module/displayio/TileGrid.c +++ b/shared-module/displayio/TileGrid.c @@ -11,6 +11,9 @@ #include "shared-bindings/displayio/ColorConverter.h" #include "shared-bindings/displayio/OnDiskBitmap.h" #include "shared-bindings/displayio/Palette.h" +#ifdef CIRCUITPY_TILEPALETTEMAPPER +#include "shared-bindings/tilepalettemapper/TilePaletteMapper.h" +#endif void common_hal_displayio_tilegrid_construct(displayio_tilegrid_t *self, mp_obj_t bitmap, uint16_t bitmap_width_in_tiles, uint16_t bitmap_height_in_tiles, @@ -485,6 +488,11 @@ bool displayio_tilegrid_fill_area(displayio_tilegrid_t *self, } output_pixel.opaque = true; + #ifdef CIRCUITPY_TILEPALETTEMAPPER + if (mp_obj_is_type(self->pixel_shader, &tilepalettemapper_tilepalettemapper_type)){ + output_pixel.pixel = common_hal_tilepalettemapper_tilepalettemapper_get_color(self->pixel_shader, tile_location, input_pixel.pixel); + } + #endif if (self->pixel_shader == mp_const_none) { output_pixel.pixel = input_pixel.pixel; } else if (mp_obj_is_type(self->pixel_shader, &displayio_palette_type)) { diff --git a/shared-module/tilepalettemapper/TilePaletteMapper.c b/shared-module/tilepalettemapper/TilePaletteMapper.c new file mode 100644 index 0000000000000..62df3a51bd375 --- /dev/null +++ b/shared-module/tilepalettemapper/TilePaletteMapper.c @@ -0,0 +1,66 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Tim Cocks for Adafruit Industries +// +// SPDX-License-Identifier: MIT +#include +#include "py/runtime.h" +#include "shared-bindings/tilepalettemapper/TilePaletteMapper.h" +#include "shared-bindings/displayio/Palette.h" + +void common_hal_tilepalettemapper_tilepalettemapper_construct(tilepalettemapper_tilepalettemapper_t *self, + mp_obj_t palette, uint16_t width, uint16_t height) { + + self->palette = palette; + self->width_in_tiles = width; + self->height_in_tiles = height; + int mappings_len = width * height; + mp_printf(&mp_plat_print, "%d", mappings_len); + self->tile_mappings = (uint16_t**)m_malloc(mappings_len * sizeof(uint16_t*)); + uint32_t palette_len = common_hal_displayio_palette_get_len(self->palette); + for (int i = 0; i < mappings_len; i++) { + self->tile_mappings[i] = (uint16_t*)m_malloc(palette_len * sizeof(uint16_t)); + for (uint16_t j = 0; j < palette_len; j++) { + self->tile_mappings[i][j] = j; + } + } +} + +uint16_t common_hal_tilepalettemapper_tilepalettemapper_get_width(tilepalettemapper_tilepalettemapper_t *self) { + return self->width_in_tiles; +} + +uint16_t common_hal_tilepalettemapper_tilepalettemapper_get_height(tilepalettemapper_tilepalettemapper_t *self) { + return self->height_in_tiles; +} + +mp_obj_t common_hal_tilepalettemapper_tilepalettemapper_get_palette(tilepalettemapper_tilepalettemapper_t *self) { + return self->palette; +} + +mp_obj_t common_hal_tilepalettemapper_tilepalettemapper_get_mapping(tilepalettemapper_tilepalettemapper_t *self, uint16_t x, uint16_t y){ + mp_obj_list_t *list = MP_OBJ_TO_PTR(mp_obj_new_list(0, NULL)); + uint32_t palette_len = common_hal_displayio_palette_get_len(self->palette); + int index = x + y * self->width_in_tiles; + for (uint32_t i = 0; i < palette_len; i++) { + mp_obj_list_append(list, mp_obj_new_int(self->tile_mappings[index][i])); + } + return MP_OBJ_FROM_PTR(list); +} + +void common_hal_tilepalettemapper_tilepalettemapper_set_mapping(tilepalettemapper_tilepalettemapper_t *self, uint16_t x, uint16_t y, size_t len, mp_obj_t *items) { +// size_t len = 0; +// mp_obj_t *items; +// mp_obj_list_get(mapping, &len, &items); + uint32_t palette_len = common_hal_displayio_palette_get_len(self->palette); + for (uint16_t i = 0; i < len; i++) { + int mapping_val = mp_arg_validate_type_int(items[i], MP_QSTR_mapping_value); + mp_arg_validate_int_range(mapping_val, 0, palette_len-1, MP_QSTR_mapping_value); + self->tile_mappings[y * self->width_in_tiles + x][i] = mapping_val; + } +} + +uint32_t common_hal_tilepalettemapper_tilepalettemapper_get_color(tilepalettemapper_tilepalettemapper_t *self, uint16_t tile_index, uint32_t palette_index){ + uint32_t mapped_index = self->tile_mappings[tile_index][palette_index]; + return common_hal_displayio_palette_get_color(self->palette, mapped_index); +} \ No newline at end of file diff --git a/shared-module/tilepalettemapper/TilePaletteMapper.h b/shared-module/tilepalettemapper/TilePaletteMapper.h new file mode 100644 index 0000000000000..540342a0c2f53 --- /dev/null +++ b/shared-module/tilepalettemapper/TilePaletteMapper.h @@ -0,0 +1,21 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Tim Cocks for Adafruit Industries +// +// SPDX-License-Identifier: MIT + + +#pragma once + +#include +#include + +#include "py/obj.h" + +typedef struct { + mp_obj_base_t base; + mp_obj_t palette; + uint16_t width_in_tiles; + uint16_t height_in_tiles; + uint16_t **tile_mappings; +} tilepalettemapper_tilepalettemapper_t; \ No newline at end of file diff --git a/shared-module/tilepalettemapper/__init__.c b/shared-module/tilepalettemapper/__init__.c new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/shared-module/tilepalettemapper/__init__.h b/shared-module/tilepalettemapper/__init__.h new file mode 100644 index 0000000000000..e69de29bb2d1d From 73f4a61376da684fc84486bdf12b6d0ab898ca00 Mon Sep 17 00:00:00 2001 From: foamyguy Date: Wed, 5 Mar 2025 09:06:55 -0600 Subject: [PATCH 02/14] implement needs_refresh, run pre-commit, move get_color to shared-module --- shared-bindings/displayio/TileGrid.c | 36 +++--- .../tilepalettemapper/TilePaletteMapper.c | 118 +++++++++--------- .../tilepalettemapper/TilePaletteMapper.h | 2 - shared-module/displayio/TileGrid.c | 15 ++- shared-module/displayio/TileGrid.h | 1 + .../tilepalettemapper/TilePaletteMapper.c | 75 ++++++----- .../tilepalettemapper/TilePaletteMapper.h | 18 ++- 7 files changed, 144 insertions(+), 121 deletions(-) diff --git a/shared-bindings/displayio/TileGrid.c b/shared-bindings/displayio/TileGrid.c index 9c9004fa3363a..88a471a69db5a 100644 --- a/shared-bindings/displayio/TileGrid.c +++ b/shared-bindings/displayio/TileGrid.c @@ -22,6 +22,21 @@ #endif +void displayio_tilegrid_validate_pixel_shader(mp_obj_t pixel_shader) { + bool valid_type = true; + if (!mp_obj_is_type(pixel_shader, &displayio_palette_type) && !mp_obj_is_type(pixel_shader, &displayio_colorconverter_type)) { + valid_type = false; + } + #ifdef CIRCUITPY_TILEPALETTEMAPPER + if (mp_obj_is_type(pixel_shader, &tilepalettemapper_tilepalettemapper_type)) { + valid_type = true; + } + #endif + if (!valid_type) { + mp_raise_TypeError_varg(MP_ERROR_TEXT("unsupported %q type"), MP_QSTR_pixel_shader); + } +} + //| class TileGrid: //| """A grid of tiles sourced out of one bitmap //| @@ -93,10 +108,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 (!mp_obj_is_type(pixel_shader, &displayio_colorconverter_type) && - !mp_obj_is_type(pixel_shader, &displayio_palette_type)) { - mp_raise_TypeError_varg(MP_ERROR_TEXT("unsupported %q type"), MP_QSTR_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; @@ -327,21 +339,7 @@ MP_DEFINE_CONST_FUN_OBJ_1(displayio_tilegrid_get_pixel_shader_obj, displayio_til static mp_obj_t displayio_tilegrid_obj_set_pixel_shader(mp_obj_t self_in, mp_obj_t pixel_shader) { displayio_tilegrid_t *self = native_tilegrid(self_in); - bool valid_type = true; - if (!mp_obj_is_type(pixel_shader, &displayio_palette_type) && !mp_obj_is_type(pixel_shader, &displayio_colorconverter_type)) { - valid_type = false; - } - mp_printf(&mp_plat_print, "checking tilepalettemapper\n"); - #ifdef CIRCUITPY_TILEPALETTEMAPPER - mp_printf(&mp_plat_print, "tilepalettemapper enabled inside set pixel shader\n"); - if (mp_obj_is_type(pixel_shader, &tilepalettemapper_tilepalettemapper_type)) { - valid_type = true; - } - #endif - if (!valid_type) { - mp_raise_TypeError_varg(MP_ERROR_TEXT("unsupported %q type"), MP_QSTR_pixel_shader); - } - + displayio_tilegrid_validate_pixel_shader(pixel_shader); common_hal_displayio_tilegrid_set_pixel_shader(self, pixel_shader); return mp_const_none; diff --git a/shared-bindings/tilepalettemapper/TilePaletteMapper.c b/shared-bindings/tilepalettemapper/TilePaletteMapper.c index 929e93533c8ac..bcf3f4c4c2f1e 100644 --- a/shared-bindings/tilepalettemapper/TilePaletteMapper.c +++ b/shared-bindings/tilepalettemapper/TilePaletteMapper.c @@ -14,29 +14,29 @@ #include "shared-bindings/tilepalettemapper/TilePaletteMapper.h" 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_palette, ARG_width, ARG_height }; - static const mp_arg_t allowed_args[] = { - { MP_QSTR_palette, MP_ARG_OBJ | MP_ARG_REQUIRED }, - { MP_QSTR_width, MP_ARG_INT | MP_ARG_REQUIRED, {.u_int = 1} }, - { MP_QSTR_height, MP_ARG_INT | MP_ARG_REQUIRED, {.u_int = 1} }, -}; - 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); - mp_obj_t palette = args[ARG_palette].u_obj; - if (!mp_obj_is_type(palette, &displayio_palette_type)) { - mp_raise_TypeError_varg(MP_ERROR_TEXT("unsupported %q type"), MP_QSTR_pixel_shader); - } - tilepalettemapper_tilepalettemapper_t *self = mp_obj_malloc(tilepalettemapper_tilepalettemapper_t, &tilepalettemapper_tilepalettemapper_type); - common_hal_tilepalettemapper_tilepalettemapper_construct(self, palette, args[ARG_width].u_int, args[ARG_height].u_int); - - return MP_OBJ_FROM_PTR(self); + enum { ARG_palette, ARG_width, ARG_height }; + static const mp_arg_t allowed_args[] = { + { MP_QSTR_palette, MP_ARG_OBJ | MP_ARG_REQUIRED }, + { MP_QSTR_width, MP_ARG_INT | MP_ARG_REQUIRED, {.u_int = 1} }, + { MP_QSTR_height, MP_ARG_INT | MP_ARG_REQUIRED, {.u_int = 1} }, + }; + 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); + mp_obj_t palette = args[ARG_palette].u_obj; + if (!mp_obj_is_type(palette, &displayio_palette_type)) { + mp_raise_TypeError_varg(MP_ERROR_TEXT("unsupported %q type"), MP_QSTR_pixel_shader); + } + tilepalettemapper_tilepalettemapper_t *self = mp_obj_malloc(tilepalettemapper_tilepalettemapper_t, &tilepalettemapper_tilepalettemapper_type); + common_hal_tilepalettemapper_tilepalettemapper_construct(self, palette, args[ARG_width].u_int, args[ARG_height].u_int); + + return MP_OBJ_FROM_PTR(self); } //| width: int //| """Width of the tile palette mapper in tiles.""" static mp_obj_t tilepalettemapper_tilepalettemapper_obj_get_width(mp_obj_t self_in) { - tilepalettemapper_tilepalettemapper_t *self = MP_OBJ_TO_PTR(self_in); - return MP_OBJ_NEW_SMALL_INT(common_hal_tilepalettemapper_tilepalettemapper_get_width(self)); + tilepalettemapper_tilepalettemapper_t *self = MP_OBJ_TO_PTR(self_in); + return MP_OBJ_NEW_SMALL_INT(common_hal_tilepalettemapper_tilepalettemapper_get_width(self)); } MP_DEFINE_CONST_FUN_OBJ_1(tilepalettemapper_tilepalettemapper_get_width_obj, tilepalettemapper_tilepalettemapper_obj_get_width); @@ -46,8 +46,8 @@ MP_PROPERTY_GETTER(tilepalettemapper_tilepalettemapper_width_obj, //| height: int //| """Height of the tile palette mapper in tiles.""" static mp_obj_t tilepalettemapper_tilepalettemapper_obj_get_height(mp_obj_t self_in) { - tilepalettemapper_tilepalettemapper_t *self = MP_OBJ_TO_PTR(self_in); - return MP_OBJ_NEW_SMALL_INT(common_hal_tilepalettemapper_tilepalettemapper_get_height(self)); + tilepalettemapper_tilepalettemapper_t *self = MP_OBJ_TO_PTR(self_in); + return MP_OBJ_NEW_SMALL_INT(common_hal_tilepalettemapper_tilepalettemapper_get_height(self)); } MP_DEFINE_CONST_FUN_OBJ_1(tilepalettemapper_tilepalettemapper_get_height_obj, tilepalettemapper_tilepalettemapper_obj_get_height); @@ -58,8 +58,8 @@ MP_PROPERTY_GETTER(tilepalettemapper_tilepalettemapper_height_obj, //| palette: displayio.Palette //| """The palette that the mapper uses.""" static mp_obj_t tilepalettemapper_tilepalettemapper_obj_get_palette(mp_obj_t self_in) { - tilepalettemapper_tilepalettemapper_t *self = MP_OBJ_TO_PTR(self_in); - return common_hal_tilepalettemapper_tilepalettemapper_get_palette(self); + tilepalettemapper_tilepalettemapper_t *self = MP_OBJ_TO_PTR(self_in); + return common_hal_tilepalettemapper_tilepalettemapper_get_palette(self); } MP_DEFINE_CONST_FUN_OBJ_1(tilepalettemapper_tilepalettemapper_get_palette_obj, tilepalettemapper_tilepalettemapper_obj_get_palette); @@ -91,51 +91,51 @@ MP_PROPERTY_GETTER(tilepalettemapper_tilepalettemapper_palette_obj, //| //| static mp_obj_t tilepalettemapper_subscr(mp_obj_t self_in, mp_obj_t index_obj, mp_obj_t value_obj) { - tilepalettemapper_tilepalettemapper_t *self = MP_OBJ_TO_PTR(self_in); - if (mp_obj_is_type(index_obj, &mp_type_slice)) { - mp_raise_NotImplementedError(MP_ERROR_TEXT("Slices not supported")); - } else { - uint16_t x = 0; - uint16_t y = 0; - if (mp_obj_is_small_int(index_obj)) { - mp_int_t i = MP_OBJ_SMALL_INT_VALUE(index_obj); - uint16_t width = common_hal_tilepalettemapper_tilepalettemapper_get_width(self); - x = i % width; - y = i / width; + tilepalettemapper_tilepalettemapper_t *self = MP_OBJ_TO_PTR(self_in); + if (mp_obj_is_type(index_obj, &mp_type_slice)) { + mp_raise_NotImplementedError(MP_ERROR_TEXT("Slices not supported")); } else { - mp_obj_t *items; - mp_obj_get_array_fixed_n(index_obj, 2, &items); - x = mp_obj_get_int(items[0]); - y = mp_obj_get_int(items[1]); - } - if (x >= common_hal_tilepalettemapper_tilepalettemapper_get_width(self) || - y >= common_hal_tilepalettemapper_tilepalettemapper_get_height(self)) { - mp_raise_IndexError(MP_ERROR_TEXT("Tile index out of bounds")); + uint16_t x = 0; + uint16_t y = 0; + if (mp_obj_is_small_int(index_obj)) { + mp_int_t i = MP_OBJ_SMALL_INT_VALUE(index_obj); + uint16_t width = common_hal_tilepalettemapper_tilepalettemapper_get_width(self); + x = i % width; + y = i / width; + } else { + mp_obj_t *items; + mp_obj_get_array_fixed_n(index_obj, 2, &items); + x = mp_obj_get_int(items[0]); + y = mp_obj_get_int(items[1]); + } + if (x >= common_hal_tilepalettemapper_tilepalettemapper_get_width(self) || + y >= common_hal_tilepalettemapper_tilepalettemapper_get_height(self)) { + mp_raise_IndexError(MP_ERROR_TEXT("Tile index out of bounds")); } - if (value_obj == MP_OBJ_SENTINEL) { - // load - return common_hal_tilepalettemapper_tilepalettemapper_get_mapping(self, x, y); - } else if (value_obj == mp_const_none) { - return MP_OBJ_NULL; // op not supported - } else { - size_t len = 0; - mp_obj_t *items; - mp_obj_list_get(value_obj, &len, &items); - uint32_t palette_len = common_hal_displayio_palette_get_len(self->palette); - - mp_arg_validate_int_range(len, 0, palette_len, MP_QSTR_mapping_length); - common_hal_tilepalettemapper_tilepalettemapper_set_mapping(self, x, y, len, items); + if (value_obj == MP_OBJ_SENTINEL) { + // load + return common_hal_tilepalettemapper_tilepalettemapper_get_mapping(self, x, y); + } else if (value_obj == mp_const_none) { + return MP_OBJ_NULL; // op not supported + } else { + size_t len = 0; + mp_obj_t *items; + mp_obj_list_get(value_obj, &len, &items); + uint32_t palette_len = common_hal_displayio_palette_get_len(self->palette); + + mp_arg_validate_int_range(len, 0, palette_len, MP_QSTR_mapping_length); + common_hal_tilepalettemapper_tilepalettemapper_set_mapping(self, x, y, len, items); + } } - } - return mp_const_none; + return mp_const_none; } 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_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) }, }; static MP_DEFINE_CONST_DICT(tilepalettemapper_tilepalettemapper_locals_dict, tilepalettemapper_tilepalettemapper_locals_dict_table); diff --git a/shared-bindings/tilepalettemapper/TilePaletteMapper.h b/shared-bindings/tilepalettemapper/TilePaletteMapper.h index e90a777dc91c9..52f277b586e47 100644 --- a/shared-bindings/tilepalettemapper/TilePaletteMapper.h +++ b/shared-bindings/tilepalettemapper/TilePaletteMapper.h @@ -14,5 +14,3 @@ uint16_t common_hal_tilepalettemapper_tilepalettemapper_get_height(tilepalettema mp_obj_t common_hal_tilepalettemapper_tilepalettemapper_get_palette(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); - -uint32_t common_hal_tilepalettemapper_tilepalettemapper_get_color(tilepalettemapper_tilepalettemapper_t *self, uint16_t tile_index, uint32_t palette_index); \ No newline at end of file diff --git a/shared-module/displayio/TileGrid.c b/shared-module/displayio/TileGrid.c index b418bb34e61e1..a71a2f300e0df 100644 --- a/shared-module/displayio/TileGrid.c +++ b/shared-module/displayio/TileGrid.c @@ -489,8 +489,8 @@ bool displayio_tilegrid_fill_area(displayio_tilegrid_t *self, output_pixel.opaque = true; #ifdef CIRCUITPY_TILEPALETTEMAPPER - if (mp_obj_is_type(self->pixel_shader, &tilepalettemapper_tilepalettemapper_type)){ - output_pixel.pixel = common_hal_tilepalettemapper_tilepalettemapper_get_color(self->pixel_shader, tile_location, input_pixel.pixel); + if (mp_obj_is_type(self->pixel_shader, &tilepalettemapper_tilepalettemapper_type)) { + output_pixel.pixel = tilepalettemapper_tilepalettemapper_get_color(self->pixel_shader, tile_location, input_pixel.pixel); } #endif if (self->pixel_shader == mp_const_none) { @@ -558,6 +558,11 @@ 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); } + #ifdef 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)) { @@ -611,6 +616,12 @@ 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)); + #ifdef 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; return &self->current_area; diff --git a/shared-module/displayio/TileGrid.h b/shared-module/displayio/TileGrid.h index c9c31696bf8f2..36d2c9a69b6cb 100644 --- a/shared-module/displayio/TileGrid.h +++ b/shared-module/displayio/TileGrid.h @@ -67,3 +67,4 @@ bool displayio_tilegrid_get_previous_area(displayio_tilegrid_t *self, displayio_ 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); diff --git a/shared-module/tilepalettemapper/TilePaletteMapper.c b/shared-module/tilepalettemapper/TilePaletteMapper.c index 62df3a51bd375..6ee262db2094f 100644 --- a/shared-module/tilepalettemapper/TilePaletteMapper.c +++ b/shared-module/tilepalettemapper/TilePaletteMapper.c @@ -11,56 +11,65 @@ void common_hal_tilepalettemapper_tilepalettemapper_construct(tilepalettemapper_tilepalettemapper_t *self, mp_obj_t palette, uint16_t width, uint16_t height) { - self->palette = palette; - self->width_in_tiles = width; - self->height_in_tiles = height; - int mappings_len = width * height; - mp_printf(&mp_plat_print, "%d", mappings_len); - self->tile_mappings = (uint16_t**)m_malloc(mappings_len * sizeof(uint16_t*)); - uint32_t palette_len = common_hal_displayio_palette_get_len(self->palette); - for (int i = 0; i < mappings_len; i++) { - self->tile_mappings[i] = (uint16_t*)m_malloc(palette_len * sizeof(uint16_t)); - for (uint16_t j = 0; j < palette_len; j++) { - self->tile_mappings[i][j] = j; + self->palette = palette; + self->width_in_tiles = width; + self->height_in_tiles = height; + self->needs_refresh = false; + int mappings_len = width * height; + self->tile_mappings = (uint16_t **)m_malloc(mappings_len * sizeof(uint16_t *)); + uint32_t palette_len = common_hal_displayio_palette_get_len(self->palette); + for (int i = 0; i < mappings_len; i++) { + self->tile_mappings[i] = (uint16_t *)m_malloc(palette_len * sizeof(uint16_t)); + for (uint16_t j = 0; j < palette_len; j++) { + self->tile_mappings[i][j] = j; + } } - } } uint16_t common_hal_tilepalettemapper_tilepalettemapper_get_width(tilepalettemapper_tilepalettemapper_t *self) { - return self->width_in_tiles; + return self->width_in_tiles; } uint16_t common_hal_tilepalettemapper_tilepalettemapper_get_height(tilepalettemapper_tilepalettemapper_t *self) { - return self->height_in_tiles; + return self->height_in_tiles; } mp_obj_t common_hal_tilepalettemapper_tilepalettemapper_get_palette(tilepalettemapper_tilepalettemapper_t *self) { - return self->palette; + return self->palette; } -mp_obj_t common_hal_tilepalettemapper_tilepalettemapper_get_mapping(tilepalettemapper_tilepalettemapper_t *self, uint16_t x, uint16_t y){ - mp_obj_list_t *list = MP_OBJ_TO_PTR(mp_obj_new_list(0, NULL)); - uint32_t palette_len = common_hal_displayio_palette_get_len(self->palette); - int index = x + y * self->width_in_tiles; - for (uint32_t i = 0; i < palette_len; i++) { - mp_obj_list_append(list, mp_obj_new_int(self->tile_mappings[index][i])); - } - return MP_OBJ_FROM_PTR(list); +mp_obj_t common_hal_tilepalettemapper_tilepalettemapper_get_mapping(tilepalettemapper_tilepalettemapper_t *self, uint16_t x, uint16_t y) { + mp_obj_list_t *list = MP_OBJ_TO_PTR(mp_obj_new_list(0, NULL)); + uint32_t palette_len = common_hal_displayio_palette_get_len(self->palette); + int index = x + y * self->width_in_tiles; + for (uint32_t i = 0; i < palette_len; i++) { + mp_obj_list_append(list, mp_obj_new_int(self->tile_mappings[index][i])); + } + return MP_OBJ_FROM_PTR(list); } void common_hal_tilepalettemapper_tilepalettemapper_set_mapping(tilepalettemapper_tilepalettemapper_t *self, uint16_t x, uint16_t y, size_t len, mp_obj_t *items) { // size_t len = 0; // mp_obj_t *items; // mp_obj_list_get(mapping, &len, &items); - uint32_t palette_len = common_hal_displayio_palette_get_len(self->palette); - for (uint16_t i = 0; i < len; i++) { - int mapping_val = mp_arg_validate_type_int(items[i], MP_QSTR_mapping_value); - mp_arg_validate_int_range(mapping_val, 0, palette_len-1, MP_QSTR_mapping_value); - self->tile_mappings[y * self->width_in_tiles + x][i] = mapping_val; - } + uint32_t palette_len = common_hal_displayio_palette_get_len(self->palette); + for (uint16_t i = 0; i < len; i++) { + int mapping_val = mp_arg_validate_type_int(items[i], MP_QSTR_mapping_value); + mp_arg_validate_int_range(mapping_val, 0, palette_len - 1, MP_QSTR_mapping_value); + self->tile_mappings[y * self->width_in_tiles + x][i] = mapping_val; + } + self->needs_refresh = true; +} + +uint32_t tilepalettemapper_tilepalettemapper_get_color(tilepalettemapper_tilepalettemapper_t *self, uint16_t tile_index, uint32_t palette_index) { + uint32_t mapped_index = self->tile_mappings[tile_index][palette_index]; + return common_hal_displayio_palette_get_color(self->palette, mapped_index); } -uint32_t common_hal_tilepalettemapper_tilepalettemapper_get_color(tilepalettemapper_tilepalettemapper_t *self, uint16_t tile_index, uint32_t palette_index){ - uint32_t mapped_index = self->tile_mappings[tile_index][palette_index]; - return common_hal_displayio_palette_get_color(self->palette, mapped_index); -} \ No newline at end of file +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 540342a0c2f53..7dc30151e96e0 100644 --- a/shared-module/tilepalettemapper/TilePaletteMapper.h +++ b/shared-module/tilepalettemapper/TilePaletteMapper.h @@ -13,9 +13,15 @@ #include "py/obj.h" typedef struct { - mp_obj_base_t base; - mp_obj_t palette; - uint16_t width_in_tiles; - uint16_t height_in_tiles; - uint16_t **tile_mappings; -} tilepalettemapper_tilepalettemapper_t; \ No newline at end of file + mp_obj_base_t base; + mp_obj_t palette; + uint16_t width_in_tiles; + uint16_t height_in_tiles; + uint16_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); + +uint32_t tilepalettemapper_tilepalettemapper_get_color(tilepalettemapper_tilepalettemapper_t *self, uint16_t tile_index, uint32_t palette_index); From beeb6684ccd2939fa4a98d1ab7cd0696d751652e Mon Sep 17 00:00:00 2001 From: foamyguy Date: Wed, 5 Mar 2025 09:15:45 -0600 Subject: [PATCH 03/14] update copyrights, remove unused empty files. remove debugging print --- shared-bindings/tilepalettemapper/TilePaletteMapper.c | 2 +- shared-bindings/tilepalettemapper/TilePaletteMapper.h | 4 +++- shared-bindings/tilepalettemapper/__init__.c | 9 ++++----- shared-bindings/tilepalettemapper/__init__.h | 0 shared-module/tilepalettemapper/__init__.h | 0 5 files changed, 8 insertions(+), 7 deletions(-) delete mode 100644 shared-bindings/tilepalettemapper/__init__.h delete mode 100644 shared-module/tilepalettemapper/__init__.h diff --git a/shared-bindings/tilepalettemapper/TilePaletteMapper.c b/shared-bindings/tilepalettemapper/TilePaletteMapper.c index bcf3f4c4c2f1e..7bf3e51534919 100644 --- a/shared-bindings/tilepalettemapper/TilePaletteMapper.c +++ b/shared-bindings/tilepalettemapper/TilePaletteMapper.c @@ -1,6 +1,6 @@ // This file is part of the CircuitPython project: https://circuitpython.org // -// SPDX-FileCopyrightText: Copyright (c) 2017 Scott Shawcroft for Adafruit Industries +// SPDX-FileCopyrightText: Copyright (c) 2025 Tim Cocks for Adafruit Industries // // SPDX-License-Identifier: MIT #include diff --git a/shared-bindings/tilepalettemapper/TilePaletteMapper.h b/shared-bindings/tilepalettemapper/TilePaletteMapper.h index 52f277b586e47..a4bf0583e8e82 100644 --- a/shared-bindings/tilepalettemapper/TilePaletteMapper.h +++ b/shared-bindings/tilepalettemapper/TilePaletteMapper.h @@ -1,6 +1,8 @@ +// This file is part of the CircuitPython project: https://circuitpython.org // -// Created by timc on 3/4/25. +// SPDX-FileCopyrightText: Copyright (c) 2025 Tim Cocks for Adafruit Industries // +// SPDX-License-Identifier: MIT #include "shared-module/tilepalettemapper/TilePaletteMapper.h" extern const mp_obj_type_t tilepalettemapper_tilepalettemapper_type; diff --git a/shared-bindings/tilepalettemapper/__init__.c b/shared-bindings/tilepalettemapper/__init__.c index fa3b2b92b0ba5..966de95076659 100644 --- a/shared-bindings/tilepalettemapper/__init__.c +++ b/shared-bindings/tilepalettemapper/__init__.c @@ -8,15 +8,14 @@ static const mp_rom_map_elem_t tilepalettemapper_module_globals_table[] = { - { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_tilepalettemapper) }, - { MP_ROM_QSTR(MP_QSTR_TilePaletteMapper), MP_ROM_PTR(&tilepalettemapper_tilepalettemapper_type) }, + { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_tilepalettemapper) }, + { MP_ROM_QSTR(MP_QSTR_TilePaletteMapper), MP_ROM_PTR(&tilepalettemapper_tilepalettemapper_type) }, }; -//mp_printf(&mp_plat_print, tilepalettemapper_module_globals_table[0]) static MP_DEFINE_CONST_DICT(tilepalettemapper_module_globals, tilepalettemapper_module_globals_table); const mp_obj_module_t tilepalettemapper_module = { - .base = {&mp_type_module }, - .globals = (mp_obj_dict_t *)&tilepalettemapper_module_globals, + .base = {&mp_type_module }, + .globals = (mp_obj_dict_t *)&tilepalettemapper_module_globals, }; MP_REGISTER_MODULE(MP_QSTR_tilepalettemapper, tilepalettemapper_module); diff --git a/shared-bindings/tilepalettemapper/__init__.h b/shared-bindings/tilepalettemapper/__init__.h deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/shared-module/tilepalettemapper/__init__.h b/shared-module/tilepalettemapper/__init__.h deleted file mode 100644 index e69de29bb2d1d..0000000000000 From e2f06f6b136e40afe006a3e812ff416a80577fe1 Mon Sep 17 00:00:00 2001 From: foamyguy Date: Wed, 5 Mar 2025 09:17:14 -0600 Subject: [PATCH 04/14] remove commented code --- shared-module/tilepalettemapper/TilePaletteMapper.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/shared-module/tilepalettemapper/TilePaletteMapper.c b/shared-module/tilepalettemapper/TilePaletteMapper.c index 6ee262db2094f..e939cd744a7c9 100644 --- a/shared-module/tilepalettemapper/TilePaletteMapper.c +++ b/shared-module/tilepalettemapper/TilePaletteMapper.c @@ -49,9 +49,6 @@ mp_obj_t common_hal_tilepalettemapper_tilepalettemapper_get_mapping(tilepalettem } void common_hal_tilepalettemapper_tilepalettemapper_set_mapping(tilepalettemapper_tilepalettemapper_t *self, uint16_t x, uint16_t y, size_t len, mp_obj_t *items) { -// size_t len = 0; -// mp_obj_t *items; -// mp_obj_list_get(mapping, &len, &items); uint32_t palette_len = common_hal_displayio_palette_get_len(self->palette); for (uint16_t i = 0; i < len; i++) { int mapping_val = mp_arg_validate_type_int(items[i], MP_QSTR_mapping_value); From c00ea3190c09cdd4dc78afc5ef9d4dfde5890ad1 Mon Sep 17 00:00:00 2001 From: foamyguy Date: Wed, 5 Mar 2025 09:32:24 -0600 Subject: [PATCH 05/14] add class docstring --- .../tilepalettemapper/TilePaletteMapper.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/shared-bindings/tilepalettemapper/TilePaletteMapper.c b/shared-bindings/tilepalettemapper/TilePaletteMapper.c index 7bf3e51534919..201b1c6449cbb 100644 --- a/shared-bindings/tilepalettemapper/TilePaletteMapper.c +++ b/shared-bindings/tilepalettemapper/TilePaletteMapper.c @@ -13,6 +13,20 @@ #include "shared-bindings/displayio/Palette.h" #include "shared-bindings/tilepalettemapper/TilePaletteMapper.h" +//| class TilePaletteMapper: +//| """Contains a displayio.Palette a series of mappings from one palette color_index to another palette color_index. +//| One mapping for tile in a 2D grid. Can be set as the pixel_shader for a TileGrid to re-map the colors for +//| spedific tile(s) within the TileGrid.""" +//| +//| def __init__(self, palette: displayio.Palette, width: int, height: int) -> None: +//| """Create a TilePaletteMApper object to store a set color mappings for tiles. +//| +//| :param displayio.Palette palette: The palette to get mapped colors from. +//| :param int width: The width of the grid in tiles. +//| :param int height: The height of the grid in tiles. +//| """ +//| ... +//| 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_palette, ARG_width, ARG_height }; static const mp_arg_t allowed_args[] = { From 332f5ddafbd961b2bba57093043adc7a89166528 Mon Sep 17 00:00:00 2001 From: foamyguy Date: Wed, 5 Mar 2025 10:01:20 -0600 Subject: [PATCH 06/14] enable depend on CIRCUITPY_DISPLAYIO instead of CIRCUITPY_FULL_BUILD --- py/circuitpy_mpconfig.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/py/circuitpy_mpconfig.mk b/py/circuitpy_mpconfig.mk index dab812ba9186c..91a191dc563f8 100644 --- a/py/circuitpy_mpconfig.mk +++ b/py/circuitpy_mpconfig.mk @@ -555,7 +555,7 @@ CFLAGS += -DCIRCUITPY_TERMINALIO=$(CIRCUITPY_TERMINALIO) CIRCUITPY_FONTIO ?= $(call enable-if-all,$(CIRCUITPY_DISPLAYIO) $(CIRCUITPY_TERMINALIO)) CFLAGS += -DCIRCUITPY_FONTIO=$(CIRCUITPY_FONTIO) -CIRCUITPY_TILEPALETTEMAPPER ?= $(CIRCUITPY_FULL_BUILD) +CIRCUITPY_TILEPALETTEMAPPER ?= $(CIRCUITPY_DISPLAYIO) CFLAGS += -DCIRCUITPY_TILEPALETTEMAPPER=$(CIRCUITPY_TILEPALETTEMAPPER) CIRCUITPY_TIME ?= 1 From 50f3d537f226fea104d4b6ae455e772165658d4e Mon Sep 17 00:00:00 2001 From: foamyguy Date: Wed, 5 Mar 2025 10:16:17 -0600 Subject: [PATCH 07/14] fix formatting and typo in docs --- shared-bindings/tilepalettemapper/TilePaletteMapper.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/shared-bindings/tilepalettemapper/TilePaletteMapper.c b/shared-bindings/tilepalettemapper/TilePaletteMapper.c index 201b1c6449cbb..b9faa94e91174 100644 --- a/shared-bindings/tilepalettemapper/TilePaletteMapper.c +++ b/shared-bindings/tilepalettemapper/TilePaletteMapper.c @@ -15,11 +15,11 @@ //| class TilePaletteMapper: //| """Contains a displayio.Palette a series of mappings from one palette color_index to another palette color_index. -//| One mapping for tile in a 2D grid. Can be set as the pixel_shader for a TileGrid to re-map the colors for -//| spedific tile(s) within the TileGrid.""" +//| One mapping for tile in a 2D grid. Can be set as the pixel_shader for a TileGrid to re-map the colors for +//| specific tile(s) within the TileGrid.""" //| //| def __init__(self, palette: displayio.Palette, width: int, height: int) -> None: -//| """Create a TilePaletteMApper object to store a set color mappings for tiles. +//| """Create a TilePaletteMApper object to store a set of color mappings for tiles. //| //| :param displayio.Palette palette: The palette to get mapped colors from. //| :param int width: The width of the grid in tiles. @@ -71,6 +71,7 @@ MP_PROPERTY_GETTER(tilepalettemapper_tilepalettemapper_height_obj, //| palette: displayio.Palette //| """The palette that the mapper uses.""" +//| static mp_obj_t tilepalettemapper_tilepalettemapper_obj_get_palette(mp_obj_t self_in) { tilepalettemapper_tilepalettemapper_t *self = MP_OBJ_TO_PTR(self_in); return common_hal_tilepalettemapper_tilepalettemapper_get_palette(self); From d48b5c99376dd542c653eef2af72a1681dcb343f Mon Sep 17 00:00:00 2001 From: foamyguy Date: Wed, 5 Mar 2025 11:36:59 -0600 Subject: [PATCH 08/14] fix #ifdef sections. disable for atmel boards that overflowed --- .../boards/circuitbrains_basic_m0/mpconfigboard.mk | 1 + .../boards/circuitbrains_deluxe_m4/mpconfigboard.mk | 1 + ports/atmel-samd/boards/datalore_ip_m4/mpconfigboard.mk | 1 + .../atmel-samd/boards/feather_m0_express/mpconfigboard.mk | 1 + .../boards/feather_m0_supersized/mpconfigboard.mk | 2 ++ ports/atmel-samd/boards/huntercat_nfc/mpconfigboard.mk | 2 ++ .../boards/itsybitsy_m0_express/mpconfigboard.mk | 1 + .../boards/itsybitsy_m4_express/mpconfigboard.mk | 1 + ports/atmel-samd/boards/metro_m0_express/mpconfigboard.mk | 1 + ports/atmel-samd/boards/openbook_m4/mpconfigboard.mk | 1 + ports/atmel-samd/boards/pewpew_lcd/mpconfigboard.mk | 1 + ports/atmel-samd/boards/qtpy_m0_haxpress/mpconfigboard.mk | 2 ++ .../boards/silicognition-m4-shim/mpconfigboard.mk | 1 + ports/atmel-samd/boards/snekboard/mpconfigboard.mk | 2 ++ .../boards/sparkfun_redboard_turbo/mpconfigboard.mk | 1 + .../boards/trinket_m0_haxpress/mpconfigboard.mk | 1 + ports/atmel-samd/boards/uartlogger2/mpconfigboard.mk | 1 + shared-bindings/displayio/TileGrid.c | 2 +- shared-module/displayio/TileGrid.c | 8 ++++---- 19 files changed, 26 insertions(+), 5 deletions(-) diff --git a/ports/atmel-samd/boards/circuitbrains_basic_m0/mpconfigboard.mk b/ports/atmel-samd/boards/circuitbrains_basic_m0/mpconfigboard.mk index c647039bc8aaf..4f9bd77f8223a 100755 --- a/ports/atmel-samd/boards/circuitbrains_basic_m0/mpconfigboard.mk +++ b/ports/atmel-samd/boards/circuitbrains_basic_m0/mpconfigboard.mk @@ -11,3 +11,4 @@ EXTERNAL_FLASH_DEVICES = "W25Q32JVxQ" LONGINT_IMPL = MPZ CIRCUITPY_JPEGIO = 0 +CIRCUITPY_TILEPALETTEMAPPER = 0 diff --git a/ports/atmel-samd/boards/circuitbrains_deluxe_m4/mpconfigboard.mk b/ports/atmel-samd/boards/circuitbrains_deluxe_m4/mpconfigboard.mk index 46aa0b7dc659f..b3cb3d73015db 100755 --- a/ports/atmel-samd/boards/circuitbrains_deluxe_m4/mpconfigboard.mk +++ b/ports/atmel-samd/boards/circuitbrains_deluxe_m4/mpconfigboard.mk @@ -14,3 +14,4 @@ CIRCUITPY_PS2IO = 1 CIRCUITPY_JPEGIO = 0 CIRCUITPY_SPITARGET = 0 CIRCUITPY_SYNTHIO = 0 +CIRCUITPY_TILEPALETTEMAPPER = 0 diff --git a/ports/atmel-samd/boards/datalore_ip_m4/mpconfigboard.mk b/ports/atmel-samd/boards/datalore_ip_m4/mpconfigboard.mk index 8f06d8d1e5168..f6c07e7aaafb4 100644 --- a/ports/atmel-samd/boards/datalore_ip_m4/mpconfigboard.mk +++ b/ports/atmel-samd/boards/datalore_ip_m4/mpconfigboard.mk @@ -12,3 +12,4 @@ LONGINT_IMPL = MPZ CIRCUITPY_SYNTHIO = 0 CIRCUITPY_JPEGIO = 0 CIRCUITPY_SPITARGET = 0 +CIRCUITPY_TILEPALETTEMAPPER = 0 diff --git a/ports/atmel-samd/boards/feather_m0_express/mpconfigboard.mk b/ports/atmel-samd/boards/feather_m0_express/mpconfigboard.mk index 004181148415a..cea9e9f8c9635 100644 --- a/ports/atmel-samd/boards/feather_m0_express/mpconfigboard.mk +++ b/ports/atmel-samd/boards/feather_m0_express/mpconfigboard.mk @@ -11,3 +11,4 @@ EXTERNAL_FLASH_DEVICES = "S25FL216K, GD25Q16C, W25Q16JVxQ" LONGINT_IMPL = MPZ CIRCUITPY_RAINBOWIO = 0 +CIRCUITPY_TILEPALETTEMAPPER = 0 diff --git a/ports/atmel-samd/boards/feather_m0_supersized/mpconfigboard.mk b/ports/atmel-samd/boards/feather_m0_supersized/mpconfigboard.mk index 811336885b86d..2ed69108fb95f 100644 --- a/ports/atmel-samd/boards/feather_m0_supersized/mpconfigboard.mk +++ b/ports/atmel-samd/boards/feather_m0_supersized/mpconfigboard.mk @@ -9,3 +9,5 @@ CHIP_FAMILY = samd21 SPI_FLASH_FILESYSTEM = 1 EXTERNAL_FLASH_DEVICES = "S25FL064L" LONGINT_IMPL = MPZ + +CIRCUITPY_TILEPALETTEMAPPER = 0 diff --git a/ports/atmel-samd/boards/huntercat_nfc/mpconfigboard.mk b/ports/atmel-samd/boards/huntercat_nfc/mpconfigboard.mk index 5e9a1372b4509..f6059a460378b 100644 --- a/ports/atmel-samd/boards/huntercat_nfc/mpconfigboard.mk +++ b/ports/atmel-samd/boards/huntercat_nfc/mpconfigboard.mk @@ -9,3 +9,5 @@ CHIP_FAMILY = samd21 SPI_FLASH_FILESYSTEM = 1 EXTERNAL_FLASH_DEVICES = "W25Q16JVxQ" LONGINT_IMPL = MPZ + +CIRCUITPY_TILEPALETTEMAPPER = 0 diff --git a/ports/atmel-samd/boards/itsybitsy_m0_express/mpconfigboard.mk b/ports/atmel-samd/boards/itsybitsy_m0_express/mpconfigboard.mk index 6dce23e506de1..5855010ed32bb 100644 --- a/ports/atmel-samd/boards/itsybitsy_m0_express/mpconfigboard.mk +++ b/ports/atmel-samd/boards/itsybitsy_m0_express/mpconfigboard.mk @@ -13,3 +13,4 @@ LONGINT_IMPL = MPZ CIRCUITPY_BITBANG_APA102 = 1 CIRCUITPY_PULSEIO = 0 +CIRCUITPY_TILEPALETTEMAPPER = 0 diff --git a/ports/atmel-samd/boards/itsybitsy_m4_express/mpconfigboard.mk b/ports/atmel-samd/boards/itsybitsy_m4_express/mpconfigboard.mk index de70d4fe0e552..27bf8c165da88 100644 --- a/ports/atmel-samd/boards/itsybitsy_m4_express/mpconfigboard.mk +++ b/ports/atmel-samd/boards/itsybitsy_m4_express/mpconfigboard.mk @@ -14,6 +14,7 @@ CIRCUITPY_CODEOP = 0 CIRCUITPY_FLOPPYIO = 0 CIRCUITPY_GIFIO = 0 CIRCUITPY_JPEGIO = 0 +CIRCUITPY_TILEPALETTEMAPPER = 0 CIRCUITPY_BITBANG_APA102 = 1 diff --git a/ports/atmel-samd/boards/metro_m0_express/mpconfigboard.mk b/ports/atmel-samd/boards/metro_m0_express/mpconfigboard.mk index d758d6878fb7f..ba14cf8c4a36f 100644 --- a/ports/atmel-samd/boards/metro_m0_express/mpconfigboard.mk +++ b/ports/atmel-samd/boards/metro_m0_express/mpconfigboard.mk @@ -12,3 +12,4 @@ LONGINT_IMPL = MPZ CIRCUITPY_CODEOP = 0 CIRCUITPY_RAINBOWIO = 0 +CIRCUITPY_TILEPALETTEMAPPER = 0 diff --git a/ports/atmel-samd/boards/openbook_m4/mpconfigboard.mk b/ports/atmel-samd/boards/openbook_m4/mpconfigboard.mk index a786b5ebc654a..c1b543639522b 100644 --- a/ports/atmel-samd/boards/openbook_m4/mpconfigboard.mk +++ b/ports/atmel-samd/boards/openbook_m4/mpconfigboard.mk @@ -14,3 +14,4 @@ CIRCUITPY_KEYPAD = 1 CIRCUITPY_SYNTHIO = 0 CIRCUITPY_JPEGIO = 0 CIRCUITPY_FLOPPYIO = 0 +CIRCUITPY_TILEPALETTEMAPPER = 0 diff --git a/ports/atmel-samd/boards/pewpew_lcd/mpconfigboard.mk b/ports/atmel-samd/boards/pewpew_lcd/mpconfigboard.mk index 823f5698156cd..c734323a6ab62 100644 --- a/ports/atmel-samd/boards/pewpew_lcd/mpconfigboard.mk +++ b/ports/atmel-samd/boards/pewpew_lcd/mpconfigboard.mk @@ -54,6 +54,7 @@ CIRCUITPY_PULSEIO = 0 CIRCUITPY_RGBMATRIX = 0 CIRCUITPY_ROTARYIO = 0 CIRCUITPY_RTC = 0 +CIRCUITPY_TILEPALETTEMAPPER = 0 CIRCUITPY_ULAB = 0 CIRCUITPY_USB_HID = 0 CIRCUITPY_USB_MIDI = 0 diff --git a/ports/atmel-samd/boards/qtpy_m0_haxpress/mpconfigboard.mk b/ports/atmel-samd/boards/qtpy_m0_haxpress/mpconfigboard.mk index 1aca913467477..b13c786c2e68a 100644 --- a/ports/atmel-samd/boards/qtpy_m0_haxpress/mpconfigboard.mk +++ b/ports/atmel-samd/boards/qtpy_m0_haxpress/mpconfigboard.mk @@ -9,3 +9,5 @@ CHIP_FAMILY = samd21 LONGINT_IMPL = MPZ SPI_FLASH_FILESYSTEM = 1 EXTERNAL_FLASH_DEVICES = "GD25Q16C,W25Q16JVxQ,W25Q32FV" + +CIRCUITPY_TILEPALETTEMAPPER = 0 diff --git a/ports/atmel-samd/boards/silicognition-m4-shim/mpconfigboard.mk b/ports/atmel-samd/boards/silicognition-m4-shim/mpconfigboard.mk index 16e439d3ef91f..214099ccc1651 100644 --- a/ports/atmel-samd/boards/silicognition-m4-shim/mpconfigboard.mk +++ b/ports/atmel-samd/boards/silicognition-m4-shim/mpconfigboard.mk @@ -13,3 +13,4 @@ LONGINT_IMPL = MPZ CIRCUITPY_JPEGIO = 0 CIRCUITPY_SPITARGET = 0 CIRCUITPY_SYNTHIO = 0 +CIRCUITPY_TILEPALETTEMAPPER = 0 diff --git a/ports/atmel-samd/boards/snekboard/mpconfigboard.mk b/ports/atmel-samd/boards/snekboard/mpconfigboard.mk index d19e606319b63..273a9b976b3fe 100644 --- a/ports/atmel-samd/boards/snekboard/mpconfigboard.mk +++ b/ports/atmel-samd/boards/snekboard/mpconfigboard.mk @@ -9,3 +9,5 @@ CHIP_FAMILY = samd21 SPI_FLASH_FILESYSTEM = 1 EXTERNAL_FLASH_DEVICES = "W25Q16JVxQ" LONGINT_IMPL = MPZ + +CIRCUITPY_TILEPALETTEMAPPER = 0 diff --git a/ports/atmel-samd/boards/sparkfun_redboard_turbo/mpconfigboard.mk b/ports/atmel-samd/boards/sparkfun_redboard_turbo/mpconfigboard.mk index 64049e8d5981c..e8fc7b362d105 100755 --- a/ports/atmel-samd/boards/sparkfun_redboard_turbo/mpconfigboard.mk +++ b/ports/atmel-samd/boards/sparkfun_redboard_turbo/mpconfigboard.mk @@ -12,3 +12,4 @@ LONGINT_IMPL = MPZ CIRCUITPY_CODEOP = 0 CIRCUITPY_RAINBOWIO = 0 +CIRCUITPY_TILEPALETTEMAPPER = 0 diff --git a/ports/atmel-samd/boards/trinket_m0_haxpress/mpconfigboard.mk b/ports/atmel-samd/boards/trinket_m0_haxpress/mpconfigboard.mk index 29b5865d419dd..64a90c8d7264c 100644 --- a/ports/atmel-samd/boards/trinket_m0_haxpress/mpconfigboard.mk +++ b/ports/atmel-samd/boards/trinket_m0_haxpress/mpconfigboard.mk @@ -11,3 +11,4 @@ EXTERNAL_FLASH_DEVICES = W25Q32BV LONGINT_IMPL = MPZ CIRCUITPY_CODEOP = 0 +CIRCUITPY_TILEPALETTEMAPPER = 0 diff --git a/ports/atmel-samd/boards/uartlogger2/mpconfigboard.mk b/ports/atmel-samd/boards/uartlogger2/mpconfigboard.mk index 4b23566f71fd0..51db0a8ddd8db 100644 --- a/ports/atmel-samd/boards/uartlogger2/mpconfigboard.mk +++ b/ports/atmel-samd/boards/uartlogger2/mpconfigboard.mk @@ -12,3 +12,4 @@ LONGINT_IMPL = MPZ CIRCUITPY_SPITARGET = 0 CIRCUITPY_SYNTHIO = 0 CIRCUITPY_JPEGIO = 0 +CIRCUITPY_TILEPALETTEMAPPER = 0 diff --git a/shared-bindings/displayio/TileGrid.c b/shared-bindings/displayio/TileGrid.c index 88a471a69db5a..a8757fbcc17f2 100644 --- a/shared-bindings/displayio/TileGrid.c +++ b/shared-bindings/displayio/TileGrid.c @@ -27,7 +27,7 @@ void displayio_tilegrid_validate_pixel_shader(mp_obj_t pixel_shader) { if (!mp_obj_is_type(pixel_shader, &displayio_palette_type) && !mp_obj_is_type(pixel_shader, &displayio_colorconverter_type)) { valid_type = false; } - #ifdef CIRCUITPY_TILEPALETTEMAPPER + #if CIRCUITPY_TILEPALETTEMAPPER if (mp_obj_is_type(pixel_shader, &tilepalettemapper_tilepalettemapper_type)) { valid_type = true; } diff --git a/shared-module/displayio/TileGrid.c b/shared-module/displayio/TileGrid.c index a71a2f300e0df..0249ac64c643f 100644 --- a/shared-module/displayio/TileGrid.c +++ b/shared-module/displayio/TileGrid.c @@ -11,7 +11,7 @@ #include "shared-bindings/displayio/ColorConverter.h" #include "shared-bindings/displayio/OnDiskBitmap.h" #include "shared-bindings/displayio/Palette.h" -#ifdef CIRCUITPY_TILEPALETTEMAPPER +#if CIRCUITPY_TILEPALETTEMAPPER #include "shared-bindings/tilepalettemapper/TilePaletteMapper.h" #endif @@ -488,7 +488,7 @@ bool displayio_tilegrid_fill_area(displayio_tilegrid_t *self, } output_pixel.opaque = true; - #ifdef CIRCUITPY_TILEPALETTEMAPPER + #if CIRCUITPY_TILEPALETTEMAPPER if (mp_obj_is_type(self->pixel_shader, &tilepalettemapper_tilepalettemapper_type)) { output_pixel.pixel = tilepalettemapper_tilepalettemapper_get_color(self->pixel_shader, tile_location, input_pixel.pixel); } @@ -558,7 +558,7 @@ 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); } - #ifdef CIRCUITPY_TILEPALETTEMAPPER + #if CIRCUITPY_TILEPALETTEMAPPER if (mp_obj_is_type(self->pixel_shader, &tilepalettemapper_tilepalettemapper_type)) { tilepalettemapper_tilepalettemapper_finish_refresh(self->pixel_shader); } @@ -616,7 +616,7 @@ 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)); - #ifdef CIRCUITPY_TILEPALETTEMAPPER + #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)); From 7e8bcae481d284a7d9ceec9fdc4ade672e35df26 Mon Sep 17 00:00:00 2001 From: foamyguy Date: Thu, 6 Mar 2025 08:54:20 -0600 Subject: [PATCH 09/14] update class docstring, return tuple from subscr, refactor and fix get_color to work with more than 2 colors, disable for samd21 instead of individaul boards, input_color_count arg. --- .../circuitbrains_basic_m0/mpconfigboard.mk | 1 - .../feather_m0_express/mpconfigboard.mk | 1 - .../feather_m0_supersized/mpconfigboard.mk | 2 -- .../boards/huntercat_nfc/mpconfigboard.mk | 2 -- .../itsybitsy_m0_express/mpconfigboard.mk | 1 - .../boards/metro_m0_express/mpconfigboard.mk | 1 - .../boards/qtpy_m0_haxpress/mpconfigboard.mk | 2 -- .../boards/snekboard/mpconfigboard.mk | 2 -- .../sparkfun_redboard_turbo/mpconfigboard.mk | 1 - .../trinket_m0_haxpress/mpconfigboard.mk | 1 - ports/atmel-samd/mpconfigport.mk | 1 + .../nordic/nrf5340dk/autogen_board_info.toml | 1 + .../nordic/nrf54l15dk/autogen_board_info.toml | 1 + .../nordic/nrf7002dk/autogen_board_info.toml | 1 + .../renesas/ek_ra6m5/autogen_board_info.toml | 1 + .../nucleo_u575zi_q/autogen_board_info.toml | 1 + .../st/stm32h7b3i_dk/autogen_board_info.toml | 1 + .../tilepalettemapper/TilePaletteMapper.c | 21 +++++++------ .../tilepalettemapper/TilePaletteMapper.h | 2 +- shared-module/displayio/TileGrid.c | 6 ++-- .../tilepalettemapper/TilePaletteMapper.c | 30 +++++++++++-------- .../tilepalettemapper/TilePaletteMapper.h | 4 ++- 22 files changed, 45 insertions(+), 39 deletions(-) diff --git a/ports/atmel-samd/boards/circuitbrains_basic_m0/mpconfigboard.mk b/ports/atmel-samd/boards/circuitbrains_basic_m0/mpconfigboard.mk index 4f9bd77f8223a..c647039bc8aaf 100755 --- a/ports/atmel-samd/boards/circuitbrains_basic_m0/mpconfigboard.mk +++ b/ports/atmel-samd/boards/circuitbrains_basic_m0/mpconfigboard.mk @@ -11,4 +11,3 @@ EXTERNAL_FLASH_DEVICES = "W25Q32JVxQ" LONGINT_IMPL = MPZ CIRCUITPY_JPEGIO = 0 -CIRCUITPY_TILEPALETTEMAPPER = 0 diff --git a/ports/atmel-samd/boards/feather_m0_express/mpconfigboard.mk b/ports/atmel-samd/boards/feather_m0_express/mpconfigboard.mk index cea9e9f8c9635..004181148415a 100644 --- a/ports/atmel-samd/boards/feather_m0_express/mpconfigboard.mk +++ b/ports/atmel-samd/boards/feather_m0_express/mpconfigboard.mk @@ -11,4 +11,3 @@ EXTERNAL_FLASH_DEVICES = "S25FL216K, GD25Q16C, W25Q16JVxQ" LONGINT_IMPL = MPZ CIRCUITPY_RAINBOWIO = 0 -CIRCUITPY_TILEPALETTEMAPPER = 0 diff --git a/ports/atmel-samd/boards/feather_m0_supersized/mpconfigboard.mk b/ports/atmel-samd/boards/feather_m0_supersized/mpconfigboard.mk index 2ed69108fb95f..811336885b86d 100644 --- a/ports/atmel-samd/boards/feather_m0_supersized/mpconfigboard.mk +++ b/ports/atmel-samd/boards/feather_m0_supersized/mpconfigboard.mk @@ -9,5 +9,3 @@ CHIP_FAMILY = samd21 SPI_FLASH_FILESYSTEM = 1 EXTERNAL_FLASH_DEVICES = "S25FL064L" LONGINT_IMPL = MPZ - -CIRCUITPY_TILEPALETTEMAPPER = 0 diff --git a/ports/atmel-samd/boards/huntercat_nfc/mpconfigboard.mk b/ports/atmel-samd/boards/huntercat_nfc/mpconfigboard.mk index f6059a460378b..5e9a1372b4509 100644 --- a/ports/atmel-samd/boards/huntercat_nfc/mpconfigboard.mk +++ b/ports/atmel-samd/boards/huntercat_nfc/mpconfigboard.mk @@ -9,5 +9,3 @@ CHIP_FAMILY = samd21 SPI_FLASH_FILESYSTEM = 1 EXTERNAL_FLASH_DEVICES = "W25Q16JVxQ" LONGINT_IMPL = MPZ - -CIRCUITPY_TILEPALETTEMAPPER = 0 diff --git a/ports/atmel-samd/boards/itsybitsy_m0_express/mpconfigboard.mk b/ports/atmel-samd/boards/itsybitsy_m0_express/mpconfigboard.mk index 5855010ed32bb..6dce23e506de1 100644 --- a/ports/atmel-samd/boards/itsybitsy_m0_express/mpconfigboard.mk +++ b/ports/atmel-samd/boards/itsybitsy_m0_express/mpconfigboard.mk @@ -13,4 +13,3 @@ LONGINT_IMPL = MPZ CIRCUITPY_BITBANG_APA102 = 1 CIRCUITPY_PULSEIO = 0 -CIRCUITPY_TILEPALETTEMAPPER = 0 diff --git a/ports/atmel-samd/boards/metro_m0_express/mpconfigboard.mk b/ports/atmel-samd/boards/metro_m0_express/mpconfigboard.mk index ba14cf8c4a36f..d758d6878fb7f 100644 --- a/ports/atmel-samd/boards/metro_m0_express/mpconfigboard.mk +++ b/ports/atmel-samd/boards/metro_m0_express/mpconfigboard.mk @@ -12,4 +12,3 @@ LONGINT_IMPL = MPZ CIRCUITPY_CODEOP = 0 CIRCUITPY_RAINBOWIO = 0 -CIRCUITPY_TILEPALETTEMAPPER = 0 diff --git a/ports/atmel-samd/boards/qtpy_m0_haxpress/mpconfigboard.mk b/ports/atmel-samd/boards/qtpy_m0_haxpress/mpconfigboard.mk index b13c786c2e68a..1aca913467477 100644 --- a/ports/atmel-samd/boards/qtpy_m0_haxpress/mpconfigboard.mk +++ b/ports/atmel-samd/boards/qtpy_m0_haxpress/mpconfigboard.mk @@ -9,5 +9,3 @@ CHIP_FAMILY = samd21 LONGINT_IMPL = MPZ SPI_FLASH_FILESYSTEM = 1 EXTERNAL_FLASH_DEVICES = "GD25Q16C,W25Q16JVxQ,W25Q32FV" - -CIRCUITPY_TILEPALETTEMAPPER = 0 diff --git a/ports/atmel-samd/boards/snekboard/mpconfigboard.mk b/ports/atmel-samd/boards/snekboard/mpconfigboard.mk index 273a9b976b3fe..d19e606319b63 100644 --- a/ports/atmel-samd/boards/snekboard/mpconfigboard.mk +++ b/ports/atmel-samd/boards/snekboard/mpconfigboard.mk @@ -9,5 +9,3 @@ CHIP_FAMILY = samd21 SPI_FLASH_FILESYSTEM = 1 EXTERNAL_FLASH_DEVICES = "W25Q16JVxQ" LONGINT_IMPL = MPZ - -CIRCUITPY_TILEPALETTEMAPPER = 0 diff --git a/ports/atmel-samd/boards/sparkfun_redboard_turbo/mpconfigboard.mk b/ports/atmel-samd/boards/sparkfun_redboard_turbo/mpconfigboard.mk index e8fc7b362d105..64049e8d5981c 100755 --- a/ports/atmel-samd/boards/sparkfun_redboard_turbo/mpconfigboard.mk +++ b/ports/atmel-samd/boards/sparkfun_redboard_turbo/mpconfigboard.mk @@ -12,4 +12,3 @@ LONGINT_IMPL = MPZ CIRCUITPY_CODEOP = 0 CIRCUITPY_RAINBOWIO = 0 -CIRCUITPY_TILEPALETTEMAPPER = 0 diff --git a/ports/atmel-samd/boards/trinket_m0_haxpress/mpconfigboard.mk b/ports/atmel-samd/boards/trinket_m0_haxpress/mpconfigboard.mk index 64a90c8d7264c..29b5865d419dd 100644 --- a/ports/atmel-samd/boards/trinket_m0_haxpress/mpconfigboard.mk +++ b/ports/atmel-samd/boards/trinket_m0_haxpress/mpconfigboard.mk @@ -11,4 +11,3 @@ EXTERNAL_FLASH_DEVICES = W25Q32BV LONGINT_IMPL = MPZ CIRCUITPY_CODEOP = 0 -CIRCUITPY_TILEPALETTEMAPPER = 0 diff --git a/ports/atmel-samd/mpconfigport.mk b/ports/atmel-samd/mpconfigport.mk index c2961e4165f23..15013b2d831ca 100644 --- a/ports/atmel-samd/mpconfigport.mk +++ b/ports/atmel-samd/mpconfigport.mk @@ -60,6 +60,7 @@ CIRCUITPY_ZLIB = 0 # Turn off a few more things that don't fit in 192kB CIRCUITPY_TERMINALIO_VT100 = 0 +CIRCUITPY_TILEPALETTEMAPPER = 0 ifeq ($(INTERNAL_FLASH_FILESYSTEM),1) CIRCUITPY_ONEWIREIO ?= 0 diff --git a/ports/zephyr-cp/boards/nordic/nrf5340dk/autogen_board_info.toml b/ports/zephyr-cp/boards/nordic/nrf5340dk/autogen_board_info.toml index a521b62fb4c30..ba0291f64300a 100644 --- a/ports/zephyr-cp/boards/nordic/nrf5340dk/autogen_board_info.toml +++ b/ports/zephyr-cp/boards/nordic/nrf5340dk/autogen_board_info.toml @@ -90,6 +90,7 @@ struct = true supervisor = false synthio = false terminalio = false +tilepalettemapper = false time = true touchio = false traceback = false diff --git a/ports/zephyr-cp/boards/nordic/nrf54l15dk/autogen_board_info.toml b/ports/zephyr-cp/boards/nordic/nrf54l15dk/autogen_board_info.toml index d8266a9b8515f..88178af3b28c2 100644 --- a/ports/zephyr-cp/boards/nordic/nrf54l15dk/autogen_board_info.toml +++ b/ports/zephyr-cp/boards/nordic/nrf54l15dk/autogen_board_info.toml @@ -90,6 +90,7 @@ struct = true supervisor = false synthio = false terminalio = false +tilepalettemapper = false time = true touchio = false traceback = false diff --git a/ports/zephyr-cp/boards/nordic/nrf7002dk/autogen_board_info.toml b/ports/zephyr-cp/boards/nordic/nrf7002dk/autogen_board_info.toml index baacdff5dd1e7..85b5a9c7e0fad 100644 --- a/ports/zephyr-cp/boards/nordic/nrf7002dk/autogen_board_info.toml +++ b/ports/zephyr-cp/boards/nordic/nrf7002dk/autogen_board_info.toml @@ -90,6 +90,7 @@ struct = true supervisor = false synthio = false terminalio = false +tilepalettemapper = false time = true touchio = false traceback = false diff --git a/ports/zephyr-cp/boards/renesas/ek_ra6m5/autogen_board_info.toml b/ports/zephyr-cp/boards/renesas/ek_ra6m5/autogen_board_info.toml index 31e979864ac1d..674a19ab107c9 100644 --- a/ports/zephyr-cp/boards/renesas/ek_ra6m5/autogen_board_info.toml +++ b/ports/zephyr-cp/boards/renesas/ek_ra6m5/autogen_board_info.toml @@ -90,6 +90,7 @@ struct = true supervisor = false synthio = false terminalio = false +tilepalettemapper = false time = true touchio = false traceback = false diff --git a/ports/zephyr-cp/boards/st/nucleo_u575zi_q/autogen_board_info.toml b/ports/zephyr-cp/boards/st/nucleo_u575zi_q/autogen_board_info.toml index cb20c3e59300e..000155eafa744 100644 --- a/ports/zephyr-cp/boards/st/nucleo_u575zi_q/autogen_board_info.toml +++ b/ports/zephyr-cp/boards/st/nucleo_u575zi_q/autogen_board_info.toml @@ -90,6 +90,7 @@ struct = true supervisor = false synthio = false terminalio = false +tilepalettemapper = false time = true touchio = false traceback = false diff --git a/ports/zephyr-cp/boards/st/stm32h7b3i_dk/autogen_board_info.toml b/ports/zephyr-cp/boards/st/stm32h7b3i_dk/autogen_board_info.toml index c755838d554a2..ac0aff61a59c3 100644 --- a/ports/zephyr-cp/boards/st/stm32h7b3i_dk/autogen_board_info.toml +++ b/ports/zephyr-cp/boards/st/stm32h7b3i_dk/autogen_board_info.toml @@ -90,6 +90,7 @@ struct = true supervisor = false synthio = false terminalio = false +tilepalettemapper = false time = true touchio = false traceback = false diff --git a/shared-bindings/tilepalettemapper/TilePaletteMapper.c b/shared-bindings/tilepalettemapper/TilePaletteMapper.c index b9faa94e91174..5482186f677a3 100644 --- a/shared-bindings/tilepalettemapper/TilePaletteMapper.c +++ b/shared-bindings/tilepalettemapper/TilePaletteMapper.c @@ -14,23 +14,28 @@ #include "shared-bindings/tilepalettemapper/TilePaletteMapper.h" //| class TilePaletteMapper: -//| """Contains a displayio.Palette a series of mappings from one palette color_index to another palette color_index. -//| One mapping for tile in a 2D grid. Can be set as the pixel_shader for a TileGrid to re-map the colors for -//| specific tile(s) within the TileGrid.""" +//| """Remaps color indices from the source bitmap to alternate indices on a +//| per-tile basis. This allows for altering coloring of tiles based on +//| their tilegrid location. It also allows for using a limited color +//| bitmap with a wider array of colors.""" //| -//| def __init__(self, palette: displayio.Palette, width: int, height: int) -> None: +//| def __init__( +//| self, palette: displayio.Palette, input_color_count: int, width: int, height: int +//| ) -> None: //| """Create a TilePaletteMApper object to store a set of color mappings for tiles. //| //| :param displayio.Palette palette: The palette 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. //| """ //| ... //| 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_palette, ARG_width, ARG_height }; + enum { ARG_palette, ARG_input_color_count, ARG_width, ARG_height }; static const mp_arg_t allowed_args[] = { { MP_QSTR_palette, MP_ARG_OBJ | MP_ARG_REQUIRED }, + { MP_QSTR_input_color_count, MP_ARG_INT | MP_ARG_REQUIRED, {.u_int = 1} }, { MP_QSTR_width, MP_ARG_INT | MP_ARG_REQUIRED, {.u_int = 1} }, { MP_QSTR_height, MP_ARG_INT | MP_ARG_REQUIRED, {.u_int = 1} }, }; @@ -41,7 +46,7 @@ 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); } tilepalettemapper_tilepalettemapper_t *self = mp_obj_malloc(tilepalettemapper_tilepalettemapper_t, &tilepalettemapper_tilepalettemapper_type); - common_hal_tilepalettemapper_tilepalettemapper_construct(self, palette, args[ARG_width].u_int, args[ARG_height].u_int); + common_hal_tilepalettemapper_tilepalettemapper_construct(self, palette, args[ARG_input_color_count].u_int, args[ARG_width].u_int, args[ARG_height].u_int); return MP_OBJ_FROM_PTR(self); } @@ -137,9 +142,7 @@ static mp_obj_t tilepalettemapper_subscr(mp_obj_t self_in, mp_obj_t index_obj, m size_t len = 0; mp_obj_t *items; mp_obj_list_get(value_obj, &len, &items); - uint32_t palette_len = common_hal_displayio_palette_get_len(self->palette); - - mp_arg_validate_int_range(len, 0, palette_len, MP_QSTR_mapping_length); + mp_arg_validate_int_range(len, 0, self->input_color_count, MP_QSTR_mapping_length); common_hal_tilepalettemapper_tilepalettemapper_set_mapping(self, x, y, len, items); } } diff --git a/shared-bindings/tilepalettemapper/TilePaletteMapper.h b/shared-bindings/tilepalettemapper/TilePaletteMapper.h index a4bf0583e8e82..0e4eced23b7c3 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 bitmap_width_in_tiles, uint16_t bitmap_height_in_tiles); + mp_obj_t paltte, uint16_t input_color_count, uint16_t bitmap_width_in_tiles, uint16_t bitmap_height_in_tiles); uint16_t common_hal_tilepalettemapper_tilepalettemapper_get_width(tilepalettemapper_tilepalettemapper_t *self); diff --git a/shared-module/displayio/TileGrid.c b/shared-module/displayio/TileGrid.c index 0249ac64c643f..e0d18d0accfb8 100644 --- a/shared-module/displayio/TileGrid.c +++ b/shared-module/displayio/TileGrid.c @@ -471,7 +471,9 @@ bool displayio_tilegrid_fill_area(displayio_tilegrid_t *self, continue; } int16_t local_x = input_pixel.x / self->absolute_transform->scale; - uint16_t tile_location = ((local_y / self->tile_height + self->top_left_y) % self->height_in_tiles) * self->width_in_tiles + (local_x / self->tile_width + self->top_left_x) % self->width_in_tiles; + uint16_t x_tile_index = (local_x / self->tile_width + self->top_left_x) % self->width_in_tiles; + uint16_t y_tile_index = (local_y / self->tile_height + self->top_left_y) % self->height_in_tiles; + uint16_t tile_location = y_tile_index * self->width_in_tiles + x_tile_index; input_pixel.tile = tiles[tile_location]; input_pixel.tile_x = (input_pixel.tile % self->bitmap_width_in_tiles) * self->tile_width + local_x % self->tile_width; input_pixel.tile_y = (input_pixel.tile / self->bitmap_width_in_tiles) * self->tile_height + local_y % self->tile_height; @@ -490,7 +492,7 @@ bool displayio_tilegrid_fill_area(displayio_tilegrid_t *self, output_pixel.opaque = true; #if CIRCUITPY_TILEPALETTEMAPPER if (mp_obj_is_type(self->pixel_shader, &tilepalettemapper_tilepalettemapper_type)) { - output_pixel.pixel = tilepalettemapper_tilepalettemapper_get_color(self->pixel_shader, tile_location, input_pixel.pixel); + tilepalettemapper_tilepalettemapper_get_color(self->pixel_shader, colorspace, &input_pixel, &output_pixel, x_tile_index, y_tile_index); } #endif if (self->pixel_shader == mp_const_none) { diff --git a/shared-module/tilepalettemapper/TilePaletteMapper.c b/shared-module/tilepalettemapper/TilePaletteMapper.c index e939cd744a7c9..0ccb1b1d74e24 100644 --- a/shared-module/tilepalettemapper/TilePaletteMapper.c +++ b/shared-module/tilepalettemapper/TilePaletteMapper.c @@ -9,18 +9,18 @@ #include "shared-bindings/displayio/Palette.h" void common_hal_tilepalettemapper_tilepalettemapper_construct(tilepalettemapper_tilepalettemapper_t *self, - mp_obj_t palette, uint16_t width, uint16_t height) { + mp_obj_t palette, uint16_t input_color_count, uint16_t width, uint16_t height) { self->palette = palette; self->width_in_tiles = width; self->height_in_tiles = height; + self->input_color_count = input_color_count; self->needs_refresh = false; int mappings_len = width * height; self->tile_mappings = (uint16_t **)m_malloc(mappings_len * sizeof(uint16_t *)); - uint32_t palette_len = common_hal_displayio_palette_get_len(self->palette); for (int i = 0; i < mappings_len; i++) { - self->tile_mappings[i] = (uint16_t *)m_malloc(palette_len * sizeof(uint16_t)); - for (uint16_t j = 0; j < palette_len; j++) { + self->tile_mappings[i] = (uint16_t *)m_malloc(input_color_count * sizeof(uint16_t)); + for (uint16_t j = 0; j < input_color_count; j++) { self->tile_mappings[i][j] = j; } } @@ -39,13 +39,12 @@ mp_obj_t common_hal_tilepalettemapper_tilepalettemapper_get_palette(tilepalettem } mp_obj_t common_hal_tilepalettemapper_tilepalettemapper_get_mapping(tilepalettemapper_tilepalettemapper_t *self, uint16_t x, uint16_t y) { - mp_obj_list_t *list = MP_OBJ_TO_PTR(mp_obj_new_list(0, NULL)); - uint32_t palette_len = common_hal_displayio_palette_get_len(self->palette); int index = x + y * self->width_in_tiles; - for (uint32_t i = 0; i < palette_len; i++) { - mp_obj_list_append(list, mp_obj_new_int(self->tile_mappings[index][i])); + mp_obj_t result[self->input_color_count]; + for (uint32_t i = 0; i < self->input_color_count; i++) { + result[i] = mp_obj_new_int(self->tile_mappings[index][i]); } - return MP_OBJ_FROM_PTR(list); + return mp_obj_new_tuple(self->input_color_count, result); } void common_hal_tilepalettemapper_tilepalettemapper_set_mapping(tilepalettemapper_tilepalettemapper_t *self, uint16_t x, uint16_t y, size_t len, mp_obj_t *items) { @@ -58,9 +57,16 @@ void common_hal_tilepalettemapper_tilepalettemapper_set_mapping(tilepalettemappe self->needs_refresh = true; } -uint32_t tilepalettemapper_tilepalettemapper_get_color(tilepalettemapper_tilepalettemapper_t *self, uint16_t tile_index, uint32_t palette_index) { - uint32_t mapped_index = self->tile_mappings[tile_index][palette_index]; - return common_hal_displayio_palette_get_color(self->palette, mapped_index); +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) { + if (x_tile_index >= self->width_in_tiles || y_tile_index >= self->height_in_tiles) { + displayio_palette_get_color(self->palette, colorspace, input_pixel, output_color); + return; + } + uint16_t tile_index = y_tile_index * self->width_in_tiles + x_tile_index; + uint32_t mapped_index = self->tile_mappings[tile_index][input_pixel->pixel]; + displayio_input_pixel_t tmp_pixel; + tmp_pixel.pixel = mapped_index; + displayio_palette_get_color(self->palette, colorspace, &tmp_pixel, output_color); } bool tilepalettemapper_tilepalettemapper_needs_refresh(tilepalettemapper_tilepalettemapper_t *self) { diff --git a/shared-module/tilepalettemapper/TilePaletteMapper.h b/shared-module/tilepalettemapper/TilePaletteMapper.h index 7dc30151e96e0..8502d4bf53601 100644 --- a/shared-module/tilepalettemapper/TilePaletteMapper.h +++ b/shared-module/tilepalettemapper/TilePaletteMapper.h @@ -11,12 +11,14 @@ #include #include "py/obj.h" +#include "shared-module/displayio/Palette.h" typedef struct { mp_obj_base_t base; mp_obj_t palette; uint16_t width_in_tiles; uint16_t height_in_tiles; + uint16_t input_color_count; uint16_t **tile_mappings; bool needs_refresh; } tilepalettemapper_tilepalettemapper_t; @@ -24,4 +26,4 @@ typedef struct { bool tilepalettemapper_tilepalettemapper_needs_refresh(tilepalettemapper_tilepalettemapper_t *self); void tilepalettemapper_tilepalettemapper_finish_refresh(tilepalettemapper_tilepalettemapper_t *self); -uint32_t tilepalettemapper_tilepalettemapper_get_color(tilepalettemapper_tilepalettemapper_t *self, uint16_t tile_index, uint32_t palette_index); +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 c473ff8b93141a108d6f4be1dce1949a0b15d278 Mon Sep 17 00:00:00 2001 From: foamyguy Date: Thu, 6 Mar 2025 09:13:56 -0600 Subject: [PATCH 10/14] fix docs formatting --- shared-bindings/tilepalettemapper/TilePaletteMapper.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/shared-bindings/tilepalettemapper/TilePaletteMapper.c b/shared-bindings/tilepalettemapper/TilePaletteMapper.c index 5482186f677a3..9606d558d4f8b 100644 --- a/shared-bindings/tilepalettemapper/TilePaletteMapper.c +++ b/shared-bindings/tilepalettemapper/TilePaletteMapper.c @@ -15,9 +15,9 @@ //| class TilePaletteMapper: //| """Remaps color indices from the source bitmap to alternate indices on a -//| per-tile basis. This allows for altering coloring of tiles based on -//| their tilegrid location. It also allows for using a limited color -//| bitmap with a wider array of colors.""" +//| per-tile basis. This allows for altering coloring of tiles based on +//| their tilegrid location. It also allows for using a limited color +//| bitmap with a wider array of colors.""" //| //| def __init__( //| self, palette: displayio.Palette, input_color_count: int, width: int, height: int @@ -27,10 +27,9 @@ //| :param displayio.Palette palette: The palette 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 int height: The height of the grid in tiles.""" //| + 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_palette, ARG_input_color_count, ARG_width, ARG_height }; static const mp_arg_t allowed_args[] = { From 63bad8f8d6a4fd69a38bf4db46b8b8be8ed3c404 Mon Sep 17 00:00:00 2001 From: foamyguy Date: Thu, 6 Mar 2025 11:04:49 -0600 Subject: [PATCH 11/14] disable on last zephyr board, hallowingm4 and meowbit. --- ports/atmel-samd/boards/hallowing_m4_express/mpconfigboard.mk | 1 + ports/stm/boards/meowbit_v121/mpconfigboard.mk | 1 + ports/zephyr-cp/boards/renesas/ek_ra8d1/autogen_board_info.toml | 1 + 3 files changed, 3 insertions(+) diff --git a/ports/atmel-samd/boards/hallowing_m4_express/mpconfigboard.mk b/ports/atmel-samd/boards/hallowing_m4_express/mpconfigboard.mk index 74f1d3e55993e..3a0eeb3f2130e 100644 --- a/ports/atmel-samd/boards/hallowing_m4_express/mpconfigboard.mk +++ b/ports/atmel-samd/boards/hallowing_m4_express/mpconfigboard.mk @@ -13,3 +13,4 @@ LONGINT_IMPL = MPZ CIRCUITPY_AESIO = 0 CIRCUITPY_JPEGIO = 0 CIRCUITPY_SYNTHIO = 0 +CIRCUITPY_TILEPALETTEMAPPER = 0 diff --git a/ports/stm/boards/meowbit_v121/mpconfigboard.mk b/ports/stm/boards/meowbit_v121/mpconfigboard.mk index 52c191b5b2efb..bde49ad13ef49 100644 --- a/ports/stm/boards/meowbit_v121/mpconfigboard.mk +++ b/ports/stm/boards/meowbit_v121/mpconfigboard.mk @@ -29,6 +29,7 @@ CIRCUITPY_BLEIO_HCI = 0 CIRCUITPY_EPAPERDISPLAY = 0 CIRCUITPY_KEYPAD_DEMUX = 0 CIRCUITPY_SHARPDISPLAY = 0 +CIRCUITPY_TILEPALETTEMAPPER = 0 CIRCUITPY_ULAB = 0 CIRCUITPY_ZLIB = 0 diff --git a/ports/zephyr-cp/boards/renesas/ek_ra8d1/autogen_board_info.toml b/ports/zephyr-cp/boards/renesas/ek_ra8d1/autogen_board_info.toml index 0f366c079bb6b..4f920c59f11d9 100644 --- a/ports/zephyr-cp/boards/renesas/ek_ra8d1/autogen_board_info.toml +++ b/ports/zephyr-cp/boards/renesas/ek_ra8d1/autogen_board_info.toml @@ -90,6 +90,7 @@ struct = true supervisor = false synthio = false terminalio = false +tilepalettemapper = false time = true touchio = false traceback = false From 6151984760afcb9f7ad2ae95410bcd497c5020de Mon Sep 17 00:00:00 2001 From: foamyguy Date: Thu, 6 Mar 2025 14:05:33 -0600 Subject: [PATCH 12/14] remove default arg values Co-authored-by: Scott Shawcroft --- shared-bindings/tilepalettemapper/TilePaletteMapper.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/shared-bindings/tilepalettemapper/TilePaletteMapper.c b/shared-bindings/tilepalettemapper/TilePaletteMapper.c index 9606d558d4f8b..1dbe9db2e85bd 100644 --- a/shared-bindings/tilepalettemapper/TilePaletteMapper.c +++ b/shared-bindings/tilepalettemapper/TilePaletteMapper.c @@ -34,9 +34,9 @@ static mp_obj_t tilepalettemapper_tilepalettemapper_make_new(const mp_obj_type_t enum { ARG_palette, ARG_input_color_count, ARG_width, ARG_height }; static const mp_arg_t allowed_args[] = { { MP_QSTR_palette, MP_ARG_OBJ | MP_ARG_REQUIRED }, - { MP_QSTR_input_color_count, MP_ARG_INT | MP_ARG_REQUIRED, {.u_int = 1} }, - { MP_QSTR_width, MP_ARG_INT | MP_ARG_REQUIRED, {.u_int = 1} }, - { MP_QSTR_height, MP_ARG_INT | MP_ARG_REQUIRED, {.u_int = 1} }, + { 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_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); From a42b3a22beb9df5bdf273cda2458d122b30fda8c Mon Sep 17 00:00:00 2001 From: foamyguy Date: Thu, 6 Mar 2025 14:06:07 -0600 Subject: [PATCH 13/14] update docstring to Tuple Co-authored-by: Scott Shawcroft --- 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 1dbe9db2e85bd..ee1475d16b50f 100644 --- a/shared-bindings/tilepalettemapper/TilePaletteMapper.c +++ b/shared-bindings/tilepalettemapper/TilePaletteMapper.c @@ -86,7 +86,7 @@ MP_PROPERTY_GETTER(tilepalettemapper_tilepalettemapper_palette_obj, (mp_obj_t)&tilepalettemapper_tilepalettemapper_get_palette_obj); -//| def __getitem__(self, index: Union[Tuple[int, int], int]) -> List[int]: +//| 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 //| to ``y * width + x``. //| From f717ffc770c8c73879ae757b4ab2d963a0ed6694 Mon Sep 17 00:00:00 2001 From: foamyguy Date: Thu, 6 Mar 2025 14:08:09 -0600 Subject: [PATCH 14/14] restrict loop to input_color_count Co-authored-by: Scott Shawcroft --- shared-module/tilepalettemapper/TilePaletteMapper.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared-module/tilepalettemapper/TilePaletteMapper.c b/shared-module/tilepalettemapper/TilePaletteMapper.c index 0ccb1b1d74e24..c988e908ab00b 100644 --- a/shared-module/tilepalettemapper/TilePaletteMapper.c +++ b/shared-module/tilepalettemapper/TilePaletteMapper.c @@ -49,7 +49,7 @@ mp_obj_t common_hal_tilepalettemapper_tilepalettemapper_get_mapping(tilepalettem void common_hal_tilepalettemapper_tilepalettemapper_set_mapping(tilepalettemapper_tilepalettemapper_t *self, uint16_t x, uint16_t y, size_t len, mp_obj_t *items) { uint32_t palette_len = common_hal_displayio_palette_get_len(self->palette); - for (uint16_t i = 0; i < len; i++) { + for (uint16_t i = 0; i < MIN(len, self->input_color_count); i++) { int mapping_val = mp_arg_validate_type_int(items[i], MP_QSTR_mapping_value); mp_arg_validate_int_range(mapping_val, 0, palette_len - 1, MP_QSTR_mapping_value); self->tile_mappings[y * self->width_in_tiles + x][i] = mapping_val;