Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions Source/WebCore/platform/graphics/filters/FEComposite.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<const FloatRect> 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
Expand All @@ -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);
}
}

Expand Down
2 changes: 1 addition & 1 deletion Source/WebCore/platform/graphics/filters/FEComposite.h
Original file line number Diff line number Diff line change
Expand Up @@ -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<const FloatRect> inputImageRects, const FloatRect& primitiveSubregion) const override;

bool resultIsValidPremultiplied() const override { return m_type != FECOMPOSITE_OPERATOR_ARITHMETIC; }

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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>, const FloatRect& primitiveSubregion) const
{
return filter.maxEffectRect(primitiveSubregion);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<float>& kernelMatrix);

FloatRect calculateImageRect(const Filter&, const FilterImageVector& inputs, const FloatRect& primitiveSubregion) const override;
FloatRect calculateImageRect(const Filter&, Span<const FloatRect> inputImageRects, const FloatRect& primitiveSubregion) const override;

std::unique_ptr<FilterEffectApplier> createSoftwareApplier() const override;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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>, const FloatRect& primitiveSubregion) const
{
return filter.maxEffectRect(primitiveSubregion);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<const FloatRect> inputImageRects, const FloatRect& primitiveSubregion) const override;

const DestinationColorSpace& resultColorSpace(const FilterImageVector&) const override;
void transformInputsColorSpace(const FilterImageVector& inputs) const override;
Expand Down
4 changes: 2 additions & 2 deletions Source/WebCore/platform/graphics/filters/FEDropShadow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<const FloatRect> 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);
Expand Down
2 changes: 1 addition & 1 deletion Source/WebCore/platform/graphics/filters/FEDropShadow.h
Original file line number Diff line number Diff line change
Expand Up @@ -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<const FloatRect> inputImageRects, const FloatRect& primitiveSubregion) const override;

std::unique_ptr<FilterEffectApplier> createSoftwareApplier() const override;

Expand Down
2 changes: 1 addition & 1 deletion Source/WebCore/platform/graphics/filters/FEFlood.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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>, const FloatRect& primitiveSubregion) const
{
return filter.maxEffectRect(primitiveSubregion);
}
Expand Down
2 changes: 1 addition & 1 deletion Source/WebCore/platform/graphics/filters/FEFlood.h
Original file line number Diff line number Diff line change
Expand Up @@ -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<const FloatRect> inputImageRects, const FloatRect& primitiveSubregion) const override;

std::unique_ptr<FilterEffectApplier> createSoftwareApplier() const override;

Expand Down
4 changes: 2 additions & 2 deletions Source/WebCore/platform/graphics/filters/FEGaussianBlur.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<const FloatRect> 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)
Expand Down
2 changes: 1 addition & 1 deletion Source/WebCore/platform/graphics/filters/FEGaussianBlur.h
Original file line number Diff line number Diff line change
Expand Up @@ -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<const FloatRect> inputImageRects, const FloatRect& primitiveSubregion) const override;

bool resultIsAlphaImage(const FilterImageVector& inputs) const override;

Expand Down
2 changes: 1 addition & 1 deletion Source/WebCore/platform/graphics/filters/FEImage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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>, const FloatRect& primitiveSubregion) const
{
if (m_sourceImage.nativeImageIfExists()) {
auto imageRect = primitiveSubregion;
Expand Down
2 changes: 1 addition & 1 deletion Source/WebCore/platform/graphics/filters/FEImage.h
Original file line number Diff line number Diff line change
Expand Up @@ -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<const FloatRect> inputImageRects, const FloatRect& primitiveSubregion) const override;

std::unique_ptr<FilterEffectApplier> createSoftwareApplier() const final;

Expand Down
2 changes: 1 addition & 1 deletion Source/WebCore/platform/graphics/filters/FELighting.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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>, const FloatRect& primitiveSubregion) const
{
return filter.maxEffectRect(primitiveSubregion);
}
Expand Down
2 changes: 1 addition & 1 deletion Source/WebCore/platform/graphics/filters/FELighting.h
Original file line number Diff line number Diff line change
Expand Up @@ -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<LightSource>&&);

FloatRect calculateImageRect(const Filter&, const FilterImageVector& inputs, const FloatRect& primitiveSubregion) const override;
FloatRect calculateImageRect(const Filter&, Span<const FloatRect> inputImageRects, const FloatRect& primitiveSubregion) const override;

std::unique_ptr<FilterEffectApplier> createSoftwareApplier() const override;

Expand Down
4 changes: 2 additions & 2 deletions Source/WebCore/platform/graphics/filters/FEMorphology.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<const FloatRect> 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);
}
Expand Down
2 changes: 1 addition & 1 deletion Source/WebCore/platform/graphics/filters/FEMorphology.h
Original file line number Diff line number Diff line change
Expand Up @@ -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<const FloatRect> inputImageRects, const FloatRect& primitiveSubregion) const override;

bool resultIsAlphaImage(const FilterImageVector& inputs) const override;

Expand Down
4 changes: 2 additions & 2 deletions Source/WebCore/platform/graphics/filters/FEOffset.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<const FloatRect> 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);
}
Expand Down
2 changes: 1 addition & 1 deletion Source/WebCore/platform/graphics/filters/FEOffset.h
Original file line number Diff line number Diff line change
Expand Up @@ -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<const FloatRect> inputImageRects, const FloatRect& primitiveSubregion) const override;

bool resultIsAlphaImage(const FilterImageVector& inputs) const override;

Expand Down
2 changes: 1 addition & 1 deletion Source/WebCore/platform/graphics/filters/FETile.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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>, const FloatRect& primitiveSubregion) const
{
return filter.maxEffectRect(primitiveSubregion);
}
Expand Down
2 changes: 1 addition & 1 deletion Source/WebCore/platform/graphics/filters/FETile.h
Original file line number Diff line number Diff line change
Expand Up @@ -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<const FloatRect> inputImageRects, const FloatRect& primitiveSubregion) const override;

bool resultIsAlphaImage(const FilterImageVector& inputs) const override;

Expand Down
2 changes: 1 addition & 1 deletion Source/WebCore/platform/graphics/filters/FETurbulence.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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>, const FloatRect& primitiveSubregion) const
{
return filter.maxEffectRect(primitiveSubregion);
}
Expand Down
2 changes: 1 addition & 1 deletion Source/WebCore/platform/graphics/filters/FETurbulence.h
Original file line number Diff line number Diff line change
Expand Up @@ -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<const FloatRect> inputImageRects, const FloatRect& primitiveSubregion) const override;

std::unique_ptr<FilterEffectApplier> createSoftwareApplier() const override;

Expand Down
32 changes: 23 additions & 9 deletions Source/WebCore/platform/graphics/filters/FilterEffect.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,15 +50,29 @@ FilterImageVector FilterEffect::takeImageInputs(FilterImageVector& stack) const
return inputs;
}

FloatRect FilterEffect::calculatePrimitiveSubregion(const Filter& filter, const FilterImageVector& inputs, const std::optional<FilterEffectGeometry>& geometry) const
static Vector<FloatRect> inputPrimitiveSubregions(const FilterImageVector& inputs)
{
return inputs.map([](auto& input) {
return input->primitiveSubregion();
});
}

static Vector<FloatRect> inputImageRects(const FilterImageVector& inputs)
{
return inputs.map([] (auto& input) {
return input->imageRect();
});
}

FloatRect FilterEffect::calculatePrimitiveSubregion(const Filter& filter, Span<const FloatRect> inputPrimitiveSubregions, const std::optional<FilterEffectGeometry>& 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();

Expand All @@ -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<const FloatRect> 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);
}

Expand Down Expand Up @@ -119,8 +133,8 @@ RefPtr<FilterImage> 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()))
Expand Down
4 changes: 2 additions & 2 deletions Source/WebCore/platform/graphics/filters/FilterEffect.h
Original file line number Diff line number Diff line change
Expand Up @@ -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<FilterEffectGeometry>&) const;
FloatRect calculatePrimitiveSubregion(const Filter&, Span<const FloatRect> inputPrimitiveSubregions, const std::optional<FilterEffectGeometry>&) const;

virtual FloatRect calculateImageRect(const Filter&, const FilterImageVector& inputs, const FloatRect& primitiveSubregion) const;
virtual FloatRect calculateImageRect(const Filter&, Span<const FloatRect> inputImageRects, const FloatRect& primitiveSubregion) const;

// Solid black image with different alpha values.
virtual bool resultIsAlphaImage(const FilterImageVector&) const { return false; }
Expand Down