summaryrefslogtreecommitdiff
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-05 14:51:52 +0100
commitec5b110f5af6618dd250c13e6fed0abd8040e813 (patch)
tree875f3acc2757636bc4984ec2c7670381a322db83
parent35079ae6fe202806f616cbbde19a5ff1aa964dc3 (diff)
downloadlibnsgif-ec5b110f5af6618dd250c13e6fed0abd8040e813.tar.gz
libnsgif-ec5b110f5af6618dd250c13e6fed0abd8040e813.tar.bz2
gif: Frame decoding: Simplify transparency check.
-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++;