Changeset 194503 in webkit
- Timestamp:
- Jan 2, 2016 2:22:10 PM (8 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r194502 r194503 1 2016-01-02 Max Stepin <maxstepin@gmail.com> 2 3 APNG decoder: only decode the frames up to haltAtFrame 4 https://bugs.webkit.org/show_bug.cgi?id=146205 5 6 Reviewed by Michael Catanzaro. 7 8 No new tests, already covered by existing tests. 9 10 * platform/image-decoders/png/PNGImageDecoder.cpp: 11 (WebCore::PNGImageReader::close): 12 (WebCore::PNGImageReader::decode): 13 (WebCore::PNGImageDecoder::isSizeAvailable): 14 (WebCore::PNGImageDecoder::frameBufferAtIndex): 15 (WebCore::PNGImageDecoder::pngComplete): 16 (WebCore::PNGImageDecoder::decode): 17 * platform/image-decoders/png/PNGImageDecoder.h: 18 (WebCore::PNGImageDecoder::isComplete): 19 (WebCore::PNGImageDecoder::isCompleteAtIndex): 20 1 21 2016-01-02 Simon Fraser <simon.fraser@apple.com> 2 22 -
trunk/Source/WebCore/platform/image-decoders/png/PNGImageDecoder.cpp
r181553 r194503 162 162 } 163 163 164 bool decode(const SharedBuffer& data, bool sizeOnly )164 bool decode(const SharedBuffer& data, bool sizeOnly, unsigned haltAtFrame) 165 165 { 166 166 m_decodingSizeOnly = sizeOnly; … … 179 179 // merely want to check if we've managed to set the size, not 180 180 // (recursively) trigger additional decoding if we haven't. 181 if (sizeOnly ? decoder->ImageDecoder::isSizeAvailable() : decoder->isComplete ())181 if (sizeOnly ? decoder->ImageDecoder::isSizeAvailable() : decoder->isCompleteAtIndex(haltAtFrame)) 182 182 return true; 183 183 } … … 275 275 { 276 276 if (!ImageDecoder::isSizeAvailable()) 277 decode(true);277 decode(true, 0); 278 278 279 279 return ImageDecoder::isSizeAvailable(); … … 309 309 ImageFrame& frame = m_frameBufferCache[index]; 310 310 if (frame.status() != ImageFrame::FrameComplete) 311 decode(false );311 decode(false, index); 312 312 return &frame; 313 313 } … … 688 688 } 689 689 690 void PNGImageDecoder::decode(bool onlySize )690 void PNGImageDecoder::decode(bool onlySize, unsigned haltAtFrame) 691 691 { 692 692 if (failed()) … … 698 698 // If we couldn't decode the image but we've received all the data, decoding 699 699 // has failed. 700 if (!m_reader->decode(*m_data, onlySize ) && isAllDataReceived())700 if (!m_reader->decode(*m_data, onlySize, haltAtFrame) && isAllDataReceived()) 701 701 setFailed(); 702 702 // If we're done decoding the image, we don't need the PNGImageReader … … 770 770 fallbackNotAnimated(); 771 771 return; 772 } 773 774 if (m_frameBufferCache.isEmpty()) { 775 m_frameBufferCache.resize(1); 776 m_frameBufferCache[0].setPremultiplyAlpha(m_premultiplyAlpha); 777 } 778 779 if (m_currentFrame < m_frameBufferCache.size()) { 780 ImageFrame& buffer = m_frameBufferCache[m_currentFrame]; 781 782 if (!m_delayDenominator) 783 buffer.setDuration(m_delayNumerator * 10); 784 else 785 buffer.setDuration(m_delayNumerator * 1000 / m_delayDenominator); 786 787 if (m_dispose == 2) 788 buffer.setDisposalMethod(ImageFrame::DisposeOverwritePrevious); 789 else if (m_dispose == 1) 790 buffer.setDisposalMethod(ImageFrame::DisposeOverwriteBgcolor); 791 else 792 buffer.setDisposalMethod(ImageFrame::DisposeKeep); 772 793 } 773 794 … … 928 949 buffer.setStatus(ImageFrame::FrameComplete); 929 950 930 if (!m_delayDenominator)931 buffer.setDuration(m_delayNumerator * 10);932 else933 buffer.setDuration(m_delayNumerator * 1000 / m_delayDenominator);934 935 if (m_dispose == 2)936 buffer.setDisposalMethod(ImageFrame::DisposeOverwritePrevious);937 else if (m_dispose == 1)938 buffer.setDisposalMethod(ImageFrame::DisposeOverwriteBgcolor);939 else940 buffer.setDisposalMethod(ImageFrame::DisposeKeep);941 942 951 png_bytep interlaceBuffer = m_reader->interlaceBuffer(); 943 952 -
trunk/Source/WebCore/platform/image-decoders/png/PNGImageDecoder.h
r185518 r194503 81 81 } 82 82 83 bool isCompleteAtIndex(size_t index) 84 { 85 return (index < m_frameBufferCache.size() && m_frameBufferCache[index].status() == ImageFrame::FrameComplete); 86 } 87 83 88 private: 84 89 // Decodes the image. If |onlySize| is true, stops decoding after 85 90 // calculating the image size. If decoding fails but there is no more 86 91 // data coming, sets the "decode failure" flag. 87 void decode(bool onlySize );92 void decode(bool onlySize, unsigned haltAtFrame); 88 93 #if ENABLE(APNG) 89 94 void initFrameBuffer(size_t frameIndex);
Note: See TracChangeset
for help on using the changeset viewer.