<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[286824] trunk/Source</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/286824">286824</a></dd>
<dt>Author</dt> <dd>said@apple.com</dd>
<dt>Date</dt> <dd>2021-12-09 18:38:54 -0800 (Thu, 09 Dec 2021)</dd>
</dl>

<h3>Log Message</h3>
<pre>[GPU Process] [Filters] Add the encoding and decoding for FEImage
https://bugs.webkit.org/show_bug.cgi?id=234099

Reviewed by Wenson Hsieh.

Source/WebCore:

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:

Source/WebKit:

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):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreHeaderscmake">trunk/Source/WebCore/Headers.cmake</a></li>
<li><a href="#trunkSourceWebCoreWebCorexcodeprojprojectpbxproj">trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsdisplaylistsDisplayListRecordercpp">trunk/Source/WebCore/platform/graphics/displaylists/DisplayListRecorder.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsfiltersFilterh">trunk/Source/WebCore/platform/graphics/filters/Filter.h</a></li>
<li><a href="#trunkSourceWebCorerenderingCSSFiltercpp">trunk/Source/WebCore/rendering/CSSFilter.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingCSSFilterh">trunk/Source/WebCore/rendering/CSSFilter.h</a></li>
<li><a href="#trunkSourceWebCoresvgSVGPreserveAspectRatioValuecpp">trunk/Source/WebCore/svg/SVGPreserveAspectRatioValue.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGPreserveAspectRatioValueh">trunk/Source/WebCore/svg/SVGPreserveAspectRatioValue.h</a></li>
<li><a href="#trunkSourceWebCoresvggraphicsfiltersSVGFEImagecpp">trunk/Source/WebCore/svg/graphics/filters/SVGFEImage.cpp</a></li>
<li><a href="#trunkSourceWebCoresvggraphicsfiltersSVGFEImageh">trunk/Source/WebCore/svg/graphics/filters/SVGFEImage.h</a></li>
<li><a href="#trunkSourceWebCoresvggraphicsfiltersSVGFiltercpp">trunk/Source/WebCore/svg/graphics/filters/SVGFilter.cpp</a></li>
<li><a href="#trunkSourceWebCoresvggraphicsfiltersSVGFilterh">trunk/Source/WebCore/svg/graphics/filters/SVGFilter.h</a></li>
<li><a href="#trunkSourceWebKitChangeLog">trunk/Source/WebKit/ChangeLog</a></li>
<li><a href="#trunkSourceWebKitGPUProcessgraphicsRemoteDisplayListRecordercpp">trunk/Source/WebKit/GPUProcess/graphics/RemoteDisplayListRecorder.cpp</a></li>
<li><a href="#trunkSourceWebKitPlatformIPCFilterReferenceh">trunk/Source/WebKit/Platform/IPC/FilterReference.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (286823 => 286824)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -1,3 +1,52 @@
</span><ins>+2021-12-09  Said Abou-Hallawa  <said@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:
+
</ins><span class="cx"> 2021-12-09  Chris Dumez  <cdumez@apple.com>
</span><span class="cx"> 
</span><span class="cx">         Add basic support for launching a SharedWorker
</span></span></pre></div>
<a id="trunkSourceWebCoreHeaderscmake"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Headers.cmake (286823 => 286824)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -1906,6 +1906,7 @@
</span><span class="cx">     svg/SVGLengthValue.h
</span><span class="cx">     svg/SVGParserUtilities.h
</span><span class="cx">     svg/SVGParsingError.h
</span><ins>+    svg/SVGPreserveAspectRatioValue.h
</ins><span class="cx">     svg/SVGStringList.h
</span><span class="cx">     svg/SVGTests.h
</span><span class="cx">     svg/SVGUnitTypes.h
</span><span class="lines">@@ -1912,6 +1913,7 @@
</span><span class="cx"> 
</span><span class="cx">     svg/graphics/SVGImageCache.h
</span><span class="cx"> 
</span><ins>+    svg/graphics/filters/SVGFEImage.h
</ins><span class="cx">     svg/graphics/filters/SVGFilter.h
</span><span class="cx">     svg/graphics/filters/SVGFilterExpression.h
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreWebCorexcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (286823 => 286824)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -2323,6 +2323,7 @@
</span><span class="cx">          729D05302531424300422098 /* RenderingResourceIdentifier.h in Headers */ = {isa = PBXBuildFile; fileRef = 729D052E25313E2600422098 /* RenderingResourceIdentifier.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">          72A5D192275E8FFE0065833E /* SVGFilterExpression.h in Headers */ = {isa = PBXBuildFile; fileRef = 726CDE25275B489700A445B2 /* SVGFilterExpression.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">          72A73BEF245A3F90001C9D03 /* AnimationFrameRate.h in Headers */ = {isa = PBXBuildFile; fileRef = 722A815C238FD50500C00583 /* AnimationFrameRate.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><ins>+               72ACC9C627629A7700D523F7 /* SVGPreserveAspectRatioValue.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C8F22461DD3D1C500E92DA3 /* SVGPreserveAspectRatioValue.h */; settings = {ATTRIBUTES = (Private, ); }; };
</ins><span class="cx">           72B8B0352753438600F752AA /* FilterFunction.h in Headers */ = {isa = PBXBuildFile; fileRef = 7262D756272A174100C56A09 /* FilterFunction.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">          72B8B0362753441400F752AA /* FilterImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 72435EF4273D07670005E7EE /* FilterImage.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">          72BAC3AE23E1F0B0008D741C /* ImageBufferBackend.h in Headers */ = {isa = PBXBuildFile; fileRef = 72BAC3A523E17328008D741C /* ImageBufferBackend.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="lines">@@ -3875,7 +3876,7 @@
</span><span class="cx">          B222F69D0AB771B80022EFAD /* JSSVGElement.h in Headers */ = {isa = PBXBuildFile; fileRef = B222F69B0AB771B80022EFAD /* JSSVGElement.h */; };
</span><span class="cx">          B22362290C3AF04A0008CA9B /* JSSVGTextPathElement.h in Headers */ = {isa = PBXBuildFile; fileRef = B22362270C3AF04A0008CA9B /* JSSVGTextPathElement.h */; };
</span><span class="cx">          B23540F30D00782E002382FA /* StringTruncator.h in Headers */ = {isa = PBXBuildFile; fileRef = B23540F10D00782E002382FA /* StringTruncator.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><del>-               B25599850D00D8BA00BB825C /* SVGFEImage.h in Headers */ = {isa = PBXBuildFile; fileRef = B25598EB0D00D8B900BB825C /* SVGFEImage.h */; };
</del><ins>+                B25599850D00D8BA00BB825C /* SVGFEImage.h in Headers */ = {isa = PBXBuildFile; fileRef = B25598EB0D00D8B900BB825C /* SVGFEImage.h */; settings = {ATTRIBUTES = (Private, ); }; };
</ins><span class="cx">           B25599A40D00D8BA00BB825C /* SVGImage.h in Headers */ = {isa = PBXBuildFile; fileRef = B255990C0D00D8B900BB825C /* SVGImage.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">          B25599A50D00D8BA00BB825C /* EmptyClients.h in Headers */ = {isa = PBXBuildFile; fileRef = B255990D0D00D8B900BB825C /* EmptyClients.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">          B27535650B053814002CE64F /* PDFDocumentImage.h in Headers */ = {isa = PBXBuildFile; fileRef = B27535370B053814002CE64F /* PDFDocumentImage.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="lines">@@ -37208,6 +37209,7 @@
</span><span class="cx">                          B2227A910D00BF220071B782 /* SVGPolygonElement.h in Headers */,
</span><span class="cx">                          B2227A940D00BF220071B782 /* SVGPolylineElement.h in Headers */,
</span><span class="cx">                          B2227A970D00BF220071B782 /* SVGPreserveAspectRatio.h in Headers */,
</span><ins>+                               72ACC9C627629A7700D523F7 /* SVGPreserveAspectRatioValue.h in Headers */,
</ins><span class="cx">                           55DCC52822407B2000C26E32 /* SVGPrimitiveList.h in Headers */,
</span><span class="cx">                          72144333223EC8B000F12FF7 /* SVGProperty.h in Headers */,
</span><span class="cx">                          72144334223EC91600F12FF7 /* SVGPropertyOwner.h in Headers */,
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsdisplaylistsDisplayListRecordercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/displaylists/DisplayListRecorder.cpp (286823 => 286824)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -34,6 +34,7 @@
</span><span class="cx"> #include "Logging.h"
</span><span class="cx"> #include "MediaPlayer.h"
</span><span class="cx"> #include "NotImplemented.h"
</span><ins>+#include "SVGFEImage.h"
</ins><span class="cx"> #include <wtf/MathExtras.h>
</span><span class="cx"> #include <wtf/text/TextStream.h>
</span><span class="cx"> 
</span><span class="lines">@@ -148,13 +149,40 @@
</span><span class="cx"> {
</span><span class="cx">     appendStateChangeItemIfNecessary();
</span><span class="cx"> 
</span><del>-    if (!sourceImage) {
-        recordDrawFilteredImageBuffer({ }, sourceImageRect, filter);
</del><ins>+    if (sourceImage && !canDrawImageBuffer(*sourceImage)) {
+        GraphicsContext::drawFilteredImageBuffer(sourceImage, sourceImageRect, filter);
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (!canDrawImageBuffer(*sourceImage)) {
-        GraphicsContext::drawFilteredImageBuffer(sourceImage, sourceImageRect, filter);
</del><ins>+    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);
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsfiltersFilterh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/filters/Filter.h (286823 => 286824)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -21,6 +21,7 @@
</span><span class="cx"> 
</span><span class="cx"> #pragma once
</span><span class="cx"> 
</span><ins>+#include "FilterEffectVector.h"
</ins><span class="cx"> #include "FilterFunction.h"
</span><span class="cx"> #include "FloatRect.h"
</span><span class="cx"> #include "GraphicsTypes.h"
</span><span class="lines">@@ -60,6 +61,7 @@
</span><span class="cx">     FloatRect clipToMaxEffectRect(const FloatRect& imageRect, const FloatRect& primitiveSubregion) const;
</span><span class="cx"> 
</span><span class="cx">     virtual RefPtr<FilterEffect> lastEffect() const = 0;
</span><ins>+    virtual FilterEffectVector effectsOfType(FilterFunction::Type) const = 0;
</ins><span class="cx"> 
</span><span class="cx">     bool clampFilterRegionIfNeeded();
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingCSSFiltercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/CSSFilter.cpp (286823 => 286824)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -347,6 +347,25 @@
</span><span class="cx">     return downcast<FilterEffect>(function.ptr());
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+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;
+}
+
</ins><span class="cx"> #if USE(CORE_IMAGE)
</span><span class="cx"> bool CSSFilter::supportsCoreImageRendering() const
</span><span class="cx"> {
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingCSSFilterh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/CSSFilter.h (286823 => 286824)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -53,6 +53,8 @@
</span><span class="cx">     bool hasFilterThatShouldBeRestrictedBySecurityOrigin() const { return m_hasFilterThatShouldBeRestrictedBySecurityOrigin; }
</span><span class="cx"> 
</span><span class="cx">     RefPtr<FilterEffect> lastEffect() const final;
</span><ins>+    FilterEffectVector effectsOfType(FilterFunction::Type) const final;
+
</ins><span class="cx">     IntOutsets outsets() const final;
</span><span class="cx"> 
</span><span class="cx">     void clearIntermediateResults();
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGPreserveAspectRatioValuecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGPreserveAspectRatioValue.cpp (286823 => 286824)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -31,15 +31,15 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-SVGPreserveAspectRatioValue::SVGPreserveAspectRatioValue()
-    : m_align(SVG_PRESERVEASPECTRATIO_XMIDYMID)
-    , m_meetOrSlice(SVG_MEETORSLICE_MEET)
</del><ins>+SVGPreserveAspectRatioValue::SVGPreserveAspectRatioValue(StringView value)
</ins><span class="cx"> {
</span><ins>+    parse(value);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-SVGPreserveAspectRatioValue::SVGPreserveAspectRatioValue(StringView value)
</del><ins>+SVGPreserveAspectRatioValue::SVGPreserveAspectRatioValue(SVGPreserveAspectRatioType align, SVGMeetOrSliceType meetOrSlice)
+    : m_align(align)
+    , m_meetOrSlice(meetOrSlice)
</ins><span class="cx"> {
</span><del>-    parse(value);
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> ExceptionOr<void> SVGPreserveAspectRatioValue::setAlign(unsigned short align)
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGPreserveAspectRatioValueh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGPreserveAspectRatioValue.h (286823 => 286824)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -51,8 +51,9 @@
</span><span class="cx">         SVG_MEETORSLICE_SLICE = 2
</span><span class="cx">     };
</span><span class="cx"> 
</span><del>-    SVGPreserveAspectRatioValue();
</del><ins>+    SVGPreserveAspectRatioValue() = default;
</ins><span class="cx">     SVGPreserveAspectRatioValue(StringView);
</span><ins>+    WEBCORE_EXPORT SVGPreserveAspectRatioValue(SVGPreserveAspectRatioType, SVGMeetOrSliceType);
</ins><span class="cx"> 
</span><span class="cx">     ExceptionOr<void> setAlign(unsigned short);
</span><span class="cx">     unsigned short align() const { return m_align; }
</span><span class="lines">@@ -70,9 +71,12 @@
</span><span class="cx"> 
</span><span class="cx">     String valueAsString() const;
</span><span class="cx"> 
</span><ins>+    template<class Encoder> void encode(Encoder&) const;
+    template<class Decoder> static std::optional<SVGPreserveAspectRatioValue> decode(Decoder&);
+
</ins><span class="cx"> private:
</span><del>-    SVGPreserveAspectRatioType m_align;
-    SVGMeetOrSliceType m_meetOrSlice;
</del><ins>+    SVGPreserveAspectRatioType m_align { SVG_PRESERVEASPECTRATIO_XMIDYMID };
+    SVGMeetOrSliceType m_meetOrSlice { SVG_MEETORSLICE_MEET };
</ins><span class="cx"> 
</span><span class="cx">     template<typename CharacterType> bool parseInternal(StringParsingBuffer<CharacterType>&, bool validate);
</span><span class="cx"> };
</span><span class="lines">@@ -84,4 +88,59 @@
</span><span class="cx">     static String toString(const SVGPreserveAspectRatioValue& type) { return type.valueAsString(); }
</span><span class="cx"> };
</span><span class="cx"> 
</span><ins>+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);
+}
+
</ins><span class="cx"> } // namespace WebCore
</span><ins>+
+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
</ins></span></pre></div>
<a id="trunkSourceWebCoresvggraphicsfiltersSVGFEImagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/graphics/filters/SVGFEImage.cpp (286823 => 286824)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -61,6 +61,10 @@
</span><span class="cx">         },
</span><span class="cx">         [&] (const Ref<ImageBuffer>&) {
</span><span class="cx">             return primitiveSubregion;
</span><ins>+        },
+        [&] (RenderingResourceIdentifier) {
+            ASSERT_NOT_REACHED();
+            return FloatRect();
</ins><span class="cx">         }
</span><span class="cx">     );
</span><span class="cx">     return filter.clipToMaxEffectRect(imageRect, primitiveSubregion);
</span><span class="lines">@@ -101,6 +105,9 @@
</span><span class="cx">             imageRect.scale(filter.filterScale());
</span><span class="cx">             imageRect = IntRect(imageRect) - result.absoluteImageRect().location();
</span><span class="cx">             context.drawImageBuffer(imageBuffer, imageRect.location());
</span><ins>+        },
+        [&] (RenderingResourceIdentifier) {
+            ASSERT_NOT_REACHED();
</ins><span class="cx">         }
</span><span class="cx">     );
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoresvggraphicsfiltersSVGFEImageh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/graphics/filters/SVGFEImage.h (286823 => 286824)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -24,6 +24,7 @@
</span><span class="cx"> #pragma once
</span><span class="cx"> 
</span><span class="cx"> #include "FilterEffect.h"
</span><ins>+#include "Image.h"
</ins><span class="cx"> #include "SVGPreserveAspectRatioValue.h"
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="lines">@@ -33,10 +34,14 @@
</span><span class="cx"> 
</span><span class="cx"> class FEImage final : public FilterEffect {
</span><span class="cx"> public:
</span><del>-    using SourceImage = std::variant<Ref<Image>, Ref<ImageBuffer>>;
</del><ins>+    using SourceImage = std::variant<
+        Ref<Image>,
+        Ref<ImageBuffer>,
+        RenderingResourceIdentifier
+    >;
</ins><span class="cx"> 
</span><span class="cx">     static Ref<FEImage> create(Ref<Image>&&, const SVGPreserveAspectRatioValue&);
</span><del>-    static Ref<FEImage> create(SourceImage&&, const FloatRect& sourceImageRect, const SVGPreserveAspectRatioValue&);
</del><ins>+    WEBCORE_EXPORT static Ref<FEImage> create(SourceImage&&, const FloatRect& sourceImageRect, const SVGPreserveAspectRatioValue&);
</ins><span class="cx"> 
</span><span class="cx">     const SourceImage& sourceImage() const { return m_sourceImage; }
</span><span class="cx">     void setImageSource(SourceImage&& sourceImage) { m_sourceImage = WTFMove(sourceImage); }
</span><span class="lines">@@ -44,6 +49,9 @@
</span><span class="cx">     FloatRect sourceImageRect() const { return m_sourceImageRect; }
</span><span class="cx">     const SVGPreserveAspectRatioValue& preserveAspectRatio() const { return m_preserveAspectRatio; }
</span><span class="cx"> 
</span><ins>+    template<class Encoder> void encode(Encoder&) const;
+    template<class Decoder> static std::optional<Ref<FEImage>> decode(Decoder&);
+
</ins><span class="cx"> private:
</span><span class="cx">     FEImage(SourceImage&&, const FloatRect& sourceImageRect, const SVGPreserveAspectRatioValue&);
</span><span class="cx"> 
</span><span class="lines">@@ -63,6 +71,47 @@
</span><span class="cx">     SVGPreserveAspectRatioValue m_preserveAspectRatio;
</span><span class="cx"> };
</span><span class="cx"> 
</span><ins>+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);
+}
+
</ins><span class="cx"> } // namespace WebCore
</span><span class="cx"> 
</span><span class="cx"> SPECIALIZE_TYPE_TRAITS_FILTER_EFFECT(FEImage)
</span></span></pre></div>
<a id="trunkSourceWebCoresvggraphicsfiltersSVGFiltercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/graphics/filters/SVGFilter.cpp (286823 => 286824)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -117,6 +117,19 @@
</span><span class="cx">     return m_expression.last().effect.ptr();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+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);
+}
+
</ins><span class="cx"> RefPtr<FilterImage> SVGFilter::apply(const Filter&, FilterImage& sourceImage)
</span><span class="cx"> {
</span><span class="cx">     return apply(&sourceImage);
</span></span></pre></div>
<a id="trunkSourceWebCoresvggraphicsfiltersSVGFilterh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/graphics/filters/SVGFilter.h (286823 => 286824)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -47,6 +47,7 @@
</span><span class="cx">     const SVGFilterExpression& expression() const { return m_expression; }
</span><span class="cx">     
</span><span class="cx">     RefPtr<FilterEffect> lastEffect() const final;
</span><ins>+    FilterEffectVector effectsOfType(FilterFunction::Type) const final;
</ins><span class="cx"> 
</span><span class="cx">     RefPtr<FilterImage> apply(FilterImage* sourceImage) final;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKitChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/ChangeLog (286823 => 286824)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -1,3 +1,22 @@
</span><ins>+2021-12-09  Said Abou-Hallawa  <said@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):
+
</ins><span class="cx"> 2021-12-09  Aditya Keerthi  <akeerthi@apple.com>
</span><span class="cx"> 
</span><span class="cx">         [iOS] Add SPI to enable find interactions on WKWebView
</span></span></pre></div>
<a id="trunkSourceWebKitGPUProcessgraphicsRemoteDisplayListRecordercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/GPUProcess/graphics/RemoteDisplayListRecorder.cpp (286823 => 286824)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -29,6 +29,7 @@
</span><span class="cx"> #if ENABLE(GPU_PROCESS)
</span><span class="cx"> 
</span><span class="cx"> #include "RemoteDisplayListRecorderMessages.h"
</span><ins>+#include <WebCore/BitmapImage.h>
</ins><span class="cx"> 
</span><span class="cx"> namespace WebKit {
</span><span class="cx"> using namespace WebCore;
</span><span class="lines">@@ -234,6 +235,26 @@
</span><span class="cx"> 
</span><span class="cx">     auto filter = filterReference.takeFilter();
</span><span class="cx"> 
</span><ins>+    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;
+        }
+    }
+
</ins><span class="cx">     handleItem(DisplayList::DrawFilteredImageBuffer(sourceImageIdentifier, sourceImageRect, WTFMove(filter)), sourceImage.get());
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKitPlatformIPCFilterReferenceh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/Platform/IPC/FilterReference.h (286823 => 286824)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -44,6 +44,7 @@
</span><span class="cx"> #include <WebCore/FETurbulence.h>
</span><span class="cx"> #include <WebCore/Filter.h>
</span><span class="cx"> #include <WebCore/FilterEffectVector.h>
</span><ins>+#include <WebCore/SVGFEImage.h>
</ins><span class="cx"> #include <WebCore/SVGFilter.h>
</span><span class="cx"> #include <WebCore/SourceAlpha.h>
</span><span class="cx"> #include <WebCore/SourceGraphic.h>
</span><span class="lines">@@ -139,7 +140,7 @@
</span><span class="cx">         break;
</span><span class="cx"> 
</span><span class="cx">     case WebCore::FilterEffect::Type::FEImage:
</span><del>-        // FIXME: encode FEImage.
</del><ins>+        downcast<WebCore::FEImage>(effect).encode(encoder);
</ins><span class="cx">         break;
</span><span class="cx"> 
</span><span class="cx">     case WebCore::FilterEffect::Type::FEMerge:
</span><span class="lines">@@ -229,7 +230,7 @@
</span><span class="cx">         break;
</span><span class="cx"> 
</span><span class="cx">     case WebCore::FilterEffect::Type::FEImage:
</span><del>-        // FIXME: decode FEImage.
</del><ins>+        effect = WebCore::FEImage::decode(decoder);
</ins><span class="cx">         break;
</span><span class="cx"> 
</span><span class="cx">     case WebCore::FilterEffect::Type::FEMerge:
</span></span></pre>
</div>
</div>

</body>
</html>