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

Reply via email to