summaryrefslogtreecommitdiff
path: root/src/libnsgif.c
diff options
context:
space:
mode:
authorMichael Drake <tlsa@netsurf-browser.org>2021-04-04 11:54:22 +0100
committerMichael Drake <tlsa@netsurf-browser.org>2021-04-06 09:03:19 +0100
commitc2074de22a8d77ff8e688a3f22132f6d0ee44c20 (patch)
tree9e266306026c84de88418d897eeb16f2c93ac4af /src/libnsgif.c
parent602dcec85a1fc6f932bd32b49008354016c29bec (diff)
downloadlibnsgif-c2074de22a8d77ff8e688a3f22132f6d0ee44c20.tar.gz
libnsgif-c2074de22a8d77ff8e688a3f22132f6d0ee44c20.tar.bz2
gif: Frame decoding: Simplify transparency check.
Diffstat (limited to 'src/libnsgif.c')
-rw-r--r--src/libnsgif.c14
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++;