Remove the SVG elements' attributes macros
[WebKit-https.git] / Source / WebCore / svg / SVGFELightElement.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) 2005 Oliver Hunt <oliver@nerget.com>
5  * Copyright (C) 2018 Apple Inc. All rights reserved.
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Library General Public
9  * License as published by the Free Software Foundation; either
10  * version 2 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Library General Public License for more details.
16  *
17  * You should have received a copy of the GNU Library General Public License
18  * along with this library; see the file COPYING.LIB.  If not, write to
19  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20  * Boston, MA 02110-1301, USA.
21  */
22
23 #include "config.h"
24 #include "SVGFELightElement.h"
25
26 #include "ElementIterator.h"
27 #include "RenderObject.h"
28 #include "RenderSVGResource.h"
29 #include "SVGFEDiffuseLightingElement.h"
30 #include "SVGFEDistantLightElement.h"
31 #include "SVGFEPointLightElement.h"
32 #include "SVGFESpecularLightingElement.h"
33 #include "SVGFESpotLightElement.h"
34 #include "SVGFilterElement.h"
35 #include "SVGFilterPrimitiveStandardAttributes.h"
36 #include "SVGNames.h"
37 #include <wtf/IsoMallocInlines.h>
38
39 namespace WebCore {
40
41 WTF_MAKE_ISO_ALLOCATED_IMPL(SVGFELightElement);
42
43 SVGFELightElement::SVGFELightElement(const QualifiedName& tagName, Document& document)
44     : SVGElement(tagName, document)
45 {
46     registerAttributes();
47 }
48
49 SVGFELightElement* SVGFELightElement::findLightElement(const SVGElement* svgElement)
50 {
51     for (auto& child : childrenOfType<SVGElement>(*svgElement)) {
52         if (is<SVGFEDistantLightElement>(child) || is<SVGFEPointLightElement>(child) || is<SVGFESpotLightElement>(child))
53             return static_cast<SVGFELightElement*>(const_cast<SVGElement*>(&child));
54     }
55     return nullptr;
56 }
57
58 void SVGFELightElement::registerAttributes()
59 {
60     auto& registry = attributeRegistry();
61     if (!registry.isEmpty())
62         return;
63     registry.registerAttribute<SVGNames::azimuthAttr, &SVGFELightElement::m_azimuth>();
64     registry.registerAttribute<SVGNames::elevationAttr, &SVGFELightElement::m_elevation>();
65     registry.registerAttribute<SVGNames::xAttr, &SVGFELightElement::m_x>();
66     registry.registerAttribute<SVGNames::yAttr, &SVGFELightElement::m_y>();
67     registry.registerAttribute<SVGNames::zAttr, &SVGFELightElement::m_z>();
68     registry.registerAttribute<SVGNames::pointsAtXAttr, &SVGFELightElement::m_pointsAtX>();
69     registry.registerAttribute<SVGNames::pointsAtYAttr, &SVGFELightElement::m_pointsAtY>();
70     registry.registerAttribute<SVGNames::pointsAtZAttr, &SVGFELightElement::m_pointsAtZ>();
71     registry.registerAttribute<SVGNames::specularExponentAttr, &SVGFELightElement::m_specularExponent>();
72     registry.registerAttribute<SVGNames::limitingConeAngleAttr, &SVGFELightElement::m_limitingConeAngle>();
73 }
74
75 void SVGFELightElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
76 {
77     if (name == SVGNames::azimuthAttr) {
78         m_azimuth.setValue(value.toFloat());
79         return;
80     }
81
82     if (name == SVGNames::elevationAttr) {
83         m_elevation.setValue(value.toFloat());
84         return;
85     }
86
87     if (name == SVGNames::xAttr) {
88         m_x.setValue(value.toFloat());
89         return;
90     }
91
92     if (name == SVGNames::yAttr) {
93         m_y.setValue(value.toFloat());
94         return;
95     }
96
97     if (name == SVGNames::zAttr) {
98         m_z.setValue(value.toFloat());
99         return;
100     }
101
102     if (name == SVGNames::pointsAtXAttr) {
103         m_pointsAtX.setValue(value.toFloat());
104         return;
105     }
106
107     if (name == SVGNames::pointsAtYAttr) {
108         m_pointsAtY.setValue(value.toFloat());
109         return;
110     }
111
112     if (name == SVGNames::pointsAtZAttr) {
113         m_pointsAtZ.setValue(value.toFloat());
114         return;
115     }
116
117     if (name == SVGNames::specularExponentAttr) {
118         m_specularExponent.setValue(value.toFloat());
119         return;
120     }
121
122     if (name == SVGNames::limitingConeAngleAttr) {
123         m_limitingConeAngle.setValue(value.toFloat());
124         return;
125     }
126
127     SVGElement::parseAttribute(name, value);
128 }
129
130 void SVGFELightElement::svgAttributeChanged(const QualifiedName& attrName)
131 {
132     if (isKnownAttribute(attrName)) {
133         auto parent = makeRefPtr(parentElement());
134         if (!parent)
135             return;
136
137         auto* renderer = parent->renderer();
138         if (!renderer || !renderer->isSVGResourceFilterPrimitive())
139             return;
140
141         if (is<SVGFEDiffuseLightingElement>(*parent)) {
142             InstanceInvalidationGuard guard(*this);
143             downcast<SVGFEDiffuseLightingElement>(*parent).lightElementAttributeChanged(this, attrName);
144         } else if (is<SVGFESpecularLightingElement>(*parent)) {
145             InstanceInvalidationGuard guard(*this);
146             downcast<SVGFESpecularLightingElement>(*parent).lightElementAttributeChanged(this, attrName);
147         }
148
149         return;
150     }
151
152     SVGElement::svgAttributeChanged(attrName);
153 }
154
155 void SVGFELightElement::childrenChanged(const ChildChange& change)
156 {
157     SVGElement::childrenChanged(change);
158
159     if (change.source == ChildChangeSource::Parser)
160         return;
161     auto parent = makeRefPtr(parentNode());
162     if (!parent)
163         return;
164     RenderElement* renderer = parent->renderer();
165     if (renderer && renderer->isSVGResourceFilterPrimitive())
166         RenderSVGResource::markForLayoutAndParentResourceInvalidation(*renderer);
167 }
168
169 }