diff options
author | Michael Drake <tlsa@netsurf-browser.org> | 2021-10-22 12:05:46 +0100 |
---|---|---|
committer | Michael Drake <tlsa@netsurf-browser.org> | 2021-10-22 12:05:46 +0100 |
commit | dabc6307eaa9e93958fd7d6084bb154e0ae03c54 (patch) | |
tree | 7316f030974b1cb8e3fdd3b09f01266f1af88ec8 | |
parent | a507bb77e88a3e8c4b654a6d7fb7351db8a3ec32 (diff) | |
download | libnsgif-dabc6307eaa9e93958fd7d6084bb154e0ae03c54.tar.gz libnsgif-dabc6307eaa9e93958fd7d6084bb154e0ae03c54.tar.bz2 |
GIF: Don't call bitmap_modified after for clear frame disposal method.
Due to recursion through gif_internal_decode_frame, the inner call
through the function for the clear would call modified, but the
outer call would already have done its get_buffer, and then do
the the decode and call modified again.
This would break cases where clients do any buffer data
transformation, since the decode would be done on top of
a client buffer representation rather than a libnsfb buffer
representation.
-rw-r--r-- | src/libnsgif.c | 28 |
1 files changed, 15 insertions, 13 deletions
diff --git a/src/libnsgif.c b/src/libnsgif.c index 2bea30e..16bb78a 100644 --- a/src/libnsgif.c +++ b/src/libnsgif.c @@ -1049,22 +1049,24 @@ gif_internal_decode_frame(gif_animation *gif, } gif_decode_frame_exit: - /* Check if we should test for optimisation */ - if (gif->frames[frame].virgin) { - if (gif->bitmap_callbacks.bitmap_test_opaque) { - gif->frames[frame].opaque = gif->bitmap_callbacks.bitmap_test_opaque(gif->frame_image); - } else { - gif->frames[frame].opaque = false; + if (!clear_image) { + if (gif->bitmap_callbacks.bitmap_modified) { + gif->bitmap_callbacks.bitmap_modified(gif->frame_image); } - gif->frames[frame].virgin = false; - } - if (gif->bitmap_callbacks.bitmap_set_opaque) { - gif->bitmap_callbacks.bitmap_set_opaque(gif->frame_image, gif->frames[frame].opaque); - } + /* Check if we should test for optimisation */ + if (gif->frames[frame].virgin) { + if (gif->bitmap_callbacks.bitmap_test_opaque) { + gif->frames[frame].opaque = gif->bitmap_callbacks.bitmap_test_opaque(gif->frame_image); + } else { + gif->frames[frame].opaque = false; + } + gif->frames[frame].virgin = false; + } - if (gif->bitmap_callbacks.bitmap_modified) { - gif->bitmap_callbacks.bitmap_modified(gif->frame_image); + if (gif->bitmap_callbacks.bitmap_set_opaque) { + gif->bitmap_callbacks.bitmap_set_opaque(gif->frame_image, gif->frames[frame].opaque); + } } /* Restore the buffer position */ |