Diff
Modified: trunk/Source/WebCore/ChangeLog (286823 => 286824)
--- trunk/Source/WebCore/ChangeLog 2021-12-10 02:16:28 UTC (rev 286823)
+++ trunk/Source/WebCore/ChangeLog 2021-12-10 02:38:54 UTC (rev 286824)
@@ -1,3 +1,52 @@
+2021-12-09 Said Abou-Hallawa <s...@apple.com>
+
+ [GPU Process] [Filters] Add the encoding and decoding for FEImage
+ https://bugs.webkit.org/show_bug.cgi?id=234099
+
+ Reviewed by Wenson Hsieh.
+
+ FEImage needs to encode and decode the RenderingResourceIdentifier of the
+ Image or the ImageBuffer of its SourceImage.
+
+ A new type 'RenderingResourceIdentifier' is added to FEImage::SourceImage
+ variant. This going to be used while transferring the FEImage from
+ WebProcess to GPUProcess.
+
+ Record-using the Image or ImageBuffer of FEImage::SourceImage has to
+ happen in Recorder::drawFilteredImageBuffer() since this is the place we
+ can send messages to GPUProcess.
+
+ Resolving RenderingResourceIdentifier of FEImage::SourceImage back to an
+ Image or an ImageBuffer has to happen in RemoteDisplayListRecorder::
+ drawFilteredImageBuffer before handling the item DrawFilteredImageBuffer.
+
+ Because of the two restrictions above we have to provide the virtual
+ function Filter::effectsOfType() which is overridden by CSSFilter and
+ SVGFilter.
+
+ * Headers.cmake:
+ * WebCore.xcodeproj/project.pbxproj:
+ * platform/graphics/displaylists/DisplayListRecorder.cpp:
+ (WebCore::DisplayList::Recorder::drawFilteredImageBuffer):
+ * platform/graphics/filters/Filter.h:
+ * rendering/CSSFilter.cpp:
+ (WebCore::CSSFilter::effectsOfType const):
+ * rendering/CSSFilter.h:
+ * svg/SVGPreserveAspectRatioValue.cpp:
+ (WebCore::SVGPreserveAspectRatioValue::SVGPreserveAspectRatioValue):
+ * svg/SVGPreserveAspectRatioValue.h:
+ (WebCore::SVGPreserveAspectRatioValue::encode const):
+ (WebCore::SVGPreserveAspectRatioValue::decode):
+ * svg/graphics/filters/SVGFEImage.cpp:
+ (WebCore::FEImage::calculateImageRect const):
+ (WebCore::FEImageSoftwareApplier::apply const):
+ * svg/graphics/filters/SVGFEImage.h:
+ (WebCore::FEImage::encode const):
+ (WebCore::FEImage::decode):
+ * svg/graphics/filters/SVGFilter.cpp:
+ (WebCore::SVGFilter::effectsOfType const):
+ * svg/graphics/filters/SVGFilter.h:
+
2021-12-09 Chris Dumez <cdu...@apple.com>
Add basic support for launching a SharedWorker
Modified: trunk/Source/WebCore/Headers.cmake (286823 => 286824)
--- trunk/Source/WebCore/Headers.cmake 2021-12-10 02:16:28 UTC (rev 286823)
+++ trunk/Source/WebCore/Headers.cmake 2021-12-10 02:38:54 UTC (rev 286824)
@@ -1906,6 +1906,7 @@
svg/SVGLengthValue.h
svg/SVGParserUtilities.h
svg/SVGParsingError.h
+ svg/SVGPreserveAspectRatioValue.h
svg/SVGStringList.h
svg/SVGTests.h
svg/SVGUnitTypes.h
@@ -1912,6 +1913,7 @@
svg/graphics/SVGImageCache.h
+ svg/graphics/filters/SVGFEImage.h
svg/graphics/filters/SVGFilter.h
svg/graphics/filters/SVGFilterExpression.h
Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (286823 => 286824)
--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj 2021-12-10 02:16:28 UTC (rev 286823)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj 2021-12-10 02:38:54 UTC (rev 286824)
@@ -2323,6 +2323,7 @@
729D05302531424300422098 /* RenderingResourceIdentifier.h in Headers */ = {isa = PBXBuildFile; fileRef = 729D052E25313E2600422098 /* RenderingResourceIdentifier.h */; settings = {ATTRIBUTES = (Private, ); }; };
72A5D192275E8FFE0065833E /* SVGFilterExpression.h in Headers */ = {isa = PBXBuildFile; fileRef = 726CDE25275B489700A445B2 /* SVGFilterExpression.h */; settings = {ATTRIBUTES = (Private, ); }; };
72A73BEF245A3F90001C9D03 /* AnimationFrameRate.h in Headers */ = {isa = PBXBuildFile; fileRef = 722A815C238FD50500C00583 /* AnimationFrameRate.h */; settings = {ATTRIBUTES = (Private, ); }; };
+ 72ACC9C627629A7700D523F7 /* SVGPreserveAspectRatioValue.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C8F22461DD3D1C500E92DA3 /* SVGPreserveAspectRatioValue.h */; settings = {ATTRIBUTES = (Private, ); }; };
72B8B0352753438600F752AA /* FilterFunction.h in Headers */ = {isa = PBXBuildFile; fileRef = 7262D756272A174100C56A09 /* FilterFunction.h */; settings = {ATTRIBUTES = (Private, ); }; };
72B8B0362753441400F752AA /* FilterImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 72435EF4273D07670005E7EE /* FilterImage.h */; settings = {ATTRIBUTES = (Private, ); }; };
72BAC3AE23E1F0B0008D741C /* ImageBufferBackend.h in Headers */ = {isa = PBXBuildFile; fileRef = 72BAC3A523E17328008D741C /* ImageBufferBackend.h */; settings = {ATTRIBUTES = (Private, ); }; };
@@ -3875,7 +3876,7 @@
B222F69D0AB771B80022EFAD /* JSSVGElement.h in Headers */ = {isa = PBXBuildFile; fileRef = B222F69B0AB771B80022EFAD /* JSSVGElement.h */; };
B22362290C3AF04A0008CA9B /* JSSVGTextPathElement.h in Headers */ = {isa = PBXBuildFile; fileRef = B22362270C3AF04A0008CA9B /* JSSVGTextPathElement.h */; };
B23540F30D00782E002382FA /* StringTruncator.h in Headers */ = {isa = PBXBuildFile; fileRef = B23540F10D00782E002382FA /* StringTruncator.h */; settings = {ATTRIBUTES = (Private, ); }; };
- B25599850D00D8BA00BB825C /* SVGFEImage.h in Headers */ = {isa = PBXBuildFile; fileRef = B25598EB0D00D8B900BB825C /* SVGFEImage.h */; };
+ B25599850D00D8BA00BB825C /* SVGFEImage.h in Headers */ = {isa = PBXBuildFile; fileRef = B25598EB0D00D8B900BB825C /* SVGFEImage.h */; settings = {ATTRIBUTES = (Private, ); }; };
B25599A40D00D8BA00BB825C /* SVGImage.h in Headers */ = {isa = PBXBuildFile; fileRef = B255990C0D00D8B900BB825C /* SVGImage.h */; settings = {ATTRIBUTES = (Private, ); }; };
B25599A50D00D8BA00BB825C /* EmptyClients.h in Headers */ = {isa = PBXBuildFile; fileRef = B255990D0D00D8B900BB825C /* EmptyClients.h */; settings = {ATTRIBUTES = (Private, ); }; };
B27535650B053814002CE64F /* PDFDocumentImage.h in Headers */ = {isa = PBXBuildFile; fileRef = B27535370B053814002CE64F /* PDFDocumentImage.h */; settings = {ATTRIBUTES = (Private, ); }; };
@@ -37208,6 +37209,7 @@
B2227A910D00BF220071B782 /* SVGPolygonElement.h in Headers */,
B2227A940D00BF220071B782 /* SVGPolylineElement.h in Headers */,
B2227A970D00BF220071B782 /* SVGPreserveAspectRatio.h in Headers */,
+ 72ACC9C627629A7700D523F7 /* SVGPreserveAspectRatioValue.h in Headers */,
55DCC52822407B2000C26E32 /* SVGPrimitiveList.h in Headers */,
72144333223EC8B000F12FF7 /* SVGProperty.h in Headers */,
72144334223EC91600F12FF7 /* SVGPropertyOwner.h in Headers */,
Modified: trunk/Source/WebCore/platform/graphics/displaylists/DisplayListRecorder.cpp (286823 => 286824)
--- trunk/Source/WebCore/platform/graphics/displaylists/DisplayListRecorder.cpp 2021-12-10 02:16:28 UTC (rev 286823)
+++ trunk/Source/WebCore/platform/graphics/displaylists/DisplayListRecorder.cpp 2021-12-10 02:38:54 UTC (rev 286824)
@@ -34,6 +34,7 @@
#include "Logging.h"
#include "MediaPlayer.h"
#include "NotImplemented.h"
+#include "SVGFEImage.h"
#include <wtf/MathExtras.h>
#include <wtf/text/TextStream.h>
@@ -148,13 +149,40 @@
{
appendStateChangeItemIfNecessary();
- if (!sourceImage) {
- recordDrawFilteredImageBuffer({ }, sourceImageRect, filter);
+ if (sourceImage && !canDrawImageBuffer(*sourceImage)) {
+ GraphicsContext::drawFilteredImageBuffer(sourceImage, sourceImageRect, filter);
return;
}
- if (!canDrawImageBuffer(*sourceImage)) {
- GraphicsContext::drawFilteredImageBuffer(sourceImage, sourceImageRect, filter);
+ for (auto& effect : filter.effectsOfType(FilterEffect::Type::FEImage)) {
+ bool isRecorded = WTF::switchOn(downcast<FEImage>(effect.get())->sourceImage(),
+ [&] (const Ref<Image>& image) {
+ if (auto nativeImage = image->nativeImage()) {
+ recordResourceUse(*nativeImage);
+ return true;
+ }
+ return false;
+ },
+ [&] (const Ref<ImageBuffer>& imageBuffer) {
+ if (canDrawImageBuffer(imageBuffer)) {
+ recordResourceUse(imageBuffer);
+ return true;
+ }
+ return false;
+ },
+ [&] (RenderingResourceIdentifier) {
+ return true;
+ }
+ );
+
+ if (!isRecorded) {
+ GraphicsContext::drawFilteredImageBuffer(sourceImage, sourceImageRect, filter);
+ return;
+ }
+ }
+
+ if (!sourceImage) {
+ recordDrawFilteredImageBuffer({ }, sourceImageRect, filter);
return;
}
Modified: trunk/Source/WebCore/platform/graphics/filters/Filter.h (286823 => 286824)
--- trunk/Source/WebCore/platform/graphics/filters/Filter.h 2021-12-10 02:16:28 UTC (rev 286823)
+++ trunk/Source/WebCore/platform/graphics/filters/Filter.h 2021-12-10 02:38:54 UTC (rev 286824)
@@ -21,6 +21,7 @@
#pragma once
+#include "FilterEffectVector.h"
#include "FilterFunction.h"
#include "FloatRect.h"
#include "GraphicsTypes.h"
@@ -60,6 +61,7 @@
FloatRect clipToMaxEffectRect(const FloatRect& imageRect, const FloatRect& primitiveSubregion) const;
virtual RefPtr<FilterEffect> lastEffect() const = 0;
+ virtual FilterEffectVector effectsOfType(FilterFunction::Type) const = 0;
bool clampFilterRegionIfNeeded();
Modified: trunk/Source/WebCore/rendering/CSSFilter.cpp (286823 => 286824)
--- trunk/Source/WebCore/rendering/CSSFilter.cpp 2021-12-10 02:16:28 UTC (rev 286823)
+++ trunk/Source/WebCore/rendering/CSSFilter.cpp 2021-12-10 02:38:54 UTC (rev 286824)
@@ -347,6 +347,25 @@
return downcast<FilterEffect>(function.ptr());
}
+FilterEffectVector CSSFilter::effectsOfType(FilterFunction::Type filterType) const
+{
+ FilterEffectVector effects;
+
+ for (auto& function : m_functions) {
+ if (function->filterType() == filterType) {
+ effects.append({ downcast<FilterEffect>(function.ptr()) });
+ continue;
+ }
+
+ if (function->isSVGFilter()) {
+ auto& filter = downcast<SVGFilter>(function.get());
+ effects.appendVector(filter.effectsOfType(filterType));
+ }
+ }
+
+ return effects;
+}
+
#if USE(CORE_IMAGE)
bool CSSFilter::supportsCoreImageRendering() const
{
Modified: trunk/Source/WebCore/rendering/CSSFilter.h (286823 => 286824)
--- trunk/Source/WebCore/rendering/CSSFilter.h 2021-12-10 02:16:28 UTC (rev 286823)
+++ trunk/Source/WebCore/rendering/CSSFilter.h 2021-12-10 02:38:54 UTC (rev 286824)
@@ -53,6 +53,8 @@
bool hasFilterThatShouldBeRestrictedBySecurityOrigin() const { return m_hasFilterThatShouldBeRestrictedBySecurityOrigin; }
RefPtr<FilterEffect> lastEffect() const final;
+ FilterEffectVector effectsOfType(FilterFunction::Type) const final;
+
IntOutsets outsets() const final;
void clearIntermediateResults();
Modified: trunk/Source/WebCore/svg/SVGPreserveAspectRatioValue.cpp (286823 => 286824)
--- trunk/Source/WebCore/svg/SVGPreserveAspectRatioValue.cpp 2021-12-10 02:16:28 UTC (rev 286823)
+++ trunk/Source/WebCore/svg/SVGPreserveAspectRatioValue.cpp 2021-12-10 02:38:54 UTC (rev 286824)
@@ -31,15 +31,15 @@
namespace WebCore {
-SVGPreserveAspectRatioValue::SVGPreserveAspectRatioValue()
- : m_align(SVG_PRESERVEASPECTRATIO_XMIDYMID)
- , m_meetOrSlice(SVG_MEETORSLICE_MEET)
+SVGPreserveAspectRatioValue::SVGPreserveAspectRatioValue(StringView value)
{
+ parse(value);
}
-SVGPreserveAspectRatioValue::SVGPreserveAspectRatioValue(StringView value)
+SVGPreserveAspectRatioValue::SVGPreserveAspectRatioValue(SVGPreserveAspectRatioType align, SVGMeetOrSliceType meetOrSlice)
+ : m_align(align)
+ , m_meetOrSlice(meetOrSlice)
{
- parse(value);
}
ExceptionOr<void> SVGPreserveAspectRatioValue::setAlign(unsigned short align)
Modified: trunk/Source/WebCore/svg/SVGPreserveAspectRatioValue.h (286823 => 286824)
--- trunk/Source/WebCore/svg/SVGPreserveAspectRatioValue.h 2021-12-10 02:16:28 UTC (rev 286823)
+++ trunk/Source/WebCore/svg/SVGPreserveAspectRatioValue.h 2021-12-10 02:38:54 UTC (rev 286824)
@@ -51,8 +51,9 @@
SVG_MEETORSLICE_SLICE = 2
};
- SVGPreserveAspectRatioValue();
+ SVGPreserveAspectRatioValue() = default;
SVGPreserveAspectRatioValue(StringView);
+ WEBCORE_EXPORT SVGPreserveAspectRatioValue(SVGPreserveAspectRatioType, SVGMeetOrSliceType);
ExceptionOr<void> setAlign(unsigned short);
unsigned short align() const { return m_align; }
@@ -70,9 +71,12 @@
String valueAsString() const;
+ template<class Encoder> void encode(Encoder&) const;
+ template<class Decoder> static std::optional<SVGPreserveAspectRatioValue> decode(Decoder&);
+
private:
- SVGPreserveAspectRatioType m_align;
- SVGMeetOrSliceType m_meetOrSlice;
+ SVGPreserveAspectRatioType m_align { SVG_PRESERVEASPECTRATIO_XMIDYMID };
+ SVGMeetOrSliceType m_meetOrSlice { SVG_MEETORSLICE_MEET };
template<typename CharacterType> bool parseInternal(StringParsingBuffer<CharacterType>&, bool validate);
};
@@ -84,4 +88,59 @@
static String toString(const SVGPreserveAspectRatioValue& type) { return type.valueAsString(); }
};
+template<class Encoder>
+void SVGPreserveAspectRatioValue::encode(Encoder& encoder) const
+{
+ encoder << m_align;
+ encoder << m_meetOrSlice;
+}
+
+template<class Decoder>
+std::optional<SVGPreserveAspectRatioValue> SVGPreserveAspectRatioValue::decode(Decoder& decoder)
+{
+ std::optional<SVGPreserveAspectRatioType> align;
+ decoder >> align;
+ if (!align)
+ return std::nullopt;
+
+ std::optional<SVGMeetOrSliceType> meetOrSlice;
+ decoder >> meetOrSlice;
+ if (!meetOrSlice)
+ return std::nullopt;
+
+ return SVGPreserveAspectRatioValue(*align, *meetOrSlice);
+}
+
} // namespace WebCore
+
+namespace WTF {
+
+template<> struct EnumTraits<WebCore::SVGPreserveAspectRatioValue::SVGPreserveAspectRatioType> {
+ using values = EnumValues<
+ WebCore::SVGPreserveAspectRatioValue::SVGPreserveAspectRatioType,
+
+ WebCore::SVGPreserveAspectRatioValue::SVG_PRESERVEASPECTRATIO_UNKNOWN,
+ WebCore::SVGPreserveAspectRatioValue::SVG_PRESERVEASPECTRATIO_NONE,
+ WebCore::SVGPreserveAspectRatioValue::SVG_PRESERVEASPECTRATIO_XMINYMIN,
+ WebCore::SVGPreserveAspectRatioValue::SVG_PRESERVEASPECTRATIO_XMIDYMIN,
+ WebCore::SVGPreserveAspectRatioValue::SVG_PRESERVEASPECTRATIO_XMAXYMIN,
+ WebCore::SVGPreserveAspectRatioValue::SVG_PRESERVEASPECTRATIO_XMINYMID,
+ WebCore::SVGPreserveAspectRatioValue::SVG_PRESERVEASPECTRATIO_XMIDYMID,
+ WebCore::SVGPreserveAspectRatioValue::SVG_PRESERVEASPECTRATIO_XMAXYMID,
+ WebCore::SVGPreserveAspectRatioValue::SVG_PRESERVEASPECTRATIO_XMINYMAX,
+ WebCore::SVGPreserveAspectRatioValue::SVG_PRESERVEASPECTRATIO_XMIDYMAX,
+ WebCore::SVGPreserveAspectRatioValue::SVG_PRESERVEASPECTRATIO_XMAXYMAX
+ >;
+};
+
+template<> struct EnumTraits<WebCore::SVGPreserveAspectRatioValue::SVGMeetOrSliceType> {
+ using values = EnumValues<
+ WebCore::SVGPreserveAspectRatioValue::SVGMeetOrSliceType,
+
+ WebCore::SVGPreserveAspectRatioValue::SVG_MEETORSLICE_UNKNOWN,
+ WebCore::SVGPreserveAspectRatioValue::SVG_MEETORSLICE_MEET,
+ WebCore::SVGPreserveAspectRatioValue::SVG_MEETORSLICE_SLICE
+ >;
+};
+
+} // namespace WTF
Modified: trunk/Source/WebCore/svg/graphics/filters/SVGFEImage.cpp (286823 => 286824)
--- trunk/Source/WebCore/svg/graphics/filters/SVGFEImage.cpp 2021-12-10 02:16:28 UTC (rev 286823)
+++ trunk/Source/WebCore/svg/graphics/filters/SVGFEImage.cpp 2021-12-10 02:38:54 UTC (rev 286824)
@@ -61,6 +61,10 @@
},
[&] (const Ref<ImageBuffer>&) {
return primitiveSubregion;
+ },
+ [&] (RenderingResourceIdentifier) {
+ ASSERT_NOT_REACHED();
+ return FloatRect();
}
);
return filter.clipToMaxEffectRect(imageRect, primitiveSubregion);
@@ -101,6 +105,9 @@
imageRect.scale(filter.filterScale());
imageRect = IntRect(imageRect) - result.absoluteImageRect().location();
context.drawImageBuffer(imageBuffer, imageRect.location());
+ },
+ [&] (RenderingResourceIdentifier) {
+ ASSERT_NOT_REACHED();
}
);
Modified: trunk/Source/WebCore/svg/graphics/filters/SVGFEImage.h (286823 => 286824)
--- trunk/Source/WebCore/svg/graphics/filters/SVGFEImage.h 2021-12-10 02:16:28 UTC (rev 286823)
+++ trunk/Source/WebCore/svg/graphics/filters/SVGFEImage.h 2021-12-10 02:38:54 UTC (rev 286824)
@@ -24,6 +24,7 @@
#pragma once
#include "FilterEffect.h"
+#include "Image.h"
#include "SVGPreserveAspectRatioValue.h"
namespace WebCore {
@@ -33,10 +34,14 @@
class FEImage final : public FilterEffect {
public:
- using SourceImage = std::variant<Ref<Image>, Ref<ImageBuffer>>;
+ using SourceImage = std::variant<
+ Ref<Image>,
+ Ref<ImageBuffer>,
+ RenderingResourceIdentifier
+ >;
static Ref<FEImage> create(Ref<Image>&&, const SVGPreserveAspectRatioValue&);
- static Ref<FEImage> create(SourceImage&&, const FloatRect& sourceImageRect, const SVGPreserveAspectRatioValue&);
+ WEBCORE_EXPORT static Ref<FEImage> create(SourceImage&&, const FloatRect& sourceImageRect, const SVGPreserveAspectRatioValue&);
const SourceImage& sourceImage() const { return m_sourceImage; }
void setImageSource(SourceImage&& sourceImage) { m_sourceImage = WTFMove(sourceImage); }
@@ -44,6 +49,9 @@
FloatRect sourceImageRect() const { return m_sourceImageRect; }
const SVGPreserveAspectRatioValue& preserveAspectRatio() const { return m_preserveAspectRatio; }
+ template<class Encoder> void encode(Encoder&) const;
+ template<class Decoder> static std::optional<Ref<FEImage>> decode(Decoder&);
+
private:
FEImage(SourceImage&&, const FloatRect& sourceImageRect, const SVGPreserveAspectRatioValue&);
@@ -63,6 +71,47 @@
SVGPreserveAspectRatioValue m_preserveAspectRatio;
};
+template<class Encoder>
+void FEImage::encode(Encoder& encoder) const
+{
+ WTF::switchOn(m_sourceImage,
+ [&] (const Ref<Image>& image) {
+ if (auto nativeImage = image->nativeImage())
+ encoder << nativeImage->renderingResourceIdentifier();
+ },
+ [&] (const Ref<ImageBuffer>& imageBuffer) {
+ encoder << imageBuffer->renderingResourceIdentifier();
+ },
+ [&] (RenderingResourceIdentifier renderingResourceIdentifier) {
+ encoder << renderingResourceIdentifier;
+ }
+ );
+
+ encoder << m_sourceImageRect;
+ encoder << m_preserveAspectRatio;
+}
+
+template<class Decoder>
+std::optional<Ref<FEImage>> FEImage::decode(Decoder& decoder)
+{
+ std::optional<RenderingResourceIdentifier> imageIdentifier;
+ decoder >> imageIdentifier;
+ if (!imageIdentifier)
+ return std::nullopt;
+
+ std::optional<FloatRect> sourceImageRect;
+ decoder >> sourceImageRect;
+ if (!sourceImageRect)
+ return std::nullopt;
+
+ std::optional<SVGPreserveAspectRatioValue> preserveAspectRatio;
+ decoder >> preserveAspectRatio;
+ if (!preserveAspectRatio)
+ return std::nullopt;
+
+ return FEImage::create(*imageIdentifier, *sourceImageRect, *preserveAspectRatio);
+}
+
} // namespace WebCore
SPECIALIZE_TYPE_TRAITS_FILTER_EFFECT(FEImage)
Modified: trunk/Source/WebCore/svg/graphics/filters/SVGFilter.cpp (286823 => 286824)
--- trunk/Source/WebCore/svg/graphics/filters/SVGFilter.cpp 2021-12-10 02:16:28 UTC (rev 286823)
+++ trunk/Source/WebCore/svg/graphics/filters/SVGFilter.cpp 2021-12-10 02:38:54 UTC (rev 286824)
@@ -117,6 +117,19 @@
return m_expression.last().effect.ptr();
}
+FilterEffectVector SVGFilter::effectsOfType(FilterFunction::Type filterType) const
+{
+ HashSet<RefPtr<FilterEffect>> effects;
+
+ for (auto& term : m_expression) {
+ auto& effect = term.effect;
+ if (effect->filterType() == filterType)
+ effects.add({ effect.ptr() });
+ }
+
+ return copyToVector(effects);
+}
+
RefPtr<FilterImage> SVGFilter::apply(const Filter&, FilterImage& sourceImage)
{
return apply(&sourceImage);
Modified: trunk/Source/WebCore/svg/graphics/filters/SVGFilter.h (286823 => 286824)
--- trunk/Source/WebCore/svg/graphics/filters/SVGFilter.h 2021-12-10 02:16:28 UTC (rev 286823)
+++ trunk/Source/WebCore/svg/graphics/filters/SVGFilter.h 2021-12-10 02:38:54 UTC (rev 286824)
@@ -47,6 +47,7 @@
const SVGFilterExpression& _expression_() const { return m_expression; }
RefPtr<FilterEffect> lastEffect() const final;
+ FilterEffectVector effectsOfType(FilterFunction::Type) const final;
RefPtr<FilterImage> apply(FilterImage* sourceImage) final;
Modified: trunk/Source/WebKit/ChangeLog (286823 => 286824)
--- trunk/Source/WebKit/ChangeLog 2021-12-10 02:16:28 UTC (rev 286823)
+++ trunk/Source/WebKit/ChangeLog 2021-12-10 02:38:54 UTC (rev 286824)
@@ -1,3 +1,22 @@
+2021-12-09 Said Abou-Hallawa <s...@apple.com>
+
+ [GPU Process] [Filters] Add the encoding and decoding for FEImage
+ https://bugs.webkit.org/show_bug.cgi?id=234099
+
+ Reviewed by Wenson Hsieh.
+
+ Add the support to encode and decode the FEImage through FilterReference.
+ The RenderingResourceIdentifier of the Image or the ImageBuffer will be
+ used while encoding and decoding the FEImage. Resolving the decoded
+ RenderingResourceIdentifier back to an Image or ImageBuffer will happen
+ in RemoteDisplayListRecorder::drawFilteredImageBuffer).
+
+ * GPUProcess/graphics/RemoteDisplayListRecorder.cpp:
+ (WebKit::RemoteDisplayListRecorder::drawFilteredImageBuffer):
+ * Platform/IPC/FilterReference.h:
+ (IPC::FilterReference::encodeFilterEffect):
+ (IPC::FilterReference::decodeFilterEffect):
+
2021-12-09 Aditya Keerthi <akeer...@apple.com>
[iOS] Add SPI to enable find interactions on WKWebView
Modified: trunk/Source/WebKit/GPUProcess/graphics/RemoteDisplayListRecorder.cpp (286823 => 286824)
--- trunk/Source/WebKit/GPUProcess/graphics/RemoteDisplayListRecorder.cpp 2021-12-10 02:16:28 UTC (rev 286823)
+++ trunk/Source/WebKit/GPUProcess/graphics/RemoteDisplayListRecorder.cpp 2021-12-10 02:38:54 UTC (rev 286824)
@@ -29,6 +29,7 @@
#if ENABLE(GPU_PROCESS)
#include "RemoteDisplayListRecorderMessages.h"
+#include <WebCore/BitmapImage.h>
namespace WebKit {
using namespace WebCore;
@@ -234,6 +235,26 @@
auto filter = filterReference.takeFilter();
+ for (auto& effect : filter->effectsOfType(FilterEffect::Type::FEImage)) {
+ auto& feImage = *downcast<FEImage>(effect.get());
+
+ const auto* resourceIdentifier = std::get_if<RenderingResourceIdentifier>(&feImage.sourceImage());
+ if (!resourceIdentifier) {
+ ASSERT_NOT_REACHED();
+ return;
+ }
+
+ if (auto nativeImage = resourceCache().cachedNativeImage({ *resourceIdentifier, m_webProcessIdentifier })) {
+ feImage.setImageSource(Ref<Image> { BitmapImage::create(nativeImage) });
+ continue;
+ }
+
+ if (auto imageBuffer = resourceCache().cachedImageBuffer({ *resourceIdentifier, m_webProcessIdentifier })) {
+ feImage.setImageSource({ *imageBuffer });
+ continue;
+ }
+ }
+
handleItem(DisplayList::DrawFilteredImageBuffer(sourceImageIdentifier, sourceImageRect, WTFMove(filter)), sourceImage.get());
}
Modified: trunk/Source/WebKit/Platform/IPC/FilterReference.h (286823 => 286824)
--- trunk/Source/WebKit/Platform/IPC/FilterReference.h 2021-12-10 02:16:28 UTC (rev 286823)
+++ trunk/Source/WebKit/Platform/IPC/FilterReference.h 2021-12-10 02:38:54 UTC (rev 286824)
@@ -44,6 +44,7 @@
#include <WebCore/FETurbulence.h>
#include <WebCore/Filter.h>
#include <WebCore/FilterEffectVector.h>
+#include <WebCore/SVGFEImage.h>
#include <WebCore/SVGFilter.h>
#include <WebCore/SourceAlpha.h>
#include <WebCore/SourceGraphic.h>
@@ -139,7 +140,7 @@
break;
case WebCore::FilterEffect::Type::FEImage:
- // FIXME: encode FEImage.
+ downcast<WebCore::FEImage>(effect).encode(encoder);
break;
case WebCore::FilterEffect::Type::FEMerge:
@@ -229,7 +230,7 @@
break;
case WebCore::FilterEffect::Type::FEImage:
- // FIXME: decode FEImage.
+ effect = WebCore::FEImage::decode(decoder);
break;
case WebCore::FilterEffect::Type::FEMerge: