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

Side by Side Diff: third_party/gif/SkGifImageReader.cpp

Issue 2447863002: Report repetition count in SkCodec (Closed)
Patch Set: Make colorTables.gif use a different loop count Created 4 years, 1 month 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 unified diff | Download patch
« no previous file with comments | « third_party/gif/SkGifImageReader.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 1 /* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* ***** BEGIN LICENSE BLOCK ***** 2 /* ***** BEGIN LICENSE BLOCK *****
3 * Version: MPL 1.1/GPL 2.0/LGPL 2.1 3 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
4 * 4 *
5 * The contents of this file are subject to the Mozilla Public License Version 5 * The contents of this file are subject to the Mozilla Public License Version
6 * 1.1 (the "License"); you may not use this file except in compliance with 6 * 1.1 (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at 7 * the License. You may obtain a copy of the License at
8 * http://www.mozilla.org/MPL/ 8 * http://www.mozilla.org/MPL/
9 * 9 *
10 * Software distributed under the License is distributed on an "AS IS" basis, 10 * Software distributed under the License is distributed on an "AS IS" basis,
(...skipping 397 matching lines...) Expand 10 before | Expand all | Expand 10 after
408 408
409 // Parse incoming GIF data stream into internal data structures. 409 // Parse incoming GIF data stream into internal data structures.
410 // Return true if parsing has progressed or there is not enough data. 410 // Return true if parsing has progressed or there is not enough data.
411 // Return false if a fatal error is encountered. 411 // Return false if a fatal error is encountered.
412 bool SkGifImageReader::parse(SkGifImageReader::SkGIFParseQuery query) 412 bool SkGifImageReader::parse(SkGifImageReader::SkGIFParseQuery query)
413 { 413 {
414 if (m_parseCompleted) { 414 if (m_parseCompleted) {
415 return true; 415 return true;
416 } 416 }
417 417
418 if (SkGIFLoopCountQuery == query && m_loopCount != cLoopCountNotSeen) {
419 // Loop count has already been parsed.
420 return true;
421 }
422
418 // SkGIFSizeQuery and SkGIFFrameCountQuery are negative, so this is only mea ningful when >= 0. 423 // SkGIFSizeQuery and SkGIFFrameCountQuery are negative, so this is only mea ningful when >= 0.
419 const int lastFrameToParse = (int) query; 424 const int lastFrameToParse = (int) query;
420 if (lastFrameToParse >= 0 && (int) m_frames.size() > lastFrameToParse 425 if (lastFrameToParse >= 0 && (int) m_frames.size() > lastFrameToParse
421 && m_frames[lastFrameToParse]->isComplete()) { 426 && m_frames[lastFrameToParse]->isComplete()) {
422 // We have already parsed this frame. 427 // We have already parsed this frame.
423 return true; 428 return true;
424 } 429 }
425 430
426 while (true) { 431 while (true) {
427 const size_t bytesBuffered = m_streamBuffer.buffer(m_bytesToConsume); 432 const size_t bytesBuffered = m_streamBuffer.buffer(m_bytesToConsume);
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after
657 reinterpret_cast<const unsigned char*>(m_streamBuffer.get()); 662 reinterpret_cast<const unsigned char*>(m_streamBuffer.get());
658 663
659 int netscapeExtension = currentComponent[0] & 7; 664 int netscapeExtension = currentComponent[0] & 7;
660 665
661 // Loop entire animation specified # of times. Only read the loop co unt during the first iteration. 666 // Loop entire animation specified # of times. Only read the loop co unt during the first iteration.
662 if (netscapeExtension == 1) { 667 if (netscapeExtension == 1) {
663 m_loopCount = GETINT16(currentComponent + 1); 668 m_loopCount = GETINT16(currentComponent + 1);
664 669
665 // Zero loop count is infinite animation loop request. 670 // Zero loop count is infinite animation loop request.
666 if (!m_loopCount) 671 if (!m_loopCount)
667 m_loopCount = SkCodecAnimation::kAnimationLoopInfinite; 672 m_loopCount = SkCodec::kRepetitionCountInfinite;
668 673
669 GETN(1, SkGIFNetscapeExtensionBlock); 674 GETN(1, SkGIFNetscapeExtensionBlock);
675
676 if (SkGIFLoopCountQuery == query) {
677 m_streamBuffer.flush();
678 return true;
679 }
670 } else if (netscapeExtension == 2) { 680 } else if (netscapeExtension == 2) {
671 // Wait for specified # of bytes to enter buffer. 681 // Wait for specified # of bytes to enter buffer.
672 682
673 // Don't do this, this extension doesn't exist (isn't used at al l) 683 // Don't do this, this extension doesn't exist (isn't used at al l)
674 // and doesn't do anything, as our streaming/buffering takes car e of it all... 684 // and doesn't do anything, as our streaming/buffering takes car e of it all...
675 // See: http://semmix.pl/color/exgraf/eeg24.htm 685 // See: http://semmix.pl/color/exgraf/eeg24.htm
676 GETN(1, SkGIFNetscapeExtensionBlock); 686 GETN(1, SkGIFNetscapeExtensionBlock);
677 } else { 687 } else {
678 // 0,3-7 are yet to be defined netscape extension codes 688 // 0,3-7 are yet to be defined netscape extension codes
679 // This prevents attempting to continue reading this invalid str eam. 689 // This prevents attempting to continue reading this invalid str eam.
(...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after
965 rowsRemaining = m_frameContext->height(); 975 rowsRemaining = m_frameContext->height();
966 976
967 // Clearing the whole suffix table lets us be more tolerant of bad data. 977 // Clearing the whole suffix table lets us be more tolerant of bad data.
968 for (int i = 0; i < clearCode; ++i) { 978 for (int i = 0; i < clearCode; ++i) {
969 suffix[i] = i; 979 suffix[i] = i;
970 suffixLength[i] = 1; 980 suffixLength[i] = 1;
971 } 981 }
972 return true; 982 return true;
973 } 983 }
974 984
OLDNEW
« no previous file with comments | « third_party/gif/SkGifImageReader.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698