Skip to content

Commit a94b8cf

Browse files
authored
Merge pull request #4823 from jepler/ondiskbitmap-palette
OnDiskBitmap: INCOMPATIBLE CHANGE: Allow them to use palettes
2 parents 892dfa8 + 193f8b7 commit a94b8cf

File tree

6 files changed

+73
-27
lines changed

6 files changed

+73
-27
lines changed

shared-bindings/displayio/OnDiskBitmap.c

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@
5555
//|
5656
//| with open("/sample.bmp", "rb") as f:
5757
//| odb = displayio.OnDiskBitmap(f)
58-
//| face = displayio.TileGrid(odb, pixel_shader=displayio.ColorConverter())
58+
//| face = displayio.TileGrid(odb, pixel_shader=odb.pixel_shader)
5959
//| splash.append(face)
6060
//| # Wait for the image to load.
6161
//| board.DISPLAY.refresh(target_frames_per_second=60)
@@ -127,8 +127,29 @@ const mp_obj_property_t displayio_ondiskbitmap_height_obj = {
127127

128128
};
129129

130+
//| pixel_shader: Union[ColorConverter, Palette]
131+
//| """The image's pixel_shader. The type depends on the underlying
132+
//| bitmap's structure. The pixel shadder can be modified (e.g., to set the
133+
//| transparent pixel or, for paletted images, to update the palette"""
134+
//|
135+
STATIC mp_obj_t displayio_ondiskbitmap_obj_get_pixel_shader(mp_obj_t self_in) {
136+
displayio_ondiskbitmap_t *self = MP_OBJ_TO_PTR(self_in);
137+
return common_hal_displayio_ondiskbitmap_get_pixel_shader(self);
138+
}
139+
140+
MP_DEFINE_CONST_FUN_OBJ_1(displayio_ondiskbitmap_get_pixel_shader_obj, displayio_ondiskbitmap_obj_get_pixel_shader);
141+
142+
const mp_obj_property_t displayio_ondiskbitmap_pixel_shader_obj = {
143+
.base.type = &mp_type_property,
144+
.proxy = {(mp_obj_t)&displayio_ondiskbitmap_get_pixel_shader_obj,
145+
(mp_obj_t)MP_ROM_NONE,
146+
(mp_obj_t)MP_ROM_NONE},
147+
};
148+
149+
130150
STATIC const mp_rom_map_elem_t displayio_ondiskbitmap_locals_dict_table[] = {
131151
{ MP_ROM_QSTR(MP_QSTR_height), MP_ROM_PTR(&displayio_ondiskbitmap_height_obj) },
152+
{ MP_ROM_QSTR(MP_QSTR_pixel_shader), MP_ROM_PTR(&displayio_ondiskbitmap_pixel_shader_obj) },
132153
{ MP_ROM_QSTR(MP_QSTR_width), MP_ROM_PTR(&displayio_ondiskbitmap_width_obj) },
133154
};
134155
STATIC MP_DEFINE_CONST_DICT(displayio_ondiskbitmap_locals_dict, displayio_ondiskbitmap_locals_dict_table);

shared-bindings/displayio/OnDiskBitmap.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,6 @@ uint32_t common_hal_displayio_ondiskbitmap_get_pixel(displayio_ondiskbitmap_t *b
3838
int16_t x, int16_t y);
3939

4040
uint16_t common_hal_displayio_ondiskbitmap_get_height(displayio_ondiskbitmap_t *self);
41-
41+
mp_obj_t common_hal_displayio_ondiskbitmap_get_pixel_shader(displayio_ondiskbitmap_t *self);
4242
uint16_t common_hal_displayio_ondiskbitmap_get_width(displayio_ondiskbitmap_t *self);
4343
#endif // MICROPY_INCLUDED_SHARED_BINDINGS_DISPLAYIO_ONDISKBITMAP_H

shared-module/displayio/ColorConverter.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
#include "py/obj.h"
3434
#include "shared-module/displayio/Palette.h"
3535

36-
typedef struct {
36+
typedef struct displayio_colorconverter {
3737
mp_obj_base_t base;
3838
bool dither;
3939
uint8_t input_colorspace;

shared-module/displayio/OnDiskBitmap.c

Lines changed: 42 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@
2525
*/
2626

2727
#include "shared-bindings/displayio/OnDiskBitmap.h"
28+
#include "shared-bindings/displayio/ColorConverter.h"
29+
#include "shared-bindings/displayio/Palette.h"
30+
#include "shared-module/displayio/ColorConverter.h"
31+
#include "shared-module/displayio/Palette.h"
2832

2933
#include <string.h>
3034

@@ -63,6 +67,11 @@ void common_hal_displayio_ondiskbitmap_construct(displayio_ondiskbitmap_t *self,
6367
self->width = read_word(bmp_header, 9);
6468
self->height = read_word(bmp_header, 11);
6569

70+
displayio_colorconverter_t *colorconverter = m_new_obj(displayio_colorconverter_t);
71+
colorconverter->base.type = &displayio_colorconverter_type;
72+
common_hal_displayio_colorconverter_construct(colorconverter, false, DISPLAYIO_COLORSPACE_RGB888);
73+
self->colorconverter = colorconverter;
74+
6675
if (bits_per_pixel == 16) {
6776
if (((header_size >= 56)) || (self->bitfield_compressed)) {
6877
self->r_bitmask = read_word(bmp_header, 27);
@@ -74,25 +83,41 @@ void common_hal_displayio_ondiskbitmap_construct(displayio_ondiskbitmap_t *self,
7483
self->g_bitmask = 0x3e0;
7584
self->b_bitmask = 0x1f;
7685
}
77-
} else if (indexed && self->bits_per_pixel != 1) {
86+
} else if (indexed) {
7887
if (number_of_colors == 0) {
7988
number_of_colors = 1 << bits_per_pixel;
8089
}
81-
uint16_t palette_size = number_of_colors * sizeof(uint32_t);
82-
uint16_t palette_offset = 0xe + header_size;
8390

84-
self->palette_data = m_malloc(palette_size, false);
91+
displayio_palette_t *palette = m_new_obj(displayio_palette_t);
92+
palette->base.type = &displayio_palette_type;
93+
common_hal_displayio_palette_construct(palette, number_of_colors);
8594

86-
f_rewind(&self->file->fp);
87-
f_lseek(&self->file->fp, palette_offset);
95+
if (number_of_colors > 1) {
96+
uint16_t palette_size = number_of_colors * sizeof(uint32_t);
97+
uint16_t palette_offset = 0xe + header_size;
8898

89-
UINT palette_bytes_read;
90-
if (f_read(&self->file->fp, self->palette_data, palette_size, &palette_bytes_read) != FR_OK) {
91-
mp_raise_OSError(MP_EIO);
92-
}
93-
if (palette_bytes_read != palette_size) {
94-
mp_raise_ValueError(translate("Unable to read color palette data"));
99+
uint32_t *palette_data = m_malloc(palette_size, false);
100+
101+
f_rewind(&self->file->fp);
102+
f_lseek(&self->file->fp, palette_offset);
103+
104+
UINT palette_bytes_read;
105+
if (f_read(&self->file->fp, palette_data, palette_size, &palette_bytes_read) != FR_OK) {
106+
mp_raise_OSError(MP_EIO);
107+
}
108+
if (palette_bytes_read != palette_size) {
109+
mp_raise_ValueError(translate("Unable to read color palette data"));
110+
}
111+
for (uint16_t i = 0; i < palette_size; i++) {
112+
common_hal_displayio_palette_set_color(palette, i, palette_data[i]);
113+
}
114+
m_free(palette_data);
115+
} else {
116+
common_hal_displayio_palette_set_color(palette, 0, 0x0);
117+
common_hal_displayio_palette_set_color(palette, 1, 0xffffff);
95118
}
119+
self->palette = palette;
120+
96121
} else if (!(header_size == 12 || header_size == 40 || header_size == 108 || header_size == 124)) {
97122
mp_raise_ValueError_varg(translate("Only Windows format, uncompressed BMP supported: given header size is %d"), header_size);
98123
}
@@ -148,15 +173,7 @@ uint32_t common_hal_displayio_ondiskbitmap_get_pixel(displayio_ondiskbitmap_t *s
148173
uint8_t offset = (x % pixels_per_byte) * self->bits_per_pixel;
149174
uint8_t mask = (1 << self->bits_per_pixel) - 1;
150175

151-
uint8_t index = (pixel_data >> ((8 - self->bits_per_pixel) - offset)) & mask;
152-
if (self->bits_per_pixel == 1) {
153-
if (index == 1) {
154-
return 0xFFFFFF;
155-
} else {
156-
return 0x000000;
157-
}
158-
}
159-
return self->palette_data[index];
176+
return (pixel_data >> ((8 - self->bits_per_pixel) - offset)) & mask;
160177
} else if (bytes_per_pixel == 2) {
161178
if (self->g_bitmask == 0x07e0) { // 565
162179
red = ((pixel_data & self->r_bitmask) >> 11);
@@ -185,3 +202,7 @@ uint16_t common_hal_displayio_ondiskbitmap_get_height(displayio_ondiskbitmap_t *
185202
uint16_t common_hal_displayio_ondiskbitmap_get_width(displayio_ondiskbitmap_t *self) {
186203
return self->width;
187204
}
205+
206+
mp_obj_t common_hal_displayio_ondiskbitmap_get_pixel_shader(displayio_ondiskbitmap_t *self) {
207+
return MP_OBJ_FROM_PTR(self->pixel_shader_base);
208+
}

shared-module/displayio/OnDiskBitmap.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,14 @@ typedef struct {
4343
uint32_t r_bitmask;
4444
uint32_t g_bitmask;
4545
uint32_t b_bitmask;
46-
bool bitfield_compressed;
4746
pyb_file_obj_t *file;
47+
union {
48+
mp_obj_base_t *pixel_shader_base;
49+
struct displayio_palette *palette;
50+
struct displayio_colorconverter *colorconverter;
51+
};
52+
bool bitfield_compressed;
4853
uint8_t bits_per_pixel;
49-
uint32_t *palette_data;
5054
} displayio_ondiskbitmap_t;
5155

5256
#endif // MICROPY_INCLUDED_SHARED_MODULE_DISPLAYIO_ONDISKBITMAP_H

shared-module/displayio/Palette.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ typedef struct {
6969
bool opaque;
7070
} displayio_output_pixel_t;
7171

72-
typedef struct {
72+
typedef struct displayio_palette {
7373
mp_obj_base_t base;
7474
_displayio_color_t *colors;
7575
uint32_t color_count;

0 commit comments

Comments
 (0)