Source/WebCore/ChangeLog

 12021-11-10 Said Abou-Hallawa <said@apple.com>
 2
 3 [GPU Process] Remove the reference to Filter from FilterEffect
 4 https://bugs.webkit.org/show_bug.cgi?id=232551
 5 rdar://85136447
 6
 7 Reviewed by NOBODY (OOPS!).
 8
 9 Instead of having a reference to the Filter in the FilterEffect, we are
 10 going to pass a reference to the Filter to the FilterEffect functions
 11 only when needed. FilterEffect may need access to the Filter only in two
 12 methods: determineAbsolutePaintRect() and platformApplySoftware().
 13
 14 We need to change all the FilterEffect create methods to not take a Filter
 15 as input. This requires the SVG filter effect elements to change their
 16 build() method. And it requires also CSSFilter to not pass itself to the
 17 FilterEffects its create.
 18
 19 * platform/graphics/coreimage/FilterEffectRendererCoreImage.h:
 20 * platform/graphics/coreimage/FilterEffectRendererCoreImage.mm:
 21 (WebCore::FilterEffectRendererCoreImage::applyEffects):
 22 (WebCore::FilterEffectRendererCoreImage::connectCIFilters):
 23 (WebCore::FilterEffectRendererCoreImage::imageForSourceGraphic):
 24 * platform/graphics/cpu/arm/filters/FEBlendNEON.h:
 25 (WebCore::FEBlend::platformApplySoftware):
 26 * platform/graphics/filters/FEBlend.cpp:
 27 (WebCore::FEBlend::create):
 28 (WebCore::FEBlend::FEBlend):
 29 (WebCore::FEBlend::platformApplySoftware):
 30 * platform/graphics/filters/FEBlend.h:
 31 * platform/graphics/filters/FEColorMatrix.cpp:
 32 (WebCore::FEColorMatrix::create):
 33 (WebCore::FEColorMatrix::FEColorMatrix):
 34 (WebCore::FEColorMatrix::platformApplySoftware):
 35 * platform/graphics/filters/FEColorMatrix.h:
 36 * platform/graphics/filters/FEComponentTransfer.cpp:
 37 (WebCore::FEComponentTransfer::create):
 38 (WebCore::FEComponentTransfer::FEComponentTransfer):
 39 (WebCore::FEComponentTransfer::platformApplySoftware):
 40 * platform/graphics/filters/FEComponentTransfer.h:
 41 * platform/graphics/filters/FEComposite.cpp:
 42 (WebCore::FEComposite::create):
 43 (WebCore::FEComposite::FEComposite):
 44 (WebCore::FEComposite::determineAbsolutePaintRect):
 45 (WebCore::FEComposite::platformApplySoftware):
 46 * platform/graphics/filters/FEComposite.h:
 47 * platform/graphics/filters/FEConvolveMatrix.cpp:
 48 (WebCore::FEConvolveMatrix::create):
 49 (WebCore::FEConvolveMatrix::FEConvolveMatrix):
 50 (WebCore::FEConvolveMatrix::platformApplySoftware):
 51 * platform/graphics/filters/FEConvolveMatrix.h:
 52 * platform/graphics/filters/FEDiffuseLighting.cpp:
 53 (WebCore::FEDiffuseLighting::create):
 54 (WebCore::FEDiffuseLighting::FEDiffuseLighting):
 55 * platform/graphics/filters/FEDiffuseLighting.h:
 56 * platform/graphics/filters/FEDisplacementMap.cpp:
 57 (WebCore::FEDisplacementMap::create):
 58 (WebCore::FEDisplacementMap::FEDisplacementMap):
 59 (WebCore::FEDisplacementMap::platformApplySoftware):
 60 * platform/graphics/filters/FEDisplacementMap.h:
 61 * platform/graphics/filters/FEDropShadow.cpp:
 62 (WebCore::FEDropShadow::create):
 63 (WebCore::FEDropShadow::FEDropShadow):
 64 (WebCore::FEDropShadow::determineAbsolutePaintRect):
 65 (WebCore::FEDropShadow::platformApplySoftware):
 66 * platform/graphics/filters/FEDropShadow.h:
 67 * platform/graphics/filters/FEFlood.cpp:
 68 (WebCore::FEFlood::create):
 69 (WebCore::FEFlood::FEFlood):
 70 (WebCore::FEFlood::platformApplySoftware):
 71 * platform/graphics/filters/FEFlood.h:
 72 * platform/graphics/filters/FEGaussianBlur.cpp:
 73 (WebCore::FEGaussianBlur::create):
 74 (WebCore::FEGaussianBlur::FEGaussianBlur):
 75 (WebCore::FEGaussianBlur::determineAbsolutePaintRect):
 76 (WebCore::FEGaussianBlur::platformApplySoftware):
 77 * platform/graphics/filters/FEGaussianBlur.h:
 78 * platform/graphics/filters/FELighting.cpp:
 79 (WebCore::FELighting::FELighting):
 80 (WebCore::FELighting::platformApplySoftware):
 81 * platform/graphics/filters/FELighting.h:
 82 * platform/graphics/filters/FEMerge.cpp:
 83 (WebCore::FEMerge::create):
 84 (WebCore::FEMerge::FEMerge):
 85 (WebCore::FEMerge::platformApplySoftware):
 86 * platform/graphics/filters/FEMerge.h:
 87 * platform/graphics/filters/FEMorphology.cpp:
 88 (WebCore::FEMorphology::create):
 89 (WebCore::FEMorphology::FEMorphology):
 90 (WebCore::FEMorphology::determineAbsolutePaintRect):
 91 (WebCore::FEMorphology::platformApplySoftware):
 92 * platform/graphics/filters/FEMorphology.h:
 93 * platform/graphics/filters/FEOffset.cpp:
 94 (WebCore::FEOffset::create):
 95 (WebCore::FEOffset::FEOffset):
 96 (WebCore::FEOffset::determineAbsolutePaintRect):
 97 (WebCore::FEOffset::platformApplySoftware):
 98 * platform/graphics/filters/FEOffset.h:
 99 * platform/graphics/filters/FESpecularLighting.cpp:
 100 (WebCore::FESpecularLighting::create):
 101 (WebCore::FESpecularLighting::FESpecularLighting):
 102 * platform/graphics/filters/FESpecularLighting.h:
 103 * platform/graphics/filters/FETile.cpp:
 104 (WebCore::FETile::create):
 105 (WebCore::FETile::FETile):
 106 (WebCore::FETile::platformApplySoftware):
 107 * platform/graphics/filters/FETile.h:
 108 * platform/graphics/filters/FETurbulence.cpp:
 109 (WebCore::FETurbulence::create):
 110 (WebCore::FETurbulence::FETurbulence):
 111 (WebCore::FETurbulence::fillRegion const):
 112 (WebCore::FETurbulence::fillRegionWorker):
 113 (WebCore::FETurbulence::platformApplySoftware):
 114 * platform/graphics/filters/FETurbulence.h:
 115 * platform/graphics/filters/Filter.h:
 116 (WebCore::Filter::sourceImage const):
 117 (WebCore::Filter::sourceImage): Deleted.
 118
 119 * platform/graphics/filters/FilterEffect.cpp:
 120 (WebCore::FilterEffect::FilterEffect):
 121 (WebCore::FilterEffect::determineAbsolutePaintRect):
 122 (WebCore::FilterEffect::determineFilterPrimitiveSubregion):
 123 (WebCore::FilterEffect::apply):
 124 (WebCore::FilterEffect::imageBufferResult):
 125 (WebCore::FilterEffect::convertPixelBufferToColorSpace):
 126 (WebCore::FilterEffect::convertImageBufferToColorSpace):
 127 (WebCore::FilterEffect::createImageBufferResult):
 128 * platform/graphics/filters/FilterEffect.h:
 129 (WebCore::FilterEffect::filter): Deleted.
 130 (WebCore::FilterEffect::filter const): Deleted.
 131 Create a unaccelerated filter image result for now. This will be fixed
 132 in the following patch. Anyway currently we never create accelerated
 133 intermediate ImageBuffers for filters.
 134
 135 * platform/graphics/filters/FilterEffectRenderer.h:
 136 * platform/graphics/filters/SourceAlpha.cpp:
 137 (WebCore::SourceAlpha::SourceAlpha):
 138 (WebCore::SourceAlpha::determineAbsolutePaintRect):
 139 (WebCore::SourceAlpha::platformApplySoftware):
 140 * platform/graphics/filters/SourceAlpha.h:
 141 * platform/graphics/filters/SourceGraphic.cpp:
 142 (WebCore::SourceGraphic::create):
 143 (WebCore::SourceGraphic::SourceGraphic):
 144 (WebCore::SourceGraphic::determineAbsolutePaintRect):
 145 (WebCore::SourceGraphic::platformApplySoftware):
 146 * platform/graphics/filters/SourceGraphic.h:
 147 (WebCore::SourceGraphic::SourceGraphic): Deleted.
 148 * rendering/CSSFilter.cpp:
 149 (WebCore::createBlurEffect):
 150 (WebCore::createBrightnessEffect):
 151 (WebCore::createContrastEffect):
 152 (WebCore::createDropShadowEffect):
 153 (WebCore::createGrayScaleEffect):
 154 (WebCore::createHueRotateEffect):
 155 (WebCore::createInvertEffect):
 156 (WebCore::createOpacityEffect):
 157 (WebCore::createSaturateEffect):
 158 (WebCore::createSepiaEffect):
 159 (WebCore::CSSFilter::buildFilterFunctions):
 160 (WebCore::CSSFilter::determineFilterPrimitiveSubregion):
 161 (WebCore::CSSFilter::apply):
 162 * rendering/CSSFilter.h:
 163 Apply the FilterFunctions of the CSSFilter in the forward direction.
 164
 165 * rendering/svg/RenderSVGResourceFilter.cpp:
 166 (WebCore::RenderSVGResourceFilter::applyResource):
 167 (WebCore::RenderSVGResourceFilter::postApplyResource):
 168
 169 * svg/SVGFEBlendElement.cpp:
 170 (WebCore::SVGFEBlendElement::build const):
 171 * svg/SVGFEBlendElement.h:
 172 * svg/SVGFEColorMatrixElement.cpp:
 173 (WebCore::SVGFEColorMatrixElement::build const):
 174 * svg/SVGFEColorMatrixElement.h:
 175 * svg/SVGFEComponentTransferElement.cpp:
 176 (WebCore::SVGFEComponentTransferElement::build const):
 177 * svg/SVGFEComponentTransferElement.h:
 178 * svg/SVGFECompositeElement.cpp:
 179 (WebCore::SVGFECompositeElement::build const):
 180 * svg/SVGFECompositeElement.h:
 181 * svg/SVGFEConvolveMatrixElement.cpp:
 182 (WebCore::SVGFEConvolveMatrixElement::build const):
 183 * svg/SVGFEConvolveMatrixElement.h:
 184 * svg/SVGFEDiffuseLightingElement.cpp:
 185 (WebCore::SVGFEDiffuseLightingElement::build const):
 186 * svg/SVGFEDiffuseLightingElement.h:
 187 * svg/SVGFEDisplacementMapElement.cpp:
 188 (WebCore::SVGFEDisplacementMapElement::build const):
 189 * svg/SVGFEDisplacementMapElement.h:
 190 * svg/SVGFEDropShadowElement.cpp:
 191 (WebCore::SVGFEDropShadowElement::build const):
 192 * svg/SVGFEDropShadowElement.h:
 193 * svg/SVGFEFloodElement.cpp:
 194 (WebCore::SVGFEFloodElement::build const):
 195 * svg/SVGFEFloodElement.h:
 196 * svg/SVGFEGaussianBlurElement.cpp:
 197 (WebCore::SVGFEGaussianBlurElement::build const):
 198 * svg/SVGFEGaussianBlurElement.h:
 199 * svg/SVGFEImageElement.cpp:
 200 (WebCore::SVGFEImageElement::build const):
 201 * svg/SVGFEImageElement.h:
 202 * svg/SVGFEMergeElement.cpp:
 203 (WebCore::SVGFEMergeElement::build const):
 204 * svg/SVGFEMergeElement.h:
 205 * svg/SVGFEMorphologyElement.cpp:
 206 (WebCore::SVGFEMorphologyElement::build const):
 207 * svg/SVGFEMorphologyElement.h:
 208 * svg/SVGFEOffsetElement.cpp:
 209 (WebCore::SVGFEOffsetElement::build const):
 210 * svg/SVGFEOffsetElement.h:
 211 * svg/SVGFESpecularLightingElement.cpp:
 212 (WebCore::SVGFESpecularLightingElement::build const):
 213 * svg/SVGFESpecularLightingElement.h:
 214 * svg/SVGFETileElement.cpp:
 215 (WebCore::SVGFETileElement::build const):
 216 * svg/SVGFETileElement.h:
 217 * svg/SVGFETurbulenceElement.cpp:
 218 (WebCore::SVGFETurbulenceElement::build const):
 219 * svg/SVGFETurbulenceElement.h:
 220 * svg/SVGFilterPrimitiveStandardAttributes.h:
 221 Remove the Filter as an input to the build() method and pass a reference
 222 to SVGFilterBuilder instead of passing a pointer.
 223
 224 * svg/graphics/filters/SVGFEImage.cpp:
 225 (WebCore::FEImage::create):
 226 (WebCore::FEImage::FEImage):
 227 (WebCore::FEImage::determineAbsolutePaintRect):
 228 (WebCore::FEImage::platformApplySoftware):
 229 * svg/graphics/filters/SVGFEImage.h:
 230 * svg/graphics/filters/SVGFilter.cpp:
 231 (WebCore::SVGFilter::create):
 232 (WebCore::SVGFilter::apply):
 233 * svg/graphics/filters/SVGFilter.h:
 234 * svg/graphics/filters/SVGFilterBuilder.cpp:
 235 (WebCore::SVGFilterBuilder::buildFilterEffects):
 236 * svg/graphics/filters/SVGFilterBuilder.h:
 237
12382021-11-10 Said Abou-Hallawa <said@apple.com>
2239
3240 [GPU Process] Make CSSFilter be a composite of FilterFunctions

Source/WebCore/platform/graphics/coreimage/FilterEffectRendererCoreImage.h

@@class FilterEffectRendererCoreImage : public FilterEffectRenderer {
4747public:
4848 static std::unique_ptr<FilterEffectRendererCoreImage> tryCreate(FilterEffect&);
4949 RetainPtr<CIContext> sharedCIContext();
50  void applyEffects(FilterEffect&) final;
 50 void applyEffects(const Filter&, FilterEffect&) final;
5151 bool hasResult() const final { return m_outputImage; }
5252 ImageBuffer* output() const final;
5353 FloatRect destRect(const FilterEffect&) const final;

@@public:
5555 FilterEffectRendererCoreImage();
5656
5757private:
58  RetainPtr<CIImage> connectCIFilters(FilterEffect&);
 58 RetainPtr<CIImage> connectCIFilters(const Filter&, FilterEffect&);
5959 void renderToImageBuffer(FilterEffect&) final;
6060 static bool supportsCoreImageRendering(FilterEffect&);
6161 static bool canRenderUsingCIFilters(FilterEffect&);
6262
63  RetainPtr<CIImage> imageForSourceGraphic(SourceGraphic&);
 63 RetainPtr<CIImage> imageForSourceGraphic(const Filter&);
6464 RetainPtr<CIImage> imageForFEColorMatrix(const FEColorMatrix&, const Vector<RetainPtr<CIImage>>&);
6565 RetainPtr<CIImage> imageForFEComponentTransfer(const FEComponentTransfer&, Vector<RetainPtr<CIImage>>&);
6666

Source/WebCore/platform/graphics/coreimage/FilterEffectRendererCoreImage.mm

@@bool FilterEffectRendererCoreImage::supportsCoreImageRendering(FilterEffect& eff
9797 return false;
9898}
9999
100 void FilterEffectRendererCoreImage::applyEffects(FilterEffect& lastEffect)
 100void FilterEffectRendererCoreImage::applyEffects(const Filter& filter, FilterEffect& lastEffect)
101101{
102  m_outputImage = connectCIFilters(lastEffect);
 102 m_outputImage = connectCIFilters(filter, lastEffect);
103103 if (!m_outputImage)
104104 return;
105105 renderToImageBuffer(lastEffect);
106106}
107107
108 RetainPtr<CIImage> FilterEffectRendererCoreImage::connectCIFilters(FilterEffect& effect)
 108RetainPtr<CIImage> FilterEffectRendererCoreImage::connectCIFilters(const Filter& filter, FilterEffect& effect)
109109{
110110 Vector<RetainPtr<CIImage>> inputImages;
111111
112112 for (auto in : effect.inputEffects()) {
113  auto inputImage = connectCIFilters(*in);
 113 auto inputImage = connectCIFilters(filter, *in);
114114 if (!inputImage)
115115 return nullptr;
116116 inputImages.append(inputImage);
117117 }
118  effect.determineAbsolutePaintRect();
 118 effect.determineAbsolutePaintRect(filter);
119119 effect.setResultColorSpace(effect.operatingColorSpace());
120120
121121 if (effect.absolutePaintRect().isEmpty() || ImageBuffer::sizeNeedsClamping(effect.absolutePaintRect().size()))

@@RetainPtr<CIImage> FilterEffectRendererCoreImage::connectCIFilters(FilterEffect&
123123
124124 switch (effect.filterType()) {
125125 case FilterEffect::Type::SourceGraphic:
126  return imageForSourceGraphic(downcast<SourceGraphic>(effect));
 126 return imageForSourceGraphic(filter);
127127 case FilterEffect::Type::FEColorMatrix:
128128 return imageForFEColorMatrix(downcast<FEColorMatrix>(effect), inputImages);
129129 case FilterEffect::Type::FEComponentTransfer:

@@RetainPtr<CIImage> FilterEffectRendererCoreImage::connectCIFilters(FilterEffect&
135135 return nullptr;
136136}
137137
138 RetainPtr<CIImage> FilterEffectRendererCoreImage::imageForSourceGraphic(SourceGraphic& effect)
 138RetainPtr<CIImage> FilterEffectRendererCoreImage::imageForSourceGraphic(const Filter& filter)
139139{
140  ImageBuffer* sourceImage = effect.filter().sourceImage();
 140 ImageBuffer* sourceImage = filter.sourceImage();
141141 if (!sourceImage)
142142 return nullptr;
143143

Source/WebCore/platform/graphics/cpu/arm/filters/FEBlendNEON.h

2525 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2626 */
2727
28 #ifndef FEBlendNEON_h
29 #define FEBlendNEON_h
 28#pragma once
3029
3130#if HAVE(ARM_NEON_INTRINSICS)
3231

@@public:
107106 }
108107};
109108
110 void FEBlend::platformApplySoftware()
 109void FEBlend::platformApplySoftware(const Filter&)
111110{
112111 FilterEffect* in = inputEffect(0);
113112 FilterEffect* in2 = inputEffect(1);

@@void FEBlend::platformApplyNEON(unsigned char* srcPixelArrayA, unsigned char* sr
205204} // namespace WebCore
206205
207206#endif // HAVE(ARM_NEON_INTRINSICS)
208 
209 #endif // FEBlendNEON_h

Source/WebCore/platform/graphics/filters/FEBlend.cpp

2626#include "FEBlend.h"
2727
2828#include "FEBlendNEON.h"
29 #include "Filter.h"
3029#include "FloatPoint.h"
3130#include "GraphicsContext.h"
 31#include "ImageBuffer.h"
3232#include <JavaScriptCore/Uint8ClampedArray.h>
3333#include <wtf/text/TextStream.h>
3434
3535namespace WebCore {
3636
37 FEBlend::FEBlend(Filter& filter, BlendMode mode)
38  : FilterEffect(filter, FilterEffect::Type::FEBlend)
39  , m_mode(mode)
 37Ref<FEBlend> FEBlend::create(BlendMode mode)
4038{
 39 return adoptRef(*new FEBlend(mode));
4140}
4241
43 Ref<FEBlend> FEBlend::create(Filter& filter, BlendMode mode)
 42FEBlend::FEBlend(BlendMode mode)
 43 : FilterEffect(FilterEffect::Type::FEBlend)
 44 , m_mode(mode)
4445{
45  return adoptRef(*new FEBlend(filter, mode));
4646}
4747
4848bool FEBlend::setBlendMode(BlendMode mode)

@@bool FEBlend::setBlendMode(BlendMode mode)
5454}
5555
5656#if !HAVE(ARM_NEON_INTRINSICS)
57 void FEBlend::platformApplySoftware()
 57void FEBlend::platformApplySoftware(const Filter&)
5858{
5959 FilterEffect* in = inputEffect(0);
6060 FilterEffect* in2 = inputEffect(1);

Source/WebCore/platform/graphics/filters/FEBlend.h

2323#pragma once
2424
2525#include "FilterEffect.h"
26 
27 #include "Filter.h"
 26#include "GraphicsTypes.h"
2827
2928namespace WebCore {
3029
3130class FEBlend : public FilterEffect {
3231public:
33  static Ref<FEBlend> create(Filter&, BlendMode);
 32 static Ref<FEBlend> create(BlendMode);
3433
3534 BlendMode blendMode() const { return m_mode; }
3635 bool setBlendMode(BlendMode);
3736
3837private:
39  void platformApplySoftware() override;
 38 FEBlend(BlendMode);
 39
 40 void platformApplySoftware(const Filter&) override;
4041 void platformApplyGeneric(unsigned char* srcPixelArrayA, unsigned char* srcPixelArrayB, unsigned char* dstPixelArray,
4142 unsigned colorArrayLength);
4243 void platformApplyNEON(unsigned char* srcPixelArrayA, unsigned char* srcPixelArrayB, unsigned char* dstPixelArray,

@@private:
4445
4546 WTF::TextStream& externalRepresentation(WTF::TextStream&, RepresentationType) const override;
4647
47  FEBlend(Filter&, BlendMode);
48 
4948 BlendMode m_mode;
5049};
5150

Source/WebCore/platform/graphics/filters/FEColorMatrix.cpp

2323#include "config.h"
2424#include "FEColorMatrix.h"
2525
26 #include "Filter.h"
2726#include "GraphicsContext.h"
 27#include "ImageBuffer.h"
2828#include "PixelBuffer.h"
2929#include <wtf/MathExtras.h>
3030#include <wtf/text/TextStream.h>

3535
3636namespace WebCore {
3737
38 FEColorMatrix::FEColorMatrix(Filter& filter, ColorMatrixType type, Vector<float>&& values)
39  : FilterEffect(filter, FilterEffect::Type::FEColorMatrix)
40  , m_type(type)
41  , m_values(WTFMove(values))
 38Ref<FEColorMatrix> FEColorMatrix::create(ColorMatrixType type, Vector<float>&& values)
4239{
 40 return adoptRef(*new FEColorMatrix(type, WTFMove(values)));
4341}
4442
45 Ref<FEColorMatrix> FEColorMatrix::create(Filter& filter, ColorMatrixType type, Vector<float>&& values)
 43FEColorMatrix::FEColorMatrix(ColorMatrixType type, Vector<float>&& values)
 44 : FilterEffect(FilterEffect::Type::FEColorMatrix)
 45 , m_type(type)
 46 , m_values(WTFMove(values))
4647{
47  return adoptRef(*new FEColorMatrix(filter, type, WTFMove(values)));
4848}
4949
5050bool FEColorMatrix::setType(ColorMatrixType type)

@@void effectType(Uint8ClampedArray& pixelArray, const Vector<float>& values, IntS
273273 }
274274}
275275
276 void FEColorMatrix::platformApplySoftware()
 276void FEColorMatrix::platformApplySoftware(const Filter&)
277277{
278278 FilterEffect* in = inputEffect(0);
279279

Source/WebCore/platform/graphics/filters/FEColorMatrix.h

2222#pragma once
2323
2424#include "FilterEffect.h"
25 
26 #include "Filter.h"
2725#include <wtf/Vector.h>
2826
2927namespace WebCore {

@@enum ColorMatrixType {
3836
3937class FEColorMatrix : public FilterEffect {
4038public:
41  static Ref<FEColorMatrix> create(Filter&, ColorMatrixType, Vector<float>&&);
 39 static Ref<FEColorMatrix> create(ColorMatrixType, Vector<float>&&);
4240
4341 ColorMatrixType type() const { return m_type; }
4442 bool setType(ColorMatrixType);

@@public:
5048 static inline void calculateHueRotateComponents(float* components, float value);
5149
5250private:
53  FEColorMatrix(Filter&, ColorMatrixType, Vector<float>&&);
 51 FEColorMatrix(ColorMatrixType, Vector<float>&&);
5452
55  void platformApplySoftware() override;
 53 void platformApplySoftware(const Filter&) override;
5654
5755 WTF::TextStream& externalRepresentation(WTF::TextStream&, RepresentationType) const override;
5856

Source/WebCore/platform/graphics/filters/FEComponentTransfer.cpp

2424#include "config.h"
2525#include "FEComponentTransfer.h"
2626
27 #include "Filter.h"
2827#include "GraphicsContext.h"
2928#include "PixelBuffer.h"
3029#include <wtf/MathExtras.h>

3332
3433namespace WebCore {
3534
36 FEComponentTransfer::FEComponentTransfer(Filter& filter, const ComponentTransferFunction& redFunction, const ComponentTransferFunction& greenFunction, const ComponentTransferFunction& blueFunction, const ComponentTransferFunction& alphaFunction)
37  : FilterEffect(filter, FilterEffect::Type::FEComponentTransfer)
 35Ref<FEComponentTransfer> FEComponentTransfer::create(const ComponentTransferFunction& redFunction, const ComponentTransferFunction& greenFunction, const ComponentTransferFunction& blueFunction, const ComponentTransferFunction& alphaFunction)
 36{
 37 return adoptRef(*new FEComponentTransfer(redFunction, greenFunction, blueFunction, alphaFunction));
 38}
 39
 40FEComponentTransfer::FEComponentTransfer(const ComponentTransferFunction& redFunction, const ComponentTransferFunction& greenFunction, const ComponentTransferFunction& blueFunction, const ComponentTransferFunction& alphaFunction)
 41 : FilterEffect(FilterEffect::Type::FEComponentTransfer)
3842 , m_redFunction(redFunction)
3943 , m_greenFunction(greenFunction)
4044 , m_blueFunction(blueFunction)

@@FEComponentTransfer::FEComponentTransfer(Filter& filter, const ComponentTransfer
4246{
4347}
4448
45 Ref<FEComponentTransfer> FEComponentTransfer::create(Filter& filter, const ComponentTransferFunction& redFunction,
46  const ComponentTransferFunction& greenFunction, const ComponentTransferFunction& blueFunction, const ComponentTransferFunction& alphaFunction)
47 {
48  return adoptRef(*new FEComponentTransfer(filter, redFunction, greenFunction, blueFunction, alphaFunction));
49 }
50 
5149void FEComponentTransfer::computeIdentityTable(LookupTable&, const ComponentTransferFunction&)
5250{
5351}

@@void FEComponentTransfer::computeGammaTable(LookupTable& values, const Component
103101 }
104102}
105103
106 void FEComponentTransfer::platformApplySoftware()
 104void FEComponentTransfer::platformApplySoftware(const Filter&)
107105{
108106 FilterEffect* in = inputEffect(0);
109107

Source/WebCore/platform/graphics/filters/FEComponentTransfer.h

2222#pragma once
2323
2424#include "FilterEffect.h"
25 
26 #include "Filter.h"
2725#include <wtf/Vector.h>
2826
2927namespace WebCore {

@@struct ComponentTransferFunction {
5351
5452class FEComponentTransfer : public FilterEffect {
5553public:
56  static Ref<FEComponentTransfer> create(Filter&, const ComponentTransferFunction& redFunc, const ComponentTransferFunction& greenFunc,
57  const ComponentTransferFunction& blueFunc, const ComponentTransferFunction& alphaFunc);
 54 static Ref<FEComponentTransfer> create(const ComponentTransferFunction& redFunc, const ComponentTransferFunction& greenFunc, const ComponentTransferFunction& blueFunc, const ComponentTransferFunction& alphaFunc);
5855
5956 ComponentTransferFunction redFunction() const { return m_redFunction; }
6057 ComponentTransferFunction greenFunction() const { return m_greenFunction; }

@@public:
6259 ComponentTransferFunction alphaFunction() const { return m_alphaFunction; }
6360
6461private:
65  FEComponentTransfer(Filter&, const ComponentTransferFunction& redFunc, const ComponentTransferFunction& greenFunc,
66  const ComponentTransferFunction& blueFunc, const ComponentTransferFunction& alphaFunc);
 62 FEComponentTransfer(const ComponentTransferFunction& redFunc, const ComponentTransferFunction& greenFunc, const ComponentTransferFunction& blueFunc, const ComponentTransferFunction& alphaFunc);
6763
6864 using LookupTable = std::array<uint8_t, 256>;
6965

@@private:
7571
7672 void computeLookupTables(LookupTable& redTable, LookupTable& greenTable, LookupTable& blueTable, LookupTable& alphaTable);
7773
78  void platformApplySoftware() override;
 74 void platformApplySoftware(const Filter&) override;
7975
8076 WTF::TextStream& externalRepresentation(WTF::TextStream&, RepresentationType) const override;
8177

Source/WebCore/platform/graphics/filters/FEComposite.cpp

2525#include "FEComposite.h"
2626
2727#include "FECompositeArithmeticNEON.h"
28 #include "Filter.h"
2928#include "GraphicsContext.h"
 29#include "ImageBuffer.h"
3030#include "PixelBuffer.h"
3131#include <wtf/text/TextStream.h>
3232
3333namespace WebCore {
3434
35 FEComposite::FEComposite(Filter& filter, const CompositeOperationType& type, float k1, float k2, float k3, float k4)
36  : FilterEffect(filter, FilterEffect::Type::FEComposite)
 35Ref<FEComposite> FEComposite::create(const CompositeOperationType& type, float k1, float k2, float k3, float k4)
 36{
 37 return adoptRef(*new FEComposite(type, k1, k2, k3, k4));
 38}
 39
 40FEComposite::FEComposite(const CompositeOperationType& type, float k1, float k2, float k3, float k4)
 41 : FilterEffect(FilterEffect::Type::FEComposite)
3742 , m_type(type)
3843 , m_k1(k1)
3944 , m_k2(k2)

@@FEComposite::FEComposite(Filter& filter, const CompositeOperationType& type, flo
4247{
4348}
4449
45 Ref<FEComposite> FEComposite::create(Filter& filter, const CompositeOperationType& type, float k1, float k2, float k3, float k4)
46 {
47  return adoptRef(*new FEComposite(filter, type, k1, k2, k3, k4));
48 }
49 
5050bool FEComposite::setOperation(CompositeOperationType type)
5151{
5252 if (m_type == type)

@@inline void FEComposite::platformArithmeticSoftware(const Uint8ClampedArray& sou
201201#endif
202202}
203203
204 void FEComposite::determineAbsolutePaintRect()
 204void FEComposite::determineAbsolutePaintRect(const Filter& filter)
205205{
206206 switch (m_type) {
207207 case FECOMPOSITE_OPERATOR_IN:

@@void FEComposite::determineAbsolutePaintRect()
218218 return;
219219 default:
220220 // Take the union of both input effects.
221  FilterEffect::determineAbsolutePaintRect();
 221 FilterEffect::determineAbsolutePaintRect(filter);
222222 return;
223223 }
224224}
225225
226 void FEComposite::platformApplySoftware()
 226void FEComposite::platformApplySoftware(const Filter&)
227227{
228228 FilterEffect* in = inputEffect(0);
229229 FilterEffect* in2 = inputEffect(1);

Source/WebCore/platform/graphics/filters/FEComposite.h

2222#pragma once
2323
2424#include "FilterEffect.h"
25 
26 #include "Filter.h"
2725#include <wtf/text/WTFString.h>
2826
2927namespace WebCore {

@@enum CompositeOperationType {
4139
4240class FEComposite : public FilterEffect {
4341public:
44  static Ref<FEComposite> create(Filter&, const CompositeOperationType&, float, float, float, float);
 42 static Ref<FEComposite> create(const CompositeOperationType&, float k1, float k2, float k3, float k4);
4543
4644 CompositeOperationType operation() const { return m_type; }
4745 bool setOperation(CompositeOperationType);

@@public:
5856 float k4() const { return m_k4; }
5957 bool setK4(float);
6058
61 protected:
62  bool requiresValidPreMultipliedPixels() override { return m_type != FECOMPOSITE_OPERATOR_ARITHMETIC; }
63 
6459private:
65  FEComposite(Filter&, const CompositeOperationType&, float, float, float, float);
 60 FEComposite(const CompositeOperationType&, float k1, float k2, float k3, float k4);
6661
6762 void correctFilterResultIfNeeded() override;
68  void determineAbsolutePaintRect() override;
6963
70  void platformApplySoftware() override;
 64 bool requiresValidPreMultipliedPixels() override { return m_type != FECOMPOSITE_OPERATOR_ARITHMETIC; }
 65
 66 void determineAbsolutePaintRect(const Filter&) override;
 67
 68 void platformApplySoftware(const Filter&) override;
 69
7170 WTF::TextStream& externalRepresentation(WTF::TextStream&, RepresentationType) const override;
7271
7372 inline void platformArithmeticSoftware(const Uint8ClampedArray& source, Uint8ClampedArray& destination, float k1, float k2, float k3, float k4);

Source/WebCore/platform/graphics/filters/FEConvolveMatrix.cpp

2424#include "config.h"
2525#include "FEConvolveMatrix.h"
2626
27 #include "Filter.h"
2827#include "PixelBuffer.h"
2928#include <wtf/ParallelJobs.h>
3029#include <wtf/WorkQueue.h>

3231
3332namespace WebCore {
3433
35 FEConvolveMatrix::FEConvolveMatrix(Filter& filter, const IntSize& kernelSize, float divisor, float bias, const IntPoint& targetOffset, EdgeModeType edgeMode, const FloatPoint& kernelUnitLength, bool preserveAlpha, const Vector<float>& kernelMatrix)
36  : FilterEffect(filter, FilterEffect::Type::FEConvolveMatrix)
 34Ref<FEConvolveMatrix> FEConvolveMatrix::create(const IntSize& kernelSize, float divisor, float bias, const IntPoint& targetOffset, EdgeModeType edgeMode, const FloatPoint& kernelUnitLength, bool preserveAlpha, const Vector<float>& kernelMatrix)
 35{
 36 return adoptRef(*new FEConvolveMatrix(kernelSize, divisor, bias, targetOffset, edgeMode, kernelUnitLength, preserveAlpha, kernelMatrix));
 37}
 38
 39FEConvolveMatrix::FEConvolveMatrix(const IntSize& kernelSize, float divisor, float bias, const IntPoint& targetOffset, EdgeModeType edgeMode, const FloatPoint& kernelUnitLength, bool preserveAlpha, const Vector<float>& kernelMatrix)
 40 : FilterEffect(FilterEffect::Type::FEConvolveMatrix)
3741 , m_kernelSize(kernelSize)
3842 , m_divisor(divisor)
3943 , m_bias(bias)

@@FEConvolveMatrix::FEConvolveMatrix(Filter& filter, const IntSize& kernelSize, fl
4751 ASSERT(m_kernelSize.height() > 0);
4852}
4953
50 Ref<FEConvolveMatrix> FEConvolveMatrix::create(Filter& filter, const IntSize& kernelSize,
51  float divisor, float bias, const IntPoint& targetOffset, EdgeModeType edgeMode,
52  const FloatPoint& kernelUnitLength, bool preserveAlpha, const Vector<float>& kernelMatrix)
53 {
54  return adoptRef(*new FEConvolveMatrix(filter, kernelSize, divisor, bias, targetOffset, edgeMode, kernelUnitLength,
55  preserveAlpha, kernelMatrix));
56 }
57 
5854void FEConvolveMatrix::setKernelSize(const IntSize& kernelSize)
5955{
6056 ASSERT(kernelSize.width() > 0);

@@ALWAYS_INLINE void FEConvolveMatrix::setOuterPixels(PaintingData& paintingData,
365361 fastSetOuterPixels<false>(paintingData, x1, y1, x2, y2);
366362}
367363
368 void FEConvolveMatrix::platformApplySoftware()
 364void FEConvolveMatrix::platformApplySoftware(const Filter&)
369365{
370366 FilterEffect* in = inputEffect(0);
371367

Source/WebCore/platform/graphics/filters/FEConvolveMatrix.h

2424
2525#include "FilterEffect.h"
2626#include "FloatPoint.h"
27 #include "Filter.h"
2827#include <wtf/Vector.h>
2928
3029namespace WebCore {

@@enum EdgeModeType {
3837
3938class FEConvolveMatrix : public FilterEffect {
4039public:
41  static Ref<FEConvolveMatrix> create(Filter&, const IntSize&,
42  float, float, const IntPoint&, EdgeModeType, const FloatPoint&,
43  bool, const Vector<float>&);
 40 static Ref<FEConvolveMatrix> create(const IntSize& kernelSize, float divisor, float bias, const IntPoint& targetOffset, EdgeModeType, const FloatPoint& kernelUnitLength, bool preserveAlpha, const Vector<float>& kernelMatrix);
4441
4542 IntSize kernelSize() const { return m_kernelSize; }
4643 void setKernelSize(const IntSize&);

@@private:
7774 Vector<float> kernelMatrix;
7875 };
7976
80  FEConvolveMatrix(Filter&, const IntSize&, float, float,
81  const IntPoint&, EdgeModeType, const FloatPoint&, bool, const Vector<float>&);
 77 FEConvolveMatrix(const IntSize& kernelSize, float divisor, float bias, const IntPoint& targetOffset, EdgeModeType, const FloatPoint& kernelUnitLength, bool preserveAlpha, const Vector<float>& kernelMatrix);
8278
83  void determineAbsolutePaintRect() override { setAbsolutePaintRect(enclosingIntRect(maxEffectRect())); }
 79 void determineAbsolutePaintRect(const Filter&) override { setAbsolutePaintRect(enclosingIntRect(maxEffectRect())); }
8480
85  void platformApplySoftware() override;
 81 void platformApplySoftware(const Filter&) override;
8682
8783 WTF::TextStream& externalRepresentation(WTF::TextStream&, RepresentationType) const override;
8884

Source/WebCore/platform/graphics/filters/FEDiffuseLighting.cpp

2727
2828namespace WebCore {
2929
30 FEDiffuseLighting::FEDiffuseLighting(Filter& filter, const Color& lightingColor, float surfaceScale, float diffuseConstant, float kernelUnitLengthX, float kernelUnitLengthY, Ref<LightSource>&& lightSource)
31  : FELighting(filter, DiffuseLighting, lightingColor, surfaceScale, diffuseConstant, 0, 0, kernelUnitLengthX, kernelUnitLengthY, WTFMove(lightSource), FilterEffect::Type::FEDiffuseLighting)
 30Ref<FEDiffuseLighting> FEDiffuseLighting::create(const Color& lightingColor, float surfaceScale, float diffuseConstant, float kernelUnitLengthX, float kernelUnitLengthY, Ref<LightSource>&& lightSource)
3231{
 32 return adoptRef(*new FEDiffuseLighting(lightingColor, surfaceScale, diffuseConstant, kernelUnitLengthX, kernelUnitLengthY, WTFMove(lightSource)));
3333}
3434
35 Ref<FEDiffuseLighting> FEDiffuseLighting::create(Filter& filter, const Color& lightingColor, float surfaceScale, float diffuseConstant, float kernelUnitLengthX, float kernelUnitLengthY, Ref<LightSource>&& lightSource)
 35FEDiffuseLighting::FEDiffuseLighting(const Color& lightingColor, float surfaceScale, float diffuseConstant, float kernelUnitLengthX, float kernelUnitLengthY, Ref<LightSource>&& lightSource)
 36 : FELighting(DiffuseLighting, lightingColor, surfaceScale, diffuseConstant, 0, 0, kernelUnitLengthX, kernelUnitLengthY, WTFMove(lightSource), FilterEffect::Type::FEDiffuseLighting)
3637{
37  return adoptRef(*new FEDiffuseLighting(filter, lightingColor, surfaceScale, diffuseConstant, kernelUnitLengthX, kernelUnitLengthY, WTFMove(lightSource)));
3838}
3939
4040bool FEDiffuseLighting::setDiffuseConstant(float diffuseConstant)

Source/WebCore/platform/graphics/filters/FEDiffuseLighting.h

@@class LightSource;
2929
3030class FEDiffuseLighting : public FELighting {
3131public:
32  static Ref<FEDiffuseLighting> create(Filter&, const Color&, float, float, float, float, Ref<LightSource>&&);
 32 static Ref<FEDiffuseLighting> create(const Color& lightingColor, float surfaceScale, float diffuseConstant, float kernelUnitLengthX, float kernelUnitLengthY, Ref<LightSource>&&);
3333
3434 float diffuseConstant() const { return m_diffuseConstant; }
3535 bool setDiffuseConstant(float);

@@public:
3737 WTF::TextStream& externalRepresentation(WTF::TextStream&, RepresentationType) const override;
3838
3939private:
40  FEDiffuseLighting(Filter&, const Color&, float, float, float, float, Ref<LightSource>&&);
 40 FEDiffuseLighting(const Color& lightingColor, float surfaceScale, float diffuseConstant, float kernelUnitLengthX, float kernelUnitLengthY, Ref<LightSource>&&);
4141};
4242
4343} // namespace WebCore

Source/WebCore/platform/graphics/filters/FEDisplacementMap.cpp

3131
3232namespace WebCore {
3333
34 FEDisplacementMap::FEDisplacementMap(Filter& filter, ChannelSelectorType xChannelSelector, ChannelSelectorType yChannelSelector, float scale)
35  : FilterEffect(filter, FilterEffect::Type::FEDisplacementMap)
36  , m_xChannelSelector(xChannelSelector)
37  , m_yChannelSelector(yChannelSelector)
38  , m_scale(scale)
 34Ref<FEDisplacementMap> FEDisplacementMap::create(ChannelSelectorType xChannelSelector, ChannelSelectorType yChannelSelector, float scale)
3935{
 36 return adoptRef(*new FEDisplacementMap(xChannelSelector, yChannelSelector, scale));
4037}
4138
42 Ref<FEDisplacementMap> FEDisplacementMap::create(Filter& filter, ChannelSelectorType xChannelSelector,
43  ChannelSelectorType yChannelSelector, float scale)
 39FEDisplacementMap::FEDisplacementMap(ChannelSelectorType xChannelSelector, ChannelSelectorType yChannelSelector, float scale)
 40 : FilterEffect(FilterEffect::Type::FEDisplacementMap)
 41 , m_xChannelSelector(xChannelSelector)
 42 , m_yChannelSelector(yChannelSelector)
 43 , m_scale(scale)
4444{
45  return adoptRef(*new FEDisplacementMap(filter, xChannelSelector, yChannelSelector, scale));
4645}
4746
4847bool FEDisplacementMap::setXChannelSelector(const ChannelSelectorType xChannelSelector)

@@static inline unsigned byteOffsetOfPixel(unsigned x, unsigned y, unsigned rowByt
9190 return x * bytesPerPixel + y * rowBytes;
9291}
9392
94 void FEDisplacementMap::platformApplySoftware()
 93void FEDisplacementMap::platformApplySoftware(const Filter& filter)
9594{
9695 FilterEffect* in = inputEffect(0);
9796 FilterEffect* in2 = inputEffect(1);

@@void FEDisplacementMap::platformApplySoftware()
117116
118117 ASSERT(inputImage->length() == displacementImage->length());
119118
120  Filter& filter = this->filter();
121119 IntSize paintSize = absolutePaintRect().size();
122120
123121 FloatSize scale = filter.scaledByFilterScale({ m_scale, m_scale });

Source/WebCore/platform/graphics/filters/FEDisplacementMap.h

2222#pragma once
2323
2424#include "FilterEffect.h"
25 #include "Filter.h"
2625#include <wtf/text/WTFString.h>
2726
2827namespace WebCore {

@@enum ChannelSelectorType {
3736
3837class FEDisplacementMap : public FilterEffect {
3938public:
40  static Ref<FEDisplacementMap> create(Filter&, ChannelSelectorType xChannelSelector, ChannelSelectorType yChannelSelector, float scale);
 39 static Ref<FEDisplacementMap> create(ChannelSelectorType xChannelSelector, ChannelSelectorType yChannelSelector, float scale);
4140
4241 ChannelSelectorType xChannelSelector() const { return m_xChannelSelector; }
4342 bool setXChannelSelector(const ChannelSelectorType);

@@public:
5251 void transformResultColorSpace(FilterEffect*, const int) override;
5352
5453private:
55  FEDisplacementMap(Filter&, ChannelSelectorType xChannelSelector, ChannelSelectorType yChannelSelector, float);
 54 FEDisplacementMap(ChannelSelectorType xChannelSelector, ChannelSelectorType yChannelSelector, float);
5655
57  void platformApplySoftware() override;
 56 void platformApplySoftware(const Filter&) override;
5857
59  void determineAbsolutePaintRect() override { setAbsolutePaintRect(enclosingIntRect(maxEffectRect())); }
 58 void determineAbsolutePaintRect(const Filter&) override { setAbsolutePaintRect(enclosingIntRect(maxEffectRect())); }
6059
6160 int xChannelIndex() const { return m_xChannelSelector - 1; }
6261 int yChannelIndex() const { return m_yChannelSelector - 1; }

Source/WebCore/platform/graphics/filters/FEDropShadow.cpp

2424#include "FEGaussianBlur.h"
2525#include "Filter.h"
2626#include "GraphicsContext.h"
 27#include "ImageBuffer.h"
2728#include "PixelBuffer.h"
2829#include "ShadowBlur.h"
2930#include <wtf/MathExtras.h>
3031#include <wtf/text/TextStream.h>
3132
3233namespace WebCore {
33 
34 FEDropShadow::FEDropShadow(Filter& filter, float stdX, float stdY, float dx, float dy, const Color& shadowColor, float shadowOpacity)
35  : FilterEffect(filter, FilterEffect::Type::FEDropShadow)
 34
 35Ref<FEDropShadow> FEDropShadow::create(float stdX, float stdY, float dx, float dy, const Color& shadowColor, float shadowOpacity)
 36{
 37 return adoptRef(*new FEDropShadow(stdX, stdY, dx, dy, shadowColor, shadowOpacity));
 38}
 39
 40FEDropShadow::FEDropShadow(float stdX, float stdY, float dx, float dy, const Color& shadowColor, float shadowOpacity)
 41 : FilterEffect(FilterEffect::Type::FEDropShadow)
3642 , m_stdX(stdX)
3743 , m_stdY(stdY)
3844 , m_dx(dx)

@@FEDropShadow::FEDropShadow(Filter& filter, float stdX, float stdY, float dx, flo
4248{
4349}
4450
45 Ref<FEDropShadow> FEDropShadow::create(Filter& filter, float stdX, float stdY, float dx, float dy, const Color& shadowColor, float shadowOpacity)
 51void FEDropShadow::determineAbsolutePaintRect(const Filter& filter)
4652{
47  return adoptRef(*new FEDropShadow(filter, stdX, stdY, dx, dy, shadowColor, shadowOpacity));
48 }
49 
50 void FEDropShadow::determineAbsolutePaintRect()
51 {
52  Filter& filter = this->filter();
53 
5453 FloatRect absolutePaintRect = inputEffect(0)->absolutePaintRect();
5554 FloatRect absoluteOffsetPaintRect(absolutePaintRect);
5655 absoluteOffsetPaintRect.move(filter.scaledByFilterScale({ m_dx, m_dy }));

@@void FEDropShadow::determineAbsolutePaintRect()
7069 setAbsolutePaintRect(enclosingIntRect(absolutePaintRect));
7170}
7271
73 void FEDropShadow::platformApplySoftware()
 72void FEDropShadow::platformApplySoftware(const Filter& filter)
7473{
7574 FilterEffect* in = inputEffect(0);
7675

@@void FEDropShadow::platformApplySoftware()
7877 if (!resultImage)
7978 return;
8079
81  Filter& filter = this->filter();
82 
8380 FloatSize blurRadius = 2 * filter.scaledByFilterScale({ m_stdX, m_stdY });
8481 FloatSize offset = filter.scaledByFilterScale({ m_dx, m_dy });
8582

Source/WebCore/platform/graphics/filters/FEDropShadow.h

2020#pragma once
2121
2222#include "Color.h"
23 #include "Filter.h"
2423#include "FilterEffect.h"
2524
2625namespace WebCore {
2726
2827class FEDropShadow : public FilterEffect {
2928public:
30  static Ref<FEDropShadow> create(Filter&, float, float, float, float, const Color&, float);
 29 static Ref<FEDropShadow> create(float stdX, float stdY, float dx, float dy, const Color& shadowColor, float shadowOpacity);
3130
3231 float stdDeviationX() const { return m_stdX; }
3332 void setStdDeviationX(float stdX) { m_stdX = stdX; }

@@public:
4847 void setShadowOpacity(float shadowOpacity) { m_shadowOpacity = shadowOpacity; }
4948
5049private:
51  FEDropShadow(Filter&, float, float, float, float, const Color&, float);
 50 FEDropShadow(float stdX, float stdY, float dx, float dy, const Color& shadowColor, float shadowOpacity);
5251
53  void platformApplySoftware() override;
54 
55  void determineAbsolutePaintRect() override;
 52 void determineAbsolutePaintRect(const Filter&) override;
5653
5754 IntOutsets outsets() const override;
5855
 56 void platformApplySoftware(const Filter&) override;
 57
5958 WTF::TextStream& externalRepresentation(WTF::TextStream&, RepresentationType) const override;
6059
6160 float m_stdX;

Source/WebCore/platform/graphics/filters/FEFlood.cpp

2424#include "FEFlood.h"
2525
2626#include "ColorSerialization.h"
27 #include "Filter.h"
2827#include "GraphicsContext.h"
 28#include "ImageBuffer.h"
2929#include <wtf/text/TextStream.h>
3030
3131namespace WebCore {
3232
33 FEFlood::FEFlood(Filter& filter, const Color& floodColor, float floodOpacity)
34  : FilterEffect(filter, FilterEffect::Type::FEFlood)
35  , m_floodColor(floodColor)
36  , m_floodOpacity(floodOpacity)
 33Ref<FEFlood> FEFlood::create(const Color& floodColor, float floodOpacity)
3734{
 35 return adoptRef(*new FEFlood(floodColor, floodOpacity));
3836}
3937
40 Ref<FEFlood> FEFlood::create(Filter& filter, const Color& floodColor, float floodOpacity)
 38FEFlood::FEFlood(const Color& floodColor, float floodOpacity)
 39 : FilterEffect(FilterEffect::Type::FEFlood)
 40 , m_floodColor(floodColor)
 41 , m_floodOpacity(floodOpacity)
4142{
42  return adoptRef(*new FEFlood(filter, floodColor, floodOpacity));
4343}
4444
4545bool FEFlood::setFloodColor(const Color& color)

@@bool FEFlood::setFloodOpacity(float floodOpacity)
5858 return true;
5959}
6060
61 void FEFlood::platformApplySoftware()
 61void FEFlood::platformApplySoftware(const Filter&)
6262{
6363 ImageBuffer* resultImage = createImageBufferResult();
6464 if (!resultImage)

Source/WebCore/platform/graphics/filters/FEFlood.h

2222#pragma once
2323
2424#include "Color.h"
25 #include "Filter.h"
2625#include "FilterEffect.h"
2726
2827namespace WebCore {
2928
3029class FEFlood : public FilterEffect {
3130public:
32  static Ref<FEFlood> create(Filter&, const Color&, float);
 31 static Ref<FEFlood> create(const Color& floodColor, float floodOpacity);
3332
3433 const Color& floodColor() const { return m_floodColor; }
3534 bool setFloodColor(const Color&);

@@public:
4544#endif
4645
4746private:
48  FEFlood(Filter&, const Color&, float);
 47 FEFlood(const Color& floodColor, float floodOpacity);
4948
50  void platformApplySoftware() override;
 49 void determineAbsolutePaintRect(const Filter&) override { setAbsolutePaintRect(enclosingIntRect(maxEffectRect())); }
5150
52  void determineAbsolutePaintRect() override { setAbsolutePaintRect(enclosingIntRect(maxEffectRect())); }
 51 void platformApplySoftware(const Filter&) override;
5352
5453 WTF::TextStream& externalRepresentation(WTF::TextStream&, RepresentationType) const override;
5554

Source/WebCore/platform/graphics/filters/FEGaussianBlur.cpp

@@inline void kernelPosition(int blurIteration, unsigned& radius, int& deltaLeft,
7979 }
8080}
8181
82 FEGaussianBlur::FEGaussianBlur(Filter& filter, float x, float y, EdgeModeType edgeMode)
83  : FilterEffect(filter, FilterEffect::Type::FEGaussianBlur)
84  , m_stdX(x)
85  , m_stdY(y)
86  , m_edgeMode(edgeMode)
 82Ref<FEGaussianBlur> FEGaussianBlur::create(float x, float y, EdgeModeType edgeMode)
8783{
 84 return adoptRef(*new FEGaussianBlur(x, y, edgeMode));
8885}
8986
90 Ref<FEGaussianBlur> FEGaussianBlur::create(Filter& filter, float x, float y, EdgeModeType edgeMode)
 87FEGaussianBlur::FEGaussianBlur(float x, float y, EdgeModeType edgeMode)
 88 : FilterEffect(FilterEffect::Type::FEGaussianBlur)
 89 , m_stdX(x)
 90 , m_stdY(y)
 91 , m_edgeMode(edgeMode)
9192{
92  return adoptRef(*new FEGaussianBlur(filter, x, y, edgeMode));
9393}
9494
9595void FEGaussianBlur::setStdDeviationX(float x)

@@IntSize FEGaussianBlur::calculateOutsetSize(FloatSize stdDeviation)
496496 return { 3 * kernelSize.width() / 2, 3 * kernelSize.height() / 2 };
497497}
498498
499 void FEGaussianBlur::determineAbsolutePaintRect()
 499void FEGaussianBlur::determineAbsolutePaintRect(const Filter& filter)
500500{
501  IntSize kernelSize = calculateKernelSize(filter(), { m_stdX, m_stdY });
 501 IntSize kernelSize = calculateKernelSize(filter, { m_stdX, m_stdY });
502502
503503 FloatRect absolutePaintRect = inputEffect(0)->absolutePaintRect();
504504 // Edge modes other than 'none' do not inflate the affected paint rect.

@@void FEGaussianBlur::determineAbsolutePaintRect()
519519 setAbsolutePaintRect(enclosingIntRect(absolutePaintRect));
520520}
521521
522 void FEGaussianBlur::platformApplySoftware()
 522void FEGaussianBlur::platformApplySoftware(const Filter& filter)
523523{
524524 FilterEffect* in = inputEffect(0);
525525

@@void FEGaussianBlur::platformApplySoftware()
536536 if (!m_stdX && !m_stdY)
537537 return;
538538
539  IntSize kernelSize = calculateKernelSize(filter(), { m_stdX, m_stdY });
 539 IntSize kernelSize = calculateKernelSize(filter, { m_stdX, m_stdY });
540540
541541 IntSize paintSize = absolutePaintRect().size();
542542 auto tmpImageData = Uint8ClampedArray::tryCreateUninitialized(paintSize.area() * 4);

Source/WebCore/platform/graphics/filters/FEGaussianBlur.h

2222#pragma once
2323
2424#include "FEConvolveMatrix.h"
25 #include "Filter.h"
2625#include "FilterEffect.h"
2726
2827namespace WebCore {
2928
3029class FEGaussianBlur : public FilterEffect {
3130public:
32  static Ref<FEGaussianBlur> create(Filter&, float, float, EdgeModeType);
 31 static Ref<FEGaussianBlur> create(float x, float y, EdgeModeType);
3332
3433 float stdDeviationX() const { return m_stdX; }
3534 void setStdDeviationX(float);

@@public:
4544 static IntSize calculateOutsetSize(FloatSize stdDeviation);
4645
4746private:
48  FEGaussianBlur(Filter&, float, float, EdgeModeType);
 47 FEGaussianBlur(float x, float y, EdgeModeType);
4948
5049 static const int s_minimalRectDimension = 100 * 100; // Empirical data limit for parallel jobs
5150

@@private:
5958 unsigned kernelSizeY;
6059 };
6160
62  void platformApplySoftware() override;
 61 void determineAbsolutePaintRect(const Filter&) override;
6362
64  void determineAbsolutePaintRect() override;
 63 void platformApplySoftware(const Filter&) override;
6564
6665 IntOutsets outsets() const override;
6766

Source/WebCore/platform/graphics/filters/FELighting.cpp

3535
3636namespace WebCore {
3737
38 FELighting::FELighting(Filter& filter, LightingType lightingType, const Color& lightingColor, float surfaceScale, float diffuseConstant, float specularConstant, float specularExponent, float kernelUnitLengthX, float kernelUnitLengthY, Ref<LightSource>&& lightSource, Type type)
39  : FilterEffect(filter, type)
 38FELighting::FELighting(LightingType lightingType, const Color& lightingColor, float surfaceScale, float diffuseConstant, float specularConstant, float specularExponent, float kernelUnitLengthX, float kernelUnitLengthY, Ref<LightSource>&& lightSource, Type type)
 39 : FilterEffect(type)
4040 , m_lightingType(lightingType)
4141 , m_lightSource(WTFMove(lightSource))
4242 , m_lightingColor(lightingColor)

@@bool FELighting::drawLighting(Uint8ClampedArray& pixels, int width, int height)
471471 return true;
472472}
473473
474 void FELighting::platformApplySoftware()
 474void FELighting::platformApplySoftware(const Filter&)
475475{
476476 FilterEffect* in = inputEffect(0);
477477

Source/WebCore/platform/graphics/filters/FELighting.h

2727#pragma once
2828
2929#include "Color.h"
30 #include "Filter.h"
3130#include "FilterEffect.h"
3231#include "LightSource.h"
3332#include <JavaScriptCore/Forward.h>

@@struct FELightingPaintingDataForNeon;
4039
4140class FELighting : public FilterEffect {
4241public:
43  void determineAbsolutePaintRect() override { setAbsolutePaintRect(enclosingIntRect(maxEffectRect())); }
44 
4542 float surfaceScale() const { return m_surfaceScale; }
4643 bool setSurfaceScale(float);
4744

@@protected:
128125 static void platformApplyGenericWorker(PlatformApplyGenericParameters*);
129126 static void platformApplyNeonWorker(FELightingPaintingDataForNeon*);
130127
131  FELighting(Filter&, LightingType, const Color&, float, float, float, float, float, float, Ref<LightSource>&&, Type);
 128 FELighting(LightingType, const Color& lightingColor, float surfaceScale, float diffuseConstant, float specularConstant, float specularExponent, float kernelUnitLengthX, float kernelUnitLengthY, Ref<LightSource>&&, Type);
132129
133130 bool drawLighting(Uint8ClampedArray&, int, int);
134131
135132 void setPixel(int offset, const LightingData&, const LightSource::PaintingData&, int x, int y, float factorX, float factorY, IntSize normalVector);
136133 void setPixelInternal(int offset, const LightingData&, const LightSource::PaintingData&, int x, int y, float factorX, float factorY, IntSize normalVector, float alpha);
137134
138  void platformApplySoftware() override;
 135 void determineAbsolutePaintRect(const Filter&) override { setAbsolutePaintRect(enclosingIntRect(maxEffectRect())); }
 136
 137 void platformApplySoftware(const Filter&) override;
139138
140139 void platformApply(const LightingData&, const LightSource::PaintingData&);
141140

Source/WebCore/platform/graphics/filters/FEMerge.cpp

2222#include "config.h"
2323#include "FEMerge.h"
2424
25 #include "Filter.h"
2625#include "GraphicsContext.h"
 26#include "ImageBuffer.h"
2727#include <wtf/text/TextStream.h>
2828
2929namespace WebCore {
3030
31 FEMerge::FEMerge(Filter& filter)
32  : FilterEffect(filter, FilterEffect::Type::FEMerge)
 31Ref<FEMerge> FEMerge::create()
3332{
 33 return adoptRef(*new FEMerge());
3434}
3535
36 Ref<FEMerge> FEMerge::create(Filter& filter)
 36FEMerge::FEMerge()
 37 : FilterEffect(FilterEffect::Type::FEMerge)
3738{
38  return adoptRef(*new FEMerge(filter));
3939}
4040
41 void FEMerge::platformApplySoftware()
 41void FEMerge::platformApplySoftware(const Filter&)
4242{
4343 unsigned size = numberOfEffectInputs();
4444 ASSERT(size > 0);

@@void FEMerge::platformApplySoftware()
4747 if (!resultImage)
4848 return;
4949
50 
5150 GraphicsContext& filterContext = resultImage->context();
5251 for (unsigned i = 0; i < size; ++i) {
5352 FilterEffect* in = inputEffect(i);

Source/WebCore/platform/graphics/filters/FEMerge.h

2222#pragma once
2323
2424#include "FilterEffect.h"
25 #include "Filter.h"
2625
2726namespace WebCore {
2827
2928class FEMerge : public FilterEffect {
3029public:
31  static Ref<FEMerge> create(Filter&);
 30 static Ref<FEMerge> create();
3231
3332private:
34  FEMerge(Filter&);
 33 FEMerge();
3534
36  void platformApplySoftware() override;
 35 void platformApplySoftware(const Filter&) override;
3736
3837 WTF::TextStream& externalRepresentation(WTF::TextStream&, RepresentationType) const override;
3938};

Source/WebCore/platform/graphics/filters/FEMorphology.cpp

3535
3636namespace WebCore {
3737
38 FEMorphology::FEMorphology(Filter& filter, MorphologyOperatorType type, float radiusX, float radiusY)
39  : FilterEffect(filter, FilterEffect::Type::FEMorphology)
40  , m_type(type)
41  , m_radiusX(radiusX)
42  , m_radiusY(radiusY)
 38Ref<FEMorphology> FEMorphology::create(MorphologyOperatorType type, float radiusX, float radiusY)
4339{
 40 return adoptRef(*new FEMorphology(type, radiusX, radiusY));
4441}
4542
46 Ref<FEMorphology> FEMorphology::create(Filter& filter, MorphologyOperatorType type, float radiusX, float radiusY)
 43FEMorphology::FEMorphology(MorphologyOperatorType type, float radiusX, float radiusY)
 44 : FilterEffect(FilterEffect::Type::FEMorphology)
 45 , m_type(type)
 46 , m_radiusX(radiusX)
 47 , m_radiusY(radiusY)
4748{
48  return adoptRef(*new FEMorphology(filter, type, radiusX, radiusY));
4949}
5050
5151bool FEMorphology::setMorphologyOperator(MorphologyOperatorType type)

@@bool FEMorphology::setRadiusY(float radiusY)
7272 return true;
7373}
7474
75 void FEMorphology::determineAbsolutePaintRect()
 75void FEMorphology::determineAbsolutePaintRect(const Filter& filter)
7676{
7777 FloatRect paintRect = inputEffect(0)->absolutePaintRect();
78  Filter& filter = this->filter();
7978 paintRect.inflate(filter.scaledByFilterScale({ m_radiusX, m_radiusY }));
8079 if (clipsToBounds())
8180 paintRect.intersect(maxEffectRect());

@@bool FEMorphology::platformApplyDegenerate(Uint8ClampedArray& dstPixelArray, con
240239 return false;
241240}
242241
243 void FEMorphology::platformApplySoftware()
 242void FEMorphology::platformApplySoftware(const Filter& filter)
244243{
245244 FilterEffect* in = inputEffect(0);
246245

@@void FEMorphology::platformApplySoftware()
258257 if (platformApplyDegenerate(destinationPixelArray, effectDrawingRect, radius.width(), radius.height()))
259258 return;
260259
261  Filter& filter = this->filter();
262260 auto sourcePixelArray = in->premultipliedResult(effectDrawingRect, operatingColorSpace());
263261 if (!sourcePixelArray)
264262 return;

Source/WebCore/platform/graphics/filters/FEMorphology.h

2222#pragma once
2323
2424#include "FilterEffect.h"
25 #include "Filter.h"
2625
2726namespace WebCore {
2827

@@enum MorphologyOperatorType {
3433
3534class FEMorphology : public FilterEffect {
3635public:
37  static Ref<FEMorphology> create(Filter&, MorphologyOperatorType, float radiusX, float radiusY);
 36 static Ref<FEMorphology> create(MorphologyOperatorType, float radiusX, float radiusY);
3837
3938 MorphologyOperatorType morphologyOperator() const { return m_type; }
4039 bool setMorphologyOperator(MorphologyOperatorType);

@@public:
4645 bool setRadiusY(float);
4746
4847private:
49  FEMorphology(Filter&, MorphologyOperatorType, float radiusX, float radiusY);
 48 FEMorphology(MorphologyOperatorType, float radiusX, float radiusY);
5049
51  void platformApplySoftware() override;
 50 void determineAbsolutePaintRect(const Filter&) override;
5251
53  void determineAbsolutePaintRect() override;
 52 void platformApplySoftware(const Filter&) override;
5453
5554 WTF::TextStream& externalRepresentation(WTF::TextStream&, RepresentationType) const override;
5655

Source/WebCore/platform/graphics/filters/FEOffset.cpp

2626
2727#include "Filter.h"
2828#include "GraphicsContext.h"
 29#include "ImageBuffer.h"
2930#include <wtf/text/TextStream.h>
3031
3132namespace WebCore {
3233
33 FEOffset::FEOffset(Filter& filter, float dx, float dy)
34  : FilterEffect(filter, FilterEffect::Type::FEOffset)
35  , m_dx(dx)
36  , m_dy(dy)
 34Ref<FEOffset> FEOffset::create(float dx, float dy)
3735{
 36 return adoptRef(*new FEOffset(dx, dy));
3837}
3938
40 Ref<FEOffset> FEOffset::create(Filter& filter, float dx, float dy)
 39FEOffset::FEOffset(float dx, float dy)
 40 : FilterEffect(FilterEffect::Type::FEOffset)
 41 , m_dx(dx)
 42 , m_dy(dy)
4143{
42  return adoptRef(*new FEOffset(filter, dx, dy));
4344}
4445
4546void FEOffset::setDx(float dx)

@@void FEOffset::setDy(float dy)
5253 m_dy = dy;
5354}
5455
55 void FEOffset::determineAbsolutePaintRect()
 56void FEOffset::determineAbsolutePaintRect(const Filter& filter)
5657{
5758 FloatRect paintRect = inputEffect(0)->absolutePaintRect();
58  Filter& filter = this->filter();
5959 paintRect.move(filter.scaledByFilterScale({ m_dx, m_dy }));
6060 if (clipsToBounds())
6161 paintRect.intersect(maxEffectRect());

@@void FEOffset::determineAbsolutePaintRect()
6464 setAbsolutePaintRect(enclosingIntRect(paintRect));
6565}
6666
67 void FEOffset::platformApplySoftware()
 67void FEOffset::platformApplySoftware(const Filter& filter)
6868{
6969 FilterEffect* in = inputEffect(0);
7070

@@void FEOffset::platformApplySoftware()
7676 setIsAlphaImage(in->isAlphaImage());
7777
7878 FloatRect drawingRegion = drawingRegionOfInputImage(in->absolutePaintRect());
79  Filter& filter = this->filter();
8079 drawingRegion.move(filter.scaledByFilterScale({ m_dx, m_dy }));
8180 resultImage->context().drawImageBuffer(*inBuffer, drawingRegion);
8281}

Source/WebCore/platform/graphics/filters/FEOffset.h

2222#pragma once
2323
2424#include "FilterEffect.h"
25 #include "Filter.h"
2625
2726namespace WebCore {
2827
2928class FEOffset : public FilterEffect {
3029public:
31  static Ref<FEOffset> create(Filter&, float dx, float dy);
 30 static Ref<FEOffset> create(float dx, float dy);
3231
3332 float dx() const { return m_dx; }
3433 void setDx(float);

@@public:
3736 void setDy(float);
3837
3938private:
40  FEOffset(Filter&, float dx, float dy);
 39 FEOffset(float dx, float dy);
4140
42  void platformApplySoftware() override;
43 
44  void determineAbsolutePaintRect() override;
 41 void determineAbsolutePaintRect(const Filter&) override;
 42
 43 void platformApplySoftware(const Filter&) override;
4544
4645 WTF::TextStream& externalRepresentation(WTF::TextStream&, RepresentationType) const override;
4746

Source/WebCore/platform/graphics/filters/FESpecularLighting.cpp

2727
2828namespace WebCore {
2929
30 FESpecularLighting::FESpecularLighting(Filter& filter, const Color& lightingColor, float surfaceScale, float specularConstant, float specularExponent, float kernelUnitLengthX, float kernelUnitLengthY, Ref<LightSource>&& lightSource)
31  : FELighting(filter, SpecularLighting, lightingColor, surfaceScale, 0, specularConstant, specularExponent, kernelUnitLengthX, kernelUnitLengthY, WTFMove(lightSource), FilterEffect::Type::FESpecularLighting)
 30Ref<FESpecularLighting> FESpecularLighting::create(const Color& lightingColor, float surfaceScale, float specularConstant, float specularExponent, float kernelUnitLengthX, float kernelUnitLengthY, Ref<LightSource>&& lightSource)
3231{
 32 return adoptRef(*new FESpecularLighting(lightingColor, surfaceScale, specularConstant, specularExponent, kernelUnitLengthX, kernelUnitLengthY, WTFMove(lightSource)));
3333}
3434
35 Ref<FESpecularLighting> FESpecularLighting::create(Filter& filter, const Color& lightingColor, float surfaceScale, float specularConstant, float specularExponent, float kernelUnitLengthX, float kernelUnitLengthY, Ref<LightSource>&& lightSource)
 35FESpecularLighting::FESpecularLighting(const Color& lightingColor, float surfaceScale, float specularConstant, float specularExponent, float kernelUnitLengthX, float kernelUnitLengthY, Ref<LightSource>&& lightSource)
 36 : FELighting(SpecularLighting, lightingColor, surfaceScale, 0, specularConstant, specularExponent, kernelUnitLengthX, kernelUnitLengthY, WTFMove(lightSource), FilterEffect::Type::FESpecularLighting)
3637{
37  return adoptRef(*new FESpecularLighting(filter, lightingColor, surfaceScale, specularConstant, specularExponent, kernelUnitLengthX, kernelUnitLengthY, WTFMove(lightSource)));
3838}
3939
4040bool FESpecularLighting::setSpecularConstant(float specularConstant)

Source/WebCore/platform/graphics/filters/FESpecularLighting.h

@@namespace WebCore {
2727
2828class FESpecularLighting : public FELighting {
2929public:
30  static Ref<FESpecularLighting> create(Filter&, const Color&, float, float, float, float, float, Ref<LightSource>&&);
 30 static Ref<FESpecularLighting> create(const Color& lightingColor, float surfaceScale, float specularConstant, float specularExponent, float kernelUnitLengthX, float kernelUnitLengthY, Ref<LightSource>&&);
3131
3232 float specularConstant() const { return m_specularConstant; }
3333 bool setSpecularConstant(float);

@@public:
3838 WTF::TextStream& externalRepresentation(WTF::TextStream&, RepresentationType) const override;
3939
4040private:
41  FESpecularLighting(Filter&, const Color&, float, float, float, float, float, Ref<LightSource>&&);
 41 FESpecularLighting(const Color& lightingColor, float surfaceScale, float specularConstant, float specularExponent, float kernelUnitLengthX, float kernelUnitLengthY, Ref<LightSource>&&);
4242};
4343
4444} // namespace WebCore

Source/WebCore/platform/graphics/filters/FETile.cpp

2424#include "AffineTransform.h"
2525#include "Filter.h"
2626#include "GraphicsContext.h"
 27#include "ImageBuffer.h"
2728#include "Pattern.h"
2829#include "RenderTreeAsText.h"
2930#include "SVGRenderingContext.h"

3132
3233namespace WebCore {
3334
34 FETile::FETile(Filter& filter)
35  : FilterEffect(filter, FilterEffect::Type::FETile)
 35Ref<FETile> FETile::create()
3636{
 37 return adoptRef(*new FETile());
3738}
3839
39 Ref<FETile> FETile::create(Filter& filter)
 40FETile::FETile()
 41 : FilterEffect(FilterEffect::Type::FETile)
4042{
41  return adoptRef(*new FETile(filter));
4243}
4344
44 void FETile::platformApplySoftware()
 45void FETile::platformApplySoftware(const Filter& filter)
4546{
4647// FIXME: See bug 47315. This is a hack to work around a compile failure, but is incorrect behavior otherwise.
4748 FilterEffect* in = inputEffect(0);

@@void FETile::platformApplySoftware()
5960 FloatPoint inMaxEffectLocation = tileRect.location();
6061 FloatPoint maxEffectLocation = maxEffectRect().location();
6162 if (in->filterType() == FilterEffect::Type::SourceGraphic || in->filterType() == FilterEffect::Type::SourceAlpha) {
62  Filter& filter = this->filter();
6363 tileRect = filter.filterRegion();
6464 tileRect.scale(filter.filterScale());
6565 }
6666
67  auto tileImage = SVGRenderingContext::createImageBuffer(tileRect, tileRect, DestinationColorSpace::SRGB(), filter().renderingMode());
 67 auto tileImage = SVGRenderingContext::createImageBuffer(tileRect, tileRect, DestinationColorSpace::SRGB(), filter.renderingMode());
6868 if (!tileImage)
6969 return;
7070

Source/WebCore/platform/graphics/filters/FETile.h

2222#pragma once
2323
2424#include "FilterEffect.h"
25 #include "Filter.h"
2625
2726namespace WebCore {
2827
2928class FETile : public FilterEffect {
3029public:
31  static Ref<FETile> create(Filter&);
 30 static Ref<FETile> create();
3231
3332private:
34  FETile(Filter&);
 33 FETile();
3534
36  void platformApplySoftware() override;
 35 void determineAbsolutePaintRect(const Filter&) override { setAbsolutePaintRect(enclosingIntRect(maxEffectRect())); }
3736
38  void determineAbsolutePaintRect() override { setAbsolutePaintRect(enclosingIntRect(maxEffectRect())); }
 37 void platformApplySoftware(const Filter&) override;
3938
4039 WTF::TextStream& externalRepresentation(WTF::TextStream&, RepresentationType) const override;
4140};

Source/WebCore/platform/graphics/filters/FETurbulence.cpp

@@static const int s_randAmplitude = 16807; // 7**5; primitive root of m
4848static const int s_randQ = 127773; // m / a
4949static const int s_randR = 2836; // m % a
5050
51 FETurbulence::FETurbulence(Filter& filter, TurbulenceType type, float baseFrequencyX, float baseFrequencyY, int numOctaves, float seed, bool stitchTiles)
52  : FilterEffect(filter, FilterEffect::Type::FETurbulence)
 51Ref<FETurbulence> FETurbulence::create(TurbulenceType type, float baseFrequencyX, float baseFrequencyY, int numOctaves, float seed, bool stitchTiles)
 52{
 53 return adoptRef(*new FETurbulence(type, baseFrequencyX, baseFrequencyY, numOctaves, seed, stitchTiles));
 54}
 55
 56FETurbulence::FETurbulence(TurbulenceType type, float baseFrequencyX, float baseFrequencyY, int numOctaves, float seed, bool stitchTiles)
 57 : FilterEffect(FilterEffect::Type::FETurbulence)
5358 , m_type(type)
5459 , m_baseFrequencyX(baseFrequencyX)
5560 , m_baseFrequencyY(baseFrequencyY)

@@FETurbulence::FETurbulence(Filter& filter, TurbulenceType type, float baseFreque
5964{
6065}
6166
62 Ref<FETurbulence> FETurbulence::create(Filter& filter, TurbulenceType type, float baseFrequencyX, float baseFrequencyY, int numOctaves, float seed, bool stitchTiles)
63 {
64  return adoptRef(*new FETurbulence(filter, type, baseFrequencyX, baseFrequencyY, numOctaves, seed, stitchTiles));
65 }
66 
6767bool FETurbulence::setType(TurbulenceType type)
6868{
6969 if (m_type == type)

@@ColorComponents<uint8_t, 4> FETurbulence::calculateTurbulenceValueForPoint(const
366366 return toIntBasedColorComponents(turbulenceFunctionResult);
367367}
368368
369 void FETurbulence::fillRegion(Uint8ClampedArray& pixelArray, const PaintingData& paintingData, StitchData stitchData, int startY, int endY) const
 369void FETurbulence::fillRegion(const Filter& filter, Uint8ClampedArray& pixelArray, const PaintingData& paintingData, StitchData stitchData, int startY, int endY) const
370370{
371371 ASSERT(endY > startY);
372372
373373 IntRect filterRegion = absolutePaintRect();
374374 FloatPoint point(0, filterRegion.y() + startY);
375375 int indexOfPixelChannel = startY * (filterRegion.width() << 2);
376  FloatSize inverseScale = { 1 / filter().filterScale().width(), 1 / filter().filterScale().height() };
 376 FloatSize inverseScale = { 1 / filter.filterScale().width(), 1 / filter.filterScale().height() };
377377
378378 for (int y = startY; y < endY; ++y) {
379379 point.setY(point.y() + 1);

@@void FETurbulence::fillRegion(Uint8ClampedArray& pixelArray, const PaintingData&
390390
391391void FETurbulence::fillRegionWorker(FillRegionParameters* parameters)
392392{
393  parameters->filter->fillRegion(*parameters->pixelArray, *parameters->paintingData, parameters->stitchData, parameters->startY, parameters->endY);
 393 parameters->effect->fillRegion(*parameters->filter, *parameters->pixelArray, *parameters->paintingData, parameters->stitchData, parameters->startY, parameters->endY);
394394}
395395
396 void FETurbulence::platformApplySoftware()
 396void FETurbulence::platformApplySoftware(const Filter& filter)
397397{
398398 auto& destinationPixelBuffer = createUnmultipliedImageResult();
399399 if (!destinationPixelBuffer)

@@void FETurbulence::platformApplySoftware()
438438
439439 for (unsigned i = 0; i < numJobs; ++i) {
440440 FillRegionParameters& params = parallelJobs.parameter(i);
441  params.filter = this;
 441 params.filter = &filter;
 442 params.effect = this;
442443 params.pixelArray = &destinationPixelArray;
443444 params.paintingData = &paintingData;
444445 params.stitchData = stitchData;

@@void FETurbulence::platformApplySoftware()
455456 }
456457
457458 // Fallback to single threaded mode if there is no room for a new thread or the paint area is too small.
458  fillRegion(destinationPixelArray, paintingData, stitchData, 0, height);
 459 fillRegion(filter, destinationPixelArray, paintingData, stitchData, 0, height);
459460}
460461
461462static TextStream& operator<<(TextStream& ts, TurbulenceType type)

Source/WebCore/platform/graphics/filters/FETurbulence.h

2626
2727#include "ColorComponents.h"
2828#include "FilterEffect.h"
29 #include "Filter.h"
3029
3130namespace WebCore {
3231

@@enum class TurbulenceType {
3837
3938class FETurbulence : public FilterEffect {
4039public:
41  static Ref<FETurbulence> create(Filter&, TurbulenceType, float, float, int, float, bool);
 40 static Ref<FETurbulence> create(TurbulenceType, float baseFrequencyX, float baseFrequencyY, int numOctaves, float seed, bool stitchTiles);
4241
4342 TurbulenceType type() const { return m_type; }
4443 bool setType(TurbulenceType);

@@private:
9392 };
9493
9594 struct FillRegionParameters {
96  FETurbulence* filter;
 95 const Filter* filter;
 96 FETurbulence* effect;
9797 Uint8ClampedArray* pixelArray;
9898 PaintingData* paintingData;
9999 StitchData stitchData;

@@private:
103103
104104 static void fillRegionWorker(FillRegionParameters*);
105105
106  FETurbulence(Filter&, TurbulenceType, float, float, int, float, bool);
 106 FETurbulence(TurbulenceType, float baseFrequencyX, float baseFrequencyY, int numOctaves, float seed, bool stitchTiles);
107107
108  void platformApplySoftware() override;
109  void determineAbsolutePaintRect() override { setAbsolutePaintRect(enclosingIntRect(maxEffectRect())); }
 108 void determineAbsolutePaintRect(const Filter&) override { setAbsolutePaintRect(enclosingIntRect(maxEffectRect())); }
 109 void platformApplySoftware(const Filter&) override;
110110 WTF::TextStream& externalRepresentation(WTF::TextStream&, RepresentationType) const override;
111111
112112 void initPaint(PaintingData&);
113113 StitchData computeStitching(IntSize tileSize, float& baseFrequencyX, float& baseFrequencyY) const;
114114 ColorComponents<float, 4> noise2D(const PaintingData&, const StitchData&, const FloatPoint&) const;
115115 ColorComponents<uint8_t, 4> calculateTurbulenceValueForPoint(const PaintingData&, StitchData, const FloatPoint&) const;
116  void fillRegion(Uint8ClampedArray&, const PaintingData&, StitchData, int startY, int endY) const;
 116 void fillRegion(const Filter&, Uint8ClampedArray&, const PaintingData&, StitchData, int startY, int endY) const;
117117
118118 static void fillRegionWorker(void*);
119119

Source/WebCore/platform/graphics/filters/Filter.h

@@public:
4343 void setFilterRegion(const FloatRect& filterRegion) { m_filterRegion = filterRegion; }
4444
4545 virtual FloatSize scaledByFilterScale(FloatSize size) const { return size * m_filterScale; }
 46 virtual void apply() = 0;
4647
47  ImageBuffer* sourceImage() { return m_sourceImage.get(); }
 48 ImageBuffer* sourceImage() const { return m_sourceImage.get(); }
4849 void setSourceImage(RefPtr<ImageBuffer>&& sourceImage) { m_sourceImage = WTFMove(sourceImage); }
4950
5051 RenderingMode renderingMode() const { return m_renderingMode; }

Source/WebCore/platform/graphics/filters/FilterEffect.cpp

4545
4646namespace WebCore {
4747
48 FilterEffect::FilterEffect(Filter& filter, FilterEffect::Type type)
 48FilterEffect::FilterEffect(FilterEffect::Type type)
4949 : FilterFunction(type)
50  , m_filter(filter)
5150{
5251}
5352
54 void FilterEffect::determineAbsolutePaintRect()
 53void FilterEffect::determineAbsolutePaintRect(const Filter&)
5554{
5655 m_absolutePaintRect = IntRect();
5756 for (auto& effect : m_inputEffects)

@@FloatRect FilterEffect::drawingRegionOfInputImage(const IntRect& srcRect) const
9493 return transform.mapRect(srcRect);
9594}
9695
97 FloatRect FilterEffect::determineFilterPrimitiveSubregion()
 96FloatRect FilterEffect::determineFilterPrimitiveSubregion(const Filter& filter)
9897{
9998 // FETile, FETurbulence, FEFlood don't have input effects, take the filter region as unite rect.
10099 FloatRect subregion;
101100 if (unsigned numberOfInputEffects = inputEffects().size()) {
102  subregion = inputEffect(0)->determineFilterPrimitiveSubregion();
 101 subregion = inputEffect(0)->determineFilterPrimitiveSubregion(filter);
103102 for (unsigned i = 1; i < numberOfInputEffects; ++i) {
104  auto inputPrimitiveSubregion = inputEffect(i)->determineFilterPrimitiveSubregion();
 103 auto inputPrimitiveSubregion = inputEffect(i)->determineFilterPrimitiveSubregion(filter);
105104 subregion.unite(inputPrimitiveSubregion);
106105 }
107106 } else
108  subregion = m_filter.filterRegion();
 107 subregion = filter.filterRegion();
109108
110109 // After calling determineFilterPrimitiveSubregion on the target effect, reset the subregion again for <feTile>.
111110 if (filterType() == FilterEffect::Type::FETile)
112  subregion = m_filter.filterRegion();
 111 subregion = filter.filterRegion();
113112
114113 auto boundaries = effectBoundaries();
115114 if (hasX())

@@FloatRect FilterEffect::determineFilterPrimitiveSubregion()
124123 setFilterPrimitiveSubregion(subregion);
125124
126125 auto absoluteSubregion = subregion;
127  absoluteSubregion.scale(m_filter.filterScale());
 126 absoluteSubregion.scale(filter.filterScale());
128127 // Save this before clipping so we can use it to map lighting points from user space to buffer coordinates.
129128 setUnclippedAbsoluteSubregion(absoluteSubregion);
130129
131130 // Clip every filter effect to the filter region.
132  auto absoluteScaledFilterRegion = m_filter.filterRegion();
133  absoluteScaledFilterRegion.scale(m_filter.filterScale());
 131 auto absoluteScaledFilterRegion = filter.filterRegion();
 132 absoluteScaledFilterRegion.scale(filter.filterScale());
134133 absoluteSubregion.intersect(absoluteScaledFilterRegion);
135134
136135 setMaxEffectRect(absoluteSubregion);

@@FilterEffect* FilterEffect::inputEffect(unsigned number) const
143142 return m_inputEffects.at(number).get();
144143}
145144
146 void FilterEffect::apply()
 145void FilterEffect::apply(const Filter& filter)
147146{
148147 if (hasResult())
149148 return;
150149 unsigned size = m_inputEffects.size();
151150 for (unsigned i = 0; i < size; ++i) {
152151 FilterEffect* in = m_inputEffects.at(i).get();
153  in->apply();
 152 in->apply(filter);
154153 if (!in->hasResult())
155154 return;
156155

@@void FilterEffect::apply()
158157 transformResultColorSpace(in, i);
159158 }
160159
161  determineAbsolutePaintRect();
 160 determineAbsolutePaintRect(filter);
162161 setResultColorSpace(m_operatingColorSpace);
163162
164  LOG_WITH_STREAM(Filters, stream << "FilterEffect " << filterName() << " " << this << " apply():\n filterPrimitiveSubregion " << m_filterPrimitiveSubregion << "\n effectBoundaries " << m_effectBoundaries << "\n absoluteUnclippedSubregion " << m_absoluteUnclippedSubregion << "\n absolutePaintRect " << m_absolutePaintRect << "\n maxEffectRect " << m_maxEffectRect << "\n filter scale " << m_filter.filterScale());
 163 LOG_WITH_STREAM(Filters, stream << "FilterEffect " << filterName() << " " << this << " apply():\n filterPrimitiveSubregion " << m_filterPrimitiveSubregion << "\n effectBoundaries " << m_effectBoundaries << "\n absoluteUnclippedSubregion " << m_absoluteUnclippedSubregion << "\n absolutePaintRect " << m_absolutePaintRect << "\n maxEffectRect " << m_maxEffectRect << "\n filter scale " << filter.filterScale());
165164
166165 if (m_absolutePaintRect.isEmpty() || ImageBuffer::sizeNeedsClamping(m_absolutePaintRect.size()))
167166 return;

@@void FilterEffect::apply()
172171 }
173172
174173 // Add platform specific apply functions here and return earlier.
175  platformApplySoftware();
 174 platformApplySoftware(filter);
176175}
177176
178177void FilterEffect::forceValidPreMultipliedPixels()

@@ImageBuffer* FilterEffect::imageBufferResult()
253252 if (m_imageBufferResult)
254253 return m_imageBufferResult.get();
255254
256  m_imageBufferResult = ImageBuffer::create(m_absolutePaintRect.size(), m_filter.renderingMode(), 1, m_resultColorSpace, PixelFormat::BGRA8);
 255 m_imageBufferResult = ImageBuffer::create(m_absolutePaintRect.size(), RenderingMode::Unaccelerated, 1, m_resultColorSpace, PixelFormat::BGRA8);
257256 if (!m_imageBufferResult)
258257 return nullptr;
259258

@@std::optional<PixelBuffer> FilterEffect::convertPixelBufferToColorSpace(const De
422421 IntRect destinationRect(IntPoint(), pixelBuffer.size());
423422 FloatSize clampedSize = ImageBuffer::clampedSize(destinationRect.size());
424423 // Create an ImageBuffer to store incoming PixelBuffer
425  auto buffer = ImageBuffer::create(clampedSize, m_filter.renderingMode(), 1, operatingColorSpace(), PixelFormat::BGRA8);
 424 auto buffer = ImageBuffer::create(clampedSize, RenderingMode::Unaccelerated, 1, operatingColorSpace(), PixelFormat::BGRA8);
426425 if (!buffer)
427426 return std::nullopt;
428427 buffer->putPixelBuffer(pixelBuffer, destinationRect);

@@std::optional<PixelBuffer> FilterEffect::convertImageBufferToColorSpace(const De
436435 FloatSize clampedSize = ImageBuffer::clampedSize(rect.size());
437436
438437 // Create an ImageBuffer with the correct color space and utilize CG to handle color space conversion
439  auto convertedBuffer = ImageBuffer::create(clampedSize, m_filter.renderingMode(), 1, targetColorSpace, PixelFormat::BGRA8);
 438 auto convertedBuffer = ImageBuffer::create(clampedSize, RenderingMode::Unaccelerated, 1, targetColorSpace, PixelFormat::BGRA8);
440439 if (!convertedBuffer)
441440 return std::nullopt;
442441

@@ImageBuffer* FilterEffect::createImageBufferResult()
553552 return nullptr;
554553
555554 FloatSize clampedSize = ImageBuffer::clampedSize(m_absolutePaintRect.size());
556  m_imageBufferResult = ImageBuffer::create(clampedSize, m_filter.renderingMode(), 1, m_resultColorSpace, PixelFormat::BGRA8);
 555 m_imageBufferResult = ImageBuffer::create(clampedSize, RenderingMode::Unaccelerated, 1, m_resultColorSpace, PixelFormat::BGRA8);
557556 return m_imageBufferResult.get();
558557}
559558

Source/WebCore/platform/graphics/filters/FilterEffect.h

@@public:
7272 IntRect requestedRegionOfInputPixelBuffer(const IntRect&) const;
7373
7474 // Recurses on inputs.
75  FloatRect determineFilterPrimitiveSubregion();
 75 FloatRect determineFilterPrimitiveSubregion(const Filter&);
7676
7777 // Solid black image with different alpha values.
7878 bool isAlphaImage() const { return m_alphaImage; }

@@public:
8484 FloatRect maxEffectRect() const { return m_maxEffectRect; }
8585 void setMaxEffectRect(const FloatRect& maxEffectRect) { m_maxEffectRect = maxEffectRect; }
8686
87  void apply();
 87 void apply(const Filter&);
8888
8989 // Correct any invalid pixels, if necessary, in the result of a filter operation.
9090 // This method is used to ensure valid pixel values on filter inputs and the final result.
9191 // Only the arithmetic composite filter ever needs to perform correction.
9292 virtual void correctFilterResultIfNeeded() { }
9393
94  virtual void determineAbsolutePaintRect();
 94 virtual void determineAbsolutePaintRect(const Filter&);
9595
9696 enum class RepresentationType { TestOutput, Debugging };
9797 virtual WTF::TextStream& externalRepresentation(WTF::TextStream&, RepresentationType = RepresentationType::TestOutput) const;

@@public:
120120
121121 FloatPoint mapPointFromUserSpaceToBuffer(FloatPoint) const;
122122
123  Filter& filter() { return m_filter; }
124  const Filter& filter() const { return m_filter; }
125 
126123 bool clipsToBounds() const { return m_clipsToBounds; }
127124 void setClipsToBounds(bool value) { m_clipsToBounds = value; }
128125

@@public:
143140 }
144141
145142protected:
146  FilterEffect(Filter&, Type);
 143 FilterEffect(Type);
147144
148145 ImageBuffer* createImageBufferResult();
149146 std::optional<PixelBuffer>& createUnmultipliedImageResult();

@@protected:
159156 void clipAbsolutePaintRect();
160157
161158private:
162  virtual void platformApplySoftware() = 0;
 159 virtual void platformApplySoftware(const Filter&) = 0;
163160
164161 void copyImageBytes(const Uint8ClampedArray& source, Uint8ClampedArray& destination, const IntRect&) const;
165162 void copyConvertedImageBufferToDestination(Uint8ClampedArray&, const DestinationColorSpace&, AlphaPremultiplication, const IntRect&);

@@private:
168165 std::optional<PixelBuffer> convertImageBufferToColorSpace(const DestinationColorSpace&, ImageBuffer&, const IntRect&, AlphaPremultiplication);
169166 std::optional<PixelBuffer> convertPixelBufferToColorSpace(const DestinationColorSpace&, PixelBuffer&);
170167
171 
172  Filter& m_filter;
173168 FilterEffectVector m_inputEffects;
174169
175170 RefPtr<ImageBuffer> m_imageBufferResult;

Source/WebCore/platform/graphics/filters/FilterEffectRenderer.h

@@class FilterEffectRenderer {
3636
3737public:
3838 static std::unique_ptr<FilterEffectRenderer> tryCreate(bool, FilterEffect&);
39  virtual void applyEffects(FilterEffect&) = 0;
 39 virtual void applyEffects(const Filter&, FilterEffect&) = 0;
4040 virtual bool hasResult() const = 0;
4141 virtual ImageBuffer* output() const = 0;
4242 virtual FloatRect destRect(const FilterEffect&) const = 0;

Source/WebCore/platform/graphics/filters/SourceAlpha.cpp

@@Ref<SourceAlpha> SourceAlpha::create(FilterEffect& sourceEffect)
3333}
3434
3535SourceAlpha::SourceAlpha(FilterEffect& sourceEffect)
36  : FilterEffect(sourceEffect.filter(), FilterEffect::Type::SourceAlpha)
 36 : FilterEffect(FilterEffect::Type::SourceAlpha)
3737{
3838 setOperatingColorSpace(sourceEffect.operatingColorSpace());
3939 inputEffects().append(&sourceEffect);
4040}
4141
42 void SourceAlpha::determineAbsolutePaintRect()
 42void SourceAlpha::determineAbsolutePaintRect(const Filter& filter)
4343{
44  inputEffect(0)->determineAbsolutePaintRect();
 44 inputEffect(0)->determineAbsolutePaintRect(filter);
4545 setAbsolutePaintRect(inputEffect(0)->absolutePaintRect());
4646}
4747
48 void SourceAlpha::platformApplySoftware()
 48void SourceAlpha::platformApplySoftware(const Filter&)
4949{
5050 ImageBuffer* resultImage = createImageBufferResult();
5151 if (!resultImage)

Source/WebCore/platform/graphics/filters/SourceAlpha.h

@@public:
3232private:
3333 explicit SourceAlpha(FilterEffect&);
3434
35  void platformApplySoftware() override;
36  void determineAbsolutePaintRect() override;
 35 void determineAbsolutePaintRect(const Filter&) override;
 36
 37 void platformApplySoftware(const Filter&) override;
 38
3739 WTF::TextStream& externalRepresentation(WTF::TextStream&, RepresentationType) const override;
3840};
3941

Source/WebCore/platform/graphics/filters/SourceGraphic.cpp

2626
2727namespace WebCore {
2828
29 Ref<SourceGraphic> SourceGraphic::create(Filter& filter)
 29Ref<SourceGraphic> SourceGraphic::create()
3030{
31  return adoptRef(*new SourceGraphic(filter));
 31 return adoptRef(*new SourceGraphic());
3232}
3333
34 void SourceGraphic::determineAbsolutePaintRect()
 34SourceGraphic::SourceGraphic()
 35 : FilterEffect(FilterEffect::Type::SourceGraphic)
 36{
 37 setOperatingColorSpace(DestinationColorSpace::SRGB());
 38}
 39
 40void SourceGraphic::determineAbsolutePaintRect(const Filter& filter)
3541{
36  Filter& filter = this->filter();
3742 FloatRect paintRect = filter.sourceImageRect();
3843 setAbsolutePaintRect(enclosingIntRect(paintRect));
3944}
4045
41 void SourceGraphic::platformApplySoftware()
 46void SourceGraphic::platformApplySoftware(const Filter& filter)
4247{
43  Filter& filter = this->filter();
44 
4548 ImageBuffer* resultImage = createImageBufferResult();
4649 ImageBuffer* sourceImage = filter.sourceImage();
4750 if (!resultImage || !sourceImage)

Source/WebCore/platform/graphics/filters/SourceGraphic.h

@@namespace WebCore {
2626
2727class SourceGraphic : public FilterEffect {
2828public:
29  static Ref<SourceGraphic> create(Filter&);
 29 static Ref<SourceGraphic> create();
3030
3131 static AtomString effectName() { return FilterEffect::sourceGraphicName(); }
3232
3333private:
34  SourceGraphic(Filter& filter)
35  : FilterEffect(filter, FilterEffect::Type::SourceGraphic)
36  {
37  setOperatingColorSpace(DestinationColorSpace::SRGB());
38  }
39 
40  void determineAbsolutePaintRect() override;
41  void platformApplySoftware() override;
 34 SourceGraphic();
 35
 36 void determineAbsolutePaintRect(const Filter&) override;
 37
 38 void platformApplySoftware(const Filter&) override;
 39
4240 WTF::TextStream& externalRepresentation(WTF::TextStream&, RepresentationType) const override;
4341};
4442

Source/WebCore/rendering/CSSFilter.cpp

@@CSSFilter::CSSFilter(bool hasFilterThatMovesPixels, bool hasFilterThatShouldBeRe
6464{
6565}
6666
67 static RefPtr<FilterEffect> createBlurEffect(CSSFilter& filter, const BlurFilterOperation& blurOperation, FilterConsumer consumer)
 67static RefPtr<FilterEffect> createBlurEffect(const BlurFilterOperation& blurOperation, FilterConsumer consumer)
6868{
6969 float stdDeviation = floatValueForLength(blurOperation.stdDeviation(), 0);
70  return FEGaussianBlur::create(filter, stdDeviation, stdDeviation, consumer == FilterConsumer::FilterProperty ? EDGEMODE_NONE : EDGEMODE_DUPLICATE);
 70 return FEGaussianBlur::create(stdDeviation, stdDeviation, consumer == FilterConsumer::FilterProperty ? EDGEMODE_NONE : EDGEMODE_DUPLICATE);
7171}
7272
73 static RefPtr<FilterEffect> createBrightnessEffect(CSSFilter& filter, const BasicComponentTransferFilterOperation& componentTransferOperation)
 73static RefPtr<FilterEffect> createBrightnessEffect(const BasicComponentTransferFilterOperation& componentTransferOperation)
7474{
7575 ComponentTransferFunction transferFunction;
7676 transferFunction.type = FECOMPONENTTRANSFER_TYPE_LINEAR;

@@static RefPtr<FilterEffect> createBrightnessEffect(CSSFilter& filter, const Basi
7878 transferFunction.intercept = 0;
7979
8080 ComponentTransferFunction nullFunction;
81  return FEComponentTransfer::create(filter, transferFunction, transferFunction, transferFunction, nullFunction);
 81 return FEComponentTransfer::create(transferFunction, transferFunction, transferFunction, nullFunction);
8282}
8383
84 static RefPtr<FilterEffect> createContrastEffect(CSSFilter& filter, const BasicComponentTransferFilterOperation& componentTransferOperation)
 84static RefPtr<FilterEffect> createContrastEffect(const BasicComponentTransferFilterOperation& componentTransferOperation)
8585{
8686 ComponentTransferFunction transferFunction;
8787 transferFunction.type = FECOMPONENTTRANSFER_TYPE_LINEAR;

@@static RefPtr<FilterEffect> createContrastEffect(CSSFilter& filter, const BasicC
9090 transferFunction.intercept = -0.5 * amount + 0.5;
9191
9292 ComponentTransferFunction nullFunction;
93  return FEComponentTransfer::create(filter, transferFunction, transferFunction, transferFunction, nullFunction);
 93 return FEComponentTransfer::create(transferFunction, transferFunction, transferFunction, nullFunction);
9494}
9595
96 static RefPtr<FilterEffect> createDropShadowEffect(CSSFilter& filter, const DropShadowFilterOperation& dropShadowOperation)
 96static RefPtr<FilterEffect> createDropShadowEffect(const DropShadowFilterOperation& dropShadowOperation)
9797{
9898 float std = dropShadowOperation.stdDeviation();
99  return FEDropShadow::create(filter, std, std, dropShadowOperation.x(), dropShadowOperation.y(), dropShadowOperation.color(), 1);
 99 return FEDropShadow::create(std, std, dropShadowOperation.x(), dropShadowOperation.y(), dropShadowOperation.color(), 1);
100100}
101101
102 static RefPtr<FilterEffect> createGrayScaleEffect(CSSFilter& filter, const BasicColorMatrixFilterOperation& colorMatrixOperation)
 102static RefPtr<FilterEffect> createGrayScaleEffect(const BasicColorMatrixFilterOperation& colorMatrixOperation)
103103{
104104 double oneMinusAmount = clampTo(1 - colorMatrixOperation.amount(), 0.0, 1.0);
105105

@@static RefPtr<FilterEffect> createGrayScaleEffect(CSSFilter& filter, const Basic
132132 0,
133133 };
134134
135  return FEColorMatrix::create(filter, FECOLORMATRIX_TYPE_MATRIX, WTFMove(inputParameters));
 135 return FEColorMatrix::create(FECOLORMATRIX_TYPE_MATRIX, WTFMove(inputParameters));
136136}
137137
138 static RefPtr<FilterEffect> createHueRotateEffect(CSSFilter& filter, const BasicColorMatrixFilterOperation& colorMatrixOperation)
 138static RefPtr<FilterEffect> createHueRotateEffect(const BasicColorMatrixFilterOperation& colorMatrixOperation)
139139{
140140 Vector<float> inputParameters { narrowPrecisionToFloat(colorMatrixOperation.amount()) };
141  return FEColorMatrix::create(filter, FECOLORMATRIX_TYPE_HUEROTATE, WTFMove(inputParameters));
 141 return FEColorMatrix::create(FECOLORMATRIX_TYPE_HUEROTATE, WTFMove(inputParameters));
142142}
143143
144 static RefPtr<FilterEffect> createInvertEffect(CSSFilter& filter, const BasicComponentTransferFilterOperation& componentTransferOperation)
 144static RefPtr<FilterEffect> createInvertEffect(const BasicComponentTransferFilterOperation& componentTransferOperation)
145145{
146146 ComponentTransferFunction transferFunction;
147147 transferFunction.type = FECOMPONENTTRANSFER_TYPE_LINEAR;

@@static RefPtr<FilterEffect> createInvertEffect(CSSFilter& filter, const BasicCom
150150 transferFunction.intercept = amount;
151151
152152 ComponentTransferFunction nullFunction;
153  return FEComponentTransfer::create(filter, transferFunction, transferFunction, transferFunction, nullFunction);
 153 return FEComponentTransfer::create(transferFunction, transferFunction, transferFunction, nullFunction);
154154}
155155
156 static RefPtr<FilterEffect> createOpacityEffect(CSSFilter& filter, const BasicComponentTransferFilterOperation& componentTransferOperation)
 156static RefPtr<FilterEffect> createOpacityEffect(const BasicComponentTransferFilterOperation& componentTransferOperation)
157157{
158158 ComponentTransferFunction transferFunction;
159159 transferFunction.type = FECOMPONENTTRANSFER_TYPE_LINEAR;

@@static RefPtr<FilterEffect> createOpacityEffect(CSSFilter& filter, const BasicCo
162162 transferFunction.intercept = 0;
163163
164164 ComponentTransferFunction nullFunction;
165  return FEComponentTransfer::create(filter, nullFunction, nullFunction, nullFunction, transferFunction);
 165 return FEComponentTransfer::create(nullFunction, nullFunction, nullFunction, transferFunction);
166166}
167167
168 static RefPtr<FilterEffect> createSaturateEffect(CSSFilter& filter, const BasicColorMatrixFilterOperation& colorMatrixOperation)
 168static RefPtr<FilterEffect> createSaturateEffect(const BasicColorMatrixFilterOperation& colorMatrixOperation)
169169{
170170 Vector<float> inputParameters { narrowPrecisionToFloat(colorMatrixOperation.amount()) };
171  return FEColorMatrix::create(filter, FECOLORMATRIX_TYPE_SATURATE, WTFMove(inputParameters));
 171 return FEColorMatrix::create(FECOLORMATRIX_TYPE_SATURATE, WTFMove(inputParameters));
172172}
173173
174 static RefPtr<FilterEffect> createSepiaEffect(CSSFilter& filter, const BasicColorMatrixFilterOperation& colorMatrixOperation)
 174static RefPtr<FilterEffect> createSepiaEffect(const BasicColorMatrixFilterOperation& colorMatrixOperation)
175175{
176176 double oneMinusAmount = clampTo(1 - colorMatrixOperation.amount(), 0.0, 1.0);
177177

@@static RefPtr<FilterEffect> createSepiaEffect(CSSFilter& filter, const BasicColo
204204 0,
205205 };
206206
207  return FEColorMatrix::create(filter, FECOLORMATRIX_TYPE_MATRIX, WTFMove(inputParameters));
 207 return FEColorMatrix::create(FECOLORMATRIX_TYPE_MATRIX, WTFMove(inputParameters));
208208}
209209
210210static RefPtr<SVGFilter> createSVGFilter(CSSFilter& filter, const ReferenceFilterOperation& filterOperation, RenderElement& renderer, FilterEffect& previousEffect)

@@bool CSSFilter::buildFilterFunctions(RenderElement& renderer, const FilterOperat
237237 m_functions.clear();
238238 m_outsets = { };
239239
240  RefPtr<FilterEffect> previousEffect = SourceGraphic::create(*this);
 240 RefPtr<FilterEffect> previousEffect = SourceGraphic::create();
241241 m_functions.append({ *previousEffect });
242242
243243 RefPtr<SVGFilter> filter;

@@bool CSSFilter::buildFilterFunctions(RenderElement& renderer, const FilterOperat
251251 break;
252252
253253 case FilterOperation::BLUR:
254  effect = createBlurEffect(*this, downcast<BlurFilterOperation>(*operation), consumer);
 254 effect = createBlurEffect(downcast<BlurFilterOperation>(*operation), consumer);
255255 break;
256256
257257 case FilterOperation::BRIGHTNESS:
258  effect = createBrightnessEffect(*this, downcast<BasicComponentTransferFilterOperation>(*operation));
 258 effect = createBrightnessEffect(downcast<BasicComponentTransferFilterOperation>(*operation));
259259 break;
260260
261261 case FilterOperation::CONTRAST:
262  effect = createContrastEffect(*this, downcast<BasicComponentTransferFilterOperation>(*operation));
 262 effect = createContrastEffect(downcast<BasicComponentTransferFilterOperation>(*operation));
263263 break;
264264
265265 case FilterOperation::DROP_SHADOW:
266  effect = createDropShadowEffect(*this, downcast<DropShadowFilterOperation>(*operation));
 266 effect = createDropShadowEffect(downcast<DropShadowFilterOperation>(*operation));
267267 break;
268268
269269 case FilterOperation::GRAYSCALE:
270  effect = createGrayScaleEffect(*this, downcast<BasicColorMatrixFilterOperation>(*operation));
 270 effect = createGrayScaleEffect(downcast<BasicColorMatrixFilterOperation>(*operation));
271271 break;
272272
273273 case FilterOperation::HUE_ROTATE:
274  effect = createHueRotateEffect(*this, downcast<BasicColorMatrixFilterOperation>(*operation));
 274 effect = createHueRotateEffect(downcast<BasicColorMatrixFilterOperation>(*operation));
275275 break;
276276
277277 case FilterOperation::INVERT:
278  effect = createInvertEffect(*this, downcast<BasicComponentTransferFilterOperation>(*operation));
 278 effect = createInvertEffect(downcast<BasicComponentTransferFilterOperation>(*operation));
279279 break;
280280
281281 case FilterOperation::OPACITY:
282  effect = createOpacityEffect(*this, downcast<BasicComponentTransferFilterOperation>(*operation));
 282 effect = createOpacityEffect(downcast<BasicComponentTransferFilterOperation>(*operation));
283283 break;
284284
285285 case FilterOperation::SATURATE:
286  effect = createSaturateEffect(*this, downcast<BasicColorMatrixFilterOperation>(*operation));
 286 effect = createSaturateEffect(downcast<BasicColorMatrixFilterOperation>(*operation));
287287 break;
288288
289289 case FilterOperation::SEPIA:
290  effect = createSepiaEffect(*this, downcast<BasicColorMatrixFilterOperation>(*operation));
 290 effect = createSepiaEffect(downcast<BasicColorMatrixFilterOperation>(*operation));
291291 break;
292292
293293 case FilterOperation::REFERENCE:

@@RefPtr<FilterEffect> CSSFilter::lastEffect()
385385void CSSFilter::determineFilterPrimitiveSubregion()
386386{
387387 auto effect = lastEffect();
388  effect->determineFilterPrimitiveSubregion();
 388 effect->determineFilterPrimitiveSubregion(*this);
389389 FloatRect subRegion = effect->maxEffectRect();
390390 // At least one FilterEffect has a too big image size, recalculate the effect sizes with new scale factors.
391391 FloatSize filterScale { 1, 1 };
392392 if (ImageBuffer::sizeNeedsClamping(subRegion.size(), filterScale)) {
393393 setFilterScale(filterScale);
394  effect->determineFilterPrimitiveSubregion();
 394 effect->determineFilterPrimitiveSubregion(*this);
395395 }
396396}
397397

@@void CSSFilter::apply()
405405{
406406 auto effect = lastEffect();
407407 if (m_filterRenderer) {
408  m_filterRenderer->applyEffects(*effect);
 408 m_filterRenderer->applyEffects(*this, *effect);
409409 if (m_filterRenderer->hasResult()) {
410410 effect->transformResultColorSpace(DestinationColorSpace::SRGB());
411411 return;
412412 }
413413 }
414  effect->apply();
 414
 415 for (auto& function : m_functions) {
 416 if (function->isSVGFilter()) {
 417 downcast<SVGFilter>(function.ptr())->setSourceImage({ sourceImage() });
 418 downcast<SVGFilter>(function.ptr())->apply();
 419 } else if (function->isFilterEffect())
 420 downcast<FilterEffect>(function.ptr())->apply(*this);
 421 }
 422
415423 effect->transformResultColorSpace(DestinationColorSpace::SRGB());
416424}
417425

Source/WebCore/rendering/CSSFilter.h

@@public:
5959 IntOutsets outsets() const override;
6060
6161 void clearIntermediateResults();
62  void apply();
 62 void apply() override;
6363
6464 ImageBuffer* output();
6565

Source/WebCore/rendering/svg/RenderSVGResourceFilter.cpp

@@bool RenderSVGResourceFilter::applyResource(RenderElement& renderer, const Rende
131131
132132 LOG_WITH_STREAM(Filters, stream << "RenderSVGResourceFilter::applyResource\n" << *filterData->builder->lastEffect());
133133
134  lastEffect->determineFilterPrimitiveSubregion();
 134 lastEffect->determineFilterPrimitiveSubregion(*filterData->filter);
135135 FloatRect subRegion = lastEffect->maxEffectRect();
136136
137137 // At least one FilterEffect has a too big image size,
138138 // recalculate the effect sizes with new scale factors.
139139 if (ImageBuffer::sizeNeedsClamping(subRegion.size(), filterScale)) {
140140 filterData->filter->setFilterScale(filterScale);
141  lastEffect->determineFilterPrimitiveSubregion();
 141 lastEffect->determineFilterPrimitiveSubregion(*filterData->filter);
142142 }
143143
144144 // If the drawingRegion is empty, we have something like <g filter=".."/>.

@@void RenderSVGResourceFilter::postApplyResource(RenderElement& renderer, Graphic
224224 break;
225225 }
226226
227  FilterEffect* lastEffect = filterData.builder->lastEffect();
 227 auto lastEffect = filterData.filter->lastEffect();
228228
229229 if (lastEffect && !filterData.boundaries.isEmpty() && !lastEffect->filterPrimitiveSubregion().isEmpty()) {
230230 // This is the real filtering of the object. It just needs to be called on the

@@void RenderSVGResourceFilter::postApplyResource(RenderElement& renderer, Graphic
236236 // Always true if filterData is just built (filterData->state == FilterData::Built).
237237 if (!lastEffect->hasResult()) {
238238 filterData.state = FilterData::Applying;
239  lastEffect->apply();
 239 filterData.filter->apply();
240240 lastEffect->correctFilterResultIfNeeded();
241241 lastEffect->transformResultColorSpace(DestinationColorSpace::SRGB());
242242 }

Source/WebCore/svg/SVGFEBlendElement.cpp

@@void SVGFEBlendElement::svgAttributeChanged(const QualifiedName& attrName)
100100 SVGFilterPrimitiveStandardAttributes::svgAttributeChanged(attrName);
101101}
102102
103 RefPtr<FilterEffect> SVGFEBlendElement::build(SVGFilterBuilder* filterBuilder, Filter& filter) const
 103RefPtr<FilterEffect> SVGFEBlendElement::build(SVGFilterBuilder& filterBuilder) const
104104{
105  auto input1 = filterBuilder->getEffectById(in1());
106  auto input2 = filterBuilder->getEffectById(in2());
 105 auto input1 = filterBuilder.getEffectById(in1());
 106 auto input2 = filterBuilder.getEffectById(in2());
107107
108108 if (!input1 || !input2)
109109 return nullptr;
110110
111  auto effect = FEBlend::create(filter, mode());
112  FilterEffectVector& inputEffects = effect->inputEffects();
113  inputEffects.reserveCapacity(2);
114  inputEffects.append(input1);
115  inputEffects.append(input2);
 111 auto effect = FEBlend::create(mode());
 112 effect->inputEffects() = { WTFMove(input1), WTFMove(input2) };
116113 return effect;
117114}
118115

Source/WebCore/svg/SVGFEBlendElement.h

@@private:
6969 void parseAttribute(const QualifiedName&, const AtomString&) override;
7070 void svgAttributeChanged(const QualifiedName&) override;
7171
72  RefPtr<FilterEffect> build(SVGFilterBuilder*, Filter&) const override;
 72 RefPtr<FilterEffect> build(SVGFilterBuilder&) const override;
7373 bool setFilterEffectAttribute(FilterEffect*, const QualifiedName& attrName) override;
7474
7575 PropertyRegistry m_propertyRegistry { *this };

Source/WebCore/svg/SVGFEColorMatrixElement.cpp

@@void SVGFEColorMatrixElement::svgAttributeChanged(const QualifiedName& attrName)
100100 SVGFilterPrimitiveStandardAttributes::svgAttributeChanged(attrName);
101101}
102102
103 RefPtr<FilterEffect> SVGFEColorMatrixElement::build(SVGFilterBuilder* filterBuilder, Filter& filter) const
 103RefPtr<FilterEffect> SVGFEColorMatrixElement::build(SVGFilterBuilder& filterBuilder) const
104104{
105  auto input1 = filterBuilder->getEffectById(in1());
 105 auto input1 = filterBuilder.getEffectById(in1());
106106
107107 if (!input1)
108108 return nullptr;

@@RefPtr<FilterEffect> SVGFEColorMatrixElement::build(SVGFilterBuilder* filterBuil
141141 filterValues.shrinkToFit();
142142 }
143143
144  auto effect = FEColorMatrix::create(filter, filterType, WTFMove(filterValues));
145  effect->inputEffects() = { input1 };
 144 auto effect = FEColorMatrix::create(filterType, WTFMove(filterValues));
 145 effect->inputEffects() = { WTFMove(input1) };
146146 return effect;
147147}
148148

Source/WebCore/svg/SVGFEColorMatrixElement.h

@@private:
8686 void svgAttributeChanged(const QualifiedName&) override;
8787
8888 bool setFilterEffectAttribute(FilterEffect*, const QualifiedName&) override;
89  RefPtr<FilterEffect> build(SVGFilterBuilder*, Filter&) const override;
 89 RefPtr<FilterEffect> build(SVGFilterBuilder&) const override;
9090
9191 PropertyRegistry m_propertyRegistry { *this };
9292 Ref<SVGAnimatedString> m_in1 { SVGAnimatedString::create(this) };

Source/WebCore/svg/SVGFEComponentTransferElement.cpp

@@void SVGFEComponentTransferElement::parseAttribute(const QualifiedName& name, co
6363 SVGFilterPrimitiveStandardAttributes::parseAttribute(name, value);
6464}
6565
66 RefPtr<FilterEffect> SVGFEComponentTransferElement::build(SVGFilterBuilder* filterBuilder, Filter& filter) const
 66RefPtr<FilterEffect> SVGFEComponentTransferElement::build(SVGFilterBuilder& filterBuilder) const
6767{
68  auto input1 = filterBuilder->getEffectById(in1());
 68 auto input1 = filterBuilder.getEffectById(in1());
6969
7070 if (!input1)
7171 return nullptr;

@@RefPtr<FilterEffect> SVGFEComponentTransferElement::build(SVGFilterBuilder* filt
8585 else if (is<SVGFEFuncAElement>(child))
8686 alpha = downcast<SVGFEFuncAElement>(child).transferFunction();
8787 }
88 
89  auto effect = FEComponentTransfer::create(filter, red, green, blue, alpha);
90  effect->inputEffects() = { input1 };
 88
 89 auto effect = FEComponentTransfer::create(red, green, blue, alpha);
 90 effect->inputEffects() = { WTFMove(input1) };
9191 return effect;
9292}
9393

Source/WebCore/svg/SVGFEComponentTransferElement.h

@@private:
4343 // FIXME: svgAttributeChanged missing.
4444 void parseAttribute(const QualifiedName&, const AtomString&) override;
4545
46  RefPtr<FilterEffect> build(SVGFilterBuilder*, Filter&) const override;
 46 RefPtr<FilterEffect> build(SVGFilterBuilder&) const override;
4747
4848 PropertyRegistry m_propertyRegistry { *this };
4949 Ref<SVGAnimatedString> m_in1 { SVGAnimatedString::create(this) };

Source/WebCore/svg/SVGFECompositeElement.cpp

@@void SVGFECompositeElement::svgAttributeChanged(const QualifiedName& attrName)
131131 SVGFilterPrimitiveStandardAttributes::svgAttributeChanged(attrName);
132132}
133133
134 RefPtr<FilterEffect> SVGFECompositeElement::build(SVGFilterBuilder* filterBuilder, Filter& filter) const
 134RefPtr<FilterEffect> SVGFECompositeElement::build(SVGFilterBuilder& filterBuilder) const
135135{
136  auto input1 = filterBuilder->getEffectById(in1());
137  auto input2 = filterBuilder->getEffectById(in2());
 136 auto input1 = filterBuilder.getEffectById(in1());
 137 auto input2 = filterBuilder.getEffectById(in2());
138138
139139 if (!input1 || !input2)
140140 return nullptr;
141141
142  auto effect = FEComposite::create(filter, svgOperator(), k1(), k2(), k3(), k4());
143  FilterEffectVector& inputEffects = effect->inputEffects();
144  inputEffects.reserveCapacity(2);
145  inputEffects.append(input1);
146  inputEffects.append(input2);
 142 auto effect = FEComposite::create(svgOperator(), k1(), k2(), k3(), k4());
 143 effect->inputEffects() = { WTFMove(input1), WTFMove(input2) };
147144 return effect;
148145}
149146

Source/WebCore/svg/SVGFECompositeElement.h

@@private:
109109 void svgAttributeChanged(const QualifiedName&) override;
110110
111111 bool setFilterEffectAttribute(FilterEffect*, const QualifiedName&) override;
112  RefPtr<FilterEffect> build(SVGFilterBuilder*, Filter&) const override;
 112 RefPtr<FilterEffect> build(SVGFilterBuilder&) const override;
113113
114114 PropertyRegistry m_propertyRegistry { *this };
115115 Ref<SVGAnimatedString> m_in1 { SVGAnimatedString::create(this) };

Source/WebCore/svg/SVGFEConvolveMatrixElement.cpp

@@void SVGFEConvolveMatrixElement::svgAttributeChanged(const QualifiedName& attrNa
191191 SVGFilterPrimitiveStandardAttributes::svgAttributeChanged(attrName);
192192}
193193
194 RefPtr<FilterEffect> SVGFEConvolveMatrixElement::build(SVGFilterBuilder* filterBuilder, Filter& filter) const
 194RefPtr<FilterEffect> SVGFEConvolveMatrixElement::build(SVGFilterBuilder& filterBuilder) const
195195{
196  auto input1 = filterBuilder->getEffectById(in1());
 196 auto input1 = filterBuilder.getEffectById(in1());
197197
198198 if (!input1)
199199 return nullptr;

@@RefPtr<FilterEffect> SVGFEConvolveMatrixElement::build(SVGFilterBuilder* filterB
246246 divisorValue = 1;
247247 }
248248
249  auto effect = FEConvolveMatrix::create(filter, IntSize(orderXValue, orderYValue), divisorValue, bias(), IntPoint(targetXValue, targetYValue), edgeMode(), FloatPoint(kernelUnitLengthXValue, kernelUnitLengthYValue), preserveAlpha(), kernelMatrix);
250  effect->inputEffects() = { input1 };
 249 auto effect = FEConvolveMatrix::create(IntSize(orderXValue, orderYValue), divisorValue, bias(), IntPoint(targetXValue, targetYValue), edgeMode(), FloatPoint(kernelUnitLengthXValue, kernelUnitLengthYValue), preserveAlpha(), kernelMatrix);
 250 effect->inputEffects() = { WTFMove(input1) };
251251 return effect;
252252}
253253

Source/WebCore/svg/SVGFEConvolveMatrixElement.h

@@private:
103103 void svgAttributeChanged(const QualifiedName&) override;
104104
105105 bool setFilterEffectAttribute(FilterEffect*, const QualifiedName&) override;
106  RefPtr<FilterEffect> build(SVGFilterBuilder*, Filter&) const override;
 106 RefPtr<FilterEffect> build(SVGFilterBuilder&) const override;
107107
108108 PropertyRegistry m_propertyRegistry { *this };
109109 Ref<SVGAnimatedString> m_in1 { SVGAnimatedString::create(this) };

Source/WebCore/svg/SVGFEDiffuseLightingElement.cpp

@@void SVGFEDiffuseLightingElement::lightElementAttributeChanged(const SVGFELightE
151151 primitiveAttributeChanged(attrName);
152152}
153153
154 RefPtr<FilterEffect> SVGFEDiffuseLightingElement::build(SVGFilterBuilder* filterBuilder, Filter& filter) const
 154RefPtr<FilterEffect> SVGFEDiffuseLightingElement::build(SVGFilterBuilder& filterBuilder) const
155155{
156  auto input1 = filterBuilder->getEffectById(in1());
 156 auto input1 = filterBuilder.getEffectById(in1());
157157
158158 if (!input1)
159159 return nullptr;

@@RefPtr<FilterEffect> SVGFEDiffuseLightingElement::build(SVGFilterBuilder* filter
162162 if (!lightElement)
163163 return nullptr;
164164
165  auto lightSource = lightElement->lightSource(*filterBuilder);
 165 auto lightSource = lightElement->lightSource(filterBuilder);
166166
167167 RenderObject* renderer = this->renderer();
168168 if (!renderer)

@@RefPtr<FilterEffect> SVGFEDiffuseLightingElement::build(SVGFilterBuilder* filter
170170
171171 Color color = renderer->style().colorByApplyingColorFilter(renderer->style().svgStyle().lightingColor());
172172
173  auto effect = FEDiffuseLighting::create(filter, color, surfaceScale(), diffuseConstant(), kernelUnitLengthX(), kernelUnitLengthY(), WTFMove(lightSource));
174  effect->inputEffects() = { input1 };
 173 auto effect = FEDiffuseLighting::create(color, surfaceScale(), diffuseConstant(), kernelUnitLengthX(), kernelUnitLengthY(), WTFMove(lightSource));
 174 effect->inputEffects() = { WTFMove(input1) };
175175 return effect;
176176}
177177

Source/WebCore/svg/SVGFEDiffuseLightingElement.h

@@private:
5858 void svgAttributeChanged(const QualifiedName&) override;
5959
6060 bool setFilterEffectAttribute(FilterEffect*, const QualifiedName&) override;
61  RefPtr<FilterEffect> build(SVGFilterBuilder*, Filter&) const override;
 61 RefPtr<FilterEffect> build(SVGFilterBuilder&) const override;
6262
6363 PropertyRegistry m_propertyRegistry { *this };
6464 Ref<SVGAnimatedString> m_in1 { SVGAnimatedString::create(this) };

Source/WebCore/svg/SVGFEDisplacementMapElement.cpp

@@void SVGFEDisplacementMapElement::svgAttributeChanged(const QualifiedName& attrN
115115 SVGFilterPrimitiveStandardAttributes::svgAttributeChanged(attrName);
116116}
117117
118 RefPtr<FilterEffect> SVGFEDisplacementMapElement::build(SVGFilterBuilder* filterBuilder, Filter& filter) const
 118RefPtr<FilterEffect> SVGFEDisplacementMapElement::build(SVGFilterBuilder& filterBuilder) const
119119{
120  auto input1 = filterBuilder->getEffectById(in1());
121  auto input2 = filterBuilder->getEffectById(in2());
 120 auto input1 = filterBuilder.getEffectById(in1());
 121 auto input2 = filterBuilder.getEffectById(in2());
122122
123123 if (!input1 || !input2)
124124 return nullptr;
125125
126  auto effect = FEDisplacementMap::create(filter, xChannelSelector(), yChannelSelector(), scale());
127  FilterEffectVector& inputEffects = effect->inputEffects();
128  inputEffects.reserveCapacity(2);
129  inputEffects.append(input1);
130  inputEffects.append(input2);
 126 auto effect = FEDisplacementMap::create(xChannelSelector(), yChannelSelector(), scale());
 127 effect->inputEffects() = { WTFMove(input1), WTFMove(input2) };
131128 return effect;
132129}
133130

Source/WebCore/svg/SVGFEDisplacementMapElement.h

@@private:
9191 void svgAttributeChanged(const QualifiedName&) override;
9292
9393 bool setFilterEffectAttribute(FilterEffect*, const QualifiedName& attrName) override;
94  RefPtr<FilterEffect> build(SVGFilterBuilder*, Filter&) const override;
 94 RefPtr<FilterEffect> build(SVGFilterBuilder&) const override;
9595
9696 PropertyRegistry m_propertyRegistry { *this };
9797 Ref<SVGAnimatedString> m_in1 { SVGAnimatedString::create(this) };

Source/WebCore/svg/SVGFEDropShadowElement.cpp

@@void SVGFEDropShadowElement::svgAttributeChanged(const QualifiedName& attrName)
9797 SVGFilterPrimitiveStandardAttributes::svgAttributeChanged(attrName);
9898}
9999
100 RefPtr<FilterEffect> SVGFEDropShadowElement::build(SVGFilterBuilder* filterBuilder, Filter& filter) const
 100RefPtr<FilterEffect> SVGFEDropShadowElement::build(SVGFilterBuilder& filterBuilder) const
101101{
 102 auto input1 = filterBuilder.getEffectById(in1());
 103 if (!input1)
 104 return nullptr;
 105
102106 RenderObject* renderer = this->renderer();
103107 if (!renderer)
104108 return nullptr;

@@RefPtr<FilterEffect> SVGFEDropShadowElement::build(SVGFilterBuilder* filterBuild
111115 Color color = renderer->style().colorByApplyingColorFilter(svgStyle.floodColor());
112116 float opacity = svgStyle.floodOpacity();
113117
114  auto input1 = filterBuilder->getEffectById(in1());
115  if (!input1)
116  return nullptr;
117 
118  auto effect = FEDropShadow::create(filter, stdDeviationX(), stdDeviationY(), dx(), dy(), color, opacity);
119  effect->inputEffects() = { input1 };
 118 auto effect = FEDropShadow::create(stdDeviationX(), stdDeviationY(), dx(), dy(), color, opacity);
 119 effect->inputEffects() = { WTFMove(input1) };
120120 return effect;
121121}
122122

Source/WebCore/svg/SVGFEDropShadowElement.h

@@private:
5353 void parseAttribute(const QualifiedName&, const AtomString&) override;
5454 void svgAttributeChanged(const QualifiedName&) override;
5555
56  RefPtr<FilterEffect> build(SVGFilterBuilder*, Filter&) const override;
 56 RefPtr<FilterEffect> build(SVGFilterBuilder&) const override;
5757
5858 PropertyRegistry m_propertyRegistry { *this };
5959 Ref<SVGAnimatedString> m_in1 { SVGAnimatedString::create(this) };

Source/WebCore/svg/SVGFEFloodElement.cpp

@@bool SVGFEFloodElement::setFilterEffectAttribute(FilterEffect* effect, const Qua
5858 return false;
5959}
6060
61 RefPtr<FilterEffect> SVGFEFloodElement::build(SVGFilterBuilder*, Filter& filter) const
 61RefPtr<FilterEffect> SVGFEFloodElement::build(SVGFilterBuilder&) const
6262{
6363 RenderObject* renderer = this->renderer();
6464 if (!renderer)

@@RefPtr<FilterEffect> SVGFEFloodElement::build(SVGFilterBuilder*, Filter& filter)
6969 Color color = renderer->style().colorByApplyingColorFilter(svgStyle.floodColor());
7070 float opacity = svgStyle.floodOpacity();
7171
72  return FEFlood::create(filter, color, opacity);
 72 return FEFlood::create(color, opacity);
7373}
7474
7575}

Source/WebCore/svg/SVGFEFloodElement.h

@@private:
3636 const SVGPropertyRegistry& propertyRegistry() const final { return m_propertyRegistry; }
3737
3838 bool setFilterEffectAttribute(FilterEffect*, const QualifiedName& attrName) override;
39  RefPtr<FilterEffect> build(SVGFilterBuilder*, Filter&) const override;
 39 RefPtr<FilterEffect> build(SVGFilterBuilder&) const override;
4040
4141 PropertyRegistry m_propertyRegistry { *this };
4242};

Source/WebCore/svg/SVGFEGaussianBlurElement.cpp

@@void SVGFEGaussianBlurElement::svgAttributeChanged(const QualifiedName& attrName
9595 SVGFilterPrimitiveStandardAttributes::svgAttributeChanged(attrName);
9696}
9797
98 RefPtr<FilterEffect> SVGFEGaussianBlurElement::build(SVGFilterBuilder* filterBuilder, Filter& filter) const
 98RefPtr<FilterEffect> SVGFEGaussianBlurElement::build(SVGFilterBuilder& filterBuilder) const
9999{
100  auto input1 = filterBuilder->getEffectById(in1());
 100 auto input1 = filterBuilder.getEffectById(in1());
101101 if (!input1)
102102 return nullptr;
103103
104104 if (stdDeviationX() < 0 || stdDeviationY() < 0)
105105 return nullptr;
106106
107  auto effect = FEGaussianBlur::create(filter, stdDeviationX(), stdDeviationY(), edgeMode());
108  effect->inputEffects() = { input1 };
 107 auto effect = FEGaussianBlur::create(stdDeviationX(), stdDeviationY(), edgeMode());
 108 effect->inputEffects() = { WTFMove(input1) };
109109 return effect;
110110}
111111

Source/WebCore/svg/SVGFEGaussianBlurElement.h

@@private:
5353 void parseAttribute(const QualifiedName&, const AtomString&) override;
5454 void svgAttributeChanged(const QualifiedName&) override;
5555
56  RefPtr<FilterEffect> build(SVGFilterBuilder*, Filter&) const override;
 56 RefPtr<FilterEffect> build(SVGFilterBuilder&) const override;
5757
5858 PropertyRegistry m_propertyRegistry { *this };
5959 Ref<SVGAnimatedString> m_in1 { SVGAnimatedString::create(this) };

Source/WebCore/svg/SVGFEImageElement.cpp

@@std::tuple<RefPtr<ImageBuffer>, FloatRect> SVGFEImageElement::imageBufferForEffe
208208 return { imageBuffer, imageRect };
209209}
210210
211 RefPtr<FilterEffect> SVGFEImageElement::build(SVGFilterBuilder*, Filter& filter) const
 211RefPtr<FilterEffect> SVGFEImageElement::build(SVGFilterBuilder&) const
212212{
213213 if (m_cachedImage)
214  return FEImage::create(filter, Ref<Image> { *m_cachedImage->imageForRenderer(renderer()) }, preserveAspectRatio());
 214 return FEImage::create(Ref<Image> { *m_cachedImage->imageForRenderer(renderer()) }, preserveAspectRatio());
215215
216216 auto [imageBuffer, imageRect] = imageBufferForEffect();
217217 if (!imageBuffer)
218218 return nullptr;
219219
220  return FEImage::create(filter, imageBuffer.releaseNonNull(), imageRect, preserveAspectRatio());
 220 return FEImage::create(imageBuffer.releaseNonNull(), imageRect, preserveAspectRatio());
221221}
222222
223223void SVGFEImageElement::addSubresourceAttributeURLs(ListHashSet<URL>& urls) const

Source/WebCore/svg/SVGFEImageElement.h

@@private:
5757
5858 std::tuple<RefPtr<ImageBuffer>, FloatRect> imageBufferForEffect() const;
5959
60  RefPtr<FilterEffect> build(SVGFilterBuilder*, Filter&) const override;
 60 RefPtr<FilterEffect> build(SVGFilterBuilder&) const override;
6161
6262 void clearResourceReferences();
6363 void requestImageResource();

Source/WebCore/svg/SVGFEMergeElement.cpp

@@Ref<SVGFEMergeElement> SVGFEMergeElement::create(const QualifiedName& tagName, D
4545 return adoptRef(*new SVGFEMergeElement(tagName, document));
4646}
4747
48 RefPtr<FilterEffect> SVGFEMergeElement::build(SVGFilterBuilder* filterBuilder, Filter& filter) const
 48RefPtr<FilterEffect> SVGFEMergeElement::build(SVGFilterBuilder& filterBuilder) const
4949{
50  auto effect = FEMerge::create(filter);
51  auto& mergeInputs = effect->inputEffects();
 50 FilterEffectVector mergeInputs;
5251
5352 for (auto& mergeNode : childrenOfType<SVGFEMergeNodeElement>(*this)) {
54  auto mergeEffect = filterBuilder->getEffectById(mergeNode.in1());
 53 auto mergeEffect = filterBuilder.getEffectById(mergeNode.in1());
5554 if (!mergeEffect)
5655 return nullptr;
5756 mergeInputs.append(WTFMove(mergeEffect));

@@RefPtr<FilterEffect> SVGFEMergeElement::build(SVGFilterBuilder* filterBuilder, F
6261 if (mergeInputs.isEmpty())
6362 return nullptr;
6463
 64 auto effect = FEMerge::create();
 65 effect->inputEffects() = WTFMove(mergeInputs);
6566 return effect;
6667}
6768

Source/WebCore/svg/SVGFEMergeElement.h

@@private:
3535 using PropertyRegistry = SVGPropertyOwnerRegistry<SVGFEMergeElement, SVGFilterPrimitiveStandardAttributes>;
3636 const SVGPropertyRegistry& propertyRegistry() const final { return m_propertyRegistry; }
3737
38  RefPtr<FilterEffect> build(SVGFilterBuilder*, Filter&) const override;
 38 RefPtr<FilterEffect> build(SVGFilterBuilder&) const override;
3939
4040 PropertyRegistry m_propertyRegistry { *this };
4141};

Source/WebCore/svg/SVGFEMorphologyElement.cpp

@@void SVGFEMorphologyElement::svgAttributeChanged(const QualifiedName& attrName)
114114 SVGFilterPrimitiveStandardAttributes::svgAttributeChanged(attrName);
115115}
116116
117 RefPtr<FilterEffect> SVGFEMorphologyElement::build(SVGFilterBuilder* filterBuilder, Filter& filter) const
 117RefPtr<FilterEffect> SVGFEMorphologyElement::build(SVGFilterBuilder& filterBuilder) const
118118{
119  auto input1 = filterBuilder->getEffectById(in1());
120  float xRadius = radiusX();
121  float yRadius = radiusY();
122 
 119 auto input1 = filterBuilder.getEffectById(in1());
123120 if (!input1)
124121 return nullptr;
125122
 123 float xRadius = radiusX();
 124 float yRadius = radiusY();
126125 if (xRadius < 0 || yRadius < 0)
127126 return nullptr;
128127
129  auto effect = FEMorphology::create(filter, svgOperator(), xRadius, yRadius);
130  effect->inputEffects() = { input1 };
 128 auto effect = FEMorphology::create(svgOperator(), xRadius, yRadius);
 129 effect->inputEffects() = { WTFMove(input1) };
131130 return effect;
132131}
133132

Source/WebCore/svg/SVGFEMorphologyElement.h

@@private:
8181 void svgAttributeChanged(const QualifiedName&) override;
8282
8383 bool setFilterEffectAttribute(FilterEffect*, const QualifiedName&) override;
84  RefPtr<FilterEffect> build(SVGFilterBuilder*, Filter&) const override;
 84 RefPtr<FilterEffect> build(SVGFilterBuilder&) const override;
8585
8686 PropertyRegistry m_propertyRegistry { *this };
8787 Ref<SVGAnimatedString> m_in1 { SVGAnimatedString::create(this) };

Source/WebCore/svg/SVGFEOffsetElement.cpp

@@void SVGFEOffsetElement::svgAttributeChanged(const QualifiedName& attrName)
8181 SVGFilterPrimitiveStandardAttributes::svgAttributeChanged(attrName);
8282}
8383
84 RefPtr<FilterEffect> SVGFEOffsetElement::build(SVGFilterBuilder* filterBuilder, Filter& filter) const
 84RefPtr<FilterEffect> SVGFEOffsetElement::build(SVGFilterBuilder& filterBuilder) const
8585{
86  auto input1 = filterBuilder->getEffectById(in1());
87 
 86 auto input1 = filterBuilder.getEffectById(in1());
8887 if (!input1)
8988 return nullptr;
9089
91  auto effect = FEOffset::create(filter, dx(), dy());
92  effect->inputEffects() = { input1 };
 90 auto effect = FEOffset::create(dx(), dy());
 91 effect->inputEffects() = { WTFMove(input1) };
9392 return effect;
9493}
9594

Source/WebCore/svg/SVGFEOffsetElement.h

@@private:
4747 void parseAttribute(const QualifiedName&, const AtomString&) override;
4848 void svgAttributeChanged(const QualifiedName&) override;
4949
50  RefPtr<FilterEffect> build(SVGFilterBuilder*, Filter&) const override;
 50 RefPtr<FilterEffect> build(SVGFilterBuilder&) const override;
5151
5252 PropertyRegistry m_propertyRegistry { *this };
5353 Ref<SVGAnimatedString> m_in1 { SVGAnimatedString::create(this) };

Source/WebCore/svg/SVGFESpecularLightingElement.cpp

@@void SVGFESpecularLightingElement::lightElementAttributeChanged(const SVGFELight
160160 primitiveAttributeChanged(attrName);
161161}
162162
163 RefPtr<FilterEffect> SVGFESpecularLightingElement::build(SVGFilterBuilder* filterBuilder, Filter& filter) const
 163RefPtr<FilterEffect> SVGFESpecularLightingElement::build(SVGFilterBuilder& filterBuilder) const
164164{
165  auto input1 = filterBuilder->getEffectById(in1());
166 
 165 auto input1 = filterBuilder.getEffectById(in1());
167166 if (!input1)
168167 return nullptr;
169168

@@RefPtr<FilterEffect> SVGFESpecularLightingElement::build(SVGFilterBuilder* filte
171170 if (!lightElement)
172171 return nullptr;
173172
174  auto lightSource = lightElement->lightSource(*filterBuilder);
 173 auto lightSource = lightElement->lightSource(filterBuilder);
175174
176175 RenderObject* renderer = this->renderer();
177176 if (!renderer)

@@RefPtr<FilterEffect> SVGFESpecularLightingElement::build(SVGFilterBuilder* filte
179178
180179 Color color = renderer->style().colorByApplyingColorFilter(renderer->style().svgStyle().lightingColor());
181180
182  auto effect = FESpecularLighting::create(filter, color, surfaceScale(), specularConstant(), specularExponent(), kernelUnitLengthX(), kernelUnitLengthY(), WTFMove(lightSource));
183  effect->inputEffects() = { input1 };
 181 auto effect = FESpecularLighting::create(color, surfaceScale(), specularConstant(), specularExponent(), kernelUnitLengthX(), kernelUnitLengthY(), WTFMove(lightSource));
 182 effect->inputEffects() = { WTFMove(input1) };
184183 return effect;
185184}
186185

Source/WebCore/svg/SVGFESpecularLightingElement.h

@@private:
5858 void svgAttributeChanged(const QualifiedName&) override;
5959
6060 bool setFilterEffectAttribute(FilterEffect*, const QualifiedName&) override;
61  RefPtr<FilterEffect> build(SVGFilterBuilder*, Filter&) const override;
 61 RefPtr<FilterEffect> build(SVGFilterBuilder&) const override;
6262
6363 PropertyRegistry m_propertyRegistry { *this };
6464 Ref<SVGAnimatedString> m_in1 { SVGAnimatedString::create(this) };

Source/WebCore/svg/SVGFETileElement.cpp

@@void SVGFETileElement::svgAttributeChanged(const QualifiedName& attrName)
7070 SVGFilterPrimitiveStandardAttributes::svgAttributeChanged(attrName);
7171}
7272
73 RefPtr<FilterEffect> SVGFETileElement::build(SVGFilterBuilder* filterBuilder, Filter& filter) const
 73RefPtr<FilterEffect> SVGFETileElement::build(SVGFilterBuilder& filterBuilder) const
7474{
75  auto input1 = filterBuilder->getEffectById(in1());
76 
 75 auto input1 = filterBuilder.getEffectById(in1());
7776 if (!input1)
7877 return nullptr;
7978
80  auto effect = FETile::create(filter);
81  effect->inputEffects() = { input1 };
 79 auto effect = FETile::create();
 80 effect->inputEffects() = { WTFMove(input1) };
8281 return effect;
8382}
8483

Source/WebCore/svg/SVGFETileElement.h

@@private:
4242 void parseAttribute(const QualifiedName&, const AtomString&) override;
4343 void svgAttributeChanged(const QualifiedName&) override;
4444
45  RefPtr<FilterEffect> build(SVGFilterBuilder*, Filter&) const override;
 45 RefPtr<FilterEffect> build(SVGFilterBuilder&) const override;
4646
4747 PropertyRegistry m_propertyRegistry { *this };
4848 Ref<SVGAnimatedString> m_in1 { SVGAnimatedString::create(this) };

Source/WebCore/svg/SVGFETurbulenceElement.cpp

@@void SVGFETurbulenceElement::svgAttributeChanged(const QualifiedName& attrName)
117117 SVGFilterPrimitiveStandardAttributes::svgAttributeChanged(attrName);
118118}
119119
120 RefPtr<FilterEffect> SVGFETurbulenceElement::build(SVGFilterBuilder*, Filter& filter) const
 120RefPtr<FilterEffect> SVGFETurbulenceElement::build(SVGFilterBuilder&) const
121121{
122122 if (baseFrequencyX() < 0 || baseFrequencyY() < 0)
123123 return nullptr;
124  return FETurbulence::create(filter, type(), baseFrequencyX(), baseFrequencyY(), numOctaves(), seed(), stitchTiles() == SVG_STITCHTYPE_STITCH);
 124 return FETurbulence::create(type(), baseFrequencyX(), baseFrequencyY(), numOctaves(), seed(), stitchTiles() == SVG_STITCHTYPE_STITCH);
125125}
126126
127127}

Source/WebCore/svg/SVGFETurbulenceElement.h

@@private:
119119 void svgAttributeChanged(const QualifiedName&) override;
120120
121121 bool setFilterEffectAttribute(FilterEffect*, const QualifiedName& attrName) override;
122  RefPtr<FilterEffect> build(SVGFilterBuilder*, Filter&) const override;
 122 RefPtr<FilterEffect> build(SVGFilterBuilder&) const override;
123123
124124 PropertyRegistry m_propertyRegistry { *this };
125125 Ref<SVGAnimatedNumber> m_baseFrequencyX { SVGAnimatedNumber::create(this) };

Source/WebCore/svg/SVGFilterPrimitiveStandardAttributes.h

@@class SVGFilterPrimitiveStandardAttributes : public SVGElement {
3838public:
3939 void setStandardAttributes(FilterEffect*) const;
4040
41  virtual RefPtr<FilterEffect> build(SVGFilterBuilder*, Filter&) const = 0;
 41 virtual RefPtr<FilterEffect> build(SVGFilterBuilder&) const = 0;
4242 // Returns true, if the new value is different from the old one.
4343 virtual bool setFilterEffectAttribute(FilterEffect*, const QualifiedName&);
4444

Source/WebCore/svg/graphics/filters/SVGFEImage.cpp

3030
3131namespace WebCore {
3232
33 Ref<FEImage> FEImage::create(Filter& filter, Ref<Image>&& image, const SVGPreserveAspectRatioValue& preserveAspectRatio)
 33Ref<FEImage> FEImage::create(Ref<Image>&& image, const SVGPreserveAspectRatioValue& preserveAspectRatio)
3434{
3535 auto imageRect = FloatRect { { }, image->size() };
36  return create(filter, WTFMove(image), imageRect, preserveAspectRatio);
 36 return create(WTFMove(image), imageRect, preserveAspectRatio);
3737}
3838
39 Ref<FEImage> FEImage::create(Filter& filter, SourceImage&& sourceImage, const FloatRect& sourceImageRect, const SVGPreserveAspectRatioValue& preserveAspectRatio)
 39Ref<FEImage> FEImage::create(SourceImage&& sourceImage, const FloatRect& sourceImageRect, const SVGPreserveAspectRatioValue& preserveAspectRatio)
4040{
41  return adoptRef(*new FEImage(filter, WTFMove(sourceImage), sourceImageRect, preserveAspectRatio));
 41 return adoptRef(*new FEImage(WTFMove(sourceImage), sourceImageRect, preserveAspectRatio));
4242}
4343
44 FEImage::FEImage(Filter& filter, SourceImage&& sourceImage, const FloatRect& sourceImageRect, const SVGPreserveAspectRatioValue& preserveAspectRatio)
45  : FilterEffect(filter, Type::FEImage)
 44FEImage::FEImage(SourceImage&& sourceImage, const FloatRect& sourceImageRect, const SVGPreserveAspectRatioValue& preserveAspectRatio)
 45 : FilterEffect(Type::FEImage)
4646 , m_sourceImage(WTFMove(sourceImage))
4747 , m_sourceImageRect(sourceImageRect)
4848 , m_preserveAspectRatio(preserveAspectRatio)
4949{
5050}
5151
52 void FEImage::determineAbsolutePaintRect()
 52void FEImage::determineAbsolutePaintRect(const Filter& filter)
5353{
5454 auto primitiveSubregion = filterPrimitiveSubregion();
5555

@@void FEImage::determineAbsolutePaintRect()
6565 }
6666 );
6767
68  imageRect.scale(filter().filterScale());
 68 imageRect.scale(filter.filterScale());
6969
7070 if (clipsToBounds())
7171 imageRect.intersect(maxEffectRect());

@@void FEImage::determineAbsolutePaintRect()
7474 setAbsolutePaintRect(enclosingIntRect(imageRect));
7575}
7676
77 void FEImage::platformApplySoftware()
 77void FEImage::platformApplySoftware(const Filter& filter)
7878{
7979 // FEImage results are always in DestinationColorSpace::SRGB()
8080 setResultColorSpace(DestinationColorSpace::SRGB());

@@void FEImage::platformApplySoftware()
9191 auto imageRect = primitiveSubregion;
9292 auto srcRect = m_sourceImageRect;
9393 m_preserveAspectRatio.transformRect(imageRect, srcRect);
94  imageRect.scale(filter().filterScale());
 94 imageRect.scale(filter.filterScale());
9595 imageRect = drawingRegionOfInputImage(IntRect(imageRect));
9696 context.drawImage(image, imageRect, srcRect);
9797 },
9898 [&] (const Ref<ImageBuffer>& imageBuffer) {
9999 auto imageRect = primitiveSubregion;
100100 imageRect.moveBy(m_sourceImageRect.location());
101  imageRect.scale(filter().filterScale());
 101 imageRect.scale(filter.filterScale());
102102 imageRect = drawingRegionOfInputImage(IntRect(imageRect));
103103 context.drawImageBuffer(imageBuffer, imageRect.location());
104104 }

Source/WebCore/svg/graphics/filters/SVGFEImage.h

@@class FEImage final : public FilterEffect {
3535public:
3636 using SourceImage = std::variant<Ref<Image>, Ref<ImageBuffer>>;
3737
38  static Ref<FEImage> create(Filter&, Ref<Image>&&, const SVGPreserveAspectRatioValue&);
39  static Ref<FEImage> create(Filter&, SourceImage&&, const FloatRect& sourceImageRect, const SVGPreserveAspectRatioValue&);
 38 static Ref<FEImage> create(Ref<Image>&&, const SVGPreserveAspectRatioValue&);
 39 static Ref<FEImage> create(SourceImage&&, const FloatRect& sourceImageRect, const SVGPreserveAspectRatioValue&);
4040
4141 SourceImage& sourceImage() { return m_sourceImage; }
4242 void setImageSource(SourceImage&& sourceImage) { m_sourceImage = WTFMove(sourceImage); }
4343
4444private:
45  FEImage(Filter&, SourceImage&&, const FloatRect& sourceImageRect, const SVGPreserveAspectRatioValue&);
 45 FEImage(SourceImage&&, const FloatRect& sourceImageRect, const SVGPreserveAspectRatioValue&);
 46
 47 void determineAbsolutePaintRect(const Filter&) final;
 48
 49 void platformApplySoftware(const Filter&) final;
4650
47  void platformApplySoftware() final;
48  void determineAbsolutePaintRect() final;
4951 WTF::TextStream& externalRepresentation(WTF::TextStream&, RepresentationType) const final;
5052
5153 SourceImage m_sourceImage;

Source/WebCore/svg/graphics/filters/SVGFilter.cpp

@@RefPtr<SVGFilter> SVGFilter::create(SVGFilterElement& filterElement, SVGFilterBu
4545 auto filter = adoptRef(*new SVGFilter(filterScale, sourceImageRect, filterRegion, targetBoundingBox, primitiveBoundingBoxMode));
4646
4747 if (!previousEffect)
48  builder.setupBuiltinEffects(SourceGraphic::create(filter));
 48 builder.setupBuiltinEffects(SourceGraphic::create());
4949 else
5050 builder.setupBuiltinEffects({ *previousEffect });
5151
5252 builder.setTargetBoundingBox(targetBoundingBox);
5353 builder.setPrimitiveUnits(filterElement.primitiveUnits());
5454
55  auto lastEffect = builder.buildFilterEffects(filter, filterElement);
 55 auto lastEffect = builder.buildFilterEffects(filterElement);
5656 if (!lastEffect)
5757 return nullptr;
5858

@@FloatSize SVGFilter::scaledByFilterScale(FloatSize size) const
7575 return Filter::scaledByFilterScale(size);
7676}
7777
 78void SVGFilter::apply()
 79{
 80 m_lastEffect->apply(*this);
 81}
 82
7883IntOutsets SVGFilter::outsets() const
7984{
8085 return m_lastEffect->outsets();

Source/WebCore/svg/graphics/filters/SVGFilter.h

@@public:
3939 FloatSize scaledByFilterScale(FloatSize) const final;
4040
4141 FloatRect targetBoundingBox() const { return m_targetBoundingBox; }
 42 void apply() override;
4243
4344 RefPtr<FilterEffect> lastEffect() { return m_lastEffect; }
4445 void setLastEffect(RefPtr<FilterEffect>&& lastEffect) { m_lastEffect = WTFMove(lastEffect); }

Source/WebCore/svg/graphics/filters/SVGFilterBuilder.cpp

@@static unsigned totalNumberFilterEffects(const FilterEffect& lastEffect)
7575 return collectEffects(&lastEffect, allEffects);
7676}
7777
78 RefPtr<FilterEffect> SVGFilterBuilder::buildFilterEffects(Filter& filter, SVGFilterElement& filterElement)
 78RefPtr<FilterEffect> SVGFilterBuilder::buildFilterEffects(SVGFilterElement& filterElement)
7979{
8080 static constexpr unsigned maxCountChildNodes = 200;
8181 static constexpr unsigned maxTotalNumberFilterEffects = 100;

@@RefPtr<FilterEffect> SVGFilterBuilder::buildFilterEffects(Filter& filter, SVGFil
8686 RefPtr<FilterEffect> effect;
8787
8888 for (auto& effectElement : childrenOfType<SVGFilterPrimitiveStandardAttributes>(filterElement)) {
89  effect = effectElement.build(this, filter);
 89 effect = effectElement.build(*this);
9090 if (!effect) {
9191 clearEffects();
9292 return nullptr;

Source/WebCore/svg/graphics/filters/SVGFilterBuilder.h

@@public:
6666 void clearResultsRecursive(FilterEffect*);
6767
6868 void setupBuiltinEffects(Ref<FilterEffect> sourceGraphic);
69  RefPtr<FilterEffect> buildFilterEffects(Filter&, SVGFilterElement&);
 69 RefPtr<FilterEffect> buildFilterEffects(SVGFilterElement&);
7070
7171private:
7272 inline void addBuiltinEffects()