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) |