Index: third_party/WebKit/Source/core/layout/svg/LayoutSVGResourceFilter.cpp |
diff --git a/third_party/WebKit/Source/core/layout/svg/LayoutSVGResourceFilter.cpp b/third_party/WebKit/Source/core/layout/svg/LayoutSVGResourceFilter.cpp |
index 1ef639cc1123532efebf3998f8b7059cc4adefae..c0d3983c9b8afde83ddd40343e4df609171811c7 100644 |
--- a/third_party/WebKit/Source/core/layout/svg/LayoutSVGResourceFilter.cpp |
+++ b/third_party/WebKit/Source/core/layout/svg/LayoutSVGResourceFilter.cpp |
@@ -24,11 +24,7 @@ |
#include "config.h" |
#include "core/layout/svg/LayoutSVGResourceFilter.h" |
-#include "core/dom/ElementTraversal.h" |
#include "core/svg/SVGFilterPrimitiveStandardAttributes.h" |
-#include "platform/graphics/GraphicsContext.h" |
-#include "platform/graphics/filters/SourceGraphic.h" |
-#include "third_party/skia/include/core/SkPicture.h" |
namespace blink { |
@@ -36,13 +32,13 @@ DEFINE_TRACE(FilterData) |
{ |
#if ENABLE(OILPAN) |
visitor->trace(filter); |
- visitor->trace(builder); |
+ visitor->trace(nodeMap); |
#endif |
} |
void FilterData::dispose() |
{ |
- builder = nullptr; |
+ nodeMap = nullptr; |
filter = nullptr; |
} |
@@ -99,34 +95,6 @@ void LayoutSVGResourceFilter::removeClientFromCache(LayoutObject* client, bool m |
markClientForInvalidation(client, markForInvalidation ? BoundariesInvalidation : ParentOnlyInvalidation); |
} |
-PassRefPtrWillBeRawPtr<SVGFilterBuilder> LayoutSVGResourceFilter::buildPrimitives(Filter* filter) |
-{ |
- SVGFilterElement* filterElement = toSVGFilterElement(element()); |
- FloatRect referenceBox = filter->referenceBox(); |
- |
- // Add effects to the builder |
- RefPtrWillBeRawPtr<SVGFilterBuilder> builder = SVGFilterBuilder::create(filter->sourceGraphic()); |
- for (SVGElement* element = Traversal<SVGElement>::firstChild(*filterElement); element; element = Traversal<SVGElement>::nextSibling(*element)) { |
- if (!element->isFilterEffect() || !element->layoutObject()) |
- continue; |
- |
- SVGFilterPrimitiveStandardAttributes* effectElement = static_cast<SVGFilterPrimitiveStandardAttributes*>(element); |
- RefPtrWillBeRawPtr<FilterEffect> effect = effectElement->build(builder.get(), filter); |
- if (!effect) { |
- builder->clearEffects(); |
- return nullptr; |
- } |
- builder->appendEffectToEffectReferences(effect, effectElement->layoutObject()); |
- effectElement->setStandardAttributes(effect.get()); |
- effect->setEffectBoundaries(SVGLengthContext::resolveRectangle<SVGFilterPrimitiveStandardAttributes>(effectElement, filterElement->primitiveUnits()->currentValue()->enumValue(), referenceBox)); |
- effect->setOperatingColorSpace( |
- effectElement->layoutObject()->style()->svgStyle().colorInterpolationFilters() == CI_LINEARRGB ? ColorSpaceLinearRGB : ColorSpaceDeviceRGB); |
- builder->add(AtomicString(effectElement->result()->currentValue()->value()), effect); |
- } |
- filter->setLastEffect(builder->lastEffect()); |
- return builder.release(); |
-} |
- |
FloatRect LayoutSVGResourceFilter::resourceBoundingBox(const LayoutObject* object) |
{ |
if (SVGFilterElement* element = toSVGFilterElement(this->element())) |
@@ -137,27 +105,25 @@ FloatRect LayoutSVGResourceFilter::resourceBoundingBox(const LayoutObject* objec |
void LayoutSVGResourceFilter::primitiveAttributeChanged(LayoutObject* object, const QualifiedName& attribute) |
{ |
- FilterMap::iterator it = m_filter.begin(); |
- FilterMap::iterator end = m_filter.end(); |
SVGFilterPrimitiveStandardAttributes* primitive = static_cast<SVGFilterPrimitiveStandardAttributes*>(object->node()); |
- for (; it != end; ++it) { |
- FilterData* filterData = it->value.get(); |
+ for (auto& filter : m_filter) { |
+ FilterData* filterData = filter.value.get(); |
if (filterData->m_state != FilterData::ReadyToPaint) |
continue; |
- SVGFilterBuilder* builder = filterData->builder.get(); |
- FilterEffect* effect = builder->effectByRenderer(object); |
+ SVGFilterGraphNodeMap* nodeMap = filterData->nodeMap.get(); |
+ FilterEffect* effect = nodeMap->effectByRenderer(object); |
if (!effect) |
continue; |
// Since all effects shares the same attribute value, all |
// or none of them will be changed. |
if (!primitive->setFilterEffectAttribute(effect, attribute)) |
return; |
- builder->clearResultsRecursive(effect); |
+ nodeMap->invalidateDependentEffects(effect); |
// Issue paint invalidations for the image on the screen. |
- markClientForInvalidation(it->key, PaintInvalidation); |
+ markClientForInvalidation(filter.key, PaintInvalidation); |
} |
markAllClientLayersForInvalidation(); |
} |