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);