Skip to content

Commit 70fe5cd

Browse files
authored
Merge pull request #10173 from FoamyGuy/tile_palette_mapper_color_converter
TilePaletteMapper support for ColorConverter
2 parents 9ba4104 + afb153e commit 70fe5cd

File tree

4 files changed

+51
-27
lines changed

4 files changed

+51
-27
lines changed

shared-bindings/tilepalettemapper/TilePaletteMapper.c

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include "py/runtime.h"
1212
#include "shared-bindings/util.h"
1313
#include "shared-bindings/displayio/Palette.h"
14+
#include "shared-bindings/displayio/ColorConverter.h"
1415
#include "shared-bindings/tilepalettemapper/TilePaletteMapper.h"
1516

1617
//| class TilePaletteMapper:
@@ -24,28 +25,29 @@
2425
//| ) -> None:
2526
//| """Create a TilePaletteMApper object to store a set of color mappings for tiles.
2627
//|
27-
//| :param displayio.Palette palette: The palette to get mapped colors from.
28+
//| :param Union[displayio.Palette, displayio.ColorConverter] pixel_shader:
29+
//| The palette or ColorConverter to get mapped colors from.
2830
//| :param int input_color_count: The number of colors in in the input bitmap.
2931
//| :param int width: The width of the grid in tiles.
3032
//| :param int height: The height of the grid in tiles."""
3133
//|
3234

3335
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) {
34-
enum { ARG_palette, ARG_input_color_count, ARG_width, ARG_height };
36+
enum { ARG_pixel_shader, ARG_input_color_count, ARG_width, ARG_height };
3537
static const mp_arg_t allowed_args[] = {
36-
{ MP_QSTR_palette, MP_ARG_OBJ | MP_ARG_REQUIRED },
38+
{ MP_QSTR_pixel_shader, MP_ARG_OBJ | MP_ARG_REQUIRED },
3739
{ MP_QSTR_input_color_count, MP_ARG_INT | MP_ARG_REQUIRED },
3840
{ MP_QSTR_width, MP_ARG_INT | MP_ARG_REQUIRED },
3941
{ MP_QSTR_height, MP_ARG_INT | MP_ARG_REQUIRED },
4042
};
4143
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
4244
mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
43-
mp_obj_t palette = args[ARG_palette].u_obj;
44-
if (!mp_obj_is_type(palette, &displayio_palette_type)) {
45+
mp_obj_t pixel_shader = args[ARG_pixel_shader].u_obj;
46+
if (!mp_obj_is_type(pixel_shader, &displayio_palette_type) && !mp_obj_is_type(pixel_shader, &displayio_colorconverter_type)) {
4547
mp_raise_TypeError_varg(MP_ERROR_TEXT("unsupported %q type"), MP_QSTR_pixel_shader);
4648
}
4749
tilepalettemapper_tilepalettemapper_t *self = mp_obj_malloc(tilepalettemapper_tilepalettemapper_t, &tilepalettemapper_tilepalettemapper_type);
48-
common_hal_tilepalettemapper_tilepalettemapper_construct(self, palette, args[ARG_input_color_count].u_int, args[ARG_width].u_int, args[ARG_height].u_int);
50+
common_hal_tilepalettemapper_tilepalettemapper_construct(self, pixel_shader, args[ARG_input_color_count].u_int, args[ARG_width].u_int, args[ARG_height].u_int);
4951

5052
return MP_OBJ_FROM_PTR(self);
5153
}
@@ -73,17 +75,17 @@ MP_PROPERTY_GETTER(tilepalettemapper_tilepalettemapper_height_obj,
7375
(mp_obj_t)&tilepalettemapper_tilepalettemapper_get_height_obj);
7476

7577

76-
//| palette: displayio.Palette
77-
//| """The palette that the mapper uses."""
78+
//| pixel_shader: Union[displayio.Palette, displayio.ColorConverter]
79+
//| """The palette or ColorConverter that the mapper uses."""
7880
//|
79-
static mp_obj_t tilepalettemapper_tilepalettemapper_obj_get_palette(mp_obj_t self_in) {
81+
static mp_obj_t tilepalettemapper_tilepalettemapper_obj_get_pixel_shader(mp_obj_t self_in) {
8082
tilepalettemapper_tilepalettemapper_t *self = MP_OBJ_TO_PTR(self_in);
81-
return common_hal_tilepalettemapper_tilepalettemapper_get_palette(self);
83+
return common_hal_tilepalettemapper_tilepalettemapper_get_pixel_shader(self);
8284
}
83-
MP_DEFINE_CONST_FUN_OBJ_1(tilepalettemapper_tilepalettemapper_get_palette_obj, tilepalettemapper_tilepalettemapper_obj_get_palette);
85+
MP_DEFINE_CONST_FUN_OBJ_1(tilepalettemapper_tilepalettemapper_get_pixel_shader_obj, tilepalettemapper_tilepalettemapper_obj_get_pixel_shader);
8486

8587
MP_PROPERTY_GETTER(tilepalettemapper_tilepalettemapper_palette_obj,
86-
(mp_obj_t)&tilepalettemapper_tilepalettemapper_get_palette_obj);
88+
(mp_obj_t)&tilepalettemapper_tilepalettemapper_get_pixel_shader_obj);
8789

8890

8991
//| def __getitem__(self, index: Union[Tuple[int, int], int]) -> Tuple[int]:

shared-bindings/tilepalettemapper/TilePaletteMapper.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,6 @@ void common_hal_tilepalettemapper_tilepalettemapper_construct(tilepalettemapper_
1313

1414
uint16_t common_hal_tilepalettemapper_tilepalettemapper_get_width(tilepalettemapper_tilepalettemapper_t *self);
1515
uint16_t common_hal_tilepalettemapper_tilepalettemapper_get_height(tilepalettemapper_tilepalettemapper_t *self);
16-
mp_obj_t common_hal_tilepalettemapper_tilepalettemapper_get_palette(tilepalettemapper_tilepalettemapper_t *self);
16+
mp_obj_t common_hal_tilepalettemapper_tilepalettemapper_get_pixel_shader(tilepalettemapper_tilepalettemapper_t *self);
1717
mp_obj_t common_hal_tilepalettemapper_tilepalettemapper_get_mapping(tilepalettemapper_tilepalettemapper_t *self, uint16_t x, uint16_t y);
1818
void common_hal_tilepalettemapper_tilepalettemapper_set_mapping(tilepalettemapper_tilepalettemapper_t *self, uint16_t x, uint16_t y, size_t len, mp_obj_t *items);

shared-module/tilepalettemapper/TilePaletteMapper.c

Lines changed: 34 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,28 @@
77
#include "py/runtime.h"
88
#include "shared-bindings/tilepalettemapper/TilePaletteMapper.h"
99
#include "shared-bindings/displayio/Palette.h"
10+
#include "shared-bindings/displayio/ColorConverter.h"
1011

1112
void common_hal_tilepalettemapper_tilepalettemapper_construct(tilepalettemapper_tilepalettemapper_t *self,
12-
mp_obj_t palette, uint16_t input_color_count, uint16_t width, uint16_t height) {
13+
mp_obj_t pixel_shader, uint16_t input_color_count, uint16_t width, uint16_t height) {
1314

14-
self->palette = palette;
15+
self->pixel_shader = pixel_shader;
1516
self->width_in_tiles = width;
1617
self->height_in_tiles = height;
1718
self->input_color_count = input_color_count;
1819
self->needs_refresh = false;
1920
int mappings_len = width * height;
20-
self->tile_mappings = (uint16_t **)m_malloc(mappings_len * sizeof(uint16_t *));
21+
self->tile_mappings = (uint32_t **)m_malloc(mappings_len * sizeof(uint32_t *));
2122
for (int i = 0; i < mappings_len; i++) {
22-
self->tile_mappings[i] = (uint16_t *)m_malloc(input_color_count * sizeof(uint16_t));
23-
for (uint16_t j = 0; j < input_color_count; j++) {
24-
self->tile_mappings[i][j] = j;
23+
self->tile_mappings[i] = (uint32_t *)m_malloc(input_color_count * sizeof(uint32_t));
24+
if (mp_obj_is_type(self->pixel_shader, &displayio_palette_type)) {
25+
for (uint16_t j = 0; j < input_color_count; j++) {
26+
self->tile_mappings[i][j] = j;
27+
}
28+
} else if (mp_obj_is_type(self->pixel_shader, &displayio_colorconverter_type)) {
29+
for (uint16_t j = 0; j < input_color_count; j++) {
30+
self->tile_mappings[i][j] = 0;
31+
}
2532
}
2633
}
2734
}
@@ -34,8 +41,8 @@ uint16_t common_hal_tilepalettemapper_tilepalettemapper_get_height(tilepalettema
3441
return self->height_in_tiles;
3542
}
3643

37-
mp_obj_t common_hal_tilepalettemapper_tilepalettemapper_get_palette(tilepalettemapper_tilepalettemapper_t *self) {
38-
return self->palette;
44+
mp_obj_t common_hal_tilepalettemapper_tilepalettemapper_get_pixel_shader(tilepalettemapper_tilepalettemapper_t *self) {
45+
return self->pixel_shader;
3946
}
4047

4148
mp_obj_t common_hal_tilepalettemapper_tilepalettemapper_get_mapping(tilepalettemapper_tilepalettemapper_t *self, uint16_t x, uint16_t y) {
@@ -48,25 +55,40 @@ mp_obj_t common_hal_tilepalettemapper_tilepalettemapper_get_mapping(tilepalettem
4855
}
4956

5057
void common_hal_tilepalettemapper_tilepalettemapper_set_mapping(tilepalettemapper_tilepalettemapper_t *self, uint16_t x, uint16_t y, size_t len, mp_obj_t *items) {
51-
uint32_t palette_len = common_hal_displayio_palette_get_len(self->palette);
58+
uint32_t palette_max;
59+
if (mp_obj_is_type(self->pixel_shader, &displayio_palette_type)) {
60+
palette_max = common_hal_displayio_palette_get_len(self->pixel_shader) - 1;
61+
} else { // colorconverter type
62+
palette_max = 0xFFFFFF;
63+
}
64+
5265
for (uint16_t i = 0; i < MIN(len, self->input_color_count); i++) {
5366
int mapping_val = mp_arg_validate_type_int(items[i], MP_QSTR_mapping_value);
54-
mp_arg_validate_int_range(mapping_val, 0, palette_len - 1, MP_QSTR_mapping_value);
67+
mp_arg_validate_int_range(mapping_val, 0, palette_max, MP_QSTR_mapping_value);
5568
self->tile_mappings[y * self->width_in_tiles + x][i] = mapping_val;
5669
}
5770
self->needs_refresh = true;
5871
}
5972

6073
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) {
6174
if (x_tile_index >= self->width_in_tiles || y_tile_index >= self->height_in_tiles) {
62-
displayio_palette_get_color(self->palette, colorspace, input_pixel, output_color);
75+
if (mp_obj_is_type(self->pixel_shader, &displayio_palette_type)) {
76+
displayio_palette_get_color(self->pixel_shader, colorspace, input_pixel, output_color);
77+
} else if (mp_obj_is_type(self->pixel_shader, &displayio_colorconverter_type)) {
78+
displayio_colorconverter_convert(self->pixel_shader, colorspace, input_pixel, output_color);
79+
}
6380
return;
6481
}
6582
uint16_t tile_index = y_tile_index * self->width_in_tiles + x_tile_index;
6683
uint32_t mapped_index = self->tile_mappings[tile_index][input_pixel->pixel];
6784
displayio_input_pixel_t tmp_pixel;
6885
tmp_pixel.pixel = mapped_index;
69-
displayio_palette_get_color(self->palette, colorspace, &tmp_pixel, output_color);
86+
if (mp_obj_is_type(self->pixel_shader, &displayio_palette_type)) {
87+
displayio_palette_get_color(self->pixel_shader, colorspace, &tmp_pixel, output_color);
88+
} else if (mp_obj_is_type(self->pixel_shader, &displayio_colorconverter_type)) {
89+
displayio_colorconverter_convert(self->pixel_shader, colorspace, &tmp_pixel, output_color);
90+
}
91+
7092
}
7193

7294
bool tilepalettemapper_tilepalettemapper_needs_refresh(tilepalettemapper_tilepalettemapper_t *self) {

shared-module/tilepalettemapper/TilePaletteMapper.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,11 @@
1515

1616
typedef struct {
1717
mp_obj_base_t base;
18-
mp_obj_t palette;
18+
mp_obj_t pixel_shader;
1919
uint16_t width_in_tiles;
2020
uint16_t height_in_tiles;
2121
uint16_t input_color_count;
22-
uint16_t **tile_mappings;
22+
uint32_t **tile_mappings;
2323
bool needs_refresh;
2424
} tilepalettemapper_tilepalettemapper_t;
2525

0 commit comments

Comments
 (0)