Diff
Modified: trunk/Source/WebCore/ChangeLog (230521 => 230522)
--- trunk/Source/WebCore/ChangeLog 2018-04-11 12:05:45 UTC (rev 230521)
+++ trunk/Source/WebCore/ChangeLog 2018-04-11 13:47:26 UTC (rev 230522)
@@ -1,3 +1,126 @@
+2018-04-11 Antti Koivisto <an...@apple.com>
+
+ ImageFrame type used by non-Cocoa image decoder should not be the same as that used by ImageSource
+ https://bugs.webkit.org/show_bug.cgi?id=184418
+
+ Reviewed by Said Abou-Hallawa.
+
+ ScalableImageDecoder uses ImageFrame class which is meant to be an implementation detail of ImageSource.
+ There are bunch of fields and methods in the type that are only used by one or the other client. For hackability
+ there should be an unrelated frame type for ScalableImageDecoder.
+
+ This patch adds ScalableImageDecoderFrame type used in ScalableImageDecoder only. It then cleans up
+ unneeded things from both ImageFrame and ScalableImageDecoderFrame.
+
+ * platform/ImageDecoders.cmake:
+ * platform/graphics/ImageFrame.cpp:
+ (WebCore::ImageFrame::operator=):
+ (WebCore::ImageFrame::clearImage):
+ (WebCore::ImageFrame::size const):
+ (WebCore::ImageFrame::initialize): Deleted.
+ * platform/graphics/ImageFrame.h:
+ (WebCore::ImageFrame::setDisposalMethod): Deleted.
+ (WebCore::ImageFrame::disposalMethod const): Deleted.
+ (WebCore::ImageFrame::backingStore const): Deleted.
+ (WebCore::ImageFrame::hasBackingStore const): Deleted.
+ * platform/image-decoders/ScalableImageDecoder.cpp:
+ (WebCore::ScalableImageDecoder::frameIsCompleteAtIndex const):
+ (WebCore::ScalableImageDecoder::frameDurationAtIndex const):
+ (WebCore::ScalableImageDecoder::createFrameImageAtIndex):
+ * platform/image-decoders/ScalableImageDecoder.h:
+ * platform/image-decoders/ScalableImageDecoderFrame.cpp: Copied from Source/WebCore/platform/graphics/ImageFrame.cpp.
+ (WebCore::ScalableImageDecoderFrame::ScalableImageDecoderFrame):
+ (WebCore::ScalableImageDecoderFrame::~ScalableImageDecoderFrame):
+ (WebCore::ScalableImageDecoderFrame::operator=):
+ (WebCore::ScalableImageDecoderFrame::setDecodingStatus):
+ (WebCore::ScalableImageDecoderFrame::decodingStatus const):
+ (WebCore::ScalableImageDecoderFrame::clearImage):
+ (WebCore::ScalableImageDecoderFrame::clear):
+ (WebCore::ScalableImageDecoderFrame::initialize):
+ (WebCore::ScalableImageDecoderFrame::size const):
+ (WebCore::ImageFrame::ImageFrame): Deleted.
+ (WebCore::ImageFrame::~ImageFrame): Deleted.
+ (WebCore::ImageFrame::defaultFrame): Deleted.
+ (WebCore::ImageFrame::operator=): Deleted.
+ (WebCore::ImageFrame::setDecodingStatus): Deleted.
+ (WebCore::ImageFrame::decodingStatus const): Deleted.
+ (WebCore::ImageFrame::clearImage): Deleted.
+ (WebCore::ImageFrame::clear): Deleted.
+ (WebCore::ImageFrame::initialize): Deleted.
+ (WebCore::ImageFrame::size const): Deleted.
+ (WebCore::ImageFrame::hasNativeImage const): Deleted.
+ (WebCore::ImageFrame::hasFullSizeNativeImage const): Deleted.
+ (WebCore::ImageFrame::hasDecodedNativeImageCompatibleWithOptions const): Deleted.
+ (WebCore::ImageFrame::singlePixelSolidColor const): Deleted.
+ * platform/image-decoders/ScalableImageDecoderFrame.h: Copied from Source/WebCore/platform/graphics/ImageFrame.h.
+ (WebCore::ScalableImageDecoderFrame::ScalableImageDecoderFrame):
+ (WebCore::ScalableImageDecoderFrame::disposalMethod const):
+ (WebCore::ScalableImageDecoderFrame::hasAlpha const):
+ (WebCore::ScalableImageDecoderFrame::hasBackingStore const):
+ (WebCore::ImageFrame::ImageFrame): Deleted.
+ (WebCore::ImageFrame::isInvalid const): Deleted.
+ (WebCore::ImageFrame::isPartial const): Deleted.
+ (WebCore::ImageFrame::isComplete const): Deleted.
+ (WebCore::ImageFrame::sizeRespectingOrientation const): Deleted.
+ (WebCore::ImageFrame::frameBytes const): Deleted.
+ (WebCore::ImageFrame::subsamplingLevel const): Deleted.
+ (WebCore::ImageFrame::setDisposalMethod): Deleted.
+ (WebCore::ImageFrame::disposalMethod const): Deleted.
+ (WebCore::ImageFrame::nativeImage const): Deleted.
+ (WebCore::ImageFrame::setOrientation): Deleted.
+ (WebCore::ImageFrame::orientation const): Deleted.
+ (WebCore::ImageFrame::setDuration): Deleted.
+ (WebCore::ImageFrame::duration const): Deleted.
+ (WebCore::ImageFrame::setHasAlpha): Deleted.
+ (WebCore::ImageFrame::hasAlpha const): Deleted.
+ (WebCore::ImageFrame::hasNativeImage): Deleted.
+ (WebCore::ImageFrame::hasFullSizeNativeImage): Deleted.
+ (WebCore::ImageFrame::hasMetadata const): Deleted.
+ (WebCore::ImageFrame::backingStore const): Deleted.
+ (WebCore::ImageFrame::hasBackingStore const): Deleted.
+ * platform/image-decoders/bmp/BMPImageDecoder.cpp:
+ (WebCore::BMPImageDecoder::frameBufferAtIndex):
+ * platform/image-decoders/bmp/BMPImageDecoder.h:
+ * platform/image-decoders/bmp/BMPImageReader.h:
+ (WebCore::BMPImageReader::setBuffer):
+ * platform/image-decoders/gif/GIFImageDecoder.cpp:
+ (WebCore::GIFImageDecoder::findFirstRequiredFrameToDecode):
+ (WebCore::GIFImageDecoder::frameBufferAtIndex):
+ (WebCore::GIFImageDecoder::clearFrameBufferCache):
+ (WebCore::GIFImageDecoder::haveDecodedRow):
+ (WebCore::GIFImageDecoder::frameComplete):
+ (WebCore::GIFImageDecoder::initFrameBuffer):
+ * platform/image-decoders/gif/GIFImageDecoder.h:
+ * platform/image-decoders/gif/GIFImageReader.cpp:
+ (GIFImageReader::parse):
+ * platform/image-decoders/gif/GIFImageReader.h:
+ (GIFFrameContext::GIFFrameContext):
+ * platform/image-decoders/ico/ICOImageDecoder.cpp:
+ (WebCore::ICOImageDecoder::frameBufferAtIndex):
+ * platform/image-decoders/ico/ICOImageDecoder.h:
+ * platform/image-decoders/jpeg/JPEGImageDecoder.cpp:
+ (WebCore::JPEGImageDecoder::frameBufferAtIndex):
+ (WebCore::setPixel):
+ (WebCore::JPEGImageDecoder::outputScanlines):
+ (WebCore::JPEGImageDecoder::jpegComplete):
+ * platform/image-decoders/jpeg/JPEGImageDecoder.h:
+ * platform/image-decoders/png/PNGImageDecoder.cpp:
+ (WebCore::PNGImageDecoder::frameBufferAtIndex):
+ (WebCore::PNGImageDecoder::rowAvailable):
+ (WebCore::PNGImageDecoder::readChunks):
+ (WebCore::PNGImageDecoder::clearFrameBufferCache):
+ (WebCore::PNGImageDecoder::initFrameBuffer):
+ (WebCore::PNGImageDecoder::frameComplete):
+ * platform/image-decoders/png/PNGImageDecoder.h:
+ * platform/image-decoders/webp/WEBPImageDecoder.cpp:
+ (WebCore::WEBPImageDecoder::frameBufferAtIndex):
+ (WebCore::WEBPImageDecoder::findFirstRequiredFrameToDecode):
+ (WebCore::WEBPImageDecoder::decodeFrame):
+ (WebCore::WEBPImageDecoder::initFrameBuffer):
+ (WebCore::WEBPImageDecoder::applyPostProcessing):
+ (WebCore::WEBPImageDecoder::clearFrameBufferCache):
+ * platform/image-decoders/webp/WEBPImageDecoder.h:
+
2018-04-11 Antoine Quint <grao...@apple.com>
[Web Animations] Turn Web Animations on by default
Modified: trunk/Source/WebCore/platform/ImageDecoders.cmake (230521 => 230522)
--- trunk/Source/WebCore/platform/ImageDecoders.cmake 2018-04-11 12:05:45 UTC (rev 230521)
+++ trunk/Source/WebCore/platform/ImageDecoders.cmake 2018-04-11 13:47:26 UTC (rev 230522)
@@ -10,6 +10,7 @@
list(APPEND WebCore_SOURCES
platform/image-decoders/ScalableImageDecoder.cpp
+ platform/image-decoders/ScalableImageDecoderFrame.cpp
platform/image-decoders/bmp/BMPImageDecoder.cpp
platform/image-decoders/bmp/BMPImageReader.cpp
Modified: trunk/Source/WebCore/platform/graphics/ImageFrame.cpp (230521 => 230522)
--- trunk/Source/WebCore/platform/graphics/ImageFrame.cpp 2018-04-11 12:05:45 UTC (rev 230521)
+++ trunk/Source/WebCore/platform/graphics/ImageFrame.cpp 2018-04-11 13:47:26 UTC (rev 230522)
@@ -53,14 +53,6 @@
m_decodingStatus = other.m_decodingStatus;
m_size = other.m_size;
-#if !USE(CG)
- if (other.backingStore())
- initialize(*other.backingStore());
- else
- m_backingStore = nullptr;
- m_disposalMethod = other.m_disposalMethod;
-#endif
-
m_nativeImage = other.m_nativeImage;
m_subsamplingLevel = other.m_subsamplingLevel;
m_decodingOptions = other.m_decodingOptions;
@@ -85,11 +77,6 @@
unsigned ImageFrame::clearImage()
{
-#if !USE(CG)
- if (hasBackingStore())
- m_backingStore = nullptr;
-#endif
-
if (!hasNativeImage())
return 0;
@@ -109,32 +96,8 @@
return frameBytes;
}
-#if !USE(CG)
-bool ImageFrame::initialize(const ImageBackingStore& backingStore)
-{
- if (&backingStore == this->backingStore())
- return true;
-
- m_backingStore = ImageBackingStore::create(backingStore);
- return m_backingStore != nullptr;
-}
-
-bool ImageFrame::initialize(const IntSize& size, bool premultiplyAlpha)
-{
- if (size.isEmpty())
- return false;
-
- m_backingStore = ImageBackingStore::create(size, premultiplyAlpha);
- return m_backingStore != nullptr;
-}
-#endif
-
IntSize ImageFrame::size() const
{
-#if !USE(CG)
- if (hasBackingStore())
- return backingStore()->size();
-#endif
return m_size;
}
Modified: trunk/Source/WebCore/platform/graphics/ImageFrame.h (230521 => 230522)
--- trunk/Source/WebCore/platform/graphics/ImageFrame.h 2018-04-11 12:05:45 UTC (rev 230521)
+++ trunk/Source/WebCore/platform/graphics/ImageFrame.h 2018-04-11 13:47:26 UTC (rev 230522)
@@ -53,11 +53,6 @@
unsigned clearImage();
unsigned clear();
-#if !USE(CG)
- bool initialize(const ImageBackingStore&);
- bool initialize(const IntSize&, bool premultiplyAlpha);
-#endif
-
void setDecodingStatus(DecodingStatus);
DecodingStatus decodingStatus() const;
@@ -70,12 +65,6 @@
unsigned frameBytes() const { return hasNativeImage() ? (size().area() * sizeof(uint32_t)).unsafeGet() : 0; }
SubsamplingLevel subsamplingLevel() const { return m_subsamplingLevel; }
-#if !USE(CG)
- enum class DisposalMethod { Unspecified, DoNotDispose, RestoreToBackground, RestoreToPrevious };
- void setDisposalMethod(DisposalMethod method) { m_disposalMethod = method; }
- DisposalMethod disposalMethod() const { return m_disposalMethod; }
-#endif
-
NativeImagePtr nativeImage() const { return m_nativeImage; }
void setOrientation(ImageOrientation orientation) { m_orientation = orientation; };
@@ -92,11 +81,6 @@
bool hasDecodedNativeImageCompatibleWithOptions(const std::optional<SubsamplingLevel>&, const DecodingOptions&) const;
bool hasMetadata() const { return !size().isEmpty(); }
-#if !USE(CG)
- ImageBackingStore* backingStore() const { return m_backingStore ? m_backingStore.get() : nullptr; }
- bool hasBackingStore() const { return backingStore(); }
-#endif
-
Color singlePixelSolidColor() const;
private:
@@ -103,11 +87,6 @@
DecodingStatus m_decodingStatus { DecodingStatus::Invalid };
IntSize m_size;
-#if !USE(CG)
- std::unique_ptr<ImageBackingStore> m_backingStore;
- DisposalMethod m_disposalMethod { DisposalMethod::Unspecified };
-#endif
-
NativeImagePtr m_nativeImage;
SubsamplingLevel m_subsamplingLevel { SubsamplingLevel::Default };
DecodingOptions m_decodingOptions;
Modified: trunk/Source/WebCore/platform/image-decoders/ScalableImageDecoder.cpp (230521 => 230522)
--- trunk/Source/WebCore/platform/image-decoders/ScalableImageDecoder.cpp 2018-04-11 12:05:45 UTC (rev 230521)
+++ trunk/Source/WebCore/platform/image-decoders/ScalableImageDecoder.cpp 2018-04-11 13:47:26 UTC (rev 230522)
@@ -176,7 +176,7 @@
// FIXME(176089): asking whether enough data has been appended for a decode
// operation to succeed should not require decoding the entire frame.
// This function should be implementable in a way that allows const.
- ImageFrame* buffer = const_cast<ScalableImageDecoder*>(this)->frameBufferAtIndex(index);
+ auto* buffer = const_cast<ScalableImageDecoder*>(this)->frameBufferAtIndex(index);
return buffer && buffer->isComplete();
}
@@ -205,7 +205,7 @@
// FIXME(176089): asking for the duration of a sub-image should not require decoding
// the entire frame. This function should be implementable in a way that
// allows const.
- ImageFrame* buffer = const_cast<ScalableImageDecoder*>(this)->frameBufferAtIndex(index);
+ auto* buffer = const_cast<ScalableImageDecoder*>(this)->frameBufferAtIndex(index);
if (!buffer || buffer->isInvalid())
return 0_s;
@@ -225,7 +225,7 @@
if (size().isEmpty())
return nullptr;
- ImageFrame* buffer = frameBufferAtIndex(index);
+ auto* buffer = frameBufferAtIndex(index);
if (!buffer || buffer->isInvalid() || !buffer->hasBackingStore())
return nullptr;
Modified: trunk/Source/WebCore/platform/image-decoders/ScalableImageDecoder.h (230521 => 230522)
--- trunk/Source/WebCore/platform/image-decoders/ScalableImageDecoder.h 2018-04-11 12:05:45 UTC (rev 230521)
+++ trunk/Source/WebCore/platform/image-decoders/ScalableImageDecoder.h 2018-04-11 13:47:26 UTC (rev 230522)
@@ -29,8 +29,8 @@
#pragma once
#include "ImageDecoder.h"
-#include "ImageFrame.h"
#include "IntRect.h"
+#include "ScalableImageDecoderFrame.h"
#include "SharedBuffer.h"
#include <wtf/Assertions.h>
#include <wtf/Lock.h>
@@ -41,7 +41,7 @@
namespace WebCore {
// ScalableImageDecoder is a base for all format-specific decoders
-// (e.g. JPEGImageDecoder). This base manages the ImageFrame cache.
+// (e.g. JPEGImageDecoder). This base manages the ScalableImageDecoderFrame cache.
class ScalableImageDecoder : public ImageDecoder {
WTF_MAKE_NONCOPYABLE(ScalableImageDecoder); WTF_MAKE_FAST_ALLOCATED;
@@ -134,7 +134,7 @@
// Decodes as much of the requested frame as possible, and returns an
// ScalableImageDecoder-owned pointer.
- virtual ImageFrame* frameBufferAtIndex(size_t) = 0;
+ virtual ScalableImageDecoderFrame* frameBufferAtIndex(size_t) = 0;
bool frameIsCompleteAtIndex(size_t) const override;
@@ -205,7 +205,7 @@
int scaledY(int origY, int searchStart = 0);
RefPtr<SharedBuffer> m_data; // The encoded data.
- Vector<ImageFrame, 1> m_frameBufferCache;
+ Vector<ScalableImageDecoderFrame, 1> m_frameBufferCache;
mutable Lock m_mutex;
bool m_scaled { false };
Vector<int> m_scaledColumns;
Copied: trunk/Source/WebCore/platform/image-decoders/ScalableImageDecoderFrame.cpp (from rev 230521, trunk/Source/WebCore/platform/graphics/ImageFrame.cpp) (0 => 230522)
--- trunk/Source/WebCore/platform/image-decoders/ScalableImageDecoderFrame.cpp (rev 0)
+++ trunk/Source/WebCore/platform/image-decoders/ScalableImageDecoderFrame.cpp 2018-04-11 13:47:26 UTC (rev 230522)
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2016 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "ScalableImageDecoderFrame.h"
+
+#include <wtf/NeverDestroyed.h>
+
+namespace WebCore {
+
+ScalableImageDecoderFrame::ScalableImageDecoderFrame()
+{
+}
+
+ScalableImageDecoderFrame::~ScalableImageDecoderFrame()
+{
+}
+
+ScalableImageDecoderFrame& ScalableImageDecoderFrame::operator=(const ScalableImageDecoderFrame& other)
+{
+ if (this == &other)
+ return *this;
+
+ m_decodingStatus = other.m_decodingStatus;
+
+ if (other.backingStore())
+ initialize(*other.backingStore());
+ else
+ m_backingStore = nullptr;
+ m_disposalMethod = other.m_disposalMethod;
+
+ m_orientation = other.m_orientation;
+ m_duration = other.m_duration;
+ m_hasAlpha = other.m_hasAlpha;
+ return *this;
+}
+
+void ScalableImageDecoderFrame::setDecodingStatus(DecodingStatus decodingStatus)
+{
+ ASSERT(decodingStatus != DecodingStatus::Decoding);
+ m_decodingStatus = decodingStatus;
+}
+
+DecodingStatus ScalableImageDecoderFrame::decodingStatus() const
+{
+ ASSERT(m_decodingStatus != DecodingStatus::Decoding);
+ return m_decodingStatus;
+}
+
+void ScalableImageDecoderFrame::clear()
+{
+ *this = ScalableImageDecoderFrame();
+}
+
+bool ScalableImageDecoderFrame::initialize(const ImageBackingStore& backingStore)
+{
+ if (&backingStore == this->backingStore())
+ return true;
+
+ m_backingStore = ImageBackingStore::create(backingStore);
+ return m_backingStore != nullptr;
+}
+
+bool ScalableImageDecoderFrame::initialize(const IntSize& size, bool premultiplyAlpha)
+{
+ if (size.isEmpty())
+ return false;
+
+ m_backingStore = ImageBackingStore::create(size, premultiplyAlpha);
+ return m_backingStore != nullptr;
+}
+
+IntSize ScalableImageDecoderFrame::size() const
+{
+ if (hasBackingStore())
+ return backingStore()->size();
+ return { };
+}
+
+}
Copied: trunk/Source/WebCore/platform/image-decoders/ScalableImageDecoderFrame.h (from rev 230521, trunk/Source/WebCore/platform/graphics/ImageFrame.h) (0 => 230522)
--- trunk/Source/WebCore/platform/image-decoders/ScalableImageDecoderFrame.h (rev 0)
+++ trunk/Source/WebCore/platform/image-decoders/ScalableImageDecoderFrame.h 2018-04-11 13:47:26 UTC (rev 230522)
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2016 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#include "Color.h"
+#include "DecodingOptions.h"
+#include "ImageBackingStore.h"
+#include "ImageOrientation.h"
+#include "ImageTypes.h"
+#include "IntSize.h"
+#include "NativeImage.h"
+#include <wtf/Seconds.h>
+
+namespace WebCore {
+
+class ScalableImageDecoderFrame {
+public:
+ ScalableImageDecoderFrame();
+ ScalableImageDecoderFrame(const ScalableImageDecoderFrame& other) { operator=(other); }
+
+ ~ScalableImageDecoderFrame();
+
+ ScalableImageDecoderFrame& operator=(const ScalableImageDecoderFrame& other);
+
+ void clear();
+
+ bool initialize(const ImageBackingStore&);
+ bool initialize(const IntSize&, bool premultiplyAlpha);
+
+ void setDecodingStatus(DecodingStatus);
+ DecodingStatus decodingStatus() const;
+
+ bool isInvalid() const { return m_decodingStatus == DecodingStatus::Invalid; }
+ bool isPartial() const { return m_decodingStatus == DecodingStatus::Partial; }
+ bool isComplete() const { return m_decodingStatus == DecodingStatus::Complete; }
+
+ IntSize size() const;
+
+ enum class DisposalMethod { Unspecified, DoNotDispose, RestoreToBackground, RestoreToPrevious };
+ void setDisposalMethod(DisposalMethod method) { m_disposalMethod = method; }
+ DisposalMethod disposalMethod() const { return m_disposalMethod; }
+
+ void setOrientation(ImageOrientation orientation) { m_orientation = orientation; };
+ ImageOrientation orientation() const { return m_orientation; }
+
+ void setDuration(const Seconds& duration) { m_duration = duration; }
+ Seconds duration() const { return m_duration; }
+
+ void setHasAlpha(bool hasAlpha) { m_hasAlpha = hasAlpha; }
+ bool hasAlpha() const { return !hasMetadata() || m_hasAlpha; }
+ bool hasMetadata() const { return !size().isEmpty(); }
+
+ ImageBackingStore* backingStore() const { return m_backingStore ? m_backingStore.get() : nullptr; }
+ bool hasBackingStore() const { return backingStore(); }
+
+private:
+ DecodingStatus m_decodingStatus { DecodingStatus::Invalid };
+
+ std::unique_ptr<ImageBackingStore> m_backingStore;
+ DisposalMethod m_disposalMethod { DisposalMethod::Unspecified };
+
+ ImageOrientation m_orientation { DefaultImageOrientation };
+ Seconds m_duration;
+ bool m_hasAlpha { true };
+};
+
+}
Modified: trunk/Source/WebCore/platform/image-decoders/bmp/BMPImageDecoder.cpp (230521 => 230522)
--- trunk/Source/WebCore/platform/image-decoders/bmp/BMPImageDecoder.cpp 2018-04-11 12:05:45 UTC (rev 230521)
+++ trunk/Source/WebCore/platform/image-decoders/bmp/BMPImageDecoder.cpp 2018-04-11 13:47:26 UTC (rev 230522)
@@ -56,7 +56,7 @@
m_reader->setData(&data);
}
-ImageFrame* BMPImageDecoder::frameBufferAtIndex(size_t index)
+ScalableImageDecoderFrame* BMPImageDecoder::frameBufferAtIndex(size_t index)
{
if (index)
return 0;
@@ -64,7 +64,7 @@
if (m_frameBufferCache.isEmpty())
m_frameBufferCache.grow(1);
- ImageFrame* buffer = &m_frameBufferCache.first();
+ auto* buffer = &m_frameBufferCache.first();
if (!buffer->isComplete())
decode(false, isAllDataReceived());
return buffer;
Modified: trunk/Source/WebCore/platform/image-decoders/bmp/BMPImageDecoder.h (230521 => 230522)
--- trunk/Source/WebCore/platform/image-decoders/bmp/BMPImageDecoder.h 2018-04-11 12:05:45 UTC (rev 230521)
+++ trunk/Source/WebCore/platform/image-decoders/bmp/BMPImageDecoder.h 2018-04-11 13:47:26 UTC (rev 230522)
@@ -45,7 +45,7 @@
// ScalableImageDecoder
String filenameExtension() const final { return ASCIILiteral("bmp"); }
void setData(SharedBuffer&, bool allDataReceived) final;
- ImageFrame* frameBufferAtIndex(size_t index) final;
+ ScalableImageDecoderFrame* frameBufferAtIndex(size_t index) final;
// CAUTION: setFailed() deletes |m_reader|. Be careful to avoid
// accessing deleted memory, especially when calling this from inside
// BMPImageReader!
Modified: trunk/Source/WebCore/platform/image-decoders/bmp/BMPImageReader.h (230521 => 230522)
--- trunk/Source/WebCore/platform/image-decoders/bmp/BMPImageReader.h 2018-04-11 12:05:45 UTC (rev 230521)
+++ trunk/Source/WebCore/platform/image-decoders/bmp/BMPImageReader.h 2018-04-11 13:47:26 UTC (rev 230522)
@@ -64,11 +64,11 @@
// |parent| is the decoder that owns us.
// |startOffset| points to the start of the BMP within the file.
- // |buffer| points at an empty ImageFrame that we'll initialize and
+ // |buffer| points at an empty ScalableImageDecoderFrame that we'll initialize and
// fill with decoded data.
BMPImageReader(ScalableImageDecoder* parent, size_t decodedAndHeaderOffset, size_t imgDataOffset, bool usesAndMask);
- void setBuffer(ImageFrame* buffer) { m_buffer = buffer; }
+ void setBuffer(ScalableImageDecoderFrame* buffer) { m_buffer = buffer; }
void setData(SharedBuffer* data) { m_data = data; }
// Does the actual decoding. If |onlySize| is true, decoding only
@@ -269,7 +269,7 @@
ScalableImageDecoder* m_parent;
// The destination for the pixel data.
- ImageFrame* m_buffer;
+ ScalableImageDecoderFrame* m_buffer;
// The file to decode.
RefPtr<SharedBuffer> m_data;
Modified: trunk/Source/WebCore/platform/image-decoders/gif/GIFImageDecoder.cpp (230521 => 230522)
--- trunk/Source/WebCore/platform/image-decoders/gif/GIFImageDecoder.cpp 2018-04-11 12:05:45 UTC (rev 230521)
+++ trunk/Source/WebCore/platform/image-decoders/gif/GIFImageDecoder.cpp 2018-04-11 13:47:26 UTC (rev 230522)
@@ -106,10 +106,10 @@
return 0;
for (size_t i = frameIndex; i > 0; --i) {
- ImageFrame& frame = m_frameBufferCache[i - 1];
+ auto& frame = m_frameBufferCache[i - 1];
// Frames with disposal method RestoreToPrevious are useless, skip them.
- if (frame.disposalMethod() == ImageFrame::DisposalMethod::RestoreToPrevious)
+ if (frame.disposalMethod() == ScalableImageDecoderFrame::DisposalMethod::RestoreToPrevious)
continue;
// At this point the disposal method can be Unspecified, DoNotDispose or RestoreToBackground.
@@ -119,7 +119,7 @@
// If the disposal method of this frame is RestoreToBackground and it fills the whole area,
// the next frame's backing store is initialized to transparent, so we start decoding with it.
- if (frame.disposalMethod() == ImageFrame::DisposalMethod::RestoreToBackground) {
+ if (frame.disposalMethod() == ScalableImageDecoderFrame::DisposalMethod::RestoreToBackground) {
// We cannot use frame.backingStore()->frameRect() here, because it has been cleared
// when the frame was removed from the cache. We need to get the values from the
// reader context.
@@ -137,12 +137,12 @@
return 0;
}
-ImageFrame* GIFImageDecoder::frameBufferAtIndex(size_t index)
+ScalableImageDecoderFrame* GIFImageDecoder::frameBufferAtIndex(size_t index)
{
if (index >= frameCount())
return 0;
- ImageFrame& frame = m_frameBufferCache[index];
+ auto& frame = m_frameBufferCache[index];
if (!frame.isComplete()) {
for (auto i = findFirstRequiredFrameToDecode(index); i <= index; i++)
decode(i + 1, GIFFullQuery, isAllDataReceived());
@@ -173,7 +173,7 @@
// always use ImageSource::clear(true, ...) to completely free the memory in
// this case.
clearBeforeFrame = std::min(clearBeforeFrame, m_frameBufferCache.size() - 1);
- const Vector<ImageFrame>::iterator end(m_frameBufferCache.begin() + clearBeforeFrame);
+ const Vector<ScalableImageDecoderFrame>::iterator end(m_frameBufferCache.begin() + clearBeforeFrame);
// We need to preserve frames such that:
// * We don't clear |end|
@@ -193,14 +193,14 @@
// * If the frame is partial, we're decoding it, so don't clear it; if it
// has a disposal method other than DisposalMethod::RestoreToPrevious, stop
// scanning, as we'll only need this frame when decoding the next one.
- Vector<ImageFrame>::iterator i(end);
- for (; (i != m_frameBufferCache.begin()) && (i->isInvalid() || (i->disposalMethod() == ImageFrame::DisposalMethod::RestoreToPrevious)); --i) {
+ Vector<ScalableImageDecoderFrame>::iterator i(end);
+ for (; (i != m_frameBufferCache.begin()) && (i->isInvalid() || (i->disposalMethod() == ScalableImageDecoderFrame::DisposalMethod::RestoreToPrevious)); --i) {
if (i->isComplete() && (i != end))
i->clear();
}
// Now |i| holds the last frame we need to preserve; clear prior frames.
- for (Vector<ImageFrame>::iterator j(m_frameBufferCache.begin()); j != i; ++j) {
+ for (Vector<ScalableImageDecoderFrame>::iterator j(m_frameBufferCache.begin()); j != i; ++j) {
ASSERT(!j->isPartial());
if (!j->isInvalid())
j->clear();
@@ -237,7 +237,7 @@
return true;
// Initialize the frame if necessary.
- ImageFrame& buffer = m_frameBufferCache[frameIndex];
+ auto& buffer = m_frameBufferCache[frameIndex];
if ((buffer.isInvalid() && !initFrameBuffer(frameIndex)) || !buffer.hasBackingStore())
return false;
@@ -270,11 +270,11 @@
return true;
}
-bool GIFImageDecoder::frameComplete(unsigned frameIndex, unsigned frameDuration, ImageFrame::DisposalMethod disposalMethod)
+bool GIFImageDecoder::frameComplete(unsigned frameIndex, unsigned frameDuration, ScalableImageDecoderFrame::DisposalMethod disposalMethod)
{
// Initialize the frame if necessary. Some GIFs insert do-nothing frames,
// in which case we never reach haveDecodedRow() before getting here.
- ImageFrame& buffer = m_frameBufferCache[frameIndex];
+ auto& buffer = m_frameBufferCache[frameIndex];
if (buffer.isInvalid() && !initFrameBuffer(frameIndex))
return false; // initFrameBuffer() has already called setFailed().
@@ -298,8 +298,8 @@
// First skip over prior DisposalMethod::RestoreToPrevious frames (since they
// don't affect the start state of this frame) the same way we do in
// initFrameBuffer().
- const ImageFrame* prevBuffer = &m_frameBufferCache[--frameIndex];
- while (frameIndex && (prevBuffer->disposalMethod() == ImageFrame::DisposalMethod::RestoreToPrevious))
+ const auto* prevBuffer = &m_frameBufferCache[--frameIndex];
+ while (frameIndex && (prevBuffer->disposalMethod() == ScalableImageDecoderFrame::DisposalMethod::RestoreToPrevious))
prevBuffer = &m_frameBufferCache[--frameIndex];
// Now, if we're at a DisposalMethod::Unspecified or DisposalMethod::DoNotDispose frame, then
@@ -311,7 +311,7 @@
// it had no alpha, and its rect is contained in the current frame's
// rect, we know the current frame has no alpha.
IntRect prevRect = prevBuffer->backingStore()->frameRect();
- if ((prevBuffer->disposalMethod() == ImageFrame::DisposalMethod::RestoreToBackground) && !prevBuffer->hasAlpha() && rect.contains(prevRect))
+ if ((prevBuffer->disposalMethod() == ScalableImageDecoderFrame::DisposalMethod::RestoreToBackground) && !prevBuffer->hasAlpha() && rect.contains(prevRect))
buffer.setHasAlpha(false);
}
}
@@ -370,7 +370,7 @@
// Initialize the frame rect in our buffer.
const GIFFrameContext* frameContext = m_reader->frameContext();
IntRect frameRect(frameContext->xOffset, frameContext->yOffset, frameContext->width, frameContext->height);
- ImageFrame* const buffer = &m_frameBufferCache[frameIndex];
+ auto* const buffer = &m_frameBufferCache[frameIndex];
if (!frameIndex) {
// This is the first frame, so we're not relying on any previous data.
@@ -385,9 +385,9 @@
// the starting state of the previous frame, so skip over them. (If the
// first frame specifies this method, it will get treated like
// DisposalMethod::RestoreToBackground below and reset to a completely empty image.)
- const ImageFrame* prevBuffer = &m_frameBufferCache[--frameIndex];
- ImageFrame::DisposalMethod prevMethod = prevBuffer->disposalMethod();
- while (frameIndex && (prevMethod == ImageFrame::DisposalMethod::RestoreToPrevious)) {
+ const auto* prevBuffer = &m_frameBufferCache[--frameIndex];
+ auto prevMethod = prevBuffer->disposalMethod();
+ while (frameIndex && (prevMethod == ScalableImageDecoderFrame::DisposalMethod::RestoreToPrevious)) {
prevBuffer = &m_frameBufferCache[--frameIndex];
prevMethod = prevBuffer->disposalMethod();
}
@@ -394,7 +394,7 @@
ASSERT(prevBuffer->isComplete());
- if ((prevMethod == ImageFrame::DisposalMethod::Unspecified) || (prevMethod == ImageFrame::DisposalMethod::DoNotDispose)) {
+ if ((prevMethod == ScalableImageDecoderFrame::DisposalMethod::Unspecified) || (prevMethod == ScalableImageDecoderFrame::DisposalMethod::DoNotDispose)) {
// Preserve the last frame as the starting state for this frame.
if (!prevBuffer->backingStore() || !buffer->initialize(*prevBuffer->backingStore()))
return setFailed();
Modified: trunk/Source/WebCore/platform/image-decoders/gif/GIFImageDecoder.h (230521 => 230522)
--- trunk/Source/WebCore/platform/image-decoders/gif/GIFImageDecoder.h 2018-04-11 12:05:45 UTC (rev 230521)
+++ trunk/Source/WebCore/platform/image-decoders/gif/GIFImageDecoder.h 2018-04-11 13:47:26 UTC (rev 230522)
@@ -50,7 +50,7 @@
bool setSize(const IntSize&) final;
size_t frameCount() const final;
RepetitionCount repetitionCount() const final;
- ImageFrame* frameBufferAtIndex(size_t index) final;
+ ScalableImageDecoderFrame* frameBufferAtIndex(size_t index) final;
// CAUTION: setFailed() deletes |m_reader|. Be careful to avoid
// accessing deleted memory, especially when calling this from inside
// GIFImageReader!
@@ -59,7 +59,7 @@
// Callbacks from the GIF reader.
bool haveDecodedRow(unsigned frameIndex, const Vector<unsigned char>& rowBuffer, size_t width, size_t rowNumber, unsigned repeatCount, bool writeTransparentPixels);
- bool frameComplete(unsigned frameIndex, unsigned frameDuration, ImageFrame::DisposalMethod);
+ bool frameComplete(unsigned frameIndex, unsigned frameDuration, ScalableImageDecoderFrame::DisposalMethod);
void gifComplete();
private:
Modified: trunk/Source/WebCore/platform/image-decoders/gif/GIFImageReader.cpp (230521 => 230522)
--- trunk/Source/WebCore/platform/image-decoders/gif/GIFImageReader.cpp 2018-04-11 12:05:45 UTC (rev 230521)
+++ trunk/Source/WebCore/platform/image-decoders/gif/GIFImageReader.cpp 2018-04-11 13:47:26 UTC (rev 230522)
@@ -576,11 +576,11 @@
// NOTE: This relies on the values in the DisposalMethod enum
// matching those in the GIF spec!
int disposalMethod = ((*currentComponent) >> 2) & 0x7;
- currentFrame->disposalMethod = static_cast<WebCore::ImageFrame::DisposalMethod>(disposalMethod);
+ currentFrame->disposalMethod = static_cast<WebCore::ScalableImageDecoderFrame::DisposalMethod>(disposalMethod);
// Some specs say that disposal method 3 is "overwrite previous", others that setting
// the third bit of the field (i.e. method 4) is. We map both to the same value.
if (disposalMethod == 4)
- currentFrame->disposalMethod = WebCore::ImageFrame::DisposalMethod::RestoreToPrevious;
+ currentFrame->disposalMethod = WebCore::ScalableImageDecoderFrame::DisposalMethod::RestoreToPrevious;
currentFrame->delayTime = GETINT16(currentComponent + 1) * 10;
GETN(1, GIFConsumeBlock);
break;
Modified: trunk/Source/WebCore/platform/image-decoders/gif/GIFImageReader.h (230521 => 230522)
--- trunk/Source/WebCore/platform/image-decoders/gif/GIFImageReader.h 2018-04-11 12:05:45 UTC (rev 230521)
+++ trunk/Source/WebCore/platform/image-decoders/gif/GIFImageReader.h 2018-04-11 13:47:26 UTC (rev 230522)
@@ -154,7 +154,7 @@
unsigned width;
unsigned height;
int tpixel; // Index of transparent pixel.
- WebCore::ImageFrame::DisposalMethod disposalMethod; // Restore to background, leave in place, etc.
+ WebCore::ScalableImageDecoderFrame::DisposalMethod disposalMethod; // Restore to background, leave in place, etc.
size_t localColormapPosition; // Per-image colormap.
int localColormapSize; // Size of local colormap array.
int datasize;
@@ -173,7 +173,7 @@
, width(0)
, height(0)
, tpixel(0)
- , disposalMethod(WebCore::ImageFrame::DisposalMethod::Unspecified)
+ , disposalMethod(WebCore::ScalableImageDecoderFrame::DisposalMethod::Unspecified)
, localColormapPosition(0)
, localColormapSize(0)
, datasize(0)
Modified: trunk/Source/WebCore/platform/image-decoders/ico/ICOImageDecoder.cpp (230521 => 230522)
--- trunk/Source/WebCore/platform/image-decoders/ico/ICOImageDecoder.cpp 2018-04-11 12:05:45 UTC (rev 230521)
+++ trunk/Source/WebCore/platform/image-decoders/ico/ICOImageDecoder.cpp 2018-04-11 13:47:26 UTC (rev 230522)
@@ -90,13 +90,13 @@
return m_frameBufferCache.size();
}
-ImageFrame* ICOImageDecoder::frameBufferAtIndex(size_t index)
+ScalableImageDecoderFrame* ICOImageDecoder::frameBufferAtIndex(size_t index)
{
// Ensure |index| is valid.
if (index >= frameCount())
return 0;
- ImageFrame* buffer = &m_frameBufferCache[index];
+ auto* buffer = &m_frameBufferCache[index];
if (!buffer->isComplete())
decode(index, false, isAllDataReceived());
return buffer;
Modified: trunk/Source/WebCore/platform/image-decoders/ico/ICOImageDecoder.h (230521 => 230522)
--- trunk/Source/WebCore/platform/image-decoders/ico/ICOImageDecoder.h 2018-04-11 12:05:45 UTC (rev 230521)
+++ trunk/Source/WebCore/platform/image-decoders/ico/ICOImageDecoder.h 2018-04-11 13:47:26 UTC (rev 230522)
@@ -51,7 +51,7 @@
IntSize frameSizeAtIndex(size_t, SubsamplingLevel) const final;
bool setSize(const IntSize&) final;
size_t frameCount() const final;
- ImageFrame* frameBufferAtIndex(size_t) final;
+ ScalableImageDecoderFrame* frameBufferAtIndex(size_t) final;
// CAUTION: setFailed() deletes all readers and decoders. Be careful to
// avoid accessing deleted memory, especially when calling this from
// inside BMPImageReader!
Modified: trunk/Source/WebCore/platform/image-decoders/jpeg/JPEGImageDecoder.cpp (230521 => 230522)
--- trunk/Source/WebCore/platform/image-decoders/jpeg/JPEGImageDecoder.cpp 2018-04-11 12:05:45 UTC (rev 230521)
+++ trunk/Source/WebCore/platform/image-decoders/jpeg/JPEGImageDecoder.cpp 2018-04-11 13:47:26 UTC (rev 230522)
@@ -511,7 +511,7 @@
return true;
}
-ImageFrame* JPEGImageDecoder::frameBufferAtIndex(size_t index)
+ScalableImageDecoderFrame* JPEGImageDecoder::frameBufferAtIndex(size_t index)
{
if (index)
return 0;
@@ -519,7 +519,7 @@
if (m_frameBufferCache.isEmpty())
m_frameBufferCache.grow(1);
- ImageFrame& frame = m_frameBufferCache[0];
+ auto& frame = m_frameBufferCache[0];
if (!frame.isComplete())
decode(false, isAllDataReceived());
return &frame;
@@ -532,7 +532,7 @@
}
template <J_COLOR_SPACE colorSpace>
-void setPixel(ImageFrame& buffer, uint32_t* currentAddress, JSAMPARRAY samples, int column)
+void setPixel(ScalableImageDecoderFrame& buffer, uint32_t* currentAddress, JSAMPARRAY samples, int column)
{
JSAMPLE* jsample = *samples + column * (colorSpace == JCS_RGB ? 3 : 4);
@@ -557,7 +557,7 @@
}
template <J_COLOR_SPACE colorSpace, bool isScaled>
-bool JPEGImageDecoder::outputScanlines(ImageFrame& buffer)
+bool JPEGImageDecoder::outputScanlines(ScalableImageDecoderFrame& buffer)
{
JSAMPARRAY samples = m_reader->samples();
jpeg_decompress_struct* info = m_reader->info();
@@ -585,7 +585,7 @@
}
template <J_COLOR_SPACE colorSpace>
-bool JPEGImageDecoder::outputScanlines(ImageFrame& buffer)
+bool JPEGImageDecoder::outputScanlines(ScalableImageDecoderFrame& buffer)
{
return m_scaled ? outputScanlines<colorSpace, true>(buffer) : outputScanlines<colorSpace, false>(buffer);
}
@@ -596,7 +596,7 @@
return false;
// Initialize the framebuffer if needed.
- ImageFrame& buffer = m_frameBufferCache[0];
+ auto& buffer = m_frameBufferCache[0];
if (buffer.isInvalid()) {
if (!buffer.initialize(scaledSize(), m_premultiplyAlpha))
return setFailed();
@@ -642,7 +642,7 @@
// Hand back an appropriately sized buffer, even if the image ended up being
// empty.
- ImageFrame& buffer = m_frameBufferCache[0];
+ auto& buffer = m_frameBufferCache[0];
buffer.setHasAlpha(false);
buffer.setDecodingStatus(DecodingStatus::Complete);
}
Modified: trunk/Source/WebCore/platform/image-decoders/jpeg/JPEGImageDecoder.h (230521 => 230522)
--- trunk/Source/WebCore/platform/image-decoders/jpeg/JPEGImageDecoder.h 2018-04-11 12:05:45 UTC (rev 230521)
+++ trunk/Source/WebCore/platform/image-decoders/jpeg/JPEGImageDecoder.h 2018-04-11 13:47:26 UTC (rev 230522)
@@ -53,7 +53,7 @@
// ScalableImageDecoder
String filenameExtension() const override { return ASCIILiteral("jpg"); }
bool setSize(const IntSize&) override;
- ImageFrame* frameBufferAtIndex(size_t index) override;
+ ScalableImageDecoderFrame* frameBufferAtIndex(size_t index) override;
// CAUTION: setFailed() deletes |m_reader|. Be careful to avoid
// accessing deleted memory, especially when calling this from inside
// JPEGImageReader!
@@ -80,10 +80,10 @@
void decode(bool onlySize, bool allDataReceived);
template <J_COLOR_SPACE colorSpace>
- bool outputScanlines(ImageFrame& buffer);
+ bool outputScanlines(ScalableImageDecoderFrame& buffer);
template <J_COLOR_SPACE colorSpace, bool isScaled>
- bool outputScanlines(ImageFrame& buffer);
+ bool outputScanlines(ScalableImageDecoderFrame& buffer);
std::unique_ptr<JPEGImageReader> m_reader;
};
Modified: trunk/Source/WebCore/platform/image-decoders/png/PNGImageDecoder.cpp (230521 => 230522)
--- trunk/Source/WebCore/platform/image-decoders/png/PNGImageDecoder.cpp 2018-04-11 12:05:45 UTC (rev 230521)
+++ trunk/Source/WebCore/platform/image-decoders/png/PNGImageDecoder.cpp 2018-04-11 13:47:26 UTC (rev 230522)
@@ -253,7 +253,7 @@
return true;
}
-ImageFrame* PNGImageDecoder::frameBufferAtIndex(size_t index)
+ScalableImageDecoderFrame* PNGImageDecoder::frameBufferAtIndex(size_t index)
{
#if ENABLE(APNG)
if (ScalableImageDecoder::encodedDataStatus() < EncodedDataStatus::SizeAvailable)
@@ -269,7 +269,7 @@
if (m_frameBufferCache.isEmpty())
m_frameBufferCache.grow(1);
- ImageFrame& frame = m_frameBufferCache[index];
+ auto& frame = m_frameBufferCache[index];
if (!frame.isComplete())
decode(false, index, isAllDataReceived());
return &frame;
@@ -428,7 +428,7 @@
if (m_currentFrame >= frameCount())
return;
#endif
- ImageFrame& buffer = m_frameBufferCache[m_currentFrame];
+ auto& buffer = m_frameBufferCache[m_currentFrame];
if (buffer.isInvalid()) {
png_structp png = m_reader->pngPtr();
if (!buffer.initialize(scaledSize(), m_premultiplyAlpha)) {
@@ -632,7 +632,7 @@
m_frameBufferCache.grow(1);
if (m_currentFrame < m_frameBufferCache.size()) {
- ImageFrame& buffer = m_frameBufferCache[m_currentFrame];
+ auto& buffer = m_frameBufferCache[m_currentFrame];
if (!m_delayDenominator)
buffer.setDuration(Seconds::fromMilliseconds(m_delayNumerator * 10));
@@ -640,11 +640,11 @@
buffer.setDuration(Seconds::fromMilliseconds(m_delayNumerator * 1000 / m_delayDenominator));
if (m_dispose == 2)
- buffer.setDisposalMethod(ImageFrame::DisposalMethod::RestoreToPrevious);
+ buffer.setDisposalMethod(ScalableImageDecoderFrame::DisposalMethod::RestoreToPrevious);
else if (m_dispose == 1)
- buffer.setDisposalMethod(ImageFrame::DisposalMethod::RestoreToBackground);
+ buffer.setDisposalMethod(ScalableImageDecoderFrame::DisposalMethod::RestoreToBackground);
else
- buffer.setDisposalMethod(ImageFrame::DisposalMethod::DoNotDispose);
+ buffer.setDisposalMethod(ScalableImageDecoderFrame::DisposalMethod::DoNotDispose);
}
m_frameInfo = true;
@@ -724,16 +724,16 @@
// See GIFImageDecoder for full explanation.
clearBeforeFrame = std::min(clearBeforeFrame, m_frameBufferCache.size() - 1);
- const Vector<ImageFrame>::iterator end(m_frameBufferCache.begin() + clearBeforeFrame);
+ const Vector<ScalableImageDecoderFrame>::iterator end(m_frameBufferCache.begin() + clearBeforeFrame);
- Vector<ImageFrame>::iterator i(end);
- for (; (i != m_frameBufferCache.begin()) && (i->isInvalid() || (i->disposalMethod() == ImageFrame::DisposalMethod::RestoreToPrevious)); --i) {
+ Vector<ScalableImageDecoderFrame>::iterator i(end);
+ for (; (i != m_frameBufferCache.begin()) && (i->isInvalid() || (i->disposalMethod() == ScalableImageDecoderFrame::DisposalMethod::RestoreToPrevious)); --i) {
if (i->isComplete() && (i != end))
i->clear();
}
// Now |i| holds the last frame we need to preserve; clear prior frames.
- for (Vector<ImageFrame>::iterator j(m_frameBufferCache.begin()); j != i; ++j) {
+ for (Vector<ScalableImageDecoderFrame>::iterator j(m_frameBufferCache.begin()); j != i; ++j) {
ASSERT(!j->isPartial());
if (j->isInvalid())
j->clear();
@@ -745,7 +745,7 @@
if (frameIndex >= frameCount())
return;
- ImageFrame& buffer = m_frameBufferCache[frameIndex];
+ auto& buffer = m_frameBufferCache[frameIndex];
// The starting state for this frame depends on the previous frame's
// disposal method.
@@ -755,9 +755,9 @@
// the starting state of the previous frame, so skip over them. (If the
// first frame specifies this method, it will get treated like
// DisposeOverwriteBgcolor below and reset to a completely empty image.)
- const ImageFrame* prevBuffer = &m_frameBufferCache[--frameIndex];
- ImageFrame::DisposalMethod prevMethod = prevBuffer->disposalMethod();
- while (frameIndex && (prevMethod == ImageFrame::DisposalMethod::RestoreToPrevious)) {
+ const auto* prevBuffer = &m_frameBufferCache[--frameIndex];
+ auto prevMethod = prevBuffer->disposalMethod();
+ while (frameIndex && (prevMethod == ScalableImageDecoderFrame::DisposalMethod::RestoreToPrevious)) {
prevBuffer = &m_frameBufferCache[--frameIndex];
prevMethod = prevBuffer->disposalMethod();
}
@@ -765,7 +765,7 @@
png_structp png = m_reader->pngPtr();
ASSERT(prevBuffer->isComplete());
- if (prevMethod == ImageFrame::DisposalMethod::DoNotDispose) {
+ if (prevMethod == ScalableImageDecoderFrame::DisposalMethod::DoNotDispose) {
// Preserve the last frame as the starting state for this frame.
if (!prevBuffer->backingStore() || !buffer.initialize(*prevBuffer->backingStore()))
longjmp(JMPBUF(png), 1);
@@ -809,7 +809,7 @@
if (m_frameIsHidden || m_currentFrame >= frameCount())
return;
- ImageFrame& buffer = m_frameBufferCache[m_currentFrame];
+ auto& buffer = m_frameBufferCache[m_currentFrame];
buffer.setDecodingStatus(DecodingStatus::Complete);
png_bytep interlaceBuffer = m_reader->interlaceBuffer();
@@ -843,12 +843,12 @@
buffer.setHasAlpha(false);
else {
size_t frameIndex = m_currentFrame;
- const ImageFrame* prevBuffer = &m_frameBufferCache[--frameIndex];
- while (frameIndex && (prevBuffer->disposalMethod() == ImageFrame::DisposalMethod::RestoreToPrevious))
+ const auto* prevBuffer = &m_frameBufferCache[--frameIndex];
+ while (frameIndex && (prevBuffer->disposalMethod() == ScalableImageDecoderFrame::DisposalMethod::RestoreToPrevious))
prevBuffer = &m_frameBufferCache[--frameIndex];
IntRect prevRect = prevBuffer->backingStore()->frameRect();
- if ((prevBuffer->disposalMethod() == ImageFrame::DisposalMethod::RestoreToBackground) && !prevBuffer->hasAlpha() && rect.contains(prevRect))
+ if ((prevBuffer->disposalMethod() == ScalableImageDecoderFrame::DisposalMethod::RestoreToBackground) && !prevBuffer->hasAlpha() && rect.contains(prevRect))
buffer.setHasAlpha(false);
}
} else if (!m_blend && !buffer.hasAlpha())
Modified: trunk/Source/WebCore/platform/image-decoders/png/PNGImageDecoder.h (230521 => 230522)
--- trunk/Source/WebCore/platform/image-decoders/png/PNGImageDecoder.h 2018-04-11 12:05:45 UTC (rev 230521)
+++ trunk/Source/WebCore/platform/image-decoders/png/PNGImageDecoder.h 2018-04-11 13:47:26 UTC (rev 230522)
@@ -51,7 +51,7 @@
RepetitionCount repetitionCount() const override;
#endif
bool setSize(const IntSize&) override;
- ImageFrame* frameBufferAtIndex(size_t index) override;
+ ScalableImageDecoderFrame* frameBufferAtIndex(size_t index) override;
// CAUTION: setFailed() deletes |m_reader|. Be careful to avoid
// accessing deleted memory, especially when calling this from inside
// PNGImageReader!
Modified: trunk/Source/WebCore/platform/image-decoders/webp/WEBPImageDecoder.cpp (230521 => 230522)
--- trunk/Source/WebCore/platform/image-decoders/webp/WEBPImageDecoder.cpp 2018-04-11 12:05:45 UTC (rev 230521)
+++ trunk/Source/WebCore/platform/image-decoders/webp/WEBPImageDecoder.cpp 2018-04-11 13:47:26 UTC (rev 230522)
@@ -70,7 +70,7 @@
return m_repetitionCount ? m_repetitionCount : RepetitionCountInfinite;
}
-ImageFrame* WEBPImageDecoder::frameBufferAtIndex(size_t index)
+ScalableImageDecoderFrame* WEBPImageDecoder::frameBufferAtIndex(size_t index)
{
if (index >= frameCount())
return 0;
@@ -117,7 +117,7 @@
// This frame covers the whole area and its disposalMethod is RestoreToBackground, which means
// that the next frame will be rendered on top of a transparent background, and can be decoded
// without dependencies. This can only be checked for frames prior to frameIndex.
- if (firstIndependentFrame < frameIndex && m_frameBufferCache[firstIndependentFrame].disposalMethod() == ImageFrame::DisposalMethod::RestoreToBackground)
+ if (firstIndependentFrame < frameIndex && m_frameBufferCache[firstIndependentFrame].disposalMethod() == ScalableImageDecoderFrame::DisposalMethod::RestoreToBackground)
return firstIndependentFrame + 1;
}
@@ -170,9 +170,9 @@
bool blend = webpFrame.blend_method == WEBP_MUX_BLEND ? true : false;
ASSERT(m_frameBufferCache.size() > frameIndex);
- ImageFrame& buffer = m_frameBufferCache[frameIndex];
+ auto& buffer = m_frameBufferCache[frameIndex];
buffer.setDuration(Seconds::fromMilliseconds(webpFrame.duration));
- buffer.setDisposalMethod(webpFrame.dispose_method == WEBP_MUX_DISPOSE_BACKGROUND ? ImageFrame::DisposalMethod::RestoreToBackground : ImageFrame::DisposalMethod::DoNotDispose);
+ buffer.setDisposalMethod(webpFrame.dispose_method == WEBP_MUX_DISPOSE_BACKGROUND ? ScalableImageDecoderFrame::DisposalMethod::RestoreToBackground : ScalableImageDecoderFrame::DisposalMethod::DoNotDispose);
ASSERT(!buffer.isComplete());
if (buffer.isInvalid() && !initFrameBuffer(frameIndex, &webpFrame)) {
@@ -223,7 +223,7 @@
if (frameIndex >= frameCount())
return false;
- ImageFrame& buffer = m_frameBufferCache[frameIndex];
+ auto& buffer = m_frameBufferCache[frameIndex];
// Initialize the frame rect in our buffer.
IntRect frameRect(webpFrame->x_offset, webpFrame->y_offset, webpFrame->width, webpFrame->height);
@@ -236,7 +236,7 @@
if (!buffer.initialize(size(), m_premultiplyAlpha))
return false;
} else {
- const ImageFrame& prevBuffer = m_frameBufferCache[frameIndex - 1];
+ const auto& prevBuffer = m_frameBufferCache[frameIndex - 1];
ASSERT(prevBuffer.isComplete());
// Preserve the last frame as the starting state for this frame.
@@ -243,7 +243,7 @@
if (!prevBuffer.backingStore() || !buffer.initialize(*prevBuffer.backingStore()))
return false;
- if (prevBuffer.disposalMethod() == ImageFrame::DisposalMethod::RestoreToBackground) {
+ if (prevBuffer.disposalMethod() == ScalableImageDecoderFrame::DisposalMethod::RestoreToBackground) {
// We want to clear the previous frame to transparent, without
// affecting pixels in the image outside of the frame.
const IntRect& prevRect = prevBuffer.backingStore()->frameRect();
@@ -259,7 +259,7 @@
void WEBPImageDecoder::applyPostProcessing(size_t frameIndex, WebPIDecoder* decoder, WebPDecBuffer& decoderBuffer, bool blend)
{
- ImageFrame& buffer = m_frameBufferCache[frameIndex];
+ auto& buffer = m_frameBufferCache[frameIndex];
int decodedWidth = 0;
int decodedHeight = 0;
if (!WebPIDecGetRGB(decoder, &decodedHeight, &decodedWidth, 0, 0))
@@ -352,7 +352,7 @@
// In WEBP every frame depends on the previous one or none. That means that frames after clearBeforeFrame
// won't need any frame before them to render, so we can clear them all.
for (int i = clearBeforeFrame - 1; i >= 0; i--) {
- ImageFrame& buffer = m_frameBufferCache[i];
+ auto& buffer = m_frameBufferCache[i];
if (!buffer.isInvalid())
buffer.clear();
}
Modified: trunk/Source/WebCore/platform/image-decoders/webp/WEBPImageDecoder.h (230521 => 230522)
--- trunk/Source/WebCore/platform/image-decoders/webp/WEBPImageDecoder.h 2018-04-11 12:05:45 UTC (rev 230521)
+++ trunk/Source/WebCore/platform/image-decoders/webp/WEBPImageDecoder.h 2018-04-11 13:47:26 UTC (rev 230522)
@@ -48,7 +48,7 @@
String filenameExtension() const override { return ASCIILiteral("webp"); }
void setData(SharedBuffer&, bool) final;
- ImageFrame* frameBufferAtIndex(size_t index) override;
+ ScalableImageDecoderFrame* frameBufferAtIndex(size_t index) override;
RepetitionCount repetitionCount() const override;
size_t frameCount() const override { return m_frameCount; }
void clearFrameBufferCache(size_t) override;