Here's a possible patch: https://github.com/libvips/libvips/commit/bf522eeffc5aa84a275b1d53e24d0daace59fa3e
On Sun, 7 Mar 2021 at 14:31, <[email protected]> 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 -- [email protected] To unsubscribe send an email to [email protected]
