diff options
author | Michael Drake <tlsa@netsurf-browser.org> | 2021-11-02 19:24:07 +0000 |
---|---|---|
committer | Michael Drake <tlsa@netsurf-browser.org> | 2021-11-02 19:25:53 +0000 |
commit | 1fbc97ea763c3f76eea43695637fe283ce831746 (patch) | |
tree | 98fb07704ec86d2c9228b917d541c7fa9872d4d9 /src/libnsgif.c | |
parent | 41f33c7495e7b83b40a93e4a76481d770f0c5f7b (diff) | |
download | libnsgif-1fbc97ea763c3f76eea43695637fe283ce831746.tar.gz libnsgif-1fbc97ea763c3f76eea43695637fe283ce831746.tar.bz2 |
GIF: Unify calculation of transparency index.
Diffstat (limited to 'src/libnsgif.c')
-rw-r--r-- | src/libnsgif.c | 45 |
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); |