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

Unified Diff: third_party/WebKit/Source/platform/graphics/filters/FilterEffect.cpp

Issue 2303703002: Revamp filter primitive region calculations for Filter Effects (Closed)
Patch Set: Baselines again; Manual for mac10.11-retina Created 4 years, 3 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: third_party/WebKit/Source/platform/graphics/filters/FilterEffect.cpp
diff --git a/third_party/WebKit/Source/platform/graphics/filters/FilterEffect.cpp b/third_party/WebKit/Source/platform/graphics/filters/FilterEffect.cpp
index 4cbb72d65edbb79b619a8703b3f0a4017f68ecdc..cec0220ca90ccdf722737863637aeb6096ae0166 100644
--- a/third_party/WebKit/Source/platform/graphics/filters/FilterEffect.cpp
+++ b/third_party/WebKit/Source/platform/graphics/filters/FilterEffect.cpp
@@ -33,10 +33,6 @@ namespace blink {
FilterEffect::FilterEffect(Filter* filter)
: m_filter(filter)
- , m_hasX(false)
- , m_hasY(false)
- , m_hasWidth(false)
- , m_hasHeight(false)
, m_clipsToBounds(true)
, m_originTainted(false)
, m_operatingColorSpace(ColorSpaceLinearRGB)
@@ -133,58 +129,44 @@ TextStream& FilterEffect::externalRepresentation(TextStream& ts, int) const
return ts;
}
-FloatRect FilterEffect::applyEffectBoundaries(const FloatRect& rect) const
-{
- FloatRect clippedRect = rect;
- if (hasX())
- clippedRect.setX(effectBoundaries().x());
- if (hasY())
- clippedRect.setY(effectBoundaries().y());
- if (hasWidth())
- clippedRect.setWidth(effectBoundaries().width());
- if (hasHeight())
- clippedRect.setHeight(effectBoundaries().height());
- return clippedRect;
-}
-
-FloatRect FilterEffect::determineFilterPrimitiveSubregion(DetermineSubregionFlags flags)
-{
- Filter* filter = this->getFilter();
- 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(flags);
- for (unsigned i = 1; i < numberOfInputEffects; ++i)
- subregion.unite(inputEffect(i)->determineFilterPrimitiveSubregion(flags));
- } else {
- subregion = filter->filterRegion();
+FloatRect FilterEffect::determineMaximumEffectRect(DetermineMaxEffectRectFlags flags)
+{
+ DCHECK(getFilter());
+ Filter* filter = getFilter();
+
+ // Compute the union of the inputs. Always do this because it has
+ // side-effects. (It computes the maximum effect rect of the input.)
+ FloatRect absoluteInputUnion;
+ for (auto& effect : m_inputEffects)
+ absoluteInputUnion.unite(effect->determineMaximumEffectRect(flags));
+
+ FloatRect absoluteSubregion;
+ switch (getFilterEffectType()) {
+ default:
+ if (m_inputEffects.size()) {
+ absoluteSubregion = absoluteInputUnion;
+ if (clipsToBounds())
+ absoluteSubregion.intersect(filter->mapLocalRectToAbsoluteRect(filterPrimitiveSubregion()));
+ break;
+ }
+ // Else fall-through and use the primitive region. (FETurbulence/FEFlood/FEImage)
+ case FilterEffectTypeTile:
+ absoluteSubregion = filter->mapLocalRectToAbsoluteRect(filterPrimitiveSubregion());
+ break;
+ case FilterEffectTypeSourceInput:
+ absoluteSubregion = filter->absoluteFilterRegion();
+ break;
}
- // After calling determineFilterPrimitiveSubregion on the target effect, reset the subregion again for <feTile>.
- if (getFilterEffectType() == FilterEffectTypeTile)
- subregion = filter->filterRegion();
-
- if (flags & MapRectForward) {
- // mapRect works on absolute rectangles.
- subregion = filter->mapAbsoluteRectToLocalRect(mapRect(
- filter->mapLocalRectToAbsoluteRect(subregion)));
- }
-
- subregion = applyEffectBoundaries(subregion);
-
- setFilterPrimitiveSubregion(subregion);
-
- FloatRect absoluteSubregion = filter->mapLocalRectToAbsoluteRect(subregion);
+ if (flags & MapRectForward)
+ absoluteSubregion = mapRect(absoluteSubregion);
// Clip every filter effect to the filter region.
- if (flags & ClipToFilterRegion) {
+ if (flags & ClipToFilterRegion)
absoluteSubregion.intersect(filter->absoluteFilterRegion());
- }
- setMaxEffectRect(absoluteSubregion);
- return subregion;
+ m_maxEffectRect = absoluteSubregion;
+ return absoluteSubregion;
}
sk_sp<SkImageFilter> FilterEffect::createImageFilter()
@@ -216,8 +198,7 @@ sk_sp<SkImageFilter> FilterEffect::createTransparentBlack() const
SkImageFilter::CropRect FilterEffect::getCropRect() const
{
if (!filterPrimitiveSubregion().isEmpty()) {
- FloatRect rect = filterPrimitiveSubregion();
- rect.scale(getFilter()->scale());
+ FloatRect rect = getFilter()->mapLocalRectToAbsoluteRect(filterPrimitiveSubregion());
return SkImageFilter::CropRect(rect);
} else {
return SkImageFilter::CropRect(SkRect::MakeEmpty(), 0);

Powered by Google App Engine
This is Rietveld 408576698