mono / libgdiplus

C-based implementation of the GDI+ API
http://www.mono-project.com/
MIT License
329 stars 171 forks source link

GIF PropertyTagFrameDelay PropertyItem does not retrieve all frame delays #703

Open jeffhandley opened 3 years ago

jeffhandley commented 3 years ago

The GIF PropertyTagFrameDelay Property Item is returning only the first frame delay instead of the frame delays for all frames.

Given a GIF that has varying frame delays, the expectation for the frame delay item is a byte array that is 4 times the length of the frame count (4 bytes per frame delay). Instead, only a 4-byte array is returned, with the bytes matching the first frame's delay.

This was discovered on Ubuntu 20.04 using the following test image. Note that the frame delay does not match the actual delay time rendered within the gif; it represents the timer's delay of rendering to the screen, which was then recorded into the GIF, resulting in a varying frame delay.

animated-timer-100fps-repeat-infinite

Here are the expected values ``` 3, 0, 0, 0 # 3/100ths of a second 3, 0, 0, 0 # 3/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 1, 0, 0, 0 # 1/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 3, 0, 0, 0 # 3/100ths of a second 5, 0, 0, 0 # 5/100ths of a second 4, 0, 0, 0 # 4/100ths of a second 5, 0, 0, 0 # 5/100ths of a second 3, 0, 0, 0 # 3/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 3, 0, 0, 0 # 3/100ths of a second 3, 0, 0, 0 # 3/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 5, 0, 0, 0 # 5/100ths of a second 3, 0, 0, 0 # 3/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 3, 0, 0, 0 # 3/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 2, 0, 0, 0 # 2/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 1, 0, 0, 0 # 1/100ths of a second 3, 0, 0, 0 # 3/100ths of a second 3, 0, 0, 0 # 3/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 5, 0, 0, 0 # 5/100ths of a second 3, 0, 0, 0 # 3/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 3, 0, 0, 0 # 3/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 3, 0, 0, 0 # 3/100ths of a second 5, 0, 0, 0 # 5/100ths of a second 3, 0, 0, 0 # 3/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 3, 0, 0, 0 # 3/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 2, 0, 0, 0 # 2/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 3, 0, 0, 0 # 3/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 3, 0, 0, 0 # 3/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 3, 0, 0, 0 # 3/100ths of a second 3, 0, 0, 0 # 3/100ths of a second 3, 0, 0, 0 # 3/100ths of a second 3, 0, 0, 0 # 3/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 3, 0, 0, 0 # 3/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 3, 0, 0, 0 # 3/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 3, 0, 0, 0 # 3/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 3, 0, 0, 0 # 3/100ths of a second 3, 0, 0, 0 # 3/100ths of a second 7, 0, 0, 0 # 7/100ths of a second 2, 0, 0, 0 # 2/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 3, 0, 0, 0 # 3/100ths of a second 5, 0, 0, 0 # 5/100ths of a second 3, 0, 0, 0 # 3/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 3, 0, 0, 0 # 3/100ths of a second 5, 0, 0, 0 # 5/100ths of a second 3, 0, 0, 0 # 3/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 1, 0, 0, 0 # 1/100ths of a second 3, 0, 0, 0 # 3/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 3, 0, 0, 0 # 3/100ths of a second 5, 0, 0, 0 # 5/100ths of a second 3, 0, 0, 0 # 3/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 3, 0, 0, 0 # 3/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 3, 0, 0, 0 # 3/100ths of a second 5, 0, 0, 0 # 5/100ths of a second 3, 0, 0, 0 # 3/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 3, 0, 0, 0 # 3/100ths of a second 5, 0, 0, 0 # 5/100ths of a second 9, 0, 0, 0 # 9/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 9, 0, 0, 0 # 9/100ths of a second 3, 0, 0, 0 # 3/100ths of a second 3, 0, 0, 0 # 3/100ths of a second 9, 0, 0, 0 # 9/100ths of a second 5, 0, 0, 0 # 5/100ths of a second 9, 0, 0, 0 # 9/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 9, 0, 0, 0 # 9/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 9, 0, 0, 0 # 9/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 9, 0, 0, 0 # 9/100ths of a second 9, 0, 0, 0 # 9/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 3, 0, 0, 0 # 3/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 10, 0, 0, 0 # 10/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 8, 0, 0, 0 # 8/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 10, 0, 0, 0 # 10/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 8, 0, 0, 0 # 8/100ths of a second 7, 0, 0, 0 # 7/100ths of a second 8, 0, 0, 0 # 8/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 3, 0, 0, 0 # 3/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 8, 0, 0, 0 # 8/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 8, 0, 0, 0 # 8/100ths of a second 10, 0, 0, 0 # 10/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 8, 0, 0, 0 # 8/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 9, 0, 0, 0 # 9/100ths of a second 9, 0, 0, 0 # 9/100ths of a second 1, 0, 0, 0 # 1/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 8, 0, 0, 0 # 8/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 9, 0, 0, 0 # 9/100ths of a second 9, 0, 0, 0 # 9/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 9, 0, 0, 0 # 9/100ths of a second 5, 0, 0, 0 # 5/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 9, 0, 0, 0 # 9/100ths of a second 9, 0, 0, 0 # 9/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 1, 0, 0, 0 # 1/100ths of a second 9, 0, 0, 0 # 9/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 9, 0, 0, 0 # 9/100ths of a second 9, 0, 0, 0 # 9/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 8, 0, 0, 0 # 8/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 10, 0, 0, 0 # 10/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 8, 0, 0, 0 # 8/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 3, 0, 0, 0 # 3/100ths of a second 5, 0, 0, 0 # 5/100ths of a second 9, 0, 0, 0 # 9/100ths of a second 4, 0, 0, 0 # 4/100ths of a second 15, 0, 0, 0 # 15/100ths of a second 15, 0, 0, 0 # 15/100ths of a second 15, 0, 0, 0 # 15/100ths of a second 16, 0, 0, 0 # 16/100ths of a second 12, 0, 0, 0 # 12/100ths of a second 3, 0, 0, 0 # 3/100ths of a second 11, 0, 0, 0 # 11/100ths of a second 15, 0, 0, 0 # 15/100ths of a second 16, 0, 0, 0 # 16/100ths of a second 15, 0, 0, 0 # 15/100ths of a second 15, 0, 0, 0 # 15/100ths of a second 15, 0, 0, 0 # 15/100ths of a second 9, 0, 0, 0 # 9/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 15, 0, 0, 0 # 15/100ths of a second 15, 0, 0, 0 # 15/100ths of a second 15, 0, 0, 0 # 15/100ths of a second 15, 0, 0, 0 # 15/100ths of a second 15, 0, 0, 0 # 15/100ths of a second 15, 0, 0, 0 # 15/100ths of a second 1, 0, 0, 0 # 1/100ths of a second 15, 0, 0, 0 # 15/100ths of a second 15, 0, 0, 0 # 15/100ths of a second 12, 0, 0, 0 # 12/100ths of a second 15, 0, 0, 0 # 15/100ths of a second 16, 0, 0, 0 # 16/100ths of a second 14, 0, 0, 0 # 14/100ths of a second 10, 0, 0, 0 # 10/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 14, 0, 0, 0 # 14/100ths of a second 15, 0, 0, 0 # 15/100ths of a second 13, 0, 0, 0 # 13/100ths of a second 15, 0, 0, 0 # 15/100ths of a second 16, 0, 0, 0 # 16/100ths of a second 15, 0, 0, 0 # 15/100ths of a second 3, 0, 0, 0 # 3/100ths of a second 11, 0, 0, 0 # 11/100ths of a second 16, 0, 0, 0 # 16/100ths of a second 11, 0, 0, 0 # 11/100ths of a second 19, 0, 0, 0 # 19/100ths of a second 2, 0, 0, 0 # 2/100ths of a second 28, 0, 0, 0 # 28/100ths of a second 9, 0, 0, 0 # 9/100ths of a second 21, 0, 0, 0 # 21/100ths of a second 28, 0, 0, 0 # 28/100ths of a second 31, 0, 0, 0 # 31/100ths of a second 18, 0, 0, 0 # 18/100ths of a second 9, 0, 0, 0 # 9/100ths of a second 28, 0, 0, 0 # 28/100ths of a second 31, 0, 0, 0 # 31/100ths of a second 28, 0, 0, 0 # 28/100ths of a second 3, 0, 0, 0 # 3/100ths of a second 27, 0, 0, 0 # 27/100ths of a second 28, 0, 0, 0 # 28/100ths of a second 27, 0, 0, 0 # 27/100ths of a second 16, 0, 0, 0 # 16/100ths of a second 15, 0, 0, 0 # 15/100ths of a second 28, 0, 0, 0 # 28/100ths of a second 31, 0, 0, 0 # 31/100ths of a second 24, 0, 0, 0 # 24/100ths of a second 3, 0, 0, 0 # 3/100ths of a second 28, 0, 0, 0 # 28/100ths of a second 31, 0, 0, 0 # 31/100ths of a second 4, 0, 0, 0 # 4/100ths of a second 34, 0, 0, 0 # 34/100ths of a second 21, 0, 0, 0 # 21/100ths of a second 58, 0, 0, 0 # 58/100ths of a second 18, 0, 0, 0 # 18/100ths of a second 37, 0, 0, 0 # 37/100ths of a second 56, 0, 0, 0 # 56/100ths of a second 6, 0, 0, 0 # 6/100ths of a second 3, 0, 0, 0 # 3/100ths of a second ```

The actual result is simply 3, 0, 0, 0.