cc4bba116013a7a75a3ded9308e3522ff3d2ca82
[WebKit-https.git] / Source / WebCore / svg / SVGFEDropShadowElement.cpp
1 /*
2  * Copyright (C) Research In Motion Limited 2011. All rights reserved.
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Library General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Library General Public License for more details.
13  *
14  * You should have received a copy of the GNU Library General Public License
15  * along with this library; see the file COPYING.LIB.  If not, write to
16  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  * Boston, MA 02110-1301, USA.
18  */
19
20 #include "config.h"
21 #include "SVGFEDropShadowElement.h"
22
23 #include "RenderStyle.h"
24 #include "SVGFilterBuilder.h"
25 #include "SVGNames.h"
26 #include "SVGParserUtilities.h"
27 #include "SVGRenderStyle.h"
28 #include <wtf/IsoMallocInlines.h>
29
30 namespace WebCore {
31
32 WTF_MAKE_ISO_ALLOCATED_IMPL(SVGFEDropShadowElement);
33
34 // Animated property definitions
35 DEFINE_ANIMATED_STRING(SVGFEDropShadowElement, SVGNames::inAttr, In1, in1)
36 DEFINE_ANIMATED_NUMBER(SVGFEDropShadowElement, SVGNames::dxAttr, Dx, dx)
37 DEFINE_ANIMATED_NUMBER(SVGFEDropShadowElement, SVGNames::dyAttr, Dy, dy)
38 DEFINE_ANIMATED_NUMBER_MULTIPLE_WRAPPERS(SVGFEDropShadowElement, SVGNames::stdDeviationAttr, stdDeviationXIdentifier(), StdDeviationX, stdDeviationX)
39 DEFINE_ANIMATED_NUMBER_MULTIPLE_WRAPPERS(SVGFEDropShadowElement, SVGNames::stdDeviationAttr, stdDeviationYIdentifier(), StdDeviationY, stdDeviationY)
40
41 BEGIN_REGISTER_ANIMATED_PROPERTIES(SVGFEDropShadowElement)
42     REGISTER_LOCAL_ANIMATED_PROPERTY(in1)
43     REGISTER_LOCAL_ANIMATED_PROPERTY(dx)
44     REGISTER_LOCAL_ANIMATED_PROPERTY(dy)
45     REGISTER_LOCAL_ANIMATED_PROPERTY(stdDeviationX)
46     REGISTER_LOCAL_ANIMATED_PROPERTY(stdDeviationY)
47     REGISTER_PARENT_ANIMATED_PROPERTIES(SVGFilterPrimitiveStandardAttributes)
48 END_REGISTER_ANIMATED_PROPERTIES
49
50 inline SVGFEDropShadowElement::SVGFEDropShadowElement(const QualifiedName& tagName, Document& document)
51     : SVGFilterPrimitiveStandardAttributes(tagName, document)
52     , m_dx(2)
53     , m_dy(2)
54     , m_stdDeviationX(2)
55     , m_stdDeviationY(2)
56 {
57     ASSERT(hasTagName(SVGNames::feDropShadowTag));
58     registerAnimatedPropertiesForSVGFEDropShadowElement();
59 }
60
61 Ref<SVGFEDropShadowElement> SVGFEDropShadowElement::create(const QualifiedName& tagName, Document& document)
62 {
63     return adoptRef(*new SVGFEDropShadowElement(tagName, document));
64 }
65
66 const AtomicString& SVGFEDropShadowElement::stdDeviationXIdentifier()
67 {
68     static NeverDestroyed<AtomicString> s_identifier("SVGStdDeviationX", AtomicString::ConstructFromLiteral);
69     return s_identifier;
70 }
71
72 const AtomicString& SVGFEDropShadowElement::stdDeviationYIdentifier()
73 {
74     static NeverDestroyed<AtomicString> s_identifier("SVGStdDeviationY", AtomicString::ConstructFromLiteral);
75     return s_identifier;
76 }
77
78 void SVGFEDropShadowElement::setStdDeviation(float x, float y)
79 {
80     setStdDeviationXBaseValue(x);
81     setStdDeviationYBaseValue(y);
82     invalidate();
83 }
84
85 void SVGFEDropShadowElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
86 {
87     if (name == SVGNames::stdDeviationAttr) {
88         float x, y;
89         if (parseNumberOptionalNumber(value, x, y)) {
90             setStdDeviationXBaseValue(x);
91             setStdDeviationYBaseValue(y);
92         }
93         return;
94     }
95
96     if (name == SVGNames::inAttr) {
97         setIn1BaseValue(value);
98         return;
99     }
100
101     if (name == SVGNames::dxAttr) {
102         setDxBaseValue(value.toFloat());
103         return;
104     }
105
106     if (name == SVGNames::dyAttr) {
107         setDyBaseValue(value.toFloat());
108         return;
109     }
110
111     SVGFilterPrimitiveStandardAttributes::parseAttribute(name, value);
112 }
113
114 void SVGFEDropShadowElement::svgAttributeChanged(const QualifiedName& attrName)
115 {
116     if (attrName == SVGNames::inAttr || attrName == SVGNames::stdDeviationAttr || attrName == SVGNames::dxAttr || attrName == SVGNames::dyAttr) {
117         InstanceInvalidationGuard guard(*this);
118         invalidate();
119         return;
120     }
121
122     SVGFilterPrimitiveStandardAttributes::svgAttributeChanged(attrName);
123 }
124
125 RefPtr<FilterEffect> SVGFEDropShadowElement::build(SVGFilterBuilder* filterBuilder, Filter& filter)
126 {
127     RenderObject* renderer = this->renderer();
128     if (!renderer)
129         return nullptr;
130
131     if (stdDeviationX() < 0 || stdDeviationY() < 0)
132         return nullptr;
133
134     const SVGRenderStyle& svgStyle = renderer->style().svgStyle();
135     
136     Color color = renderer->style().colorByApplyingColorFilter(svgStyle.floodColor());
137     float opacity = svgStyle.floodOpacity();
138
139     auto input1 = filterBuilder->getEffectById(in1());
140     if (!input1)
141         return nullptr;
142
143     RefPtr<FilterEffect> effect = FEDropShadow::create(filter, stdDeviationX(), stdDeviationY(), dx(), dy(), color, opacity);
144     effect->inputEffects().append(input1);
145     return effect;
146 }
147
148 }