Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1790)

Unified Diff: Source/core/platform/image-decoders/gif/GIFImageReader.cpp

Issue 15350006: Decode GIF image frames on demand. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);

Powered by Google App Engine
This is Rietveld 408576698