Use #pragma once in WebCore
[WebKit-https.git] / Source / WebCore / svg / SVGFEDisplacementMapElement.cpp
1 /*
2  * Copyright (C) 2006 Oliver Hunt <oliver@nerget.com>
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 "SVGFEDisplacementMapElement.h"
22
23 #include "FilterEffect.h"
24 #include "SVGFilterBuilder.h"
25 #include "SVGNames.h"
26
27 namespace WebCore {
28
29 // Animated property definitions
30 DEFINE_ANIMATED_STRING(SVGFEDisplacementMapElement, SVGNames::inAttr, In1, in1)
31 DEFINE_ANIMATED_STRING(SVGFEDisplacementMapElement, SVGNames::in2Attr, In2, in2)
32 DEFINE_ANIMATED_ENUMERATION(SVGFEDisplacementMapElement, SVGNames::xChannelSelectorAttr, XChannelSelector, xChannelSelector, ChannelSelectorType)
33 DEFINE_ANIMATED_ENUMERATION(SVGFEDisplacementMapElement, SVGNames::yChannelSelectorAttr, YChannelSelector, yChannelSelector, ChannelSelectorType)
34 DEFINE_ANIMATED_NUMBER(SVGFEDisplacementMapElement, SVGNames::scaleAttr, Scale, scale)
35
36 BEGIN_REGISTER_ANIMATED_PROPERTIES(SVGFEDisplacementMapElement)
37     REGISTER_LOCAL_ANIMATED_PROPERTY(in1)
38     REGISTER_LOCAL_ANIMATED_PROPERTY(in2)
39     REGISTER_LOCAL_ANIMATED_PROPERTY(xChannelSelector)
40     REGISTER_LOCAL_ANIMATED_PROPERTY(yChannelSelector)
41     REGISTER_LOCAL_ANIMATED_PROPERTY(scale)
42     REGISTER_PARENT_ANIMATED_PROPERTIES(SVGFilterPrimitiveStandardAttributes)
43 END_REGISTER_ANIMATED_PROPERTIES
44
45 inline SVGFEDisplacementMapElement::SVGFEDisplacementMapElement(const QualifiedName& tagName, Document& document)
46     : SVGFilterPrimitiveStandardAttributes(tagName, document)
47     , m_xChannelSelector(CHANNEL_A)
48     , m_yChannelSelector(CHANNEL_A)
49 {
50     ASSERT(hasTagName(SVGNames::feDisplacementMapTag));
51     registerAnimatedPropertiesForSVGFEDisplacementMapElement();
52 }
53
54 Ref<SVGFEDisplacementMapElement> SVGFEDisplacementMapElement::create(const QualifiedName& tagName, Document& document)
55 {
56     return adoptRef(*new SVGFEDisplacementMapElement(tagName, document));
57 }
58
59 void SVGFEDisplacementMapElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
60 {
61     if (name == SVGNames::xChannelSelectorAttr) {
62         auto propertyValue = SVGPropertyTraits<ChannelSelectorType>::fromString(value);
63         if (propertyValue > 0)
64             setXChannelSelectorBaseValue(propertyValue);
65         return;
66     }
67
68     if (name == SVGNames::yChannelSelectorAttr) {
69         auto propertyValue = SVGPropertyTraits<ChannelSelectorType>::fromString(value);
70         if (propertyValue > 0)
71             setYChannelSelectorBaseValue(propertyValue);
72         return;
73     }
74
75     if (name == SVGNames::inAttr) {
76         setIn1BaseValue(value);
77         return;
78     }
79
80     if (name == SVGNames::in2Attr) {
81         setIn2BaseValue(value);
82         return;
83     }
84
85     if (name == SVGNames::scaleAttr) {
86         setScaleBaseValue(value.toFloat());
87         return;
88     }
89
90     SVGFilterPrimitiveStandardAttributes::parseAttribute(name, value);
91 }
92
93 bool SVGFEDisplacementMapElement::setFilterEffectAttribute(FilterEffect* effect, const QualifiedName& attrName)
94 {
95     FEDisplacementMap* displacementMap = static_cast<FEDisplacementMap*>(effect);
96     if (attrName == SVGNames::xChannelSelectorAttr)
97         return displacementMap->setXChannelSelector(xChannelSelector());
98     if (attrName == SVGNames::yChannelSelectorAttr)
99         return displacementMap->setYChannelSelector(yChannelSelector());
100     if (attrName == SVGNames::scaleAttr)
101         return displacementMap->setScale(scale());
102
103     ASSERT_NOT_REACHED();
104     return false;
105 }
106
107 void SVGFEDisplacementMapElement::svgAttributeChanged(const QualifiedName& attrName)
108 {
109     if (attrName == SVGNames::xChannelSelectorAttr || attrName == SVGNames::yChannelSelectorAttr || attrName == SVGNames::scaleAttr) {
110         InstanceInvalidationGuard guard(*this);
111         primitiveAttributeChanged(attrName);
112         return;
113     }
114
115     if (attrName == SVGNames::inAttr || attrName == SVGNames::in2Attr) {
116         InstanceInvalidationGuard guard(*this);
117         invalidate();
118         return;
119     }
120
121     SVGFilterPrimitiveStandardAttributes::svgAttributeChanged(attrName);
122 }
123
124 RefPtr<FilterEffect> SVGFEDisplacementMapElement::build(SVGFilterBuilder* filterBuilder, Filter& filter)
125 {
126     FilterEffect* input1 = filterBuilder->getEffectById(in1());
127     FilterEffect* input2 = filterBuilder->getEffectById(in2());
128     
129     if (!input1 || !input2)
130         return nullptr;
131
132     RefPtr<FilterEffect> effect = FEDisplacementMap::create(filter, xChannelSelector(), yChannelSelector(), scale());
133     FilterEffectVector& inputEffects = effect->inputEffects();
134     inputEffects.reserveCapacity(2);
135     inputEffects.append(input1);
136     inputEffects.append(input2);    
137     return effect;
138 }
139
140 }