Chromium Code Reviews| 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 72f2c834ae95c11df7e2e03cee1975a0e5591c08..7b4f71f0a7fa3aa837fba4315afc042910cd12a0 100644 |
| --- a/third_party/WebKit/Source/platform/image-decoders/gif/GIFImageDecoder.cpp |
| +++ b/third_party/WebKit/Source/platform/image-decoders/gif/GIFImageDecoder.cpp |
| @@ -356,12 +356,21 @@ bool GIFImageDecoder::initFrameBuffer(size_t frameIndex) |
| if (!buffer->setSize(size().width(), size().height())) |
| return setFailed(); |
| } else { |
| - const ImageFrame* prevBuffer = &m_frameBufferCache[requiredPreviousFrameIndex]; |
| + ImageFrame* prevBuffer = &m_frameBufferCache[requiredPreviousFrameIndex]; |
| ASSERT(prevBuffer->getStatus() == ImageFrame::FrameComplete); |
| - // Preserve the last frame as the starting state for this frame. |
| - if (!buffer->copyBitmapData(*prevBuffer)) |
| - return setFailed(); |
| + if (buffer->getDisposalMethod() == ImageFrame::DisposeOverwritePrevious) { |
| + // The next frame will also use |prevBuffer| as its starting state, |
| + // so we can't take over its image data as we do below. Copy the |
| + // data instead. |
| + if (!buffer->copyBitmapData(*prevBuffer)) |
| + return setFailed(); |
| + } else { |
| + // This is the only frame to use |prevBuffer| as its starting state, |
| + // and we'll always clear the old frame data after initializing this |
| + // frame anyway, so we can save time by just moving its data over. |
|
Peter Kasting
2016/07/20 01:00:28
Nit: I still think you should explicitly say what
|
| + buffer->takeBitmapData(prevBuffer); |
| + } |
| if (prevBuffer->getDisposalMethod() == ImageFrame::DisposeOverwriteBgcolor) { |
| // We want to clear the previous frame to transparent, without |