[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