summaryrefslogtreecommitdiff
path: root/src/libnsgif.c
diff options
context:
space:
mode:
authorMichael Drake <tlsa@netsurf-browser.org>2021-10-22 12:05:46 +0100
committerMichael Drake <tlsa@netsurf-browser.org>2021-10-22 12:05:46 +0100
commitdabc6307eaa9e93958fd7d6084bb154e0ae03c54 (patch)
tree7316f030974b1cb8e3fdd3b09f01266f1af88ec8 /src/libnsgif.c
parenta507bb77e88a3e8c4b654a6d7fb7351db8a3ec32 (diff)
downloadlibnsgif-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.
Diffstat (limited to 'src/libnsgif.c')
-rw-r--r--src/libnsgif.c28
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 */