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