Hi John, Thanks for investigating and for the patch. It looks good! I've applied it and its on master now.
Thanks again, Michael On 07/03/2021 14:39, jcup...@gmail.com wrote: > Here's a possible patch: > > https://github.com/libvips/libvips/commit/bf522eeffc5aa84a275b1d53e24d0daace59fa3e > > > On Sun, 7 Mar 2021 at 14:31, <jcup...@gmail.com> wrote: >> >> Hello again everyone, >> >> I think I have a GIF which libnsgif does not handle correctly: >> >> https://github.com/libvips/libvips/blob/master/test/test-suite/images/dispose-previous.gif >> >> This GIF has three frames which draw three concentric red circles. The >> GIF does this: >> >> - clear frame >> frame 0: >> - disposal_method COMBINE >> - draw outermost red circle >> frame 1: >> - disposal_method RESTORE >> - draw middle red circle >> frame 2: >> - disposal_method RESTORE >> - draw inner red circle >> >> So the viewer should see this: >> >> https://github.com/libvips/libvips/blob/master/test/test-suite/images/dispose-previous.png >> >> frame 0: >> - outer circle >> frame 1: >> - outer + middle >> frame 2: >> - outer + inner >> >> However, if you view with libnsgif, you'll see frame 2 has all three >> circles, ie. the middle frame is not removed. >> >> Looking at the code, the problem seems to be that >> gif_internal_decode_frame() calls gif__record_previous_frame() before >> it calls gif__recover_previous_frame(). This means that if you have >> two frames with RESTORE dispose in a row, the second restore will be >> missed, since it will save the frame (overwriting the restore) before >> it tries to restore it. >> >> The simplest fix is probably to simply move the record handler to just >> after the recover. I think this makes intuitive sense -- you want to >> finish disposing of the previous frame before you record the current >> state. >> >> John > _______________________________________________ > netsurf-dev mailing list -- netsurf-dev@netsurf-browser.org > To unsubscribe send an email to netsurf-dev-le...@netsurf-browser.org > -- Michael Drake https://www.codethink.co.uk/ _______________________________________________ netsurf-dev mailing list -- netsurf-dev@netsurf-browser.org To unsubscribe send an email to netsurf-dev-le...@netsurf-browser.org