Title: [287507] trunk/Source/WebCore
Revision
287507
Author
[email protected]
Date
2022-01-01 16:19:00 -0800 (Sat, 01 Jan 2022)

Log Message

ScalableImageDecoder should be using SharedBuffer instead of DataSegment
https://bugs.webkit.org/show_bug.cgi?id=233441
rdar://problem/85854204

Reviewed by Darin Adler.

DataSegment should be a SharedBuffer's implementation details and not
be used outside SharedBuffer's code.
Historically, using the inner DataSegment was required as it was thread
safe while SharedBuffer wasn't: This is no longer the case.
SharedBuffer and DataSegment are semantically very similar, so this is
mostly a find/replace change.
Flattening the FragmentedSharedBuffer is still required as most decoders
require reading the raw bytes.

No change in observable behaviour.

* platform/graphics/ImageBackingStore.h:
(WebCore::ImageBackingStore::setSize):
(WebCore::ImageBackingStore::ImageBackingStore):
* platform/image-decoders/ScalableImageDecoder.h:
* platform/image-decoders/avif/AVIFImageReader.cpp:
(WebCore::AVIFImageReader::parseHeader):
(WebCore::AVIFImageReader::decodeFrame):
* platform/image-decoders/avif/AVIFImageReader.h:
* platform/image-decoders/bmp/BMPImageReader.h:
(WebCore::BMPImageReader::readUint16):
(WebCore::BMPImageReader::readUint32):
(WebCore::BMPImageReader::setData):
* platform/image-decoders/gif/GIFImageReader.h:
(GIFImageReader::setData):
* platform/image-decoders/jpeg/JPEGImageDecoder.cpp:
(WebCore::JPEGImageReader::decode):
* platform/image-decoders/jpeg2000/JPEG2000ImageDecoder.cpp:
(WebCore::JPEG2000ImageDecoder::decode):
* platform/image-decoders/png/PNGImageDecoder.cpp:
(WebCore::PNGImageReader::decode):
* platform/image-decoders/webp/WEBPImageDecoder.cpp:
(WebCore::WEBPImageDecoder::decode):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (287506 => 287507)


--- trunk/Source/WebCore/ChangeLog	2022-01-02 00:09:19 UTC (rev 287506)
+++ trunk/Source/WebCore/ChangeLog	2022-01-02 00:19:00 UTC (rev 287507)
@@ -1,5 +1,47 @@
 2022-01-01  Jean-Yves Avenard  <[email protected]>
 
+        ScalableImageDecoder should be using SharedBuffer instead of DataSegment
+        https://bugs.webkit.org/show_bug.cgi?id=233441
+        rdar://problem/85854204
+
+        Reviewed by Darin Adler.
+
+        DataSegment should be a SharedBuffer's implementation details and not
+        be used outside SharedBuffer's code.
+        Historically, using the inner DataSegment was required as it was thread
+        safe while SharedBuffer wasn't: This is no longer the case.
+        SharedBuffer and DataSegment are semantically very similar, so this is
+        mostly a find/replace change.
+        Flattening the FragmentedSharedBuffer is still required as most decoders
+        require reading the raw bytes.
+
+        No change in observable behaviour.
+
+        * platform/graphics/ImageBackingStore.h:
+        (WebCore::ImageBackingStore::setSize):
+        (WebCore::ImageBackingStore::ImageBackingStore):
+        * platform/image-decoders/ScalableImageDecoder.h:
+        * platform/image-decoders/avif/AVIFImageReader.cpp:
+        (WebCore::AVIFImageReader::parseHeader):
+        (WebCore::AVIFImageReader::decodeFrame):
+        * platform/image-decoders/avif/AVIFImageReader.h:
+        * platform/image-decoders/bmp/BMPImageReader.h:
+        (WebCore::BMPImageReader::readUint16):
+        (WebCore::BMPImageReader::readUint32):
+        (WebCore::BMPImageReader::setData):
+        * platform/image-decoders/gif/GIFImageReader.h:
+        (GIFImageReader::setData):
+        * platform/image-decoders/jpeg/JPEGImageDecoder.cpp:
+        (WebCore::JPEGImageReader::decode):
+        * platform/image-decoders/jpeg2000/JPEG2000ImageDecoder.cpp:
+        (WebCore::JPEG2000ImageDecoder::decode):
+        * platform/image-decoders/png/PNGImageDecoder.cpp:
+        (WebCore::PNGImageReader::decode):
+        * platform/image-decoders/webp/WEBPImageDecoder.cpp:
+        (WebCore::WEBPImageDecoder::decode):
+
+2022-01-01  Jean-Yves Avenard  <[email protected]>
+
         make SharedBuffer::copy() return a contiguous SharedBuffer
         https://bugs.webkit.org/show_bug.cgi?id=234622
         rdar://problem/86829527

Modified: trunk/Source/WebCore/platform/graphics/ImageBackingStore.h (287506 => 287507)


--- trunk/Source/WebCore/platform/graphics/ImageBackingStore.h	2022-01-02 00:09:19 UTC (rev 287506)
+++ trunk/Source/WebCore/platform/graphics/ImageBackingStore.h	2022-01-02 00:19:00 UTC (rev 287507)
@@ -233,6 +233,7 @@
         return PackedColor::ARGB { result }.value;
     }
 
+    // m_pixels type should be identical to the one set in ImageBackingStoreCairo.cpp
     RefPtr<FragmentedSharedBuffer::DataSegment> m_pixels;
     uint32_t* m_pixelsPtr { nullptr };
     IntSize m_size;

Modified: trunk/Source/WebCore/platform/image-decoders/ScalableImageDecoder.h (287506 => 287507)


--- trunk/Source/WebCore/platform/image-decoders/ScalableImageDecoder.h	2022-01-02 00:09:19 UTC (rev 287506)
+++ trunk/Source/WebCore/platform/image-decoders/ScalableImageDecoder.h	2022-01-02 00:19:00 UTC (rev 287507)
@@ -76,9 +76,8 @@
         if (m_encodedDataStatus == EncodedDataStatus::Error)
             return;
 
-        auto contiguousData = data.makeContiguous();
-        if (contiguousData->data())
-            m_data = contiguousData->begin()->segment.copyRef();
+        m_data = data.makeContiguous();
+
         if (m_encodedDataStatus == EncodedDataStatus::TypeAvailable) {
             m_decodingSizeFromSetData = true;
             tryDecodeSize(allDataReceived);
@@ -194,7 +193,7 @@
     std::optional<IntPoint> hotSpot() const override { return std::nullopt; }
 
 protected:
-    RefPtr<FragmentedSharedBuffer::DataSegment> m_data;
+    RefPtr<const SharedBuffer> m_data;
     Vector<ScalableImageDecoderFrame, 1> m_frameBufferCache WTF_GUARDED_BY_LOCK(m_lock);
     mutable Lock m_lock;
     bool m_premultiplyAlpha;

Modified: trunk/Source/WebCore/platform/image-decoders/avif/AVIFImageReader.cpp (287506 => 287507)


--- trunk/Source/WebCore/platform/image-decoders/avif/AVIFImageReader.cpp	2022-01-02 00:09:19 UTC (rev 287506)
+++ trunk/Source/WebCore/platform/image-decoders/avif/AVIFImageReader.cpp	2022-01-02 00:19:00 UTC (rev 287507)
@@ -41,7 +41,7 @@
 
 AVIFImageReader::~AVIFImageReader() = default;
 
-bool AVIFImageReader::parseHeader(const FragmentedSharedBuffer::DataSegment& data, bool allDataReceived)
+bool AVIFImageReader::parseHeader(const SharedBuffer& data, bool allDataReceived)
 {
     if (avifDecoderSetIOMemory(m_avifDecoder.get(), data.data(), data.size()) != AVIF_RESULT_OK)
         return allDataReceived ? m_decoder->setFailed() : false;
@@ -58,7 +58,7 @@
     return true;
 }
 
-void AVIFImageReader::decodeFrame(size_t frameIndex, ScalableImageDecoderFrame& buffer, const FragmentedSharedBuffer::DataSegment& data)
+void AVIFImageReader::decodeFrame(size_t frameIndex, ScalableImageDecoderFrame& buffer, const SharedBuffer& data)
 {
     if (m_decoder->failed())
         return;

Modified: trunk/Source/WebCore/platform/image-decoders/avif/AVIFImageReader.h (287506 => 287507)


--- trunk/Source/WebCore/platform/image-decoders/avif/AVIFImageReader.h	2022-01-02 00:09:19 UTC (rev 287506)
+++ trunk/Source/WebCore/platform/image-decoders/avif/AVIFImageReader.h	2022-01-02 00:19:00 UTC (rev 287507)
@@ -39,8 +39,8 @@
     AVIFImageReader(RefPtr<AVIFImageDecoder>&&);
     ~AVIFImageReader();
 
-    bool parseHeader(const FragmentedSharedBuffer::DataSegment&, bool allDataReceived);
-    void decodeFrame(size_t index, ScalableImageDecoderFrame&, const FragmentedSharedBuffer::DataSegment&);
+    bool parseHeader(const SharedBuffer&, bool allDataReceived);
+    void decodeFrame(size_t index, ScalableImageDecoderFrame&, const SharedBuffer&);
     size_t imageCount() const;
     double repetitionCount() const;
 

Modified: trunk/Source/WebCore/platform/image-decoders/bmp/BMPImageReader.h (287506 => 287507)


--- trunk/Source/WebCore/platform/image-decoders/bmp/BMPImageReader.h	2022-01-02 00:09:19 UTC (rev 287506)
+++ trunk/Source/WebCore/platform/image-decoders/bmp/BMPImageReader.h	2022-01-02 00:19:00 UTC (rev 287507)
@@ -42,7 +42,7 @@
 public:
     // Read a value from |data[offset]|, converting from little to native
     // endianness.
-    static inline uint16_t readUint16(const FragmentedSharedBuffer::DataSegment& data, int offset)
+    static inline uint16_t readUint16(const SharedBuffer& data, int offset)
     {
         uint16_t result;
         memcpy(&result, &data.data()[offset], 2);
@@ -52,7 +52,7 @@
         return result;
     }
 
-    static inline uint32_t readUint32(const FragmentedSharedBuffer::DataSegment& data, int offset)
+    static inline uint32_t readUint32(const SharedBuffer& data, int offset)
     {
         uint32_t result;
         memcpy(&result, &data.data()[offset], 4);
@@ -69,7 +69,7 @@
     BMPImageReader(ScalableImageDecoder* parent, size_t decodedAndHeaderOffset, size_t imgDataOffset, bool usesAndMask);
 
     void setBuffer(ScalableImageDecoderFrame* buffer) { m_buffer = buffer; }
-    void setData(FragmentedSharedBuffer::DataSegment& data) { m_data = &data; }
+    void setData(const SharedBuffer& data) { m_data = &data; }
 
     // Does the actual decoding. If |onlySize| is true, decoding only
     // progresses as far as necessary to get the image size. Returns
@@ -272,7 +272,7 @@
     ScalableImageDecoderFrame* m_buffer;
 
     // The file to decode.
-    RefPtr<FragmentedSharedBuffer::DataSegment> m_data;
+    RefPtr<const SharedBuffer> m_data;
 
     // An index into |m_data| representing how much we've already decoded.
     size_t m_decodedOffset;

Modified: trunk/Source/WebCore/platform/image-decoders/gif/GIFImageReader.h (287506 => 287507)


--- trunk/Source/WebCore/platform/image-decoders/gif/GIFImageReader.h	2022-01-02 00:09:19 UTC (rev 287506)
+++ trunk/Source/WebCore/platform/image-decoders/gif/GIFImageReader.h	2022-01-02 00:19:00 UTC (rev 287507)
@@ -237,7 +237,7 @@
     {
     }
 
-    void setData(WebCore::FragmentedSharedBuffer::DataSegment& data) { m_data = &data; }
+    void setData(const WebCore::SharedBuffer& data) { m_data = &data; }
     // FIXME: haltAtFrame should be size_t.
     bool decode(WebCore::GIFImageDecoder::GIFQuery, unsigned haltAtFrame);
 
@@ -316,6 +316,6 @@
     Vector<std::unique_ptr<GIFFrameContext> > m_frames;
     size_t m_currentDecodingFrame;
 
-    RefPtr<WebCore::FragmentedSharedBuffer::DataSegment> m_data;
+    RefPtr<const WebCore::SharedBuffer> m_data;
     bool m_parseCompleted;
 };

Modified: trunk/Source/WebCore/platform/image-decoders/jpeg/JPEGImageDecoder.cpp (287506 => 287507)


--- trunk/Source/WebCore/platform/image-decoders/jpeg/JPEGImageDecoder.cpp	2022-01-02 00:09:19 UTC (rev 287506)
+++ trunk/Source/WebCore/platform/image-decoders/jpeg/JPEGImageDecoder.cpp	2022-01-02 00:19:00 UTC (rev 287507)
@@ -317,7 +317,7 @@
         m_bytesToSkip = std::max(numBytes - bytesToSkip, static_cast<long>(0));
     }
 
-    bool decode(const FragmentedSharedBuffer::DataSegment& data, bool onlySize)
+    bool decode(const SharedBuffer& data, bool onlySize)
     {
         m_decodingSizeOnly = onlySize;
 

Modified: trunk/Source/WebCore/platform/image-decoders/jpeg2000/JPEG2000ImageDecoder.cpp (287506 => 287507)


--- trunk/Source/WebCore/platform/image-decoders/jpeg2000/JPEG2000ImageDecoder.cpp	2022-01-02 00:09:19 UTC (rev 287506)
+++ trunk/Source/WebCore/platform/image-decoders/jpeg2000/JPEG2000ImageDecoder.cpp	2022-01-02 00:19:00 UTC (rev 287507)
@@ -380,7 +380,7 @@
     }
 
     struct Reader {
-        FragmentedSharedBuffer::DataSegment& data;
+        const SharedBuffer& data;
         size_t offset;
     } reader = { *m_data, 0 };
 

Modified: trunk/Source/WebCore/platform/image-decoders/png/PNGImageDecoder.cpp (287506 => 287507)


--- trunk/Source/WebCore/platform/image-decoders/png/PNGImageDecoder.cpp	2022-01-02 00:09:19 UTC (rev 287506)
+++ trunk/Source/WebCore/platform/image-decoders/png/PNGImageDecoder.cpp	2022-01-02 00:19:00 UTC (rev 287507)
@@ -148,7 +148,7 @@
         m_readOffset = 0;
     }
 
-    bool decode(const FragmentedSharedBuffer::DataSegment& data, bool sizeOnly, unsigned haltAtFrame)
+    bool decode(const SharedBuffer& data, bool sizeOnly, unsigned haltAtFrame)
     {
         m_decodingSizeOnly = sizeOnly;
         PNGImageDecoder* decoder = static_cast<PNGImageDecoder*>(png_get_progressive_ptr(m_png));

Modified: trunk/Source/WebCore/platform/image-decoders/webp/WEBPImageDecoder.cpp (287506 => 287507)


--- trunk/Source/WebCore/platform/image-decoders/webp/WEBPImageDecoder.cpp	2022-01-02 00:09:19 UTC (rev 287506)
+++ trunk/Source/WebCore/platform/image-decoders/webp/WEBPImageDecoder.cpp	2022-01-02 00:19:00 UTC (rev 287507)
@@ -132,7 +132,7 @@
     // This can be executed both in the main thread (when not using async decoding) or in the decoding thread.
     // When executed in the decoding thread, a call to setData() from the main thread may change the data
     // the WebPDemuxer is using, leaving it in an inconsistent state, so we need to protect the data.
-    RefPtr<FragmentedSharedBuffer::DataSegment> protectedData(m_data);
+    RefPtr<const SharedBuffer> protectedData(m_data);
     WebPData inputData = { protectedData->data(), protectedData->size() };
     WebPDemuxState demuxerState;
     WebPDemuxer* demuxer = WebPDemuxPartial(&inputData, &demuxerState);
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to