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..992d16c1f970424e6437e24420754c2741b0fe60 100644 |
--- a/third_party/WebKit/Source/platform/image-decoders/gif/GIFImageDecoder.cpp |
+++ b/third_party/WebKit/Source/platform/image-decoders/gif/GIFImageDecoder.cpp |
@@ -227,8 +227,28 @@ size_t GIFImageDecoder::clearCacheExceptFrame(size_t clearExceptFrame) |
// All other frames can be cleared. |
while ((clearExceptFrame < m_frameBufferCache.size()) && (m_frameBufferCache[clearExceptFrame].status() == ImageFrame::FrameEmpty)) |
clearExceptFrame = m_frameBufferCache[clearExceptFrame].requiredPreviousFrameIndex(); |
+ if ((clearExceptFrame >= m_frameBufferCache.size()) || (m_frameBufferCache.size() == 1) |
+ || (m_frameBufferCache[clearExceptFrame].disposalMethod() != ImageFrame::DisposeOverwritePrevious)) |
+ return ImageDecoder::clearCacheExceptFrame(clearExceptFrame); |
+ // For case with DisposeOverwritePrevious, enumerate through required to |
+ // find the one that is complete. |
+ size_t frame2 = m_frameBufferCache[clearExceptFrame].requiredPreviousFrameIndex(); |
+ while ((frame2 < m_frameBufferCache.size()) && (m_frameBufferCache[frame2].status() == ImageFrame::FrameEmpty)) |
+ frame2 = m_frameBufferCache[frame2].requiredPreviousFrameIndex(); |
+ return clearCacheExceptTwoFrames(clearExceptFrame, frame2); |
+} |
+ |
- return ImageDecoder::clearCacheExceptFrame(clearExceptFrame); |
+size_t GIFImageDecoder::clearCacheExceptTwoFrames(size_t dontClearFrame1, size_t dontClearFrame2) |
+{ |
+ size_t frameBytesCleared = 0; |
+ for (size_t i = 0; i < m_frameBufferCache.size(); ++i) { |
+ if (m_frameBufferCache[i].status() != ImageFrame::FrameEmpty && i != dontClearFrame1 && i != dontClearFrame2) { |
+ frameBytesCleared += frameBytesAtIndex(i); |
+ clearFrameBuffer(i); |
+ } |
+ } |
+ return frameBytesCleared; |
} |
void GIFImageDecoder::clearFrameBuffer(size_t frameIndex) |