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

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

Issue 13980003: Add animation support for WebP images (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Create and use zeroFillPixelData() Created 7 years, 6 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: Source/core/platform/image-decoders/gif/GIFImageDecoder.cpp
diff --git a/Source/core/platform/image-decoders/gif/GIFImageDecoder.cpp b/Source/core/platform/image-decoders/gif/GIFImageDecoder.cpp
index 28b2f823d94398f2e8929dd06ea7d570db9134c4..9626d7bba264f182c92f628549515950d1286d47 100644
--- a/Source/core/platform/image-decoders/gif/GIFImageDecoder.cpp
+++ b/Source/core/platform/image-decoders/gif/GIFImageDecoder.cpp
@@ -134,6 +134,7 @@ bool GIFImageDecoder::setFailed()
return ImageDecoder::setFailed();
}
+// FIXME: Can the intermediate |rowBuffer| be avoided?
bool GIFImageDecoder::haveDecodedRow(size_t frameIndex, const Vector<unsigned char>& rowBuffer, size_t width, size_t rowNumber, unsigned repeatCount, bool writeTransparentPixels)
{
const GIFFrameContext* frameContext = m_reader->frameContext(frameIndex);
@@ -242,6 +243,19 @@ bool GIFImageDecoder::frameComplete(size_t frameIndex)
return true;
}
+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
+ // 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);
+}
+
void GIFImageDecoder::clearFrameBuffer(size_t frameIndex)
{
if (m_reader && m_frameBufferCache[frameIndex].status() == ImageFrame::FramePartial) {
@@ -347,12 +361,7 @@ bool GIFImageDecoder::initFrameBuffer(size_t frameIndex)
// affecting pixels in the image outside of the frame.
const IntRect& prevRect = prevBuffer->originalFrameRect();
ASSERT(!prevRect.contains(IntRect(IntPoint(), size())));
- for (int y = prevRect.y(); y < prevRect.maxY(); ++y) {
- for (int x = prevRect.x(); x < prevRect.maxX(); ++x)
- buffer->setRGBA(x, y, 0, 0, 0, 0);
- }
- if ((prevRect.width() > 0) && (prevRect.height() > 0))
- buffer->setHasAlpha(true);
+ buffer->zeroFillFrameRect(prevRect);
}
}
« no previous file with comments | « Source/core/platform/image-decoders/gif/GIFImageDecoder.h ('k') | Source/core/platform/image-decoders/webp/WEBPImageDecoder.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698