|
28 | 28 |
|
29 | 29 | #include "py/runtime.h" |
30 | 30 | #include "shared-bindings/displayio/Bitmap.h" |
| 31 | +#include "shared-bindings/displayio/Palette.h" |
31 | 32 | #include "shared-bindings/bitmapfilter/__init__.h" |
32 | 33 |
|
33 | 34 | //| |
@@ -347,11 +348,54 @@ STATIC mp_obj_t bitmapfilter_lookup(size_t n_args, const mp_obj_t *pos_args, mp_ |
347 | 348 |
|
348 | 349 | MP_DEFINE_CONST_FUN_OBJ_KW(bitmapfilter_lookup_obj, 0, bitmapfilter_lookup); |
349 | 350 |
|
| 351 | +//| def false_color( |
| 352 | +//| bitmap: displayio.Bitmap, |
| 353 | +//| palette: displayio.Palette | Sequence[int], |
| 354 | +//| mask: displayio.Bitmap | None, |
| 355 | +//| ) -> displayio.Bitmap: |
| 356 | +//| """Convert the image to false color using the given palette |
| 357 | +//| |
| 358 | +//| The ``bitmap``, which must be in RGB565_SWAPPED format, is converted into false color: |
| 359 | +//| |
| 360 | +//| Each pixel is converted to a luminance (brightness/greyscale) value |
| 361 | +//| in the range 0..255, then the corresponding palette entry is looked up and |
| 362 | +//| stored in the bitmap. |
| 363 | +//| """ |
| 364 | +//| |
| 365 | +STATIC mp_obj_t bitmapfilter_false_color(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { |
| 366 | + enum { ARG_bitmap, ARG_palette, ARG_mask }; |
| 367 | + static const mp_arg_t allowed_args[] = { |
| 368 | + { MP_QSTR_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ, { .u_obj = MP_OBJ_NULL } }, |
| 369 | + { MP_QSTR_palette, MP_ARG_REQUIRED | MP_ARG_OBJ, { .u_obj = MP_OBJ_NULL } }, |
| 370 | + { MP_QSTR_mask, MP_ARG_OBJ, { .u_obj = MP_ROM_NONE } }, |
| 371 | + }; |
| 372 | + mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; |
| 373 | + mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); |
| 374 | + |
| 375 | + mp_arg_validate_type(args[ARG_bitmap].u_obj, &displayio_bitmap_type, MP_QSTR_bitmap); |
| 376 | + displayio_bitmap_t *bitmap = MP_OBJ_TO_PTR(args[ARG_bitmap].u_obj); |
| 377 | + |
| 378 | + mp_arg_validate_type(args[ARG_palette].u_obj, &displayio_palette_type, MP_QSTR_palette); |
| 379 | + displayio_palette_t *palette = MP_OBJ_TO_PTR(args[ARG_palette].u_obj); |
| 380 | + mp_arg_validate_length(palette->color_count, 256, MP_QSTR_palette); |
| 381 | + |
| 382 | + displayio_bitmap_t *mask = NULL; |
| 383 | + if (args[ARG_mask].u_obj != mp_const_none) { |
| 384 | + mp_arg_validate_type(args[ARG_mask].u_obj, &displayio_bitmap_type, MP_QSTR_mask); |
| 385 | + mask = MP_OBJ_TO_PTR(args[ARG_mask].u_obj); |
| 386 | + } |
| 387 | + |
| 388 | + shared_module_bitmapfilter_false_color(bitmap, mask, palette->colors); |
| 389 | + return args[ARG_bitmap].u_obj; |
| 390 | +} |
| 391 | + |
| 392 | +MP_DEFINE_CONST_FUN_OBJ_KW(bitmapfilter_false_color_obj, 0, bitmapfilter_false_color); |
350 | 393 | STATIC const mp_rom_map_elem_t bitmapfilter_module_globals_table[] = { |
351 | 394 | { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_bitmapfilter) }, |
352 | 395 | { MP_ROM_QSTR(MP_QSTR_morph), MP_ROM_PTR(&bitmapfilter_morph_obj) }, |
353 | 396 | { MP_ROM_QSTR(MP_QSTR_mix), MP_ROM_PTR(&bitmapfilter_mix_obj) }, |
354 | 397 | { MP_ROM_QSTR(MP_QSTR_solarize), MP_ROM_PTR(&bitmapfilter_solarize_obj) }, |
| 398 | + { MP_ROM_QSTR(MP_QSTR_false_color), MP_ROM_PTR(&bitmapfilter_false_color_obj) }, |
355 | 399 | { MP_ROM_QSTR(MP_QSTR_lookup), MP_ROM_PTR(&bitmapfilter_lookup_obj) }, |
356 | 400 | }; |
357 | 401 | STATIC MP_DEFINE_CONST_DICT(bitmapfilter_module_globals, bitmapfilter_module_globals_table); |
|
0 commit comments