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)
pFad - Phonifier reborn

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

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


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy