Skip to content

Commit 108860a

Browse files
authored
Merge pull request #10732 from FoamyGuy/bitmaptools_replace_color
bitmaptools.replace_color() function
2 parents 11727bd + 7b429ba commit 108860a

File tree

4 files changed

+90
-31
lines changed

4 files changed

+90
-31
lines changed

ports/unix/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ INC += -I$(BUILD)
4646

4747
# compiler settings
4848
CWARN = -Wall -Werror
49-
CWARN += -Wextra -Wno-unused-parameter -Wpointer-arith -Wdouble-promotion -Wfloat-conversion
49+
CWARN += -Wextra -Wno-unused-parameter -Wpointer-arith -Wdouble-promotion -Wfloat-conversion -Wno-missing-field-initializers
5050
CFLAGS += $(INC) $(CWARN) -std=gnu99 -DUNIX $(COPT) -I$(VARIANT_DIR) $(CFLAGS_EXTRA)
5151

5252
# Force the use of 64-bits for file sizes in C library functions on 32-bit platforms.

shared-bindings/bitmaptools/__init__.c

Lines changed: 71 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -185,8 +185,8 @@ static mp_obj_t bitmaptools_obj_rotozoom(size_t n_args, const mp_obj_t *pos_args
185185
ARG_angle, ARG_scale, ARG_skip_index};
186186

187187
static const mp_arg_t allowed_args[] = {
188-
{MP_QSTR_dest_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL}},
189-
{MP_QSTR_source_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL}},
188+
{MP_QSTR_dest_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ},
189+
{MP_QSTR_source_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ},
190190

191191
{MP_QSTR_ox, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} }, // None convert to destination->width / 2
192192
{MP_QSTR_oy, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} }, // None convert to destination->height / 2
@@ -418,6 +418,46 @@ static mp_obj_t bitmaptools_alphablend(size_t n_args, const mp_obj_t *pos_args,
418418
}
419419
MP_DEFINE_CONST_FUN_OBJ_KW(bitmaptools_alphablend_obj, 0, bitmaptools_alphablend);
420420

421+
//| def replace_color(
422+
//| dest_bitmap: displayio.Bitmap, old_color: int, new_color: int
423+
//| ) -> None:
424+
//| """Replace any pixels of ``old_color`` with ``new_color`` in the ``bitmap``
425+
//|
426+
//| :param displayio.Bitmap bitmap: Bitmap that will be changed
427+
//| :param int old_color: Bitmap palette index that will overwritten
428+
//| :param int new_color: Bitmap palette index that will get put in the bitmap"""
429+
//| ...
430+
//|
431+
//|
432+
static mp_obj_t bitmaptools_obj_replace_color(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
433+
enum {ARG_bitmap, ARG_old_color, ARG_new_color};
434+
435+
static const mp_arg_t allowed_args[] = {
436+
{MP_QSTR_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ},
437+
{MP_QSTR_old_color, MP_ARG_REQUIRED | MP_ARG_INT},
438+
{MP_QSTR_new_color, MP_ARG_REQUIRED | MP_ARG_INT},
439+
};
440+
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
441+
mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
442+
443+
displayio_bitmap_t *destination = MP_OBJ_TO_PTR(mp_arg_validate_type(args[ARG_bitmap].u_obj, &displayio_bitmap_type, MP_QSTR_bitmap));
444+
445+
uint32_t old_color, new_color, color_depth;
446+
old_color = args[ARG_old_color].u_int;
447+
new_color = args[ARG_new_color].u_int;
448+
449+
color_depth = (1 << destination->bits_per_value);
450+
if (color_depth <= old_color || color_depth <= new_color) {
451+
mp_raise_ValueError_varg(MP_ERROR_TEXT("%q out of range"), MP_QSTR_color);
452+
}
453+
454+
common_hal_bitmaptools_replace_color(destination, old_color, new_color);
455+
456+
return mp_const_none;
457+
}
458+
459+
MP_DEFINE_CONST_FUN_OBJ_KW(bitmaptools_replace_color_obj, 0, bitmaptools_obj_replace_color);
460+
421461
//| def fill_region(
422462
//| dest_bitmap: displayio.Bitmap, x1: int, y1: int, x2: int, y2: int, value: int
423463
//| ) -> None:
@@ -438,9 +478,9 @@ static mp_obj_t bitmaptools_obj_fill_region(size_t n_args, const mp_obj_t *pos_a
438478
enum {ARG_dest_bitmap, ARGS_X1_Y1_X2_Y2, ARG_value};
439479

440480
static const mp_arg_t allowed_args[] = {
441-
{MP_QSTR_dest_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL}},
481+
{MP_QSTR_dest_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ},
442482
ALLOWED_ARGS_X1_Y1_X2_Y2(MP_ARG_REQUIRED, MP_ARG_REQUIRED),
443-
{MP_QSTR_value, MP_ARG_REQUIRED | MP_ARG_INT, {.u_obj = MP_OBJ_NULL}},
483+
{MP_QSTR_value, MP_ARG_REQUIRED | MP_ARG_INT},
444484
};
445485
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
446486
mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
@@ -487,10 +527,10 @@ static mp_obj_t bitmaptools_obj_boundary_fill(size_t n_args, const mp_obj_t *pos
487527
enum {ARG_dest_bitmap, ARG_x, ARG_y, ARG_fill_color_value, ARG_replaced_color_value};
488528

489529
static const mp_arg_t allowed_args[] = {
490-
{MP_QSTR_dest_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL}},
491-
{MP_QSTR_x, MP_ARG_REQUIRED | MP_ARG_INT, {.u_obj = MP_OBJ_NULL}},
492-
{MP_QSTR_y, MP_ARG_REQUIRED | MP_ARG_INT, {.u_obj = MP_OBJ_NULL}},
493-
{MP_QSTR_fill_color_value, MP_ARG_REQUIRED | MP_ARG_INT, {.u_obj = MP_OBJ_NULL}},
530+
{MP_QSTR_dest_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ},
531+
{MP_QSTR_x, MP_ARG_REQUIRED | MP_ARG_INT},
532+
{MP_QSTR_y, MP_ARG_REQUIRED | MP_ARG_INT},
533+
{MP_QSTR_fill_color_value, MP_ARG_REQUIRED | MP_ARG_INT},
494534
{MP_QSTR_replaced_color_value, MP_ARG_INT, {.u_int = INT_MAX} },
495535
};
496536
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
@@ -548,12 +588,12 @@ static mp_obj_t bitmaptools_obj_draw_line(size_t n_args, const mp_obj_t *pos_arg
548588
enum {ARG_dest_bitmap, ARG_x1, ARG_y1, ARG_x2, ARG_y2, ARG_value};
549589

550590
static const mp_arg_t allowed_args[] = {
551-
{MP_QSTR_dest_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL}},
552-
{MP_QSTR_x1, MP_ARG_REQUIRED | MP_ARG_INT, {.u_obj = MP_OBJ_NULL}},
553-
{MP_QSTR_y1, MP_ARG_REQUIRED | MP_ARG_INT, {.u_obj = MP_OBJ_NULL}},
554-
{MP_QSTR_x2, MP_ARG_REQUIRED | MP_ARG_INT, {.u_obj = MP_OBJ_NULL}},
555-
{MP_QSTR_y2, MP_ARG_REQUIRED | MP_ARG_INT, {.u_obj = MP_OBJ_NULL}},
556-
{MP_QSTR_value, MP_ARG_REQUIRED | MP_ARG_INT, {.u_obj = MP_OBJ_NULL}},
591+
{MP_QSTR_dest_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ},
592+
{MP_QSTR_x1, MP_ARG_REQUIRED | MP_ARG_INT},
593+
{MP_QSTR_y1, MP_ARG_REQUIRED | MP_ARG_INT},
594+
{MP_QSTR_x2, MP_ARG_REQUIRED | MP_ARG_INT},
595+
{MP_QSTR_y2, MP_ARG_REQUIRED | MP_ARG_INT},
596+
{MP_QSTR_value, MP_ARG_REQUIRED | MP_ARG_INT},
557597
};
558598
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
559599
mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
@@ -635,10 +675,10 @@ static mp_obj_t bitmaptools_obj_draw_polygon(size_t n_args, const mp_obj_t *pos_
635675
enum {ARG_dest_bitmap, ARG_xs, ARG_ys, ARG_value, ARG_close};
636676

637677
static const mp_arg_t allowed_args[] = {
638-
{MP_QSTR_dest_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL}},
639-
{MP_QSTR_xs, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL}},
640-
{MP_QSTR_ys, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL}},
641-
{MP_QSTR_value, MP_ARG_REQUIRED | MP_ARG_INT, {.u_obj = MP_OBJ_NULL}},
678+
{MP_QSTR_dest_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ},
679+
{MP_QSTR_xs, MP_ARG_REQUIRED | MP_ARG_OBJ},
680+
{MP_QSTR_ys, MP_ARG_REQUIRED | MP_ARG_OBJ},
681+
{MP_QSTR_value, MP_ARG_REQUIRED | MP_ARG_INT},
642682
{MP_QSTR_close, MP_ARG_BOOL, {.u_bool = true}},
643683
};
644684
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
@@ -717,8 +757,8 @@ MP_DEFINE_CONST_FUN_OBJ_KW(bitmaptools_draw_polygon_obj, 0, bitmaptools_obj_draw
717757
static mp_obj_t bitmaptools_arrayblit(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
718758
enum { ARG_bitmap, ARG_data, ARGS_X1_Y1_X2_Y2, ARG_skip_index };
719759
static const mp_arg_t allowed_args[] = {
720-
{ MP_QSTR_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
721-
{ MP_QSTR_data, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
760+
{ MP_QSTR_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ },
761+
{ MP_QSTR_data, MP_ARG_REQUIRED | MP_ARG_OBJ },
722762
ALLOWED_ARGS_X1_Y1_X2_Y2(0, 0),
723763
{ MP_QSTR_skip_index, MP_ARG_OBJ, {.u_obj = mp_const_none } },
724764
};
@@ -782,9 +822,9 @@ MP_DEFINE_CONST_FUN_OBJ_KW(bitmaptools_arrayblit_obj, 0, bitmaptools_arrayblit);
782822
static mp_obj_t bitmaptools_readinto(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
783823
enum { ARG_bitmap, ARG_file, ARG_bits_per_pixel, ARG_element_size, ARG_reverse_pixels_in_element, ARG_swap_bytes_in_element, ARG_reverse_rows };
784824
static const mp_arg_t allowed_args[] = {
785-
{ MP_QSTR_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
786-
{ MP_QSTR_file, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
787-
{ MP_QSTR_bits_per_pixel, MP_ARG_REQUIRED | MP_ARG_INT, {.u_obj = MP_OBJ_NULL} },
825+
{ MP_QSTR_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ },
826+
{ MP_QSTR_file, MP_ARG_REQUIRED | MP_ARG_OBJ },
827+
{ MP_QSTR_bits_per_pixel, MP_ARG_REQUIRED | MP_ARG_INT },
788828
{ MP_QSTR_element_size, MP_ARG_INT, { .u_int = 1 } },
789829
{ MP_QSTR_reverse_pixels_in_element, MP_ARG_BOOL, { .u_bool = false } },
790830
{ MP_QSTR_swap_bytes_in_element, MP_ARG_BOOL, { .u_bool = false } },
@@ -873,9 +913,9 @@ MAKE_ENUM_TYPE(bitmaptools, DitherAlgorithm, bitmaptools_dither_algorithm);
873913
static mp_obj_t bitmaptools_dither(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
874914
enum { ARG_dest_bitmap, ARG_source_bitmap, ARG_source_colorspace, ARG_algorithm };
875915
static const mp_arg_t allowed_args[] = {
876-
{ MP_QSTR_dest_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
877-
{ MP_QSTR_source_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
878-
{ MP_QSTR_source_colorspace, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
916+
{ MP_QSTR_dest_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ },
917+
{ MP_QSTR_source_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ },
918+
{ MP_QSTR_source_colorspace, MP_ARG_REQUIRED | MP_ARG_OBJ },
879919
{ MP_QSTR_algorithm, MP_ARG_OBJ, { .u_obj = MP_ROM_PTR((void *)&dither_algorithm_Atkinson_obj) } },
880920
};
881921
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
@@ -1038,10 +1078,10 @@ MP_DEFINE_CONST_FUN_OBJ_KW(bitmaptools_draw_circle_obj, 0, bitmaptools_obj_draw_
10381078
static mp_obj_t bitmaptools_obj_blit(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
10391079
enum {ARG_destination, ARG_source, ARG_x, ARG_y, ARG_x1, ARG_y1, ARG_x2, ARG_y2, ARG_skip_source_index, ARG_skip_dest_index};
10401080
static const mp_arg_t allowed_args[] = {
1041-
{MP_QSTR_dest_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
1042-
{MP_QSTR_source_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
1043-
{MP_QSTR_x, MP_ARG_REQUIRED | MP_ARG_INT, {.u_obj = MP_OBJ_NULL} },
1044-
{MP_QSTR_y, MP_ARG_REQUIRED | MP_ARG_INT, {.u_obj = MP_OBJ_NULL} },
1081+
{MP_QSTR_dest_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ },
1082+
{MP_QSTR_source_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ },
1083+
{MP_QSTR_x, MP_ARG_REQUIRED | MP_ARG_INT },
1084+
{MP_QSTR_y, MP_ARG_REQUIRED | MP_ARG_INT },
10451085
ALLOWED_ARGS_X1_Y1_X2_Y2(0, 0),
10461086
{MP_QSTR_skip_source_index, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} },
10471087
{MP_QSTR_skip_dest_index, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} },
@@ -1103,6 +1143,7 @@ static const mp_rom_map_elem_t bitmaptools_module_globals_table[] = {
11031143
{ MP_ROM_QSTR(MP_QSTR_rotozoom), MP_ROM_PTR(&bitmaptools_rotozoom_obj) },
11041144
{ MP_ROM_QSTR(MP_QSTR_arrayblit), MP_ROM_PTR(&bitmaptools_arrayblit_obj) },
11051145
{ MP_ROM_QSTR(MP_QSTR_alphablend), MP_ROM_PTR(&bitmaptools_alphablend_obj) },
1146+
{ MP_ROM_QSTR(MP_QSTR_replace_color), MP_ROM_PTR(&bitmaptools_replace_color_obj) },
11061147
{ MP_ROM_QSTR(MP_QSTR_fill_region), MP_ROM_PTR(&bitmaptools_fill_region_obj) },
11071148
{ MP_ROM_QSTR(MP_QSTR_boundary_fill), MP_ROM_PTR(&bitmaptools_boundary_fill_obj) },
11081149
{ MP_ROM_QSTR(MP_QSTR_draw_line), MP_ROM_PTR(&bitmaptools_draw_line_obj) },

shared-bindings/bitmaptools/__init__.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,9 @@ void common_hal_bitmaptools_fill_region(displayio_bitmap_t *destination,
4242
int16_t x2, int16_t y2,
4343
uint32_t value);
4444

45+
void common_hal_bitmaptools_replace_color(displayio_bitmap_t *destination,
46+
uint32_t old_color, uint32_t new_color);
47+
4548
void common_hal_bitmaptools_boundary_fill(displayio_bitmap_t *destination,
4649
int16_t x, int16_t y,
4750
uint32_t fill_color_value, uint32_t replaced_color_value);

shared-module/bitmaptools/__init__.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,21 @@ void common_hal_bitmaptools_rotozoom(displayio_bitmap_t *self, int16_t ox, int16
204204
}
205205
}
206206

207+
void common_hal_bitmaptools_replace_color(displayio_bitmap_t *destination,
208+
uint32_t old_color,
209+
uint32_t new_color) {
210+
211+
int16_t x, y;
212+
for (x = 0; x < destination->width; x++) {
213+
for (y = 0; y < destination->height; y++) {
214+
uint32_t pixel_val = common_hal_displayio_bitmap_get_pixel(destination, x, y);
215+
if (pixel_val == old_color) {
216+
displayio_bitmap_write_pixel(destination, x, y, new_color);
217+
}
218+
}
219+
}
220+
}
221+
207222
void common_hal_bitmaptools_fill_region(displayio_bitmap_t *destination,
208223
int16_t x1, int16_t y1,
209224
int16_t x2, int16_t y2,

0 commit comments

Comments
 (0)