diff options
-rw-r--r-- | Makefile | 4 | ||||
-rw-r--r-- | include/libnsbmp.h | 2 | ||||
-rw-r--r-- | src/libnsbmp.c | 23 | ||||
-rw-r--r-- | test/decode_bmp.c | 14 | ||||
-rw-r--r-- | test/decode_ico.c | 10 |
5 files changed, 19 insertions, 34 deletions
@@ -2,11 +2,11 @@ # # Makefile for libnsbmp # -# Copyright 2009-2015 John-Mark Bell <jmb@netsurf-browser.org> +# Copyright 2009-2020 John-Mark Bell <jmb@netsurf-browser.org> # Component settings COMPONENT := nsbmp -COMPONENT_VERSION := 0.1.4 +COMPONENT_VERSION := 0.1.7 # Default to a static library COMPONENT_TYPE ?= lib-static diff --git a/include/libnsbmp.h b/include/libnsbmp.h index 7e90b4a..ad683f0 100644 --- a/include/libnsbmp.h +++ b/include/libnsbmp.h @@ -62,8 +62,6 @@ typedef struct bmp_bitmap_callback_vt_s { bmp_bitmap_cb_destroy bitmap_destroy; /** Return a pointer to the pixel data in a bitmap. */ bmp_bitmap_cb_get_buffer bitmap_get_buffer; - /** Find the width of a pixel row in bytes. */ - bmp_bitmap_cb_get_bpp bitmap_get_bpp; } bmp_bitmap_callback_vt; /** diff --git a/src/libnsbmp.c b/src/libnsbmp.c index 97391e4..b4da553 100644 --- a/src/libnsbmp.c +++ b/src/libnsbmp.c @@ -325,11 +325,11 @@ static bmp_result bmp_info_header_parse(bmp_image *bmp, uint8_t *data) if (!bmp->colour_table) return BMP_INSUFFICIENT_MEMORY; for (i = 0; i < bmp->colours; i++) { - bmp->colour_table[i] = data[2] | (data[1] << 8) | (data[0] << 16); + uint32_t colour = data[2] | (data[1] << 8) | (data[0] << 16); if (bmp->opaque) - bmp->colour_table[i] |= ((uint32_t)0xff << 24); + colour |= ((uint32_t)0xff << 24); data += palette_size; - bmp->colour_table[i] = read_uint32((uint8_t *)&bmp->colour_table[i],0); + bmp->colour_table[i] = read_uint32((uint8_t *)&colour,0); } /* some bitmaps have a bad offset if there is a pallete, work @@ -530,7 +530,7 @@ static bmp_result bmp_decode_rgb32(bmp_image *bmp, uint8_t **start, int bytes) assert(bmp->bpp == 32); data = *start; - swidth = bmp->bitmap_callbacks.bitmap_get_bpp(bmp->bitmap) * bmp->width; + swidth = sizeof(uint32_t) * bmp->width; top = bmp->bitmap_callbacks.bitmap_get_buffer(bmp->bitmap); if (!top) return BMP_INSUFFICIENT_MEMORY; @@ -612,7 +612,7 @@ static bmp_result bmp_decode_rgb24(bmp_image *bmp, uint8_t **start, int bytes) assert(bmp->bpp == 24); data = *start; - swidth = bmp->bitmap_callbacks.bitmap_get_bpp(bmp->bitmap) * bmp->width; + swidth = sizeof(uint32_t) * bmp->width; top = bmp->bitmap_callbacks.bitmap_get_buffer(bmp->bitmap); if (!top) { return BMP_INSUFFICIENT_MEMORY; @@ -683,7 +683,7 @@ static bmp_result bmp_decode_rgb16(bmp_image *bmp, uint8_t **start, int bytes) uint16_t word; data = *start; - swidth = bmp->bitmap_callbacks.bitmap_get_bpp(bmp->bitmap) * bmp->width; + swidth = sizeof(uint32_t) * bmp->width; top = bmp->bitmap_callbacks.bitmap_get_buffer(bmp->bitmap); if (!top) return BMP_INSUFFICIENT_MEMORY; @@ -770,11 +770,14 @@ static bmp_result bmp_decode_rgb(bmp_image *bmp, uint8_t **start, int bytes) uint8_t bit_mask = (1 << bmp->bpp) - 1; uint8_t cur_byte = 0, bit, i; + /* Belt and braces, we shouldn't get here unless this holds */ + assert(ppb >= 1); + for (i = 0; i < ppb; i++) bit_shifts[i] = 8 - ((i + 1) * bmp->bpp); data = *start; - swidth = bmp->bitmap_callbacks.bitmap_get_bpp(bmp->bitmap) * bmp->width; + swidth = sizeof(uint32_t) * bmp->width; top = bmp->bitmap_callbacks.bitmap_get_buffer(bmp->bitmap); if (!top) return BMP_INSUFFICIENT_MEMORY; @@ -839,7 +842,7 @@ static bmp_result bmp_decode_mask(bmp_image *bmp, uint8_t *data, int bytes) uint32_t x, y, swidth; uint32_t cur_byte = 0; - swidth = bmp->bitmap_callbacks.bitmap_get_bpp(bmp->bitmap) * bmp->width; + swidth = sizeof(uint32_t) * bmp->width; top = bmp->bitmap_callbacks.bitmap_get_buffer(bmp->bitmap); if (!top) return BMP_INSUFFICIENT_MEMORY; @@ -894,7 +897,7 @@ bmp_decode_rle8(bmp_image *bmp, uint8_t *data, int bytes) if (bmp->ico) return BMP_DATA_ERROR; - swidth = bmp->bitmap_callbacks.bitmap_get_bpp(bmp->bitmap) * bmp->width; + swidth = sizeof(uint32_t) * bmp->width; top = bmp->bitmap_callbacks.bitmap_get_buffer(bmp->bitmap); if (!top) return BMP_INSUFFICIENT_MEMORY; @@ -1048,7 +1051,7 @@ bmp_decode_rle4(bmp_image *bmp, uint8_t *data, int bytes) if (bmp->ico) return BMP_DATA_ERROR; - swidth = bmp->bitmap_callbacks.bitmap_get_bpp(bmp->bitmap) * bmp->width; + swidth = sizeof(uint32_t) * bmp->width; top = bmp->bitmap_callbacks.bitmap_get_buffer(bmp->bitmap); if (!top) return BMP_INSUFFICIENT_MEMORY; diff --git a/test/decode_bmp.c b/test/decode_bmp.c index 68de542..a0b02e8 100644 --- a/test/decode_bmp.c +++ b/test/decode_bmp.c @@ -17,7 +17,7 @@ #include <sys/stat.h> #include "../include/libnsbmp.h" -#define BYTES_PER_PIXEL 4 +#define BYTES_PER_PIXEL sizeof(uint32_t) #define MAX_IMAGE_BYTES (48 * 1024 * 1024) #define TRANSPARENT_COLOR 0xffffffff @@ -25,8 +25,8 @@ static void *bitmap_create(int width, int height, unsigned int state) { (void) state; /* unused */ - /* ensure a stupidly large (>50Megs or so) bitmap is not created */ - if (((long long)width * (long long)height) > (MAX_IMAGE_BYTES/BYTES_PER_PIXEL)) { + /* Ensure a stupidly large bitmap is not created */ + if (width > 4096 || height > 4096) { return NULL; } return calloc(width * height, BYTES_PER_PIXEL); @@ -40,13 +40,6 @@ static unsigned char *bitmap_get_buffer(void *bitmap) } -static size_t bitmap_get_bpp(void *bitmap) -{ - (void) bitmap; /* unused */ - return BYTES_PER_PIXEL; -} - - static void bitmap_destroy(void *bitmap) { assert(bitmap); @@ -144,7 +137,6 @@ int main(int argc, char *argv[]) bitmap_create, bitmap_destroy, bitmap_get_buffer, - bitmap_get_bpp }; bmp_result code; bmp_image bmp; diff --git a/test/decode_ico.c b/test/decode_ico.c index 5dbc7a5..94db57e 100644 --- a/test/decode_ico.c +++ b/test/decode_ico.c @@ -24,7 +24,7 @@ /* Currently the library returns the data in RGBA format, * so there are 4 bytes per pixel */ -#define BYTES_PER_PIXEL 4 +#define BYTES_PER_PIXEL sizeof(uint32_t) /* White with alpha masking. */ #define TRANSPARENT_COLOR 0xffffffff @@ -43,13 +43,6 @@ static unsigned char *bitmap_get_buffer(void *bitmap) } -static size_t bitmap_get_bpp(void *bitmap) -{ - (void) bitmap; /* unused */ - return BYTES_PER_PIXEL; -} - - static void bitmap_destroy(void *bitmap) { assert(bitmap); @@ -175,7 +168,6 @@ int main(int argc, char *argv[]) bitmap_create, bitmap_destroy, bitmap_get_buffer, - bitmap_get_bpp }; uint16_t width, height; ico_collection ico; |