summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile4
-rw-r--r--include/libnsbmp.h2
-rw-r--r--src/libnsbmp.c23
-rw-r--r--test/decode_bmp.c14
-rw-r--r--test/decode_ico.c10
5 files changed, 19 insertions, 34 deletions
diff --git a/Makefile b/Makefile
index 5dbfeaa..e456758 100644
--- a/Makefile
+++ b/Makefile
@@ -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;