Skip to content

Commit b359e29

Browse files
committed
displayio: Add make_transparent and make_opaque to ColorConvertor
1 parent 57b4492 commit b359e29

File tree

3 files changed

+24
-17
lines changed

3 files changed

+24
-17
lines changed

shared-bindings/displayio/ColorConverter.c

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,27 +43,24 @@
4343
//| """Create a ColorConverter object to convert color formats. Only supports RGB888 to RGB565
4444
//| currently.
4545
//| :param bool dither: Adds random noise to dither the output image"""
46-
//| :param bool transparent_color: Sets one color in the colorset to transparent"""
4746
//| ...
4847
//|
4948

5049
// TODO(tannewt): Add support for other color formats.
5150
//|
5251
STATIC mp_obj_t displayio_colorconverter_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
5352
enum { ARG_dither};
54-
enum { ARG_transparent_color };
5553

5654
static const mp_arg_t allowed_args[] = {
57-
{ MP_QSTR_dither, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = false} },
58-
{ MP_QSTR_transparent_color, MP_ARG_KW_ONLY | MP_ARG_INT, {.uint32_t = 0} },
55+
{ MP_QSTR_dither, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = false} }
5956
};
6057
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
6158
mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
6259

6360
displayio_colorconverter_t *self = m_new_obj(displayio_colorconverter_t);
6461
self->base.type = &displayio_colorconverter_type;
6562

66-
common_hal_displayio_colorconverter_construct(self, args[ARG_dither].u_bool, args[ARG_transparent_color].uint32_t);
63+
common_hal_displayio_colorconverter_construct(self, args[ARG_dither].u_bool);
6764

6865
return MP_OBJ_FROM_PTR(self);
6966
}

shared-bindings/displayio/ColorConverter.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,13 @@
3333

3434
extern const mp_obj_type_t displayio_colorconverter_type;
3535

36-
void common_hal_displayio_colorconverter_construct(displayio_colorconverter_t* self, bool dither, uint32_t transparent_color);
36+
void common_hal_displayio_colorconverter_construct(displayio_colorconverter_t* self, bool dither);
3737
void common_hal_displayio_colorconverter_convert(displayio_colorconverter_t *colorconverter, const _displayio_colorspace_t* colorspace, uint32_t input_color, uint32_t* output_color);
3838

3939
void common_hal_displayio_colorconverter_set_dither(displayio_colorconverter_t* self, bool dither);
4040
bool common_hal_displayio_colorconverter_get_dither(displayio_colorconverter_t* self);
4141

42+
void common_hal_displayio_colorconverter_make_transparent(displayio_colorconverter_t* self, uint32_t transparent_color);
43+
void common_hal_displayio_colorconverter_make_opaque(displayio_colorconverter_t* self, uint32_t transparent_color);
44+
4245
#endif // MICROPY_INCLUDED_SHARED_BINDINGS_DISPLAYIO_COLORCONVERTER_H

shared-module/displayio/ColorConverter.c

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,8 @@ uint32_t displayio_colorconverter_dither_noise_2(uint32_t x, uint32_t y) {
3939
return displayio_colorconverter_dither_noise_1(x + y * 0xFFFF);
4040
}
4141

42-
void common_hal_displayio_colorconverter_construct(displayio_colorconverter_t* self, bool dither, uint32_t transparent_color) {
42+
void common_hal_displayio_colorconverter_construct(displayio_colorconverter_t* self, bool dither) {
4343
self->dither = dither;
44-
self->transparent_color = transparent_color;
4544
}
4645

4746
uint16_t displayio_colorconverter_compute_rgb565(uint32_t color_rgb888) {
@@ -129,9 +128,26 @@ bool common_hal_displayio_colorconverter_get_dither(displayio_colorconverter_t*
129128
return self->dither;
130129
}
131130

131+
void common_hal_displayio_colorconverter_make_transparent(displayio_colorconverter_t* self, uint32_t transparent_color) {
132+
self->transparent_color = transparent_color;
133+
// TODO: Does this require refreshing like the other modules?
134+
}
135+
136+
void common_hal_displayio_colorconverter_make_opaque(displayio_colorconverter_t* self, uint32_t transparent_color) {
137+
if (self->transparent_color == transparent_color) {
138+
m_del(uint8_t, self, transparent_color);
139+
}
140+
// TODO: Does this require refreshing like the other modules?
141+
}
142+
132143
void displayio_colorconverter_convert(displayio_colorconverter_t *self, const _displayio_colorspace_t* colorspace, const displayio_input_pixel_t *input_pixel, displayio_output_pixel_t *output_color) {
133144
uint32_t pixel = input_pixel->pixel;
134145

146+
if (self->transparent_color == pixel) {
147+
output_color->opaque = false;
148+
return;
149+
}
150+
135151
if (self->dither){
136152
uint8_t randr = (displayio_colorconverter_dither_noise_2(input_pixel->tile_x,input_pixel->tile_y));
137153
uint8_t randg = (displayio_colorconverter_dither_noise_2(input_pixel->tile_x+33,input_pixel->tile_y));
@@ -162,9 +178,6 @@ void displayio_colorconverter_convert(displayio_colorconverter_t *self, const _d
162178
}
163179
output_color->pixel = packed;
164180
output_color->opaque = true;
165-
if (self->transparent_color == pixel) {
166-
output_color->opaque = false;
167-
}
168181
return;
169182
} else if (colorspace->tricolor) {
170183
uint8_t luma = displayio_colorconverter_compute_luma(pixel);
@@ -174,9 +187,6 @@ void displayio_colorconverter_convert(displayio_colorconverter_t *self, const _d
174187
output_color->pixel = 0;
175188
}
176189
output_color->opaque = true;
177-
if (self->transparent_color == pixel) {
178-
output_color->opaque = false;
179-
}
180190
return;
181191
}
182192
uint8_t pixel_hue = displayio_colorconverter_compute_hue(pixel);
@@ -186,9 +196,6 @@ void displayio_colorconverter_convert(displayio_colorconverter_t *self, const _d
186196
uint8_t luma = displayio_colorconverter_compute_luma(pixel);
187197
output_color->pixel = luma >> (8 - colorspace->depth);
188198
output_color->opaque = true;
189-
if (self->transparent_color == pixel) {
190-
output_color->opaque = false;
191-
}
192199
return;
193200
}
194201
output_color->opaque = false;

0 commit comments

Comments
 (0)