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