Gitweb links:
...log
http://git.netsurf-browser.org/libnsgif.git/shortlog/dabc6307eaa9e93958fd...
...commit
http://git.netsurf-browser.org/libnsgif.git/commit/dabc6307eaa9e93958fd7d...
...tree
http://git.netsurf-browser.org/libnsgif.git/tree/dabc6307eaa9e93958fd7d60...
The branch, master has been updated
via dabc6307eaa9e93958fd7d6084bb154e0ae03c54 (commit)
from a507bb77e88a3e8c4b654a6d7fb7351db8a3ec32 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff
http://git.netsurf-browser.org/libnsgif.git/commit/?id=dabc6307eaa9e93958...
commit dabc6307eaa9e93958fd7d6084bb154e0ae03c54
Author: Michael Drake <tlsa(a)netsurf-browser.org>
Commit: Michael Drake <tlsa(a)netsurf-browser.org>
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.
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 */
-----------------------------------------------------------------------
Summary of changes:
src/libnsgif.c | 28 +++++++++++++++-------------
1 file 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 */
--
NetSurf GIF Decoder