Chromium Code Reviews| Index: Source/core/platform/image-decoders/gif/GIFImageReader.cpp |
| diff --git a/Source/core/platform/image-decoders/gif/GIFImageReader.cpp b/Source/core/platform/image-decoders/gif/GIFImageReader.cpp |
| index 1a7268a19ba20c71a3e76a1bbd410d6ca1fe63cf..fd7961aaa98635bb3af5b5575137b378117978ee 100644 |
| --- a/Source/core/platform/image-decoders/gif/GIFImageReader.cpp |
| +++ b/Source/core/platform/image-decoders/gif/GIFImageReader.cpp |
| @@ -351,22 +351,17 @@ bool GIFFrameContext::decode(const unsigned char* data, size_t length, WebCore:: |
| return true; |
| } |
| -// Decode all frames before haltAtFrame. |
| +// Decode frames. The frames must have been parsed. |
| // This method uses GIFFrameContext:decode() to decode each frame; decoding error is reported to client as a critical failure. |
| // Return true if decoding has progressed. Return false if an error has occurred. |
| -bool GIFImageReader::decode(GIFImageDecoder::GIFQuery query, unsigned haltAtFrame) |
| +bool GIFImageReader::decode(const BitVector& frames) |
| { |
| - ASSERT(m_bytesRead <= m_data->size()); |
| - |
| - if (!parse(m_bytesRead, m_data->size() - m_bytesRead, query == GIFImageDecoder::GIFSizeQuery)) |
| - return false; |
| + for (size_t i = 0; i < frames.size(); ++i) { |
|
Alpha Left Google
2013/05/18 00:39:35
I would rather let the user of this API to call mu
Xianzhu
2013/05/20 04:30:59
Done.
|
| + if (!frames.get(i)) |
| + continue; |
| - if (query != GIFImageDecoder::GIFFullQuery) |
| - return true; |
| - |
| - while (m_currentDecodingFrame < std::min(m_frames.size(), static_cast<size_t>(haltAtFrame))) { |
| bool frameDecoded = false; |
| - GIFFrameContext* currentFrame = m_frames[m_currentDecodingFrame].get(); |
| + GIFFrameContext* currentFrame = m_frames[i].get(); |
| if (!currentFrame->decode(data(0), m_data->size(), m_client, &frameDecoded)) |
| return false; |
| @@ -375,21 +370,29 @@ bool GIFImageReader::decode(GIFImageDecoder::GIFQuery query, unsigned haltAtFram |
| if (!frameDecoded) |
| break; |
| - if (!m_client->frameComplete(m_currentDecodingFrame, currentFrame->delayTime, currentFrame->disposalMethod)) |
| + if (!m_client->frameComplete(i, currentFrame->delayTime, currentFrame->disposalMethod)) |
| return false; |
| - ++m_currentDecodingFrame; |
| + |
| + m_decodedFramesCount++; |
|
Alpha Left Google
2013/05/18 00:39:35
See my comments below, I don't think we need to do
Xianzhu
2013/05/20 04:30:59
Done.
|
| } |
| // All frames decoded. |
| - if (m_currentDecodingFrame == m_frames.size() && m_parseCompleted) |
| + if (m_decodedFramesCount == m_frames.size() && m_parseCompleted) |
|
Alpha Left Google
2013/05/18 00:39:35
This check will not be correct because we now allo
Xianzhu
2013/05/20 04:30:59
Done.
|
| m_client->gifComplete(); |
| return true; |
| } |
| +bool GIFImageReader::parse(GIFImageDecoder::GIFParseQuery query) |
| +{ |
| + ASSERT(m_bytesRead <= m_data->size()); |
| + |
| + return parseData(m_bytesRead, m_data->size() - m_bytesRead, query); |
| +} |
| + |
| // Parse incoming GIF data stream into internal data structures. |
| // Return true if parsing has progressed or there is not enough data. |
| // Return false if a fatal error is encountered. |
| -bool GIFImageReader::parse(size_t dataPosition, size_t len, bool parseSizeOnly) |
| +bool GIFImageReader::parseData(size_t dataPosition, size_t len, GIFImageDecoder::GIFParseQuery query) |
| { |
| if (!len) { |
| // No new data has come in since the last call, just ignore this call. |
| @@ -676,7 +679,7 @@ bool GIFImageReader::parse(size_t dataPosition, size_t len, bool parseSizeOnly) |
| return false; |
| } |
| - if (parseSizeOnly) { |
| + if (query == GIFImageDecoder::GIFSizeQuery) { |
| // The decoder needs to stop. Hand back the number of bytes we consumed from |
| // buffer minus 9 (the amount we consumed to read the header). |
| setRemainingBytes(len + 9); |