Diff
Modified: trunk/Source/WebCore/ChangeLog (251835 => 251836)
--- trunk/Source/WebCore/ChangeLog 2019-10-31 08:00:52 UTC (rev 251835)
+++ trunk/Source/WebCore/ChangeLog 2019-10-31 09:01:02 UTC (rev 251836)
@@ -1,3 +1,41 @@
+2019-10-29 Carlos Garcia Campos <cgar...@igalia.com>
+
+ [GTK][WPE] ImageDecoders: use SharedBuffer::DataSegment instead of SharedBuffer
+ https://bugs.webkit.org/show_bug.cgi?id=202807
+
+ Reviewed by Adrian Perez de Castro.
+
+ Because SharedBuffer::DataSegment is ThreadSafeRefCounted.
+
+ * platform/image-decoders/ScalableImageDecoder.h:
+ * platform/image-decoders/bmp/BMPImageDecoder.cpp:
+ (WebCore::BMPImageDecoder::setData):
+ (WebCore::BMPImageDecoder::decodeHelper):
+ * platform/image-decoders/bmp/BMPImageDecoder.h:
+ * platform/image-decoders/bmp/BMPImageReader.h:
+ (WebCore::BMPImageReader::readUint16):
+ (WebCore::BMPImageReader::readUint32):
+ (WebCore::BMPImageReader::setData):
+ (WebCore::BMPImageReader::readUint16 const):
+ (WebCore::BMPImageReader::readUint32 const):
+ * platform/image-decoders/gif/GIFImageDecoder.cpp:
+ (WebCore::GIFImageDecoder::setData):
+ (WebCore::GIFImageDecoder::decode):
+ * platform/image-decoders/gif/GIFImageReader.h:
+ (GIFImageReader::setData):
+ * platform/image-decoders/ico/ICOImageDecoder.cpp:
+ (WebCore::ICOImageDecoder::setData):
+ (WebCore::ICOImageDecoder::decodeAtIndex):
+ * platform/image-decoders/ico/ICOImageDecoder.h:
+ * 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):
+
2019-10-30 Peng Liu <peng.l...@apple.com>
[Picture-in-Picture Web API] Enable the support for iOS
Modified: trunk/Source/WebCore/platform/image-decoders/ScalableImageDecoder.h (251835 => 251836)
--- trunk/Source/WebCore/platform/image-decoders/ScalableImageDecoder.h 2019-10-31 08:00:52 UTC (rev 251835)
+++ trunk/Source/WebCore/platform/image-decoders/ScalableImageDecoder.h 2019-10-31 09:01:02 UTC (rev 251836)
@@ -76,7 +76,10 @@
if (m_encodedDataStatus == EncodedDataStatus::Error)
return;
- m_data = &data;
+ if (data.data()) {
+ // SharedBuffer::data() combines all segments into one in case there's more than one.
+ m_data = data.begin()->segment.copyRef();
+ }
if (m_encodedDataStatus == EncodedDataStatus::TypeAvailable) {
m_decodingSizeFromSetData = true;
tryDecodeSize(allDataReceived);
@@ -192,7 +195,7 @@
Optional<IntPoint> hotSpot() const override { return WTF::nullopt; }
protected:
- RefPtr<SharedBuffer> m_data; // The encoded data.
+ RefPtr<SharedBuffer::DataSegment> m_data;
Vector<ScalableImageDecoderFrame, 1> m_frameBufferCache;
mutable Lock m_mutex;
bool m_premultiplyAlpha;
Modified: trunk/Source/WebCore/platform/image-decoders/bmp/BMPImageDecoder.cpp (251835 => 251836)
--- trunk/Source/WebCore/platform/image-decoders/bmp/BMPImageDecoder.cpp 2019-10-31 08:00:52 UTC (rev 251835)
+++ trunk/Source/WebCore/platform/image-decoders/bmp/BMPImageDecoder.cpp 2019-10-31 09:01:02 UTC (rev 251836)
@@ -53,7 +53,7 @@
ScalableImageDecoder::setData(data, allDataReceived);
if (m_reader)
- m_reader->setData(&data);
+ m_reader->setData(*m_data);
}
ScalableImageDecoderFrame* BMPImageDecoder::frameBufferAtIndex(size_t index)
@@ -99,7 +99,7 @@
if (!m_reader) {
m_reader = makeUnique<BMPImageReader>(this, m_decodedOffset, imgDataOffset, false);
- m_reader->setData(m_data.get());
+ m_reader->setData(*m_data);
}
if (!m_frameBufferCache.isEmpty())
Modified: trunk/Source/WebCore/platform/image-decoders/bmp/BMPImageDecoder.h (251835 => 251836)
--- trunk/Source/WebCore/platform/image-decoders/bmp/BMPImageDecoder.h 2019-10-31 08:00:52 UTC (rev 251835)
+++ trunk/Source/WebCore/platform/image-decoders/bmp/BMPImageDecoder.h 2019-10-31 09:01:02 UTC (rev 251836)
@@ -57,7 +57,7 @@
inline uint32_t readUint32(int offset) const
{
- return BMPImageReader::readUint32(m_data.get(), m_decodedOffset + offset);
+ return BMPImageReader::readUint32(*m_data, m_decodedOffset + offset);
}
// Decodes the image. If |onlySize| is true, stops decoding after
Modified: trunk/Source/WebCore/platform/image-decoders/bmp/BMPImageReader.h (251835 => 251836)
--- trunk/Source/WebCore/platform/image-decoders/bmp/BMPImageReader.h 2019-10-31 08:00:52 UTC (rev 251835)
+++ trunk/Source/WebCore/platform/image-decoders/bmp/BMPImageReader.h 2019-10-31 09:01:02 UTC (rev 251836)
@@ -42,10 +42,10 @@
public:
// Read a value from |data[offset]|, converting from little to native
// endianness.
- static inline uint16_t readUint16(SharedBuffer* data, int offset)
+ static inline uint16_t readUint16(const SharedBuffer::DataSegment& data, int offset)
{
uint16_t result;
- memcpy(&result, &data->data()[offset], 2);
+ memcpy(&result, &data.data()[offset], 2);
#if CPU(BIG_ENDIAN)
result = ((result & 0xff) << 8) | ((result & 0xff00) >> 8);
#endif
@@ -52,10 +52,10 @@
return result;
}
- static inline uint32_t readUint32(SharedBuffer* data, int offset)
+ static inline uint32_t readUint32(const SharedBuffer::DataSegment& data, int offset)
{
uint32_t result;
- memcpy(&result, &data->data()[offset], 4);
+ memcpy(&result, &data.data()[offset], 4);
#if CPU(BIG_ENDIAN)
result = ((result & 0xff) << 24) | ((result & 0xff00) << 8) | ((result & 0xff0000) >> 8) | ((result & 0xff000000) >> 24);
#endif
@@ -69,7 +69,7 @@
BMPImageReader(ScalableImageDecoder* parent, size_t decodedAndHeaderOffset, size_t imgDataOffset, bool usesAndMask);
void setBuffer(ScalableImageDecoderFrame* buffer) { m_buffer = buffer; }
- void setData(SharedBuffer* data) { m_data = data; }
+ void setData(SharedBuffer::DataSegment& 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
@@ -121,12 +121,12 @@
inline uint16_t readUint16(int offset) const
{
- return readUint16(m_data.get(), m_decodedOffset + offset);
+ return readUint16(*m_data, m_decodedOffset + offset);
}
inline uint32_t readUint32(int offset) const
{
- return readUint32(m_data.get(), m_decodedOffset + offset);
+ return readUint32(*m_data, m_decodedOffset + offset);
}
// Determines the size of the BMP info header. Returns true if the size
@@ -272,7 +272,7 @@
ScalableImageDecoderFrame* m_buffer;
// The file to decode.
- RefPtr<SharedBuffer> m_data;
+ RefPtr<SharedBuffer::DataSegment> 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/GIFImageDecoder.cpp (251835 => 251836)
--- trunk/Source/WebCore/platform/image-decoders/gif/GIFImageDecoder.cpp 2019-10-31 08:00:52 UTC (rev 251835)
+++ trunk/Source/WebCore/platform/image-decoders/gif/GIFImageDecoder.cpp 2019-10-31 09:01:02 UTC (rev 251836)
@@ -45,7 +45,7 @@
ScalableImageDecoder::setData(data, allDataReceived);
if (m_reader)
- m_reader->setData(&data);
+ m_reader->setData(*m_data);
}
bool GIFImageDecoder::setSize(const IntSize& size)
@@ -328,7 +328,7 @@
if (!m_reader) {
m_reader = makeUnique<GIFImageReader>(this);
- m_reader->setData(m_data.get());
+ m_reader->setData(*m_data);
}
if (query == GIFSizeQuery) {
Modified: trunk/Source/WebCore/platform/image-decoders/gif/GIFImageReader.h (251835 => 251836)
--- trunk/Source/WebCore/platform/image-decoders/gif/GIFImageReader.h 2019-10-31 08:00:52 UTC (rev 251835)
+++ trunk/Source/WebCore/platform/image-decoders/gif/GIFImageReader.h 2019-10-31 09:01:02 UTC (rev 251836)
@@ -237,7 +237,7 @@
{
}
- void setData(WebCore::SharedBuffer* data) { m_data = data; }
+ void setData(WebCore::SharedBuffer::DataSegment& 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::SharedBuffer> m_data;
+ RefPtr<WebCore::SharedBuffer::DataSegment> m_data;
bool m_parseCompleted;
};
Modified: trunk/Source/WebCore/platform/image-decoders/ico/ICOImageDecoder.cpp (251835 => 251836)
--- trunk/Source/WebCore/platform/image-decoders/ico/ICOImageDecoder.cpp 2019-10-31 08:00:52 UTC (rev 251835)
+++ trunk/Source/WebCore/platform/image-decoders/ico/ICOImageDecoder.cpp 2019-10-31 09:01:02 UTC (rev 251836)
@@ -61,7 +61,7 @@
for (BMPReaders::iterator i(m_bmpReaders.begin()); i != m_bmpReaders.end(); ++i) {
if (*i)
- (*i)->setData(&data);
+ (*i)->setData(*m_data);
}
for (size_t i = 0; i < m_pngDecoders.size(); ++i)
setDataForPNGDecoderAtIndex(i);
@@ -196,7 +196,7 @@
// we must not resize it again later (see caution in frameCount()).
ASSERT(m_frameBufferCache.size() == m_dirEntries.size());
m_bmpReaders[index] = makeUnique<BMPImageReader>(this, dirEntry.m_imageOffset, 0, true);
- m_bmpReaders[index]->setData(m_data.get());
+ m_bmpReaders[index]->setData(*m_data);
m_bmpReaders[index]->setBuffer(&m_frameBufferCache[index]);
}
m_frameSize = dirEntry.m_size;
Modified: trunk/Source/WebCore/platform/image-decoders/ico/ICOImageDecoder.h (251835 => 251836)
--- trunk/Source/WebCore/platform/image-decoders/ico/ICOImageDecoder.h 2019-10-31 08:00:52 UTC (rev 251835)
+++ trunk/Source/WebCore/platform/image-decoders/ico/ICOImageDecoder.h 2019-10-31 09:01:02 UTC (rev 251836)
@@ -86,12 +86,12 @@
inline uint16_t readUint16(int offset) const
{
- return BMPImageReader::readUint16(m_data.get(), m_decodedOffset + offset);
+ return BMPImageReader::readUint16(*m_data, m_decodedOffset + offset);
}
inline uint32_t readUint32(int offset) const
{
- return BMPImageReader::readUint32(m_data.get(), m_decodedOffset + offset);
+ return BMPImageReader::readUint32(*m_data, m_decodedOffset + offset);
}
// If the desired PNGImageDecoder exists, gives it the appropriate data.
Modified: trunk/Source/WebCore/platform/image-decoders/jpeg/JPEGImageDecoder.cpp (251835 => 251836)
--- trunk/Source/WebCore/platform/image-decoders/jpeg/JPEGImageDecoder.cpp 2019-10-31 08:00:52 UTC (rev 251835)
+++ trunk/Source/WebCore/platform/image-decoders/jpeg/JPEGImageDecoder.cpp 2019-10-31 09:01:02 UTC (rev 251836)
@@ -266,7 +266,7 @@
m_bytesToSkip = std::max(numBytes - bytesToSkip, static_cast<long>(0));
}
- bool decode(const SharedBuffer& data, bool onlySize)
+ bool decode(const SharedBuffer::DataSegment& data, bool onlySize)
{
m_decodingSizeOnly = onlySize;
Modified: trunk/Source/WebCore/platform/image-decoders/jpeg2000/JPEG2000ImageDecoder.cpp (251835 => 251836)
--- trunk/Source/WebCore/platform/image-decoders/jpeg2000/JPEG2000ImageDecoder.cpp 2019-10-31 08:00:52 UTC (rev 251835)
+++ trunk/Source/WebCore/platform/image-decoders/jpeg2000/JPEG2000ImageDecoder.cpp 2019-10-31 09:01:02 UTC (rev 251836)
@@ -380,7 +380,7 @@
}
struct Reader {
- SharedBuffer& data;
+ SharedBuffer::DataSegment& data;
size_t offset;
} reader = { *m_data, 0 };
Modified: trunk/Source/WebCore/platform/image-decoders/png/PNGImageDecoder.cpp (251835 => 251836)
--- trunk/Source/WebCore/platform/image-decoders/png/PNGImageDecoder.cpp 2019-10-31 08:00:52 UTC (rev 251835)
+++ trunk/Source/WebCore/platform/image-decoders/png/PNGImageDecoder.cpp 2019-10-31 09:01:02 UTC (rev 251836)
@@ -147,7 +147,7 @@
m_readOffset = 0;
}
- bool decode(const SharedBuffer& data, bool sizeOnly, unsigned haltAtFrame)
+ bool decode(const SharedBuffer::DataSegment& data, bool sizeOnly, unsigned haltAtFrame)
{
m_decodingSizeOnly = sizeOnly;
PNGImageDecoder* decoder = static_cast<PNGImageDecoder*>(png_get_progressive_ptr(m_png));
@@ -157,24 +157,16 @@
return decoder->setFailed();
auto bytesToSkip = m_readOffset;
-
- // FIXME: Use getSomeData which is O(log(n)) instead of skipping bytes which is O(n).
- for (const auto& element : data) {
- if (bytesToSkip > element.segment->size()) {
- bytesToSkip -= element.segment->size();
- continue;
- }
- auto bytesToUse = element.segment->size() - bytesToSkip;
- m_readOffset += bytesToUse;
- m_currentBufferSize = m_readOffset;
- png_process_data(m_png, m_info, reinterpret_cast<png_bytep>(const_cast<char*>(element.segment->data() + bytesToSkip)), bytesToUse);
- bytesToSkip = 0;
- // We explicitly specify the superclass encodedDataStatus() because we
- // merely want to check if we've managed to set the size, not
- // (recursively) trigger additional decoding if we haven't.
- if (sizeOnly ? decoder->ScalableImageDecoder::encodedDataStatus() >= EncodedDataStatus::SizeAvailable : decoder->isCompleteAtIndex(haltAtFrame))
- return true;
- }
+ auto bytesToUse = data.size() - bytesToSkip;
+ m_readOffset += bytesToUse;
+ m_currentBufferSize = m_readOffset;
+ png_process_data(m_png, m_info, reinterpret_cast<png_bytep>(const_cast<char*>(data.data() + bytesToSkip)), bytesToUse);
+ // We explicitly specify the superclass encodedDataStatus() because we
+ // merely want to check if we've managed to set the size, not
+ // (recursively) trigger additional decoding if we haven't.
+ if (sizeOnly ? decoder->ScalableImageDecoder::encodedDataStatus() >= EncodedDataStatus::SizeAvailable : decoder->isCompleteAtIndex(haltAtFrame))
+ return true;
+
return false;
}
Modified: trunk/Source/WebCore/platform/image-decoders/webp/WEBPImageDecoder.cpp (251835 => 251836)
--- trunk/Source/WebCore/platform/image-decoders/webp/WEBPImageDecoder.cpp 2019-10-31 08:00:52 UTC (rev 251835)
+++ trunk/Source/WebCore/platform/image-decoders/webp/WEBPImageDecoder.cpp 2019-10-31 09:01:02 UTC (rev 251836)
@@ -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<SharedBuffer> protectedData(m_data);
+ RefPtr<SharedBuffer::DataSegment> protectedData(m_data);
WebPData inputData = { reinterpret_cast<const uint8_t*>(protectedData->data()), protectedData->size() };
WebPDemuxState demuxerState;
WebPDemuxer* demuxer = WebPDemuxPartial(&inputData, &demuxerState);