Changeset 202800 in webkit


Ignore:
Timestamp:
Jul 3, 2016 11:30:28 PM (8 years ago)
Author:
Carlos Garcia Campos
Message:

[image-decoders] Make ImageDecoder::size() lazily decode the image if needed to return a valid size
https://bugs.webkit.org/show_bug.cgi?id=159297

Reviewed by Antonio Gomes.

It's otherwise confusing leading to bugs like #159089.

  • platform/image-decoders/ImageDecoder.cpp:

(WebCore::ImageDecoder::createFrameImageAtIndex): Check the size at the beginning and return early if it's
empty. We no longer need to check the size after calling frameBufferAtIndex().

  • platform/image-decoders/ImageDecoder.h:

(WebCore::ImageDecoder::size): Check first is size is available, which lazily decodes the image.
(WebCore::ImageDecoder::scaledSize): Remove const.
(WebCore::ImageDecoder::frameSizeAtIndex): Ditto.

  • platform/image-decoders/ico/ICOImageDecoder.cpp:

(WebCore::ICOImageDecoder::size): Ditto.
(WebCore::ICOImageDecoder::frameSizeAtIndex): Ditto.

  • platform/image-decoders/ico/ICOImageDecoder.h:
Location:
trunk/Source/WebCore
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r202779 r202800  
     12016-07-03  Carlos Garcia Campos  <cgarcia@igalia.com>
     2
     3        [image-decoders] Make ImageDecoder::size() lazily decode the image if needed to return a valid size
     4        https://bugs.webkit.org/show_bug.cgi?id=159297
     5
     6        Reviewed by Antonio Gomes.
     7
     8        It's otherwise confusing leading to bugs like #159089.
     9
     10        * platform/image-decoders/ImageDecoder.cpp:
     11        (WebCore::ImageDecoder::createFrameImageAtIndex): Check the size at the beginning and return early if it's
     12        empty. We no longer need to check the size after calling frameBufferAtIndex().
     13        * platform/image-decoders/ImageDecoder.h:
     14        (WebCore::ImageDecoder::size): Check first is size is available, which lazily decodes the image.
     15        (WebCore::ImageDecoder::scaledSize): Remove const.
     16        (WebCore::ImageDecoder::frameSizeAtIndex): Ditto.
     17        * platform/image-decoders/ico/ICOImageDecoder.cpp:
     18        (WebCore::ICOImageDecoder::size): Ditto.
     19        (WebCore::ICOImageDecoder::frameSizeAtIndex): Ditto.
     20        * platform/image-decoders/ico/ICOImageDecoder.h:
     21
    1222016-07-02  Youenn Fablet  <youenn@apple.com>
    223
  • trunk/Source/WebCore/platform/image-decoders/ImageDecoder.cpp

    r202616 r202800  
    313313NativeImagePtr ImageDecoder::createFrameImageAtIndex(size_t index, SubsamplingLevel)
    314314{
     315    // Zero-height images can cause problems for some ports. If we have an empty image dimension, just bail.
     316    if (size().isEmpty())
     317        return nullptr;
     318
    315319    ImageFrame* buffer = frameBufferAtIndex(index);
    316     // Zero-height images can cause problems for some ports. If we have an empty image dimension, just bail.
    317     // It's important to check the size after calling frameBufferAtIndex() to ensure the decoder has updated the size.
    318     // See https://bugs.webkit.org/show_bug.cgi?id=159089.
    319     if (!buffer || buffer->status() == ImageFrame::FrameEmpty || size().isEmpty())
     320    if (!buffer || buffer->status() == ImageFrame::FrameEmpty)
    320321        return nullptr;
    321322
  • trunk/Source/WebCore/platform/image-decoders/ImageDecoder.h

    r201441 r202800  
    272272        }
    273273
    274         virtual IntSize size() const { return m_size; }
    275 
    276         IntSize scaledSize() const
     274        virtual IntSize size() { return isSizeAvailable() ? m_size : IntSize(); }
     275
     276        IntSize scaledSize()
    277277        {
    278278            return m_scaled ? IntSize(m_scaledColumns.size(), m_scaledRows.size()) : size();
     
    284284        // composites any smaller frames against previous frames to create full-
    285285        // size frames.
    286         virtual IntSize frameSizeAtIndex(size_t, SubsamplingLevel) const
     286        virtual IntSize frameSizeAtIndex(size_t, SubsamplingLevel)
    287287        {
    288288            return size();
  • trunk/Source/WebCore/platform/image-decoders/ico/ICOImageDecoder.cpp

    r202677 r202800  
    7979}
    8080
    81 IntSize ICOImageDecoder::size() const
     81IntSize ICOImageDecoder::size()
    8282{
    8383    return m_frameSize.isEmpty() ? ImageDecoder::size() : m_frameSize;
    8484}
    8585
    86 IntSize ICOImageDecoder::frameSizeAtIndex(size_t index, SubsamplingLevel) const
     86IntSize ICOImageDecoder::frameSizeAtIndex(size_t index, SubsamplingLevel)
    8787{
    8888    return (index && (index < m_dirEntries.size())) ? m_dirEntries[index].m_size : size();
  • trunk/Source/WebCore/platform/image-decoders/ico/ICOImageDecoder.h

    r202677 r202800  
    4848        void setData(SharedBuffer&, bool allDataReceived) override;
    4949        bool isSizeAvailable() override;
    50         IntSize size() const override;
    51         IntSize frameSizeAtIndex(size_t, SubsamplingLevel) const override;
     50        IntSize size() override;
     51        IntSize frameSizeAtIndex(size_t, SubsamplingLevel) override;
    5252        bool setSize(unsigned width, unsigned height) override;
    5353        size_t frameCount() override;
Note: See TracChangeset for help on using the changeset viewer.