Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(20)

Unified Diff: third_party/WebKit/Source/platform/image-decoders/gif/GIFImageDecoder.cpp

Issue 1574283002: GIF Animations "clear from cache related glitch" fix (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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)

Powered by Google App Engine
This is Rietveld 408576698