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 0a810039b76fe2cc5a524abdf7644bab11a35be8..142bf64c24e68c2ad7949396b10a6507eb0ec75a 100644 |
| --- a/third_party/WebKit/Source/platform/image-decoders/gif/GIFImageDecoder.cpp |
| +++ b/third_party/WebKit/Source/platform/image-decoders/gif/GIFImageDecoder.cpp |
| @@ -132,8 +132,7 @@ bool GIFImageDecoder::haveDecodedRow(size_t frameIndex, |
| // Initialize the frame if necessary. |
| ImageFrame& buffer = m_frameBufferCache[frameIndex]; |
| - if ((buffer.getStatus() == ImageFrame::FrameEmpty) && |
| - !initFrameBuffer(frameIndex)) |
| + if (!initFrameBuffer(frameIndex)) |
| return false; |
| const size_t transparentPixel = frameContext->transparentPixel(); |
| @@ -190,8 +189,7 @@ bool GIFImageDecoder::frameComplete(size_t frameIndex) { |
| // Initialize the frame if necessary. Some GIFs insert do-nothing frames, |
| // in which case we never reach haveDecodedRow() before getting here. |
| ImageFrame& buffer = m_frameBufferCache[frameIndex]; |
| - if ((buffer.getStatus() == ImageFrame::FrameEmpty) && |
| - !initFrameBuffer(frameIndex)) |
| + if (!initFrameBuffer(frameIndex)) |
| return false; // initFrameBuffer() has already called setFailed(). |
| buffer.setStatus(ImageFrame::FrameComplete); |
| @@ -363,44 +361,18 @@ void GIFImageDecoder::parse(GIFParseQuery query) { |
| } |
| bool GIFImageDecoder::initFrameBuffer(size_t frameIndex) { |
| - // Initialize the frame rect in our buffer. |
| - ImageFrame* const buffer = &m_frameBufferCache[frameIndex]; |
| - |
| - size_t requiredPreviousFrameIndex = buffer->requiredPreviousFrameIndex(); |
| - if (requiredPreviousFrameIndex == kNotFound) { |
| - // This frame doesn't rely on any previous data. |
| - if (!buffer->setSizeAndColorSpace(size().width(), size().height(), |
| - colorSpace())) { |
| - return setFailed(); |
| - } |
| - } else { |
| - ImageFrame* prevBuffer = &m_frameBufferCache[requiredPreviousFrameIndex]; |
| - ASSERT(prevBuffer->getStatus() == ImageFrame::FrameComplete); |
| - |
| - // We try to reuse |prevBuffer| as starting state to avoid copying. |
| - // For DisposeOverwritePrevious, the next frame will also use |
| - // |prevBuffer| as its starting state, so we can't take over its image |
| - // data using takeBitmapDataIfWritable. Copy the data instead. |
| - if ((buffer->getDisposalMethod() == ImageFrame::DisposeOverwritePrevious || |
| - !buffer->takeBitmapDataIfWritable(prevBuffer)) && |
| - !buffer->copyBitmapData(*prevBuffer)) |
| - return setFailed(); |
| - |
| - if (prevBuffer->getDisposalMethod() == |
| - ImageFrame::DisposeOverwriteBgcolor) { |
| - // We want to clear the previous frame to transparent, without |
| - // affecting pixels in the image outside of the frame. |
| - const IntRect& prevRect = prevBuffer->originalFrameRect(); |
| - ASSERT(!prevRect.contains(IntRect(IntPoint(), size()))); |
| - buffer->zeroFillFrameRect(prevRect); |
| - } |
| - } |
| - |
| - // Update our status to be partially complete. |
| - buffer->setStatus(ImageFrame::FramePartial); |
| + // ImageDecoder::initFrameBuffer does a DCHECK if |frameIndex| exists. |
| + if (!ImageDecoder::initFrameBuffer(frameIndex)) |
|
scroggo_chromium
2016/11/14 13:51:46
Since all of the overrides first call ImageDecoder
joostouwerling
2016/11/14 16:25:10
Good suggestion! Done.
|
| + return false; |
| - // Reset the alpha pixel tracker for this frame. |
| m_currentBufferSawAlpha = false; |
| return true; |
| } |
| + |
| +bool GIFImageDecoder::canReusePreviousFrameBuffer(size_t frameIndex) const { |
| + DCHECK(frameIndex < m_frameBufferCache.size()); |
| + return m_frameBufferCache[frameIndex].getDisposalMethod() != |
| + ImageFrame::DisposeOverwritePrevious; |
| +} |
| + |
| } // namespace blink |