summaryrefslogtreecommitdiff
path: root/Source/WebCore/svg/SVGFEDropShadowElement.cpp
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@nokia.com>2012-01-06 14:44:00 +0100
committerSimon Hausmann <simon.hausmann@nokia.com>2012-01-06 14:44:00 +0100
commit40736c5763bf61337c8c14e16d8587db021a87d4 (patch)
treeb17a9c00042ad89cb1308e2484491799aa14e9f8 /Source/WebCore/svg/SVGFEDropShadowElement.cpp
downloadqtwebkit-40736c5763bf61337c8c14e16d8587db021a87d4.tar.gz
Imported WebKit commit 2ea9d364d0f6efa8fa64acf19f451504c59be0e4 (http://svn.webkit.org/repository/webkit/trunk@104285)
Diffstat (limited to 'Source/WebCore/svg/SVGFEDropShadowElement.cpp')
-rw-r--r--Source/WebCore/svg/SVGFEDropShadowElement.cpp176
1 files changed, 176 insertions, 0 deletions
diff --git a/Source/WebCore/svg/SVGFEDropShadowElement.cpp b/Source/WebCore/svg/SVGFEDropShadowElement.cpp
new file mode 100644
index 000000000..d2259dd8f
--- /dev/null
+++ b/Source/WebCore/svg/SVGFEDropShadowElement.cpp
@@ -0,0 +1,176 @@
+/*
+ * Copyright (C) Research In Motion Limited 2011. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "config.h"
+
+#if ENABLE(SVG) && ENABLE(FILTERS)
+#include "SVGFEDropShadowElement.h"
+
+#include "Attribute.h"
+#include "RenderStyle.h"
+#include "SVGElementInstance.h"
+#include "SVGFilterBuilder.h"
+#include "SVGNames.h"
+#include "SVGParserUtilities.h"
+#include "SVGRenderStyle.h"
+
+namespace WebCore {
+
+// Animated property definitions
+DEFINE_ANIMATED_STRING(SVGFEDropShadowElement, SVGNames::inAttr, In1, in1)
+DEFINE_ANIMATED_NUMBER(SVGFEDropShadowElement, SVGNames::dxAttr, Dx, dx)
+DEFINE_ANIMATED_NUMBER(SVGFEDropShadowElement, SVGNames::dyAttr, Dy, dy)
+DEFINE_ANIMATED_NUMBER_MULTIPLE_WRAPPERS(SVGFEDropShadowElement, SVGNames::stdDeviationAttr, stdDeviationXIdentifier(), StdDeviationX, stdDeviationX)
+DEFINE_ANIMATED_NUMBER_MULTIPLE_WRAPPERS(SVGFEDropShadowElement, SVGNames::stdDeviationAttr, stdDeviationYIdentifier(), StdDeviationY, stdDeviationY)
+
+BEGIN_REGISTER_ANIMATED_PROPERTIES(SVGFEDropShadowElement)
+ REGISTER_LOCAL_ANIMATED_PROPERTY(in1)
+ REGISTER_LOCAL_ANIMATED_PROPERTY(dx)
+ REGISTER_LOCAL_ANIMATED_PROPERTY(dy)
+ REGISTER_LOCAL_ANIMATED_PROPERTY(stdDeviationX)
+ REGISTER_LOCAL_ANIMATED_PROPERTY(stdDeviationY)
+ REGISTER_PARENT_ANIMATED_PROPERTIES(SVGFilterPrimitiveStandardAttributes)
+END_REGISTER_ANIMATED_PROPERTIES
+
+inline SVGFEDropShadowElement::SVGFEDropShadowElement(const QualifiedName& tagName, Document* document)
+ : SVGFilterPrimitiveStandardAttributes(tagName, document)
+ , m_dx(2)
+ , m_dy(2)
+ , m_stdDeviationX(2)
+ , m_stdDeviationY(2)
+{
+ ASSERT(hasTagName(SVGNames::feDropShadowTag));
+ registerAnimatedPropertiesForSVGFEDropShadowElement();
+}
+
+PassRefPtr<SVGFEDropShadowElement> SVGFEDropShadowElement::create(const QualifiedName& tagName, Document* document)
+{
+ return adoptRef(new SVGFEDropShadowElement(tagName, document));
+}
+
+const AtomicString& SVGFEDropShadowElement::stdDeviationXIdentifier()
+{
+ DEFINE_STATIC_LOCAL(AtomicString, s_identifier, ("SVGStdDeviationX"));
+ return s_identifier;
+}
+
+const AtomicString& SVGFEDropShadowElement::stdDeviationYIdentifier()
+{
+ DEFINE_STATIC_LOCAL(AtomicString, s_identifier, ("SVGStdDeviationY"));
+ return s_identifier;
+}
+
+void SVGFEDropShadowElement::setStdDeviation(float x, float y)
+{
+ setStdDeviationXBaseValue(x);
+ setStdDeviationYBaseValue(y);
+ invalidate();
+}
+
+bool SVGFEDropShadowElement::isSupportedAttribute(const QualifiedName& attrName)
+{
+ DEFINE_STATIC_LOCAL(HashSet<QualifiedName>, supportedAttributes, ());
+ if (supportedAttributes.isEmpty()) {
+ supportedAttributes.add(SVGNames::inAttr);
+ supportedAttributes.add(SVGNames::dxAttr);
+ supportedAttributes.add(SVGNames::dyAttr);
+ supportedAttributes.add(SVGNames::stdDeviationAttr);
+ }
+ return supportedAttributes.contains<QualifiedName, SVGAttributeHashTranslator>(attrName);
+}
+
+void SVGFEDropShadowElement::parseMappedAttribute(Attribute* attr)
+{
+ if (!isSupportedAttribute(attr->name())) {
+ SVGFilterPrimitiveStandardAttributes::parseMappedAttribute(attr);
+ return;
+ }
+
+ const AtomicString& value = attr->value();
+ if (attr->name() == SVGNames::stdDeviationAttr) {
+ float x, y;
+ if (parseNumberOptionalNumber(value, x, y)) {
+ setStdDeviationXBaseValue(x);
+ setStdDeviationYBaseValue(y);
+ }
+ return;
+ }
+
+ if (attr->name() == SVGNames::inAttr) {
+ setIn1BaseValue(value);
+ return;
+ }
+
+ if (attr->name() == SVGNames::dxAttr) {
+ setDxBaseValue(attr->value().toFloat());
+ return;
+ }
+
+ if (attr->name() == SVGNames::dyAttr) {
+ setDyBaseValue(attr->value().toFloat());
+ return;
+ }
+
+ ASSERT_NOT_REACHED();
+}
+
+void SVGFEDropShadowElement::svgAttributeChanged(const QualifiedName& attrName)
+{
+ if (!isSupportedAttribute(attrName)) {
+ SVGFilterPrimitiveStandardAttributes::svgAttributeChanged(attrName);
+ return;
+ }
+
+ SVGElementInstance::InvalidationGuard invalidationGuard(this);
+
+ if (attrName == SVGNames::inAttr
+ || attrName == SVGNames::stdDeviationAttr
+ || attrName == SVGNames::dxAttr
+ || attrName == SVGNames::dyAttr) {
+ invalidate();
+ return;
+ }
+
+ ASSERT_NOT_REACHED();
+}
+
+PassRefPtr<FilterEffect> SVGFEDropShadowElement::build(SVGFilterBuilder* filterBuilder, Filter* filter)
+{
+ RenderObject* renderer = this->renderer();
+ if (!renderer)
+ return 0;
+
+ ASSERT(renderer->style());
+ const SVGRenderStyle* svgStyle = renderer->style()->svgStyle();
+
+ Color color = svgStyle->floodColor();
+ float opacity = svgStyle->floodOpacity();
+
+ FilterEffect* input1 = filterBuilder->getEffectById(in1());
+ if (!input1)
+ return 0;
+
+ RefPtr<FilterEffect> effect = FEDropShadow::create(filter, stdDeviationX(), stdDeviationY(), dx(), dy(), color, opacity);
+ effect->inputEffects().append(input1);
+ return effect.release();
+}
+
+}
+
+#endif // ENABLE(SVG)