| Index: Source/core/platform/graphics/filters/FilterEffect.cpp
|
| diff --git a/Source/core/platform/graphics/filters/FilterEffect.cpp b/Source/core/platform/graphics/filters/FilterEffect.cpp
|
| index 920ae250b7d557dae9c5e4874e9afab671c777d9..0261babf68af4d308ea9d055e2cba84501b5aa6c 100644
|
| --- a/Source/core/platform/graphics/filters/FilterEffect.cpp
|
| +++ b/Source/core/platform/graphics/filters/FilterEffect.cpp
|
| @@ -398,4 +398,46 @@ TextStream& FilterEffect::externalRepresentation(TextStream& ts, int) const
|
| return ts;
|
| }
|
|
|
| +FloatRect FilterEffect::determineFilterPrimitiveSubregion()
|
| +{
|
| + ASSERT(filter());
|
| +
|
| + // FETile, FETurbulence, FEFlood don't have input effects, take the filter region as unite rect.
|
| + FloatRect subregion;
|
| + if (unsigned numberOfInputEffects = inputEffects().size()) {
|
| + subregion = inputEffect(0)->determineFilterPrimitiveSubregion();
|
| + for (unsigned i = 1; i < numberOfInputEffects; ++i)
|
| + subregion.unite(inputEffect(i)->determineFilterPrimitiveSubregion());
|
| + } else
|
| + subregion = filter()->filterRegionInUserSpace();
|
| +
|
| + // After calling determineFilterPrimitiveSubregion on the target effect, reset the subregion again for <feTile>.
|
| + if (filterEffectType() == FilterEffectTypeTile)
|
| + subregion = filter()->filterRegionInUserSpace();
|
| +
|
| + FloatRect boundaries = effectBoundaries();
|
| + if (hasX())
|
| + subregion.setX(boundaries.x());
|
| + if (hasY())
|
| + subregion.setY(boundaries.y());
|
| + if (hasWidth())
|
| + subregion.setWidth(boundaries.width());
|
| + if (hasHeight())
|
| + subregion.setHeight(boundaries.height());
|
| +
|
| + setFilterPrimitiveSubregion(subregion);
|
| +
|
| + FloatRect absoluteSubregion = filter()->absoluteTransform().mapRect(subregion);
|
| + FloatSize filterResolution = filter()->filterResolution();
|
| + absoluteSubregion.scale(filterResolution.width(), filterResolution.height());
|
| +
|
| + // Clip every filter effect to the filter region.
|
| + FloatRect absoluteScaledFilterRegion = filter()->filterRegion();
|
| + absoluteScaledFilterRegion.scale(filterResolution.width(), filterResolution.height());
|
| + absoluteSubregion.intersect(absoluteScaledFilterRegion);
|
| +
|
| + setMaxEffectRect(absoluteSubregion);
|
| + return subregion;
|
| +}
|
| +
|
| } // namespace WebCore
|
|
|