[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-9427-gc2be6fc

zherczeg at webkit.org zherczeg at webkit.org
Wed Dec 22 13:47:36 UTC 2010


The following commit has been merged in the debian/experimental branch:
commit 010a3482ba96ce9126fba6f5571a3ecc2e0d4605
Author: zherczeg at webkit.org <zherczeg at webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Mon Sep 27 12:55:46 2010 +0000

    Filter builder should be able to follow the filter object dependencies
    https://bugs.webkit.org/show_bug.cgi?id=45812
    
    Reviewed by Dirk Schulze.
    
    To propagate the changes of a primitive object, a data structure
    is needed which stores the dependent primitive objects. (Those
    who use the resulting image.) This data structure is implemented
    as a hash map, which contains primitive object and set of primitive
    objects <key,value> pairs. The hash map is able to follow the
    dynamic topology changes.
    
    * rendering/RenderSVGResourceFilter.cpp:
    (WebCore::RenderSVGResourceFilter::buildPrimitives):
    * rendering/RenderSVGResourceFilterPrimitive.h:
    (WebCore::RenderSVGResourceFilterPrimitive::renderName):
    (WebCore::RenderSVGResourceFilterPrimitive::isSVGResourceFilterPrimitive):
    * svg/graphics/filters/SVGFilterBuilder.cpp:
    (WebCore::SVGFilterBuilder::SVGFilterBuilder):
    (WebCore::SVGFilterBuilder::appendEffectToEffectReferences):
    (WebCore::SVGFilterBuilder::clearEffects):
    * svg/graphics/filters/SVGFilterBuilder.h:
    (WebCore::SVGFilterBuilder::getEffectReferences):
    (WebCore::SVGFilterBuilder::addBuiltinEffects):
    
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@68385 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index 848724b..d42a66a 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,30 @@
+2010-09-27  Zoltan Herczeg  <zherczeg at webkit.org>
+
+        Reviewed by Dirk Schulze.
+
+        Filter builder should be able to follow the filter object dependencies
+        https://bugs.webkit.org/show_bug.cgi?id=45812
+
+        To propagate the changes of a primitive object, a data structure
+        is needed which stores the dependent primitive objects. (Those
+        who use the resulting image.) This data structure is implemented
+        as a hash map, which contains primitive object and set of primitive
+        objects <key,value> pairs. The hash map is able to follow the
+        dynamic topology changes.
+
+        * rendering/RenderSVGResourceFilter.cpp:
+        (WebCore::RenderSVGResourceFilter::buildPrimitives):
+        * rendering/RenderSVGResourceFilterPrimitive.h:
+        (WebCore::RenderSVGResourceFilterPrimitive::renderName):
+        (WebCore::RenderSVGResourceFilterPrimitive::isSVGResourceFilterPrimitive):
+        * svg/graphics/filters/SVGFilterBuilder.cpp:
+        (WebCore::SVGFilterBuilder::SVGFilterBuilder):
+        (WebCore::SVGFilterBuilder::appendEffectToEffectReferences):
+        (WebCore::SVGFilterBuilder::clearEffects):
+        * svg/graphics/filters/SVGFilterBuilder.h:
+        (WebCore::SVGFilterBuilder::getEffectReferences):
+        (WebCore::SVGFilterBuilder::addBuiltinEffects):
+
 2010-09-27  Andreas Kling  <andreas.kling at nokia.com>
 
         Rubber-stamped by Kenneth Rohde Christiansen.
diff --git a/WebCore/rendering/RenderSVGResourceFilter.cpp b/WebCore/rendering/RenderSVGResourceFilter.cpp
index 698033e..4dccad6 100644
--- a/WebCore/rendering/RenderSVGResourceFilter.cpp
+++ b/WebCore/rendering/RenderSVGResourceFilter.cpp
@@ -93,7 +93,6 @@ PassRefPtr<SVGFilterBuilder> RenderSVGResourceFilter::buildPrimitives()
 
     // Add effects to the builder
     RefPtr<SVGFilterBuilder> builder = SVGFilterBuilder::create();
-    builder->clearEffects();
     for (Node* node = filterElement->firstChild(); node; node = node->nextSibling()) {
         if (!node->isSVGElement())
             continue;
@@ -108,6 +107,7 @@ PassRefPtr<SVGFilterBuilder> RenderSVGResourceFilter::buildPrimitives()
             builder->clearEffects();
             return 0;
         }
+        builder->appendEffectToEffectReferences(effect);
         effectElement->setStandardAttributes(primitiveBoundingBoxMode, effect.get());
         builder->add(effectElement->result(), effect);
     }
diff --git a/WebCore/rendering/RenderSVGResourceFilterPrimitive.h b/WebCore/rendering/RenderSVGResourceFilterPrimitive.h
index 96e2c5e..4b23737 100644
--- a/WebCore/rendering/RenderSVGResourceFilterPrimitive.h
+++ b/WebCore/rendering/RenderSVGResourceFilterPrimitive.h
@@ -36,10 +36,11 @@ namespace WebCore {
 
 class RenderSVGResourceFilterPrimitive : public RenderSVGHiddenContainer {
 public:
-     RenderSVGResourceFilterPrimitive(SVGFilterPrimitiveStandardAttributes* filterPrimitiveElement);
+    RenderSVGResourceFilterPrimitive(SVGFilterPrimitiveStandardAttributes* filterPrimitiveElement);
 
 private:
-     virtual bool isSVGResourceFilterPrimitive() const { return true; }
+    virtual const char* renderName() const { return "RenderSVGResourceFilterPrimitive"; }
+    virtual bool isSVGResourceFilterPrimitive() const { return true; }
 };
 
 } // namespace WebCore
diff --git a/WebCore/svg/graphics/filters/SVGFilterBuilder.cpp b/WebCore/svg/graphics/filters/SVGFilterBuilder.cpp
index 5a6d0b9..091379e 100644
--- a/WebCore/svg/graphics/filters/SVGFilterBuilder.cpp
+++ b/WebCore/svg/graphics/filters/SVGFilterBuilder.cpp
@@ -27,15 +27,16 @@
 #include "SourceAlpha.h"
 #include "SourceGraphic.h"
 
-#include <wtf/HashMap.h>
 #include <wtf/PassRefPtr.h>
 
 namespace WebCore {
 
 SVGFilterBuilder::SVGFilterBuilder()
+    : m_lastEffect(0)
 {
     m_builtinEffects.add(SourceGraphic::effectName(), SourceGraphic::create());
     m_builtinEffects.add(SourceAlpha::effectName(), SourceAlpha::create());
+    addBuiltinEffects();
 }
 
 void SVGFilterBuilder::add(const AtomicString& id, RefPtr<FilterEffect> effect)
@@ -67,10 +68,26 @@ FilterEffect* SVGFilterBuilder::getEffectById(const AtomicString& id) const
     return m_namedEffects.get(id).get();
 }
 
+void SVGFilterBuilder::appendEffectToEffectReferences(RefPtr<FilterEffect> effectReference)
+{
+    // The effect must be a newly created filter effect.
+    ASSERT(!m_effectReferences.contains(effectReference));
+    m_effectReferences.add(effectReference, FilterEffectSet());
+
+    FilterEffect* effect = effectReference.get();
+    unsigned numberOfInputEffects = effect->inputEffects().size();
+
+    // 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);
+}
+
 void SVGFilterBuilder::clearEffects()
 {
     m_lastEffect = 0;
     m_namedEffects.clear();
+    m_effectReferences.clear();
+    addBuiltinEffects();
 }
 
 } // namespace WebCore
diff --git a/WebCore/svg/graphics/filters/SVGFilterBuilder.h b/WebCore/svg/graphics/filters/SVGFilterBuilder.h
index 4ef6ffe..320088d 100644
--- a/WebCore/svg/graphics/filters/SVGFilterBuilder.h
+++ b/WebCore/svg/graphics/filters/SVGFilterBuilder.h
@@ -27,6 +27,7 @@
 #include "PlatformString.h"
 
 #include <wtf/HashMap.h>
+#include <wtf/HashSet.h>
 #include <wtf/PassRefPtr.h>
 #include <wtf/text/AtomicStringHash.h>
 
@@ -34,6 +35,8 @@ namespace WebCore {
     
     class SVGFilterBuilder : public RefCounted<SVGFilterBuilder> {
     public:
+        typedef HashSet<FilterEffect*> FilterEffectSet;
+
         static PassRefPtr<SVGFilterBuilder> create() { return adoptRef(new SVGFilterBuilder); }
 
         void add(const AtomicString& id, RefPtr<FilterEffect> effect);
@@ -41,15 +44,32 @@ namespace WebCore {
         FilterEffect* getEffectById(const AtomicString& id) const;
         FilterEffect* lastEffect() const { return m_lastEffect.get(); }
 
-        const HashMap<AtomicString, RefPtr<FilterEffect> >& namedEffects() { return m_namedEffects; }
+        void appendEffectToEffectReferences(RefPtr<FilterEffect>);
+
+        inline FilterEffectSet& getEffectReferences(FilterEffect* effect)
+        {
+            // Only allowed for effects belongs to this builder.
+            ASSERT(m_effectReferences.contains(effect));
+            return m_effectReferences.find(effect)->second;
+        }
 
         void clearEffects();
 
     private:
         SVGFilterBuilder();
 
+        inline void addBuiltinEffects()
+        {
+            HashMap<AtomicString, RefPtr<FilterEffect> >::iterator end = m_builtinEffects.end();
+            for (HashMap<AtomicString, RefPtr<FilterEffect> >::iterator iterator = m_builtinEffects.begin(); iterator != end; ++iterator)
+                 m_effectReferences.add(iterator->second, FilterEffectSet());
+        }
+
         HashMap<AtomicString, RefPtr<FilterEffect> > m_builtinEffects;
         HashMap<AtomicString, RefPtr<FilterEffect> > m_namedEffects;
+        // The value is a list, which contains those filter effects,
+        // which depends on the key filter effect.
+        HashMap<RefPtr<FilterEffect>, FilterEffectSet> m_effectReferences;
 
         RefPtr<FilterEffect> m_lastEffect;
     };

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list