Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1116)

Unified Diff: Source/core/platform/graphics/filters/FilterEffect.cpp

Issue 14652016: Implement filter primitive subregion for reference CSS filters. This required refactoring determin… (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698