Chromium Code Reviews| Index: third_party/WebKit/Source/core/paint/FilterEffectBuilder.cpp | 
| diff --git a/third_party/WebKit/Source/core/paint/FilterEffectBuilder.cpp b/third_party/WebKit/Source/core/paint/FilterEffectBuilder.cpp | 
| index 02812f1312bab7a35805c87ae53f78b50d6afbf8..73ccf1576962a10dc17972e6ef72f2d4b301752d 100644 | 
| --- a/third_party/WebKit/Source/core/paint/FilterEffectBuilder.cpp | 
| +++ b/third_party/WebKit/Source/core/paint/FilterEffectBuilder.cpp | 
| @@ -38,6 +38,7 @@ | 
| #include "platform/graphics/filters/FEDropShadow.h" | 
| #include "platform/graphics/filters/FEGaussianBlur.h" | 
| #include "platform/graphics/filters/Filter.h" | 
| +#include "platform/graphics/filters/FilterEffect.h" | 
| #include "platform/graphics/filters/FilterOperations.h" | 
| #include "platform/graphics/filters/SourceGraphic.h" | 
| #include "wtf/MathExtras.h" | 
| @@ -120,20 +121,21 @@ Vector<float> sepiaMatrix(double amount) | 
| } // namespace | 
| -FilterEffectBuilder::FilterEffectBuilder() | 
| +FilterEffectBuilder::FilterEffectBuilder( | 
| + Element* target, | 
| + const FloatRect& zoomedReferenceBox, float zoom, | 
| + const SkPaint* fillPaint, const SkPaint* strokePaint) | 
| + : m_targetContext(target) | 
| + , m_referenceBox(zoomedReferenceBox) | 
| + , m_zoom(zoom) | 
| + , m_fillPaint(fillPaint) | 
| + , m_strokePaint(strokePaint) | 
| { | 
| + if (m_zoom != 1) | 
| + m_referenceBox.scale(1 / m_zoom); | 
| } | 
| -FilterEffectBuilder::~FilterEffectBuilder() | 
| -{ | 
| -} | 
| - | 
| -DEFINE_TRACE(FilterEffectBuilder) | 
| -{ | 
| - visitor->trace(m_lastEffect); | 
| -} | 
| - | 
| -bool FilterEffectBuilder::build(Element* element, const FilterOperations& operations, float zoom, const FloatRect& zoomedReferenceBox, const SkPaint* fillPaint, const SkPaint* strokePaint) | 
| +FilterEffect* FilterEffectBuilder::buildFilterEffect(const FilterOperations& operations) const | 
| { | 
| // Create a parent filter for shorthand filters. These have already been scaled by the CSS code for page zoom, so scale is 1.0 here. | 
| Filter* parentFilter = Filter::create(1.0f); | 
| @@ -143,7 +145,7 @@ bool FilterEffectBuilder::build(Element* element, const FilterOperations& operat | 
| FilterOperation* filterOperation = operations.operations().at(i).get(); | 
| switch (filterOperation->type()) { | 
| case FilterOperation::REFERENCE: { | 
| - Filter* referenceFilter = buildReferenceFilter(toReferenceFilterOperation(*filterOperation), zoomedReferenceBox, fillPaint, strokePaint, *element, previousEffect, zoom); | 
| + Filter* referenceFilter = buildReferenceFilter(toReferenceFilterOperation(*filterOperation), previousEffect); | 
| if (referenceFilter) | 
| effect = referenceFilter->lastEffect(); | 
| break; | 
| @@ -250,45 +252,26 @@ bool FilterEffectBuilder::build(Element* element, const FilterOperations& operat | 
| previousEffect = effect; | 
| } | 
| } | 
| - | 
| - // We need to keep the old effects alive until this point, so that SVG reference filters | 
| - // can share cached resources across frames. | 
| - m_lastEffect = previousEffect; | 
| - | 
| - // If we didn't make any effects, tell our caller we are not valid | 
| - if (!m_lastEffect.get()) | 
| - return false; | 
| - | 
| - return true; | 
| + return previousEffect; | 
| } | 
| Filter* FilterEffectBuilder::buildReferenceFilter( | 
| 
 
Stephen White
2016/09/19 14:59:36
I wonder if we should now just have two constructo
 
fs
2016/09/20 08:17:28
My plan is one constructor and one buildReferenceF
 
 | 
| const ReferenceFilterOperation& referenceOperation, | 
| - const FloatRect& zoomedReferenceBox, | 
| - const SkPaint* fillPaint, | 
| - const SkPaint* strokePaint, | 
| - Element& element, | 
| - FilterEffect* previousEffect, | 
| - float zoom) | 
| + FilterEffect* previousEffect) const | 
| { | 
| - SVGFilterElement* filterElement = ReferenceFilterBuilder::resolveFilterReference(referenceOperation, element); | 
| + DCHECK(m_targetContext); | 
| + SVGFilterElement* filterElement = ReferenceFilterBuilder::resolveFilterReference(referenceOperation, *m_targetContext); | 
| if (!filterElement) | 
| return nullptr; | 
| - FloatRect referenceBox = zoomedReferenceBox; | 
| - referenceBox.scale(1.0f / zoom); | 
| - return buildReferenceFilter(*filterElement, referenceBox, fillPaint, strokePaint, previousEffect, zoom); | 
| + return buildReferenceFilter(*filterElement, previousEffect); | 
| } | 
| Filter* FilterEffectBuilder::buildReferenceFilter( | 
| SVGFilterElement& filterElement, | 
| - const FloatRect& referenceBox, | 
| - const SkPaint* fillPaint, | 
| - const SkPaint* strokePaint, | 
| FilterEffect* previousEffect, | 
| - float zoom, | 
| - SVGFilterGraphNodeMap* nodeMap) | 
| + SVGFilterGraphNodeMap* nodeMap) const | 
| { | 
| - FloatRect filterRegion = SVGLengthContext::resolveRectangle<SVGFilterElement>(&filterElement, filterElement.filterUnits()->currentValue()->enumValue(), referenceBox); | 
| + FloatRect filterRegion = SVGLengthContext::resolveRectangle<SVGFilterElement>(&filterElement, filterElement.filterUnits()->currentValue()->enumValue(), m_referenceBox); | 
| // TODO(fs): We rely on the presence of a node map here to opt-in to the | 
| // check for an empty filter region. The reason for this is that we lack a | 
| // viewport to resolve against for HTML content. This is crbug.com/512453. | 
| @@ -297,11 +280,11 @@ Filter* FilterEffectBuilder::buildReferenceFilter( | 
| bool primitiveBoundingBoxMode = filterElement.primitiveUnits()->currentValue()->enumValue() == SVGUnitTypes::kSvgUnitTypeObjectboundingbox; | 
| Filter::UnitScaling unitScaling = primitiveBoundingBoxMode ? Filter::BoundingBox : Filter::UserSpace; | 
| - Filter* result = Filter::create(referenceBox, filterRegion, zoom, unitScaling); | 
| + Filter* result = Filter::create(m_referenceBox, filterRegion, m_zoom, unitScaling); | 
| if (!previousEffect) | 
| previousEffect = result->getSourceGraphic(); | 
| - SVGFilterBuilder builder(previousEffect, nodeMap, fillPaint, strokePaint); | 
| - builder.buildGraph(result, filterElement, referenceBox); | 
| + SVGFilterBuilder builder(previousEffect, nodeMap, m_fillPaint, m_strokePaint); | 
| + builder.buildGraph(result, filterElement, m_referenceBox); | 
| result->setLastEffect(builder.lastEffect()); | 
| return result; | 
| } |