Skip to content

Commit df8cba1

Browse files
authored
Merge pull request #3834 from jepler/pr3723
displayio: Fix several bugs (transparency and palettes of OnDiskBitmaps)
2 parents fb0c74c + f224ed1 commit df8cba1

File tree

2 files changed

+10
-4
lines changed

2 files changed

+10
-4
lines changed

shared-module/displayio/ColorConverter.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@
2929
#include "py/misc.h"
3030
#include "py/runtime.h"
3131

32+
#define NO_TRANSPARENT_COLOR (0x1000000)
33+
3234
uint32_t displayio_colorconverter_dither_noise_1 (uint32_t n)
3335
{
3436
n = (n >> 13) ^ n;
@@ -42,6 +44,7 @@ uint32_t displayio_colorconverter_dither_noise_2(uint32_t x, uint32_t y) {
4244

4345
void common_hal_displayio_colorconverter_construct(displayio_colorconverter_t* self, bool dither) {
4446
self->dither = dither;
47+
self->transparent_color = NO_TRANSPARENT_COLOR;
4548
}
4649

4750
uint16_t displayio_colorconverter_compute_rgb565(uint32_t color_rgb888) {
@@ -130,16 +133,16 @@ bool common_hal_displayio_colorconverter_get_dither(displayio_colorconverter_t*
130133
}
131134

132135
void common_hal_displayio_colorconverter_make_transparent(displayio_colorconverter_t* self, uint32_t transparent_color) {
133-
if (self->transparent_color >= 0x1000000) {
136+
if (self->transparent_color != NO_TRANSPARENT_COLOR) {
134137
mp_raise_RuntimeError(translate("Only one color can be transparent at a time"));
135138
}
136139
self->transparent_color = transparent_color;
137140
}
138141

139142
void common_hal_displayio_colorconverter_make_opaque(displayio_colorconverter_t* self, uint32_t transparent_color) {
140143
(void) transparent_color;
141-
// 0x1000000 will never equal a valid color
142-
self->transparent_color = 0x1000000;
144+
// NO_TRANSPARENT_COLOR will never equal a valid color
145+
self->transparent_color = NO_TRANSPARENT_COLOR;
143146
}
144147

145148
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) {

shared-module/displayio/OnDiskBitmap.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ void common_hal_displayio_ondiskbitmap_construct(displayio_ondiskbitmap_t *self,
5757
uint32_t compression = read_word(bmp_header, 15);
5858
uint32_t number_of_colors = read_word(bmp_header, 23);
5959

60-
bool indexed = ((bits_per_pixel <= 8) && (number_of_colors != 0));
60+
bool indexed = bits_per_pixel <= 8;
6161
self->bitfield_compressed = (compression == 3);
6262
self->bits_per_pixel = bits_per_pixel;
6363
self->width = read_word(bmp_header, 9);
@@ -75,6 +75,9 @@ void common_hal_displayio_ondiskbitmap_construct(displayio_ondiskbitmap_t *self,
7575
self->b_bitmask = 0x1f;
7676
}
7777
} else if (indexed && self->bits_per_pixel != 1) {
78+
if (number_of_colors == 0) {
79+
number_of_colors = 1 << bits_per_pixel;
80+
}
7881
uint16_t palette_size = number_of_colors * sizeof(uint32_t);
7982
uint16_t palette_offset = 0xe + header_size;
8083

0 commit comments

Comments
 (0)