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