| 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);
|
|
|