7
7
#include "py/runtime.h"
8
8
#include "shared-bindings/tilepalettemapper/TilePaletteMapper.h"
9
9
#include "shared-bindings/displayio/Palette.h"
10
+ #include "shared-bindings/displayio/ColorConverter.h"
10
11
11
12
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) {
13
14
14
- self->palette = palette ;
15
+ self->pixel_shader = pixel_shader ;
15
16
self->width_in_tiles = width;
16
17
self->height_in_tiles = height;
17
18
self->input_color_count = input_color_count;
18
19
self->needs_refresh = false;
19
20
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 *));
21
22
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
+ }
25
32
}
26
33
}
27
34
}
@@ -34,8 +41,8 @@ uint16_t common_hal_tilepalettemapper_tilepalettemapper_get_height(tilepalettema
34
41
return self->height_in_tiles;
35
42
}
36
43
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 ;
39
46
}
40
47
41
48
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
48
55
}
49
56
50
57
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
+
52
65
for (uint16_t i = 0; i < MIN(len, self->input_color_count); i++) {
53
66
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);
55
68
self->tile_mappings[y * self->width_in_tiles + x][i] = mapping_val;
56
69
}
57
70
self->needs_refresh = true;
58
71
}
59
72
60
73
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) {
61
74
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
+ }
63
80
return;
64
81
}
65
82
uint16_t tile_index = y_tile_index * self->width_in_tiles + x_tile_index;
66
83
uint32_t mapped_index = self->tile_mappings[tile_index][input_pixel->pixel];
67
84
displayio_input_pixel_t tmp_pixel;
68
85
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
+
70
92
}
71
93
72
94
bool tilepalettemapper_tilepalettemapper_needs_refresh(tilepalettemapper_tilepalettemapper_t *self) {
0 commit comments