From d4236a4ea1de855429c44f541a7a7c6ac74aeeb1 Mon Sep 17 00:00:00 2001 From: Said Abou-Hallawa Date: Wed, 23 Nov 2022 20:30:40 -0800 Subject: [PATCH] [Filters] FilterEffect::calculatePrimitiveSubregion() and calculateImageRect() should take a span of the input image rects https://bugs.webkit.org/show_bug.cgi?id=248181 rdar://102586592 Reviewed by Cameron McCormack. Instead of passing a FilterImageVector to these functions we should pass a Vector since they care about the FilterImage::imageRect() only. This work is towards supporting CoreGraphics filters since no FilterImage will be used while applying the FilterEffects. * Source/WebCore/platform/graphics/filters/FEComposite.cpp: (WebCore::FEComposite::calculateImageRect const): * Source/WebCore/platform/graphics/filters/FEComposite.h: * Source/WebCore/platform/graphics/filters/FEConvolveMatrix.cpp: (WebCore::FEConvolveMatrix::calculateImageRect const): * Source/WebCore/platform/graphics/filters/FEConvolveMatrix.h: * Source/WebCore/platform/graphics/filters/FEDisplacementMap.cpp: (WebCore::FEDisplacementMap::calculateImageRect const): * Source/WebCore/platform/graphics/filters/FEDisplacementMap.h: * Source/WebCore/platform/graphics/filters/FEDropShadow.cpp: (WebCore::FEDropShadow::calculateImageRect const): * Source/WebCore/platform/graphics/filters/FEDropShadow.h: * Source/WebCore/platform/graphics/filters/FEFlood.cpp: (WebCore::FEFlood::calculateImageRect const): * Source/WebCore/platform/graphics/filters/FEFlood.h: * Source/WebCore/platform/graphics/filters/FEGaussianBlur.cpp: (WebCore::FEGaussianBlur::calculateImageRect const): * Source/WebCore/platform/graphics/filters/FEGaussianBlur.h: * Source/WebCore/platform/graphics/filters/FEImage.cpp: (WebCore::FEImage::calculateImageRect const): * Source/WebCore/platform/graphics/filters/FEImage.h: * Source/WebCore/platform/graphics/filters/FELighting.cpp: (WebCore::FELighting::calculateImageRect const): * Source/WebCore/platform/graphics/filters/FELighting.h: * Source/WebCore/platform/graphics/filters/FEMorphology.cpp: (WebCore::FEMorphology::calculateImageRect const): * Source/WebCore/platform/graphics/filters/FEMorphology.h: * Source/WebCore/platform/graphics/filters/FEOffset.cpp: (WebCore::FEOffset::calculateImageRect const): * Source/WebCore/platform/graphics/filters/FEOffset.h: * Source/WebCore/platform/graphics/filters/FETile.cpp: (WebCore::FETile::calculateImageRect const): * Source/WebCore/platform/graphics/filters/FETile.h: * Source/WebCore/platform/graphics/filters/FETurbulence.cpp: (WebCore::FETurbulence::calculateImageRect const): * Source/WebCore/platform/graphics/filters/FETurbulence.h: * Source/WebCore/platform/graphics/filters/FilterEffect.cpp: (WebCore::inputPrimitiveSubregions): (WebCore::FilterEffect::calculatePrimitiveSubregion const): (WebCore::inputImageRects): (WebCore::FilterEffect::calculateImageRect const): (WebCore::FilterEffect::apply): * Source/WebCore/platform/graphics/filters/FilterEffect.h: Canonical link: https://commits.webkit.org/256983@main --- .../platform/graphics/filters/FEComposite.cpp | 6 ++-- .../platform/graphics/filters/FEComposite.h | 2 +- .../graphics/filters/FEConvolveMatrix.cpp | 2 +- .../graphics/filters/FEConvolveMatrix.h | 2 +- .../graphics/filters/FEDisplacementMap.cpp | 2 +- .../graphics/filters/FEDisplacementMap.h | 2 +- .../graphics/filters/FEDropShadow.cpp | 4 +-- .../platform/graphics/filters/FEDropShadow.h | 2 +- .../platform/graphics/filters/FEFlood.cpp | 2 +- .../platform/graphics/filters/FEFlood.h | 2 +- .../graphics/filters/FEGaussianBlur.cpp | 4 +-- .../graphics/filters/FEGaussianBlur.h | 2 +- .../platform/graphics/filters/FEImage.cpp | 2 +- .../platform/graphics/filters/FEImage.h | 2 +- .../platform/graphics/filters/FELighting.cpp | 2 +- .../platform/graphics/filters/FELighting.h | 2 +- .../graphics/filters/FEMorphology.cpp | 4 +-- .../platform/graphics/filters/FEMorphology.h | 2 +- .../platform/graphics/filters/FEOffset.cpp | 4 +-- .../platform/graphics/filters/FEOffset.h | 2 +- .../platform/graphics/filters/FETile.cpp | 2 +- .../platform/graphics/filters/FETile.h | 2 +- .../graphics/filters/FETurbulence.cpp | 2 +- .../platform/graphics/filters/FETurbulence.h | 2 +- .../graphics/filters/FilterEffect.cpp | 32 +++++++++++++------ .../platform/graphics/filters/FilterEffect.h | 4 +-- 26 files changed, 55 insertions(+), 41 deletions(-) diff --git a/Source/WebCore/platform/graphics/filters/FEComposite.cpp b/Source/WebCore/platform/graphics/filters/FEComposite.cpp index 4c3b6708e57f..a8053df9d791 100644 --- a/Source/WebCore/platform/graphics/filters/FEComposite.cpp +++ b/Source/WebCore/platform/graphics/filters/FEComposite.cpp @@ -86,14 +86,14 @@ bool FEComposite::setK4(float k4) return true; } -FloatRect FEComposite::calculateImageRect(const Filter& filter, const FilterImageVector& inputs, const FloatRect& primitiveSubregion) const +FloatRect FEComposite::calculateImageRect(const Filter& filter, Span inputImageRects, const FloatRect& primitiveSubregion) const { switch (m_type) { case FECOMPOSITE_OPERATOR_IN: case FECOMPOSITE_OPERATOR_ATOP: // For In and Atop the first FilterImage just influences the result of the // second FilterImage. So just use the rect of the second FilterImage here. - return filter.clipToMaxEffectRect(inputs[1]->imageRect(), primitiveSubregion); + return filter.clipToMaxEffectRect(inputImageRects[1], primitiveSubregion); case FECOMPOSITE_OPERATOR_ARITHMETIC: // Arithmetic may influnce the entire filter primitive region. So we can't @@ -102,7 +102,7 @@ FloatRect FEComposite::calculateImageRect(const Filter& filter, const FilterImag default: // Take the union of both input effects. - return FilterEffect::calculateImageRect(filter, inputs, primitiveSubregion); + return FilterEffect::calculateImageRect(filter, inputImageRects, primitiveSubregion); } } diff --git a/Source/WebCore/platform/graphics/filters/FEComposite.h b/Source/WebCore/platform/graphics/filters/FEComposite.h index 6801b7dcf54e..1f1ec652206f 100644 --- a/Source/WebCore/platform/graphics/filters/FEComposite.h +++ b/Source/WebCore/platform/graphics/filters/FEComposite.h @@ -65,7 +65,7 @@ class FEComposite : public FilterEffect { unsigned numberOfEffectInputs() const override { return 2; } - FloatRect calculateImageRect(const Filter&, const FilterImageVector& inputs, const FloatRect& primitiveSubregion) const override; + FloatRect calculateImageRect(const Filter&, Span inputImageRects, const FloatRect& primitiveSubregion) const override; bool resultIsValidPremultiplied() const override { return m_type != FECOMPOSITE_OPERATOR_ARITHMETIC; } diff --git a/Source/WebCore/platform/graphics/filters/FEConvolveMatrix.cpp b/Source/WebCore/platform/graphics/filters/FEConvolveMatrix.cpp index e61ac8f957b4..bb456dc4b168 100644 --- a/Source/WebCore/platform/graphics/filters/FEConvolveMatrix.cpp +++ b/Source/WebCore/platform/graphics/filters/FEConvolveMatrix.cpp @@ -114,7 +114,7 @@ bool FEConvolveMatrix::setPreserveAlpha(bool preserveAlpha) return true; } -FloatRect FEConvolveMatrix::calculateImageRect(const Filter& filter, const FilterImageVector&, const FloatRect& primitiveSubregion) const +FloatRect FEConvolveMatrix::calculateImageRect(const Filter& filter, Span, const FloatRect& primitiveSubregion) const { return filter.maxEffectRect(primitiveSubregion); } diff --git a/Source/WebCore/platform/graphics/filters/FEConvolveMatrix.h b/Source/WebCore/platform/graphics/filters/FEConvolveMatrix.h index 07545b8748d1..7f74fc75080e 100644 --- a/Source/WebCore/platform/graphics/filters/FEConvolveMatrix.h +++ b/Source/WebCore/platform/graphics/filters/FEConvolveMatrix.h @@ -70,7 +70,7 @@ class FEConvolveMatrix : public FilterEffect { private: FEConvolveMatrix(const IntSize& kernelSize, float divisor, float bias, const IntPoint& targetOffset, EdgeModeType, const FloatPoint& kernelUnitLength, bool preserveAlpha, const Vector& kernelMatrix); - FloatRect calculateImageRect(const Filter&, const FilterImageVector& inputs, const FloatRect& primitiveSubregion) const override; + FloatRect calculateImageRect(const Filter&, Span inputImageRects, const FloatRect& primitiveSubregion) const override; std::unique_ptr createSoftwareApplier() const override; diff --git a/Source/WebCore/platform/graphics/filters/FEDisplacementMap.cpp b/Source/WebCore/platform/graphics/filters/FEDisplacementMap.cpp index 49099b637639..e2391dd9cb60 100644 --- a/Source/WebCore/platform/graphics/filters/FEDisplacementMap.cpp +++ b/Source/WebCore/platform/graphics/filters/FEDisplacementMap.cpp @@ -68,7 +68,7 @@ bool FEDisplacementMap::setScale(float scale) return true; } -FloatRect FEDisplacementMap::calculateImageRect(const Filter& filter, const FilterImageVector&, const FloatRect& primitiveSubregion) const +FloatRect FEDisplacementMap::calculateImageRect(const Filter& filter, Span, const FloatRect& primitiveSubregion) const { return filter.maxEffectRect(primitiveSubregion); } diff --git a/Source/WebCore/platform/graphics/filters/FEDisplacementMap.h b/Source/WebCore/platform/graphics/filters/FEDisplacementMap.h index d8fcdfda1dd6..93948ced8546 100644 --- a/Source/WebCore/platform/graphics/filters/FEDisplacementMap.h +++ b/Source/WebCore/platform/graphics/filters/FEDisplacementMap.h @@ -56,7 +56,7 @@ class FEDisplacementMap : public FilterEffect { unsigned numberOfEffectInputs() const override { return 2; } - FloatRect calculateImageRect(const Filter&, const FilterImageVector& inputs, const FloatRect& primitiveSubregion) const override; + FloatRect calculateImageRect(const Filter&, Span inputImageRects, const FloatRect& primitiveSubregion) const override; const DestinationColorSpace& resultColorSpace(const FilterImageVector&) const override; void transformInputsColorSpace(const FilterImageVector& inputs) const override; diff --git a/Source/WebCore/platform/graphics/filters/FEDropShadow.cpp b/Source/WebCore/platform/graphics/filters/FEDropShadow.cpp index 246a5bee6f84..9048f474158a 100644 --- a/Source/WebCore/platform/graphics/filters/FEDropShadow.cpp +++ b/Source/WebCore/platform/graphics/filters/FEDropShadow.cpp @@ -93,9 +93,9 @@ bool FEDropShadow::setShadowOpacity(float shadowOpacity) return true; } -FloatRect FEDropShadow::calculateImageRect(const Filter& filter, const FilterImageVector& inputs, const FloatRect& primitiveSubregion) const +FloatRect FEDropShadow::calculateImageRect(const Filter& filter, Span inputImageRects, const FloatRect& primitiveSubregion) const { - auto imageRect = inputs[0]->imageRect(); + auto imageRect = inputImageRects[0]; auto imageRectWithOffset(imageRect); imageRectWithOffset.move(filter.resolvedSize({ m_dx, m_dy })); imageRect.unite(imageRectWithOffset); diff --git a/Source/WebCore/platform/graphics/filters/FEDropShadow.h b/Source/WebCore/platform/graphics/filters/FEDropShadow.h index 29e46d900c42..520f52bd0803 100644 --- a/Source/WebCore/platform/graphics/filters/FEDropShadow.h +++ b/Source/WebCore/platform/graphics/filters/FEDropShadow.h @@ -55,7 +55,7 @@ class FEDropShadow : public FilterEffect { private: FEDropShadow(float stdX, float stdY, float dx, float dy, const Color& shadowColor, float shadowOpacity); - FloatRect calculateImageRect(const Filter&, const FilterImageVector& inputs, const FloatRect& primitiveSubregion) const override; + FloatRect calculateImageRect(const Filter&, Span inputImageRects, const FloatRect& primitiveSubregion) const override; std::unique_ptr createSoftwareApplier() const override; diff --git a/Source/WebCore/platform/graphics/filters/FEFlood.cpp b/Source/WebCore/platform/graphics/filters/FEFlood.cpp index c4c1a1ff7c7f..894e24119c28 100644 --- a/Source/WebCore/platform/graphics/filters/FEFlood.cpp +++ b/Source/WebCore/platform/graphics/filters/FEFlood.cpp @@ -59,7 +59,7 @@ bool FEFlood::setFloodOpacity(float floodOpacity) return true; } -FloatRect FEFlood::calculateImageRect(const Filter& filter, const FilterImageVector&, const FloatRect& primitiveSubregion) const +FloatRect FEFlood::calculateImageRect(const Filter& filter, Span, const FloatRect& primitiveSubregion) const { return filter.maxEffectRect(primitiveSubregion); } diff --git a/Source/WebCore/platform/graphics/filters/FEFlood.h b/Source/WebCore/platform/graphics/filters/FEFlood.h index 53d4cc5f9df1..c8fcbd7db755 100644 --- a/Source/WebCore/platform/graphics/filters/FEFlood.h +++ b/Source/WebCore/platform/graphics/filters/FEFlood.h @@ -51,7 +51,7 @@ class FEFlood : public FilterEffect { unsigned numberOfEffectInputs() const override { return 0; } - FloatRect calculateImageRect(const Filter&, const FilterImageVector& inputs, const FloatRect& primitiveSubregion) const override; + FloatRect calculateImageRect(const Filter&, Span inputImageRects, const FloatRect& primitiveSubregion) const override; std::unique_ptr createSoftwareApplier() const override; diff --git a/Source/WebCore/platform/graphics/filters/FEGaussianBlur.cpp b/Source/WebCore/platform/graphics/filters/FEGaussianBlur.cpp index cedfc297bce7..b6cf51a92926 100644 --- a/Source/WebCore/platform/graphics/filters/FEGaussianBlur.cpp +++ b/Source/WebCore/platform/graphics/filters/FEGaussianBlur.cpp @@ -112,9 +112,9 @@ IntSize FEGaussianBlur::calculateOutsetSize(FloatSize stdDeviation) return { 3 * kernelSize.width() / 2, 3 * kernelSize.height() / 2 }; } -FloatRect FEGaussianBlur::calculateImageRect(const Filter& filter, const FilterImageVector& inputs, const FloatRect& primitiveSubregion) const +FloatRect FEGaussianBlur::calculateImageRect(const Filter& filter, Span inputImageRects, const FloatRect& primitiveSubregion) const { - auto imageRect = inputs[0]->imageRect(); + auto imageRect = inputImageRects[0]; // Edge modes other than 'none' do not inflate the affected paint rect. if (m_edgeMode != EdgeModeType::None) diff --git a/Source/WebCore/platform/graphics/filters/FEGaussianBlur.h b/Source/WebCore/platform/graphics/filters/FEGaussianBlur.h index 384b2dc01666..e173731f17e1 100644 --- a/Source/WebCore/platform/graphics/filters/FEGaussianBlur.h +++ b/Source/WebCore/platform/graphics/filters/FEGaussianBlur.h @@ -52,7 +52,7 @@ class FEGaussianBlur : public FilterEffect { private: FEGaussianBlur(float x, float y, EdgeModeType); - FloatRect calculateImageRect(const Filter&, const FilterImageVector& inputs, const FloatRect& primitiveSubregion) const override; + FloatRect calculateImageRect(const Filter&, Span inputImageRects, const FloatRect& primitiveSubregion) const override; bool resultIsAlphaImage(const FilterImageVector& inputs) const override; diff --git a/Source/WebCore/platform/graphics/filters/FEImage.cpp b/Source/WebCore/platform/graphics/filters/FEImage.cpp index a6446738310a..fd55205f799a 100644 --- a/Source/WebCore/platform/graphics/filters/FEImage.cpp +++ b/Source/WebCore/platform/graphics/filters/FEImage.cpp @@ -43,7 +43,7 @@ FEImage::FEImage(SourceImage&& sourceImage, const FloatRect& sourceImageRect, co { } -FloatRect FEImage::calculateImageRect(const Filter& filter, const FilterImageVector&, const FloatRect& primitiveSubregion) const +FloatRect FEImage::calculateImageRect(const Filter& filter, Span, const FloatRect& primitiveSubregion) const { if (m_sourceImage.nativeImageIfExists()) { auto imageRect = primitiveSubregion; diff --git a/Source/WebCore/platform/graphics/filters/FEImage.h b/Source/WebCore/platform/graphics/filters/FEImage.h index 4656bb9d52c8..61fd2502ab70 100644 --- a/Source/WebCore/platform/graphics/filters/FEImage.h +++ b/Source/WebCore/platform/graphics/filters/FEImage.h @@ -55,7 +55,7 @@ class FEImage final : public FilterEffect { // FEImage results are always in DestinationColorSpace::SRGB() void setOperatingColorSpace(const DestinationColorSpace&) override { } - FloatRect calculateImageRect(const Filter&, const FilterImageVector& inputs, const FloatRect& primitiveSubregion) const override; + FloatRect calculateImageRect(const Filter&, Span inputImageRects, const FloatRect& primitiveSubregion) const override; std::unique_ptr createSoftwareApplier() const final; diff --git a/Source/WebCore/platform/graphics/filters/FELighting.cpp b/Source/WebCore/platform/graphics/filters/FELighting.cpp index eb49b75d4eb3..01753850b83e 100644 --- a/Source/WebCore/platform/graphics/filters/FELighting.cpp +++ b/Source/WebCore/platform/graphics/filters/FELighting.cpp @@ -82,7 +82,7 @@ bool FELighting::setKernelUnitLengthY(float kernelUnitLengthY) return true; } -FloatRect FELighting::calculateImageRect(const Filter& filter, const FilterImageVector&, const FloatRect& primitiveSubregion) const +FloatRect FELighting::calculateImageRect(const Filter& filter, Span, const FloatRect& primitiveSubregion) const { return filter.maxEffectRect(primitiveSubregion); } diff --git a/Source/WebCore/platform/graphics/filters/FELighting.h b/Source/WebCore/platform/graphics/filters/FELighting.h index 0c073bc13f8c..8e5e95d2ed92 100644 --- a/Source/WebCore/platform/graphics/filters/FELighting.h +++ b/Source/WebCore/platform/graphics/filters/FELighting.h @@ -63,7 +63,7 @@ class FELighting : public FilterEffect { protected: FELighting(Type, const Color& lightingColor, float surfaceScale, float diffuseConstant, float specularConstant, float specularExponent, float kernelUnitLengthX, float kernelUnitLengthY, Ref&&); - FloatRect calculateImageRect(const Filter&, const FilterImageVector& inputs, const FloatRect& primitiveSubregion) const override; + FloatRect calculateImageRect(const Filter&, Span inputImageRects, const FloatRect& primitiveSubregion) const override; std::unique_ptr createSoftwareApplier() const override; diff --git a/Source/WebCore/platform/graphics/filters/FEMorphology.cpp b/Source/WebCore/platform/graphics/filters/FEMorphology.cpp index ca6e505155dc..0b6af721231d 100644 --- a/Source/WebCore/platform/graphics/filters/FEMorphology.cpp +++ b/Source/WebCore/platform/graphics/filters/FEMorphology.cpp @@ -68,9 +68,9 @@ bool FEMorphology::setRadiusY(float radiusY) return true; } -FloatRect FEMorphology::calculateImageRect(const Filter& filter, const FilterImageVector& inputs, const FloatRect& primitiveSubregion) const +FloatRect FEMorphology::calculateImageRect(const Filter& filter, Span inputImageRects, const FloatRect& primitiveSubregion) const { - auto imageRect = inputs[0]->imageRect(); + auto imageRect = inputImageRects[0]; imageRect.inflate(filter.resolvedSize({ m_radiusX, m_radiusY })); return filter.clipToMaxEffectRect(imageRect, primitiveSubregion); } diff --git a/Source/WebCore/platform/graphics/filters/FEMorphology.h b/Source/WebCore/platform/graphics/filters/FEMorphology.h index 2f6b62381960..e46085f38d61 100644 --- a/Source/WebCore/platform/graphics/filters/FEMorphology.h +++ b/Source/WebCore/platform/graphics/filters/FEMorphology.h @@ -51,7 +51,7 @@ class FEMorphology : public FilterEffect { private: FEMorphology(MorphologyOperatorType, float radiusX, float radiusY); - FloatRect calculateImageRect(const Filter&, const FilterImageVector& inputs, const FloatRect& primitiveSubregion) const override; + FloatRect calculateImageRect(const Filter&, Span inputImageRects, const FloatRect& primitiveSubregion) const override; bool resultIsAlphaImage(const FilterImageVector& inputs) const override; diff --git a/Source/WebCore/platform/graphics/filters/FEOffset.cpp b/Source/WebCore/platform/graphics/filters/FEOffset.cpp index d58efea6d976..e1509d4d37bb 100644 --- a/Source/WebCore/platform/graphics/filters/FEOffset.cpp +++ b/Source/WebCore/platform/graphics/filters/FEOffset.cpp @@ -59,9 +59,9 @@ bool FEOffset::setDy(float dy) return true; } -FloatRect FEOffset::calculateImageRect(const Filter& filter, const FilterImageVector& inputs, const FloatRect& primitiveSubregion) const +FloatRect FEOffset::calculateImageRect(const Filter& filter, Span inputImageRects, const FloatRect& primitiveSubregion) const { - auto imageRect = inputs[0]->imageRect(); + auto imageRect = inputImageRects[0]; imageRect.move(filter.resolvedSize({ m_dx, m_dy })); return filter.clipToMaxEffectRect(imageRect, primitiveSubregion); } diff --git a/Source/WebCore/platform/graphics/filters/FEOffset.h b/Source/WebCore/platform/graphics/filters/FEOffset.h index b0a7b81402d4..59ef3e348fad 100644 --- a/Source/WebCore/platform/graphics/filters/FEOffset.h +++ b/Source/WebCore/platform/graphics/filters/FEOffset.h @@ -44,7 +44,7 @@ class FEOffset : public FilterEffect { private: FEOffset(float dx, float dy); - FloatRect calculateImageRect(const Filter&, const FilterImageVector& inputs, const FloatRect& primitiveSubregion) const override; + FloatRect calculateImageRect(const Filter&, Span inputImageRects, const FloatRect& primitiveSubregion) const override; bool resultIsAlphaImage(const FilterImageVector& inputs) const override; diff --git a/Source/WebCore/platform/graphics/filters/FETile.cpp b/Source/WebCore/platform/graphics/filters/FETile.cpp index e34fbab26479..b4a2a3af534d 100644 --- a/Source/WebCore/platform/graphics/filters/FETile.cpp +++ b/Source/WebCore/platform/graphics/filters/FETile.cpp @@ -38,7 +38,7 @@ FETile::FETile() { } -FloatRect FETile::calculateImageRect(const Filter& filter, const FilterImageVector&, const FloatRect& primitiveSubregion) const +FloatRect FETile::calculateImageRect(const Filter& filter, Span, const FloatRect& primitiveSubregion) const { return filter.maxEffectRect(primitiveSubregion); } diff --git a/Source/WebCore/platform/graphics/filters/FETile.h b/Source/WebCore/platform/graphics/filters/FETile.h index 89fa30e4824e..28156b0da590 100644 --- a/Source/WebCore/platform/graphics/filters/FETile.h +++ b/Source/WebCore/platform/graphics/filters/FETile.h @@ -33,7 +33,7 @@ class FETile : public FilterEffect { private: FETile(); - FloatRect calculateImageRect(const Filter&, const FilterImageVector& inputs, const FloatRect& primitiveSubregion) const override; + FloatRect calculateImageRect(const Filter&, Span inputImageRects, const FloatRect& primitiveSubregion) const override; bool resultIsAlphaImage(const FilterImageVector& inputs) const override; diff --git a/Source/WebCore/platform/graphics/filters/FETurbulence.cpp b/Source/WebCore/platform/graphics/filters/FETurbulence.cpp index d412972a7e2d..9f0bd750a2da 100644 --- a/Source/WebCore/platform/graphics/filters/FETurbulence.cpp +++ b/Source/WebCore/platform/graphics/filters/FETurbulence.cpp @@ -96,7 +96,7 @@ bool FETurbulence::setStitchTiles(bool stitch) return true; } -FloatRect FETurbulence::calculateImageRect(const Filter& filter, const FilterImageVector&, const FloatRect& primitiveSubregion) const +FloatRect FETurbulence::calculateImageRect(const Filter& filter, Span, const FloatRect& primitiveSubregion) const { return filter.maxEffectRect(primitiveSubregion); } diff --git a/Source/WebCore/platform/graphics/filters/FETurbulence.h b/Source/WebCore/platform/graphics/filters/FETurbulence.h index e8087c3002a6..c36e212c4563 100644 --- a/Source/WebCore/platform/graphics/filters/FETurbulence.h +++ b/Source/WebCore/platform/graphics/filters/FETurbulence.h @@ -65,7 +65,7 @@ class FETurbulence : public FilterEffect { unsigned numberOfEffectInputs() const override { return 0; } - FloatRect calculateImageRect(const Filter&, const FilterImageVector& inputs, const FloatRect& primitiveSubregion) const override; + FloatRect calculateImageRect(const Filter&, Span inputImageRects, const FloatRect& primitiveSubregion) const override; std::unique_ptr createSoftwareApplier() const override; diff --git a/Source/WebCore/platform/graphics/filters/FilterEffect.cpp b/Source/WebCore/platform/graphics/filters/FilterEffect.cpp index 32abb8b71cb3..e67b234f31ec 100644 --- a/Source/WebCore/platform/graphics/filters/FilterEffect.cpp +++ b/Source/WebCore/platform/graphics/filters/FilterEffect.cpp @@ -50,15 +50,29 @@ FilterImageVector FilterEffect::takeImageInputs(FilterImageVector& stack) const return inputs; } -FloatRect FilterEffect::calculatePrimitiveSubregion(const Filter& filter, const FilterImageVector& inputs, const std::optional& geometry) const +static Vector inputPrimitiveSubregions(const FilterImageVector& inputs) +{ + return inputs.map([](auto& input) { + return input->primitiveSubregion(); + }); +} + +static Vector inputImageRects(const FilterImageVector& inputs) +{ + return inputs.map([] (auto& input) { + return input->imageRect(); + }); +} + +FloatRect FilterEffect::calculatePrimitiveSubregion(const Filter& filter, Span inputPrimitiveSubregions, const std::optional& geometry) const { // This function implements https://www.w3.org/TR/filter-effects-1/#FilterPrimitiveSubRegion. FloatRect primitiveSubregion; // If there is no input effects, take the effect boundaries as unite rect. Don't use the input's subregion for FETile. - if (!inputs.isEmpty() && filterType() != FilterEffect::Type::FETile) { - for (auto& input : inputs) - primitiveSubregion.unite(input->primitiveSubregion()); + if (!inputPrimitiveSubregions.empty() && filterType() != FilterEffect::Type::FETile) { + for (auto& inputPrimitiveSubregion : inputPrimitiveSubregions) + primitiveSubregion.unite(inputPrimitiveSubregion); } else primitiveSubregion = filter.filterRegion(); @@ -77,11 +91,11 @@ FloatRect FilterEffect::calculatePrimitiveSubregion(const Filter& filter, const return primitiveSubregion; } -FloatRect FilterEffect::calculateImageRect(const Filter& filter, const FilterImageVector& inputs, const FloatRect& primitiveSubregion) const +FloatRect FilterEffect::calculateImageRect(const Filter& filter, Span inputImageRects, const FloatRect& primitiveSubregion) const { FloatRect imageRect; - for (auto& input : inputs) - imageRect.unite(input->imageRect()); + for (auto& inputImageRect : inputImageRects) + imageRect.unite(inputImageRect); return filter.clipToMaxEffectRect(imageRect, primitiveSubregion); } @@ -119,8 +133,8 @@ RefPtr FilterEffect::apply(const Filter& filter, const FilterImageV if (auto result = results.effectResult(*this)) return result; - auto primitiveSubregion = calculatePrimitiveSubregion(filter, inputs, geometry); - auto imageRect = calculateImageRect(filter, inputs, primitiveSubregion); + auto primitiveSubregion = calculatePrimitiveSubregion(filter, inputPrimitiveSubregions(inputs), geometry); + auto imageRect = calculateImageRect(filter, inputImageRects(inputs), primitiveSubregion); auto absoluteImageRect = enclosingIntRect(filter.scaledByFilterScale(imageRect)); if (absoluteImageRect.isEmpty() || ImageBuffer::sizeNeedsClamping(absoluteImageRect.size())) diff --git a/Source/WebCore/platform/graphics/filters/FilterEffect.h b/Source/WebCore/platform/graphics/filters/FilterEffect.h index 2fd1533485fa..b02ddf414e98 100644 --- a/Source/WebCore/platform/graphics/filters/FilterEffect.h +++ b/Source/WebCore/platform/graphics/filters/FilterEffect.h @@ -55,9 +55,9 @@ class FilterEffect : public FilterFunction { virtual unsigned numberOfEffectInputs() const { return 1; } unsigned numberOfImageInputs() const { return filterType() == FilterEffect::Type::SourceGraphic ? 1 : numberOfEffectInputs(); } - FloatRect calculatePrimitiveSubregion(const Filter&, const FilterImageVector& inputs, const std::optional&) const; + FloatRect calculatePrimitiveSubregion(const Filter&, Span inputPrimitiveSubregions, const std::optional&) const; - virtual FloatRect calculateImageRect(const Filter&, const FilterImageVector& inputs, const FloatRect& primitiveSubregion) const; + virtual FloatRect calculateImageRect(const Filter&, Span inputImageRects, const FloatRect& primitiveSubregion) const; // Solid black image with different alpha values. virtual bool resultIsAlphaImage(const FilterImageVector&) const { return false; }