Remove the SVG elements' attributes macros
[WebKit-https.git] / Source / WebCore / svg / SVGFETurbulenceElement.cpp
1 /*
2  * Copyright (C) 2004, 2005, 2007 Nikolas Zimmermann <zimmermann@kde.org>
3  * Copyright (C) 2004, 2005, 2006 Rob Buis <buis@kde.org>
4  * Copyright (C) 2018 Apple Inc. All rights reserved.
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Library General Public
8  * License as published by the Free Software Foundation; either
9  * version 2 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Library General Public License for more details.
15  *
16  * You should have received a copy of the GNU Library General Public License
17  * along with this library; see the file COPYING.LIB.  If not, write to
18  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19  * Boston, MA 02110-1301, USA.
20  */
21
22 #include "config.h"
23 #include "SVGFETurbulenceElement.h"
24
25 #include "SVGNames.h"
26 #include "SVGParserUtilities.h"
27 #include <wtf/IsoMallocInlines.h>
28
29 namespace WebCore {
30
31 WTF_MAKE_ISO_ALLOCATED_IMPL(SVGFETurbulenceElement);
32
33 inline SVGFETurbulenceElement::SVGFETurbulenceElement(const QualifiedName& tagName, Document& document)
34     : SVGFilterPrimitiveStandardAttributes(tagName, document)
35 {
36     ASSERT(hasTagName(SVGNames::feTurbulenceTag));
37     registerAttributes();
38 }
39
40 Ref<SVGFETurbulenceElement> SVGFETurbulenceElement::create(const QualifiedName& tagName, Document& document)
41 {
42     return adoptRef(*new SVGFETurbulenceElement(tagName, document));
43 }
44
45 const AtomicString& SVGFETurbulenceElement::baseFrequencyXIdentifier()
46 {
47     static NeverDestroyed<AtomicString> s_identifier("SVGBaseFrequencyX", AtomicString::ConstructFromLiteral);
48     return s_identifier;
49 }
50
51 const AtomicString& SVGFETurbulenceElement::baseFrequencyYIdentifier()
52 {
53     static NeverDestroyed<AtomicString> s_identifier("SVGBaseFrequencyY", AtomicString::ConstructFromLiteral);
54     return s_identifier;
55 }
56
57 void SVGFETurbulenceElement::registerAttributes()
58 {
59     auto& registry = attributeRegistry();
60     if (!registry.isEmpty())
61         return;
62     registry.registerAttribute<SVGNames::baseFrequencyAttr,
63         &SVGFETurbulenceElement::baseFrequencyXIdentifier, &SVGFETurbulenceElement::m_baseFrequencyX,
64         &SVGFETurbulenceElement::baseFrequencyYIdentifier, &SVGFETurbulenceElement::m_baseFrequencyY>();
65     registry.registerAttribute<SVGNames::numOctavesAttr, &SVGFETurbulenceElement::m_numOctaves>();
66     registry.registerAttribute<SVGNames::seedAttr, &SVGFETurbulenceElement::m_seed>();
67     registry.registerAttribute<SVGNames::stitchTilesAttr, SVGStitchOptions, &SVGFETurbulenceElement::m_stitchTiles>();
68     registry.registerAttribute<SVGNames::typeAttr, TurbulenceType, &SVGFETurbulenceElement::m_type>();
69 }
70
71 void SVGFETurbulenceElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
72 {
73     if (name == SVGNames::typeAttr) {
74         TurbulenceType propertyValue = SVGPropertyTraits<TurbulenceType>::fromString(value);
75         if (propertyValue != TurbulenceType::Unknown)
76             m_type.setValue(propertyValue);
77         return;
78     }
79
80     if (name == SVGNames::stitchTilesAttr) {
81         SVGStitchOptions propertyValue = SVGPropertyTraits<SVGStitchOptions>::fromString(value);
82         if (propertyValue > 0)
83             m_stitchTiles.setValue(propertyValue);
84         return;
85     }
86
87     if (name == SVGNames::baseFrequencyAttr) {
88         float x, y;
89         if (parseNumberOptionalNumber(value, x, y)) {
90             m_baseFrequencyX.setValue(x);
91             m_baseFrequencyY.setValue(y);
92         }
93         return;
94     }
95
96     if (name == SVGNames::seedAttr) {
97         m_seed.setValue(value.toFloat());
98         return;
99     }
100
101     if (name == SVGNames::numOctavesAttr) {
102         m_numOctaves.setValue(value.string().toUIntStrict());
103         return;
104     }
105
106     SVGFilterPrimitiveStandardAttributes::parseAttribute(name, value);
107 }
108
109 bool SVGFETurbulenceElement::setFilterEffectAttribute(FilterEffect* effect, const QualifiedName& attrName)
110 {
111     FETurbulence* turbulence = static_cast<FETurbulence*>(effect);
112     if (attrName == SVGNames::typeAttr)
113         return turbulence->setType(type());
114     if (attrName == SVGNames::stitchTilesAttr)
115         return turbulence->setStitchTiles(stitchTiles());
116     if (attrName == SVGNames::baseFrequencyAttr)
117         return (turbulence->setBaseFrequencyX(baseFrequencyX()) || turbulence->setBaseFrequencyY(baseFrequencyY()));
118     if (attrName == SVGNames::seedAttr)
119         return turbulence->setSeed(seed());
120     if (attrName == SVGNames::numOctavesAttr)
121         return turbulence->setNumOctaves(numOctaves());
122
123     ASSERT_NOT_REACHED();
124     return false;
125 }
126
127 void SVGFETurbulenceElement::svgAttributeChanged(const QualifiedName& attrName)
128 {
129     if (isKnownAttribute(attrName)) {
130         InstanceInvalidationGuard guard(*this);
131         primitiveAttributeChanged(attrName);
132         return;
133     }
134
135     SVGFilterPrimitiveStandardAttributes::svgAttributeChanged(attrName);
136 }
137
138 RefPtr<FilterEffect> SVGFETurbulenceElement::build(SVGFilterBuilder*, Filter& filter)
139 {
140     if (baseFrequencyX() < 0 || baseFrequencyY() < 0)
141         return nullptr;
142     return FETurbulence::create(filter, type(), baseFrequencyX(), baseFrequencyY(), numOctaves(), seed(), stitchTiles() == SVG_STITCHTYPE_STITCH);
143 }
144
145 }