summaryrefslogtreecommitdiff
path: root/src/libnsgif.c
diff options
context:
space:
mode:
authorMichael Drake <tlsa@netsurf-browser.org>2021-11-02 19:24:07 +0000
committerMichael Drake <tlsa@netsurf-browser.org>2021-11-02 19:25:53 +0000
commit1fbc97ea763c3f76eea43695637fe283ce831746 (patch)
tree98fb07704ec86d2c9228b917d541c7fa9872d4d9 /src/libnsgif.c
parent41f33c7495e7b83b40a93e4a76481d770f0c5f7b (diff)
downloadlibnsgif-1fbc97ea763c3f76eea43695637fe283ce831746.tar.gz
libnsgif-1fbc97ea763c3f76eea43695637fe283ce831746.tar.bz2
GIF: Unify calculation of transparency index.
Diffstat (limited to 'src/libnsgif.c')
-rw-r--r--src/libnsgif.c45
1 files changed, 23 insertions, 22 deletions
diff --git a/src/libnsgif.c b/src/libnsgif.c
index 47f02fa..352bbb9 100644
--- a/src/libnsgif.c
+++ b/src/libnsgif.c
@@ -673,18 +673,18 @@ static gif_result gif__recover_frame(const gif_animation *gif)
}
static gif_result
-gif__decode_complex(gif_animation *gif,
- uint32_t frame,
+gif__decode_complex(
+ struct gif_animation *gif,
uint32_t width,
uint32_t height,
uint32_t offset_x,
uint32_t offset_y,
uint32_t interlace,
uint8_t minimum_code_size,
+ uint32_t transparency_index,
uint32_t *restrict frame_data,
uint32_t *restrict colour_table)
{
- uint32_t transparency_index;
uint32_t available = 0;
gif_result ret = GIF_OK;
lzw_result res;
@@ -696,10 +696,6 @@ gif__decode_complex(gif_animation *gif,
return gif_error_from_lzw(res);
}
- transparency_index = gif->frames[frame].transparency ?
- gif->frames[frame].transparency_index :
- GIF_NO_TRANSPARENCY;
-
for (uint32_t y = 0; y < height; y++) {
uint32_t x;
uint32_t decode_y;
@@ -755,24 +751,20 @@ gif__decode_complex(gif_animation *gif,
}
static gif_result
-gif__decode_simple(gif_animation *gif,
- uint32_t frame,
+gif__decode_simple(
+ struct gif_animation *gif,
uint32_t height,
uint32_t offset_y,
uint8_t minimum_code_size,
+ uint32_t transparency_index,
uint32_t *restrict frame_data,
uint32_t *restrict colour_table)
{
- uint32_t transparency_index;
uint32_t pixels = gif->width * height;
uint32_t written = 0;
gif_result ret = GIF_OK;
lzw_result res;
- transparency_index = gif->frames[frame].transparency ?
- gif->frames[frame].transparency_index :
- GIF_NO_TRANSPARENCY;
-
/* Initialise the LZW decoding */
res = lzw_decode_init_map(gif->lzw_ctx,
minimum_code_size, transparency_index, colour_table,
@@ -806,9 +798,9 @@ gif__decode_simple(gif_animation *gif,
return ret;
}
-static inline gif_result
-gif__decode(gif_animation *gif,
- uint32_t frame,
+static inline gif_result gif__decode(
+ struct gif_animation *gif,
+ struct gif_frame *frame,
uint32_t width,
uint32_t height,
uint32_t offset_x,
@@ -819,14 +811,23 @@ gif__decode(gif_animation *gif,
uint32_t *restrict colour_table)
{
gif_result ret;
+ uint32_t transparency_index;
+
+ if (frame->transparency) {
+ transparency_index = frame->transparency_index;
+ } else {
+ transparency_index = GIF_NO_TRANSPARENCY;
+ }
if (interlace == false && width == gif->width && offset_x == 0) {
- ret = gif__decode_simple(gif, frame, height, offset_y,
- minimum_code_size, frame_data, colour_table);
+ ret = gif__decode_simple(gif, height, offset_y,
+ minimum_code_size, transparency_index,
+ frame_data, colour_table);
} else {
- ret = gif__decode_complex(gif, frame, width, height,
+ ret = gif__decode_complex(gif, width, height,
offset_x, offset_y, interlace,
- minimum_code_size, frame_data, colour_table);
+ minimum_code_size, transparency_index,
+ frame_data, colour_table);
}
return ret;
@@ -1084,7 +1085,7 @@ gif_internal_decode_frame(gif_animation *gif,
gif->decoded_frame = frame_idx;
gif->buffer_position = (gif_data - gif->gif_data) + 1;
- ret = gif__decode(gif, frame_idx, width, height,
+ ret = gif__decode(gif, frame, width, height,
offset_x, offset_y, interlace, gif_data[0],
frame_data, colour_table);