Changeset 194503 in webkit


Ignore:
Timestamp:
Jan 2, 2016 2:22:10 PM (8 years ago)
Author:
commit-queue@webkit.org
Message:

APNG decoder: only decode the frames up to haltAtFrame
https://bugs.webkit.org/show_bug.cgi?id=146205

Patch by Max Stepin <maxstepin@gmail.com> on 2016-01-02
Reviewed by Michael Catanzaro.

No new tests, already covered by existing tests.

  • platform/image-decoders/png/PNGImageDecoder.cpp:

(WebCore::PNGImageReader::close):
(WebCore::PNGImageReader::decode):
(WebCore::PNGImageDecoder::isSizeAvailable):
(WebCore::PNGImageDecoder::frameBufferAtIndex):
(WebCore::PNGImageDecoder::pngComplete):
(WebCore::PNGImageDecoder::decode):

  • platform/image-decoders/png/PNGImageDecoder.h:

(WebCore::PNGImageDecoder::isComplete):
(WebCore::PNGImageDecoder::isCompleteAtIndex):

Location:
trunk/Source/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r194502 r194503  
     12016-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
    1212016-01-02  Simon Fraser  <simon.fraser@apple.com>
    222
  • trunk/Source/WebCore/platform/image-decoders/png/PNGImageDecoder.cpp

    r181553 r194503  
    162162    }
    163163
    164     bool decode(const SharedBuffer& data, bool sizeOnly)
     164    bool decode(const SharedBuffer& data, bool sizeOnly, unsigned haltAtFrame)
    165165    {
    166166        m_decodingSizeOnly = sizeOnly;
     
    179179            // merely want to check if we've managed to set the size, not
    180180            // (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))
    182182                return true;
    183183        }
     
    275275{
    276276    if (!ImageDecoder::isSizeAvailable())
    277          decode(true);
     277        decode(true, 0);
    278278
    279279    return ImageDecoder::isSizeAvailable();
     
    309309    ImageFrame& frame = m_frameBufferCache[index];
    310310    if (frame.status() != ImageFrame::FrameComplete)
    311         decode(false);
     311        decode(false, index);
    312312    return &frame;
    313313}
     
    688688}
    689689
    690 void PNGImageDecoder::decode(bool onlySize)
     690void PNGImageDecoder::decode(bool onlySize, unsigned haltAtFrame)
    691691{
    692692    if (failed())
     
    698698    // If we couldn't decode the image but we've received all the data, decoding
    699699    // has failed.
    700     if (!m_reader->decode(*m_data, onlySize) && isAllDataReceived())
     700    if (!m_reader->decode(*m_data, onlySize, haltAtFrame) && isAllDataReceived())
    701701        setFailed();
    702702    // If we're done decoding the image, we don't need the PNGImageReader
     
    770770            fallbackNotAnimated();
    771771            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);
    772793        }
    773794
     
    928949    buffer.setStatus(ImageFrame::FrameComplete);
    929950
    930     if (!m_delayDenominator)
    931         buffer.setDuration(m_delayNumerator * 10);
    932     else
    933         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     else
    940         buffer.setDisposalMethod(ImageFrame::DisposeKeep);
    941 
    942951    png_bytep interlaceBuffer = m_reader->interlaceBuffer();
    943952
  • trunk/Source/WebCore/platform/image-decoders/png/PNGImageDecoder.h

    r185518 r194503  
    8181        }
    8282
     83        bool isCompleteAtIndex(size_t index)
     84        {
     85            return (index < m_frameBufferCache.size() && m_frameBufferCache[index].status() == ImageFrame::FrameComplete);
     86        }
     87
    8388    private:
    8489        // Decodes the image.  If |onlySize| is true, stops decoding after
    8590        // calculating the image size.  If decoding fails but there is no more
    8691        // data coming, sets the "decode failure" flag.
    87         void decode(bool onlySize);
     92        void decode(bool onlySize, unsigned haltAtFrame);
    8893#if ENABLE(APNG)
    8994        void initFrameBuffer(size_t frameIndex);
Note: See TracChangeset for help on using the changeset viewer.