diff options
Diffstat (limited to 'Source/WebCore/svg/graphics/filters')
-rw-r--r-- | Source/WebCore/svg/graphics/filters/SVGFilterBuilder.cpp | 20 | ||||
-rw-r--r-- | Source/WebCore/svg/graphics/filters/SVGFilterBuilder.h | 10 |
2 files changed, 26 insertions, 4 deletions
diff --git a/Source/WebCore/svg/graphics/filters/SVGFilterBuilder.cpp b/Source/WebCore/svg/graphics/filters/SVGFilterBuilder.cpp index b31b994..e6d0e65 100644 --- a/Source/WebCore/svg/graphics/filters/SVGFilterBuilder.cpp +++ b/Source/WebCore/svg/graphics/filters/SVGFilterBuilder.cpp @@ -68,10 +68,11 @@ FilterEffect* SVGFilterBuilder::getEffectById(const AtomicString& id) const return m_namedEffects.get(id).get(); } -void SVGFilterBuilder::appendEffectToEffectReferences(RefPtr<FilterEffect> effectReference) +void SVGFilterBuilder::appendEffectToEffectReferences(RefPtr<FilterEffect> effectReference, RenderObject* object) { // The effect must be a newly created filter effect. ASSERT(!m_effectReferences.contains(effectReference)); + ASSERT(object && !m_effectRenderer.contains(object)); m_effectReferences.add(effectReference, FilterEffectSet()); FilterEffect* effect = effectReference.get(); @@ -79,7 +80,8 @@ void SVGFilterBuilder::appendEffectToEffectReferences(RefPtr<FilterEffect> effec // It is not possible to add the same value to a set twice. for (unsigned i = 0; i < numberOfInputEffects; ++i) - getEffectReferences(effect->inputEffect(i)).add(effect); + effectReferences(effect->inputEffect(i)).add(effect); + m_effectRenderer.add(object, effectReference.get()); } void SVGFilterBuilder::clearEffects() @@ -87,9 +89,23 @@ void SVGFilterBuilder::clearEffects() m_lastEffect = 0; m_namedEffects.clear(); m_effectReferences.clear(); + m_effectRenderer.clear(); addBuiltinEffects(); } +void SVGFilterBuilder::clearResultsRecursive(FilterEffect* effect) +{ + if (!effect->hasResult()) + return; + + effect->clearResult(); + + HashSet<FilterEffect*>& effectReferences = this->effectReferences(effect); + HashSet<FilterEffect*>::iterator end = effectReferences.end(); + for (HashSet<FilterEffect*>::iterator it = effectReferences.begin(); it != end; ++it) + clearResultsRecursive(*it); +} + } // namespace WebCore #endif // ENABLE(SVG) && ENABLE(FILTERS) diff --git a/Source/WebCore/svg/graphics/filters/SVGFilterBuilder.h b/Source/WebCore/svg/graphics/filters/SVGFilterBuilder.h index a3c1244..9e7b2fe 100644 --- a/Source/WebCore/svg/graphics/filters/SVGFilterBuilder.h +++ b/Source/WebCore/svg/graphics/filters/SVGFilterBuilder.h @@ -24,6 +24,7 @@ #if ENABLE(SVG) && ENABLE(FILTERS) #include "FilterEffect.h" #include "PlatformString.h" +#include "RenderObject.h" #include <wtf/HashMap.h> #include <wtf/HashSet.h> @@ -43,16 +44,20 @@ public: FilterEffect* getEffectById(const AtomicString& id) const; FilterEffect* lastEffect() const { return m_lastEffect.get(); } - void appendEffectToEffectReferences(RefPtr<FilterEffect>); + void appendEffectToEffectReferences(RefPtr<FilterEffect>, RenderObject*); - inline FilterEffectSet& getEffectReferences(FilterEffect* effect) + inline FilterEffectSet& effectReferences(FilterEffect* effect) { // Only allowed for effects belongs to this builder. ASSERT(m_effectReferences.contains(effect)); return m_effectReferences.find(effect)->second; } + // Required to change the attributes of a filter during an svgAttributeChanged. + inline FilterEffect* effectByRenderer(RenderObject* object) { return m_effectRenderer.get(object); } + void clearEffects(); + void clearResultsRecursive(FilterEffect*); private: SVGFilterBuilder(Filter*); @@ -69,6 +74,7 @@ private: // The value is a list, which contains those filter effects, // which depends on the key filter effect. HashMap<RefPtr<FilterEffect>, FilterEffectSet> m_effectReferences; + HashMap<RenderObject*, FilterEffect*> m_effectRenderer; RefPtr<FilterEffect> m_lastEffect; }; |