@@ -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}
419419MP_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
717757static 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);
782822static 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);
873913static 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_
10381078static 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 ) },
0 commit comments