diff options
author | Michael Drake <tlsa@netsurf-browser.org> | 2021-04-04 11:54:22 +0100 |
---|---|---|
committer | Michael Drake <tlsa@netsurf-browser.org> | 2021-04-05 14:51:52 +0100 |
commit | ec5b110f5af6618dd250c13e6fed0abd8040e813 (patch) | |
tree | 875f3acc2757636bc4984ec2c7670381a322db83 | |
parent | 35079ae6fe202806f616cbbde19a5ff1aa964dc3 (diff) | |
download | libnsgif-ec5b110f5af6618dd250c13e6fed0abd8040e813.tar.gz libnsgif-ec5b110f5af6618dd250c13e6fed0abd8040e813.tar.bz2 |
gif: Frame decoding: Simplify transparency check.
-rw-r--r-- | src/libnsgif.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/src/libnsgif.c b/src/libnsgif.c index 3b070b3..0874ec9 100644 --- a/src/libnsgif.c +++ b/src/libnsgif.c @@ -42,6 +42,9 @@ /** Transparent colour */ #define GIF_TRANSPARENT_COLOUR 0x00 +/** No transparency */ +#define GIF_NO_TRANSPARENCY (0xFFFFFFFFu) + /* GIF Flags */ #define GIF_FRAME_COMBINE 1 #define GIF_FRAME_CLEAR 2 @@ -635,6 +638,7 @@ gif__decode(gif_animation *gif, unsigned int *restrict frame_data, unsigned int *restrict colour_table) { + unsigned int transparency_index; const uint8_t *stack_base; const uint8_t *stack_pos; uint32_t written = 0; @@ -649,6 +653,10 @@ gif__decode(gif_animation *gif, return gif_error_from_lzw(res); } + transparency_index = gif->frames[frame].transparency ? + gif->frames[frame].transparency_index : + GIF_NO_TRANSPARENCY; + stack_pos = stack_base; for (unsigned int y = 0; y < height; y++) { unsigned int x; @@ -672,11 +680,9 @@ gif__decode(gif_animation *gif, x -= burst_bytes; written -= burst_bytes; while (burst_bytes-- > 0) { - register unsigned char colour; + register unsigned int colour; colour = *stack_pos++; - if (((gif->frames[frame].transparency) && - (colour != gif->frames[frame].transparency_index)) || - (!gif->frames[frame].transparency)) { + if (colour != transparency_index) { *frame_scanline = colour_table[colour]; } frame_scanline++; |