Title: [202800] trunk/Source/WebCore
Revision
202800
Author
[email protected]
Date
2016-07-03 23:30:28 -0700 (Sun, 03 Jul 2016)

Log 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:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (202799 => 202800)


--- trunk/Source/WebCore/ChangeLog	2016-07-04 06:27:32 UTC (rev 202799)
+++ trunk/Source/WebCore/ChangeLog	2016-07-04 06:30:28 UTC (rev 202800)
@@ -1,3 +1,24 @@
+2016-07-03  Carlos Garcia Campos  <[email protected]>
+
+        [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:
+
 2016-07-02  Youenn Fablet  <[email protected]>
 
         Synchronous preflight checker should set loading options to not use credentials

Modified: trunk/Source/WebCore/platform/image-decoders/ImageDecoder.cpp (202799 => 202800)


--- trunk/Source/WebCore/platform/image-decoders/ImageDecoder.cpp	2016-07-04 06:27:32 UTC (rev 202799)
+++ trunk/Source/WebCore/platform/image-decoders/ImageDecoder.cpp	2016-07-04 06:30:28 UTC (rev 202800)
@@ -312,13 +312,14 @@
 
 NativeImagePtr ImageDecoder::createFrameImageAtIndex(size_t index, SubsamplingLevel)
 {
-    ImageFrame* buffer = frameBufferAtIndex(index);
     // Zero-height images can cause problems for some ports. If we have an empty image dimension, just bail.
-    // It's important to check the size after calling frameBufferAtIndex() to ensure the decoder has updated the size.
-    // See https://bugs.webkit.org/show_bug.cgi?id=159089.
-    if (!buffer || buffer->status() == ImageFrame::FrameEmpty || size().isEmpty())
+    if (size().isEmpty())
         return nullptr;
 
+    ImageFrame* buffer = frameBufferAtIndex(index);
+    if (!buffer || buffer->status() == ImageFrame::FrameEmpty)
+        return nullptr;
+
     // Return the buffer contents as a native image. For some ports, the data
     // is already in a native container, and this just increments its refcount.
     return buffer->asNewNativeImage();

Modified: trunk/Source/WebCore/platform/image-decoders/ImageDecoder.h (202799 => 202800)


--- trunk/Source/WebCore/platform/image-decoders/ImageDecoder.h	2016-07-04 06:27:32 UTC (rev 202799)
+++ trunk/Source/WebCore/platform/image-decoders/ImageDecoder.h	2016-07-04 06:30:28 UTC (rev 202800)
@@ -271,9 +271,9 @@
             return !m_failed && m_sizeAvailable;
         }
 
-        virtual IntSize size() const { return m_size; }
+        virtual IntSize size() { return isSizeAvailable() ? m_size : IntSize(); }
 
-        IntSize scaledSize() const
+        IntSize scaledSize()
         {
             return m_scaled ? IntSize(m_scaledColumns.size(), m_scaledRows.size()) : size();
         }
@@ -283,7 +283,7 @@
         // sizes.  This does NOT differ from size() for GIF, since decoding GIFs
         // composites any smaller frames against previous frames to create full-
         // size frames.
-        virtual IntSize frameSizeAtIndex(size_t, SubsamplingLevel) const
+        virtual IntSize frameSizeAtIndex(size_t, SubsamplingLevel)
         {
             return size();
         }

Modified: trunk/Source/WebCore/platform/image-decoders/ico/ICOImageDecoder.cpp (202799 => 202800)


--- trunk/Source/WebCore/platform/image-decoders/ico/ICOImageDecoder.cpp	2016-07-04 06:27:32 UTC (rev 202799)
+++ trunk/Source/WebCore/platform/image-decoders/ico/ICOImageDecoder.cpp	2016-07-04 06:30:28 UTC (rev 202800)
@@ -78,12 +78,12 @@
     return ImageDecoder::isSizeAvailable();
 }
 
-IntSize ICOImageDecoder::size() const
+IntSize ICOImageDecoder::size()
 {
     return m_frameSize.isEmpty() ? ImageDecoder::size() : m_frameSize;
 }
 
-IntSize ICOImageDecoder::frameSizeAtIndex(size_t index, SubsamplingLevel) const
+IntSize ICOImageDecoder::frameSizeAtIndex(size_t index, SubsamplingLevel)
 {
     return (index && (index < m_dirEntries.size())) ? m_dirEntries[index].m_size : size();
 }

Modified: trunk/Source/WebCore/platform/image-decoders/ico/ICOImageDecoder.h (202799 => 202800)


--- trunk/Source/WebCore/platform/image-decoders/ico/ICOImageDecoder.h	2016-07-04 06:27:32 UTC (rev 202799)
+++ trunk/Source/WebCore/platform/image-decoders/ico/ICOImageDecoder.h	2016-07-04 06:30:28 UTC (rev 202800)
@@ -47,8 +47,8 @@
         String filenameExtension() const override { return "ico"; }
         void setData(SharedBuffer&, bool allDataReceived) override;
         bool isSizeAvailable() override;
-        IntSize size() const override;
-        IntSize frameSizeAtIndex(size_t, SubsamplingLevel) const override;
+        IntSize size() override;
+        IntSize frameSizeAtIndex(size_t, SubsamplingLevel) override;
         bool setSize(unsigned width, unsigned height) override;
         size_t frameCount() override;
         ImageFrame* frameBufferAtIndex(size_t) override;
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to