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