Chromium Code Reviews| Index: third_party/WebKit/Source/platform/image-decoders/gif/GIFImageDecoder.cpp |
| diff --git a/third_party/WebKit/Source/platform/image-decoders/gif/GIFImageDecoder.cpp b/third_party/WebKit/Source/platform/image-decoders/gif/GIFImageDecoder.cpp |
| index cc5954edf9de97a6391a4c904dc4826cc341741d..e77a70c851e906cdeb37eda10611e915fb670830 100644 |
| --- a/third_party/WebKit/Source/platform/image-decoders/gif/GIFImageDecoder.cpp |
| +++ b/third_party/WebKit/Source/platform/image-decoders/gif/GIFImageDecoder.cpp |
| @@ -222,13 +222,24 @@ size_t GIFImageDecoder::clearCacheExceptFrame(size_t clearExceptFrame) |
| { |
| // We need to preserve frames such that: |
| // 1. We don't clear |clearExceptFrame|; |
| - // 2. We don't clear any frame from which a future initFrameBuffer() call |
| + // 2. We don't clear any frame from which a two* future initFrameBuffer() calls |
|
tomhudson
2016/01/12 16:15:59
Nit: 'which a two' -> 'which two', although this c
aleksandar.stojiljkovic
2016/01/12 17:34:59
Done.
|
| // will copy bitmap data. |
| // All other frames can be cleared. |
| - while ((clearExceptFrame < m_frameBufferCache.size()) && (m_frameBufferCache[clearExceptFrame].status() == ImageFrame::FrameEmpty)) |
| - clearExceptFrame = m_frameBufferCache[clearExceptFrame].requiredPreviousFrameIndex(); |
| - |
| - return ImageDecoder::clearCacheExceptFrame(clearExceptFrame); |
| + // *) Two frames range is chosen as dependent animated GIF frames usually depend |
| + // on the previous or the frame before previous. |
|
urvang
2016/01/12 18:02:01
As an extreme example, what if all frames in a GIF
aleksandar.stojiljkovic
2016/01/12 18:19:14
Theoretically, you're right.
While exploring GIF r
|
| + if (clearExceptFrame == kNotFound) |
| + return ImageDecoder::clearCacheExceptFrame(clearExceptFrame); |
| + SizeTHashSet clearExceptFrames; |
| + for (int i = 0; i < 2; ++i, ++clearExceptFrame) { |
| + size_t leave = clearExceptFrame; |
| + while ((leave < m_frameBufferCache.size()) && (m_frameBufferCache[leave].status() == ImageFrame::FrameEmpty)) |
| + leave = m_frameBufferCache[leave].requiredPreviousFrameIndex(); |
| + if (leave != kNotFound) |
| + clearExceptFrames.add(leave); |
| + } |
| + if (clearExceptFrames.size() > 1) |
| + return clearCacheExceptFrames(clearExceptFrames); |
| + return ImageDecoder::clearCacheExceptFrame(clearExceptFrames.size() ? *(clearExceptFrames.begin()) : kNotFound); |
|
tomhudson
2016/01/12 16:15:59
These three lines are significantly more complicat
aleksandar.stojiljkovic
2016/01/12 17:34:59
Acknowledged.
aleksandar.stojiljkovic
2016/01/12 18:54:02
Fixed this in new patch.
Thanks for pointing - mea
|
| } |
| void GIFImageDecoder::clearFrameBuffer(size_t frameIndex) |