summaryrefslogtreecommitdiff
path: root/shared-module/displayio/OnDiskBitmap.c
diff options
context:
space:
mode:
authorRoy Hooper <rhooper@toybox.ca>2019-10-03 19:06:55 -0400
committerRoy Hooper <rhooper@toybox.ca>2019-10-03 19:06:55 -0400
commit10510014952e1ecede35325324231d8aca6b0baa (patch)
treec9af6e58997e0b30205f387cf1bc7814ce67cef3 /shared-module/displayio/OnDiskBitmap.c
parent3cf9a475b99090d72b9992816808cbde309dcc40 (diff)
parentf4922a530a06ed62523ae333eab90fee6145fc46 (diff)
Merge branch 'master' into new-pixelbuf-api
Diffstat (limited to 'shared-module/displayio/OnDiskBitmap.c')
-rw-r--r--shared-module/displayio/OnDiskBitmap.c47
1 files changed, 23 insertions, 24 deletions
diff --git a/shared-module/displayio/OnDiskBitmap.c b/shared-module/displayio/OnDiskBitmap.c
index 2b5642437..993fc03de 100644
--- a/shared-module/displayio/OnDiskBitmap.c
+++ b/shared-module/displayio/OnDiskBitmap.c
@@ -74,7 +74,7 @@ void common_hal_displayio_ondiskbitmap_construct(displayio_ondiskbitmap_t *self,
self->g_bitmask = 0x3e0;
self->b_bitmask = 0x1f;
}
- } else if ((indexed) && (self->bits_per_pixel != 1)) {
+ } else if (indexed && self->bits_per_pixel != 1) {
uint16_t palette_size = number_of_colors * sizeof(uint32_t);
uint16_t palette_offset = 0xe + header_size;
@@ -90,25 +90,24 @@ void common_hal_displayio_ondiskbitmap_construct(displayio_ondiskbitmap_t *self,
if (palette_bytes_read != palette_size) {
mp_raise_ValueError(translate("Unable to read color palette data"));
}
-
-
} else if (!(header_size == 12 || header_size == 40 || header_size == 108 || header_size == 124)) {
mp_raise_ValueError_varg(translate("Only Windows format, uncompressed BMP supported: given header size is %d"), header_size);
}
- if ((bits_per_pixel == 4 ) || (( bits_per_pixel == 8) && (number_of_colors == 0))) {
- mp_raise_ValueError_varg(translate("Only monochrome, indexed 8bpp, and 16bpp or greater BMPs supported: %d bpp given"), bits_per_pixel);
+ if (bits_per_pixel == 8 && number_of_colors == 0) {
+ mp_raise_ValueError_varg(translate("Only monochrome, indexed 4bpp or 8bpp, and 16bpp or greater BMPs supported: %d bpp given"), bits_per_pixel);
}
- if (self->bits_per_pixel >=8){
- self->stride = (self->width * (bits_per_pixel / 8));
+ uint8_t bytes_per_pixel = (self->bits_per_pixel / 8) ? (self->bits_per_pixel /8) : 1;
+ uint8_t pixels_per_byte = 8 / self->bits_per_pixel;
+ if (pixels_per_byte == 0){
+ self->stride = (self->width * bytes_per_pixel);
// Rows are word aligned.
if (self->stride % 4 != 0) {
self->stride += 4 - self->stride % 4;
}
-
} else {
- uint32_t bit_stride = self->width;
+ uint32_t bit_stride = self->width * self->bits_per_pixel;
if (bit_stride % 32 != 0) {
bit_stride += 32 - bit_stride % 32;
}
@@ -126,10 +125,11 @@ uint32_t common_hal_displayio_ondiskbitmap_get_pixel(displayio_ondiskbitmap_t *s
uint32_t location;
uint8_t bytes_per_pixel = (self->bits_per_pixel / 8) ? (self->bits_per_pixel /8) : 1;
- if (self->bits_per_pixel >= 8){
+ uint8_t pixels_per_byte = 8 / self->bits_per_pixel;
+ if (pixels_per_byte == 0){
location = self->data_offset + (self->height - y - 1) * self->stride + x * bytes_per_pixel;
} else {
- location = self->data_offset + (self->height - y - 1) * self->stride + x / 8;
+ location = self->data_offset + (self->height - y - 1) * self->stride + x / pixels_per_byte;
}
// We don't cache here because the underlying FS caches sectors.
f_lseek(&self->file->fp, location);
@@ -141,20 +141,19 @@ uint32_t common_hal_displayio_ondiskbitmap_get_pixel(displayio_ondiskbitmap_t *s
uint8_t red;
uint8_t green;
uint8_t blue;
- if (self->bits_per_pixel == 1) {
- uint8_t bit_offset = x%8;
- tmp = ( pixel_data & (0x80 >> (bit_offset))) >> (7 - bit_offset);
- if (tmp == 1) {
- return 0x00FFFFFF;
- } else {
- return 0x00000000;
+ if (bytes_per_pixel == 1) {
+ uint8_t offset = (x % pixels_per_byte) * self->bits_per_pixel;
+ uint8_t mask = (1 << self->bits_per_pixel) - 1;
+
+ uint8_t index = (pixel_data >> ((8 - self->bits_per_pixel) - offset)) & mask;
+ if (self->bits_per_pixel == 1) {
+ if (index == 1) {
+ return 0xFFFFFF;
+ } else {
+ return 0x000000;
+ }
}
- } else if (bytes_per_pixel == 1) {
- blue = ((self->palette_data[pixel_data] & 0xFF) >> 0);
- red = ((self->palette_data[pixel_data] & 0xFF0000) >> 16);
- green = ((self->palette_data[pixel_data] & 0xFF00) >> 8);
- tmp = (red << 16 | green << 8 | blue );
- return tmp;
+ return self->palette_data[index];
} else if (bytes_per_pixel == 2) {
if (self->g_bitmask == 0x07e0) { // 565
red =((pixel_data & self->r_bitmask) >>11);