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