Define the type of SVGPropertyOwnerRegistry for all SVG elements
[WebKit-https.git] / Source / WebCore / svg / SVGGradientElement.h
1 /*
2  * Copyright (C) 2004, 2005, 2006, 2008 Nikolas Zimmermann <zimmermann@kde.org>
3  * Copyright (C) 2004, 2005, 2006 Rob Buis <buis@kde.org>
4  * Copyright (C) 2018-2019 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 #pragma once
23
24 #include "Gradient.h"
25 #include "SVGAnimatedBoolean.h"
26 #include "SVGAnimatedEnumeration.h"
27 #include "SVGAnimatedTransformList.h"
28 #include "SVGElement.h"
29 #include "SVGExternalResourcesRequired.h"
30 #include "SVGNames.h"
31 #include "SVGURIReference.h"
32 #include "SVGUnitTypes.h"
33
34 namespace WebCore {
35
36 enum SVGSpreadMethodType {
37     SVGSpreadMethodUnknown = 0,
38     SVGSpreadMethodPad,
39     SVGSpreadMethodReflect,
40     SVGSpreadMethodRepeat
41 };
42
43 template<>
44 struct SVGPropertyTraits<SVGSpreadMethodType> {
45     static unsigned highestEnumValue() { return SVGSpreadMethodRepeat; }
46
47     static String toString(SVGSpreadMethodType type)
48     {
49         switch (type) {
50         case SVGSpreadMethodUnknown:
51             return emptyString();
52         case SVGSpreadMethodPad:
53             return "pad"_s;
54         case SVGSpreadMethodReflect:
55             return "reflect"_s;
56         case SVGSpreadMethodRepeat:
57             return "repeat"_s;
58         }
59
60         ASSERT_NOT_REACHED();
61         return emptyString();
62     }
63
64     static SVGSpreadMethodType fromString(const String& value)
65     {
66         if (value == "pad")
67             return SVGSpreadMethodPad;
68         if (value == "reflect")
69             return SVGSpreadMethodReflect;
70         if (value == "repeat")
71             return SVGSpreadMethodRepeat;
72         return SVGSpreadMethodUnknown;
73     }
74 };
75
76 class SVGGradientElement : public SVGElement, public SVGExternalResourcesRequired, public SVGURIReference {
77     WTF_MAKE_ISO_ALLOCATED(SVGGradientElement);
78 public:
79     enum {
80         SVG_SPREADMETHOD_UNKNOWN = SVGSpreadMethodUnknown,
81         SVG_SPREADMETHOD_PAD = SVGSpreadMethodReflect,
82         SVG_SPREADMETHOD_REFLECT = SVGSpreadMethodRepeat,
83         SVG_SPREADMETHOD_REPEAT = SVGSpreadMethodUnknown
84     };
85
86     Vector<Gradient::ColorStop> buildStops();
87
88     using AttributeOwnerProxy = SVGAttributeOwnerProxyImpl<SVGGradientElement, SVGElement, SVGExternalResourcesRequired, SVGURIReference>;
89     static AttributeOwnerProxy::AttributeRegistry& attributeRegistry() { return AttributeOwnerProxy::attributeRegistry(); }
90
91     using PropertyRegistry = SVGPropertyOwnerRegistry<SVGGradientElement, SVGElement, SVGExternalResourcesRequired, SVGURIReference>;
92
93     SVGSpreadMethodType spreadMethod() const { return m_spreadMethod.currentValue(attributeOwnerProxy()); }
94     SVGUnitTypes::SVGUnitType gradientUnits() const { return m_gradientUnits.currentValue(attributeOwnerProxy()); }
95     const SVGTransformListValues& gradientTransform() const { return m_gradientTransform.currentValue(attributeOwnerProxy()); }
96
97     RefPtr<SVGAnimatedEnumeration> spreadMethodAnimated() { return m_spreadMethod.animatedProperty(attributeOwnerProxy()); }
98     RefPtr<SVGAnimatedEnumeration> gradientUnitsAnimated() { return m_gradientUnits.animatedProperty(attributeOwnerProxy()); }
99     RefPtr<SVGAnimatedTransformList> gradientTransformAnimated() { return m_gradientTransform.animatedProperty(attributeOwnerProxy()); }
100
101 protected:
102     SVGGradientElement(const QualifiedName&, Document&);
103
104     static bool isKnownAttribute(const QualifiedName& attributeName)
105     {
106         return AttributeOwnerProxy::isKnownAttribute(attributeName) || PropertyRegistry::isKnownAttribute(attributeName);
107     }
108
109     void parseAttribute(const QualifiedName&, const AtomicString&) override;
110     void svgAttributeChanged(const QualifiedName&) override;
111
112 private:
113     bool needsPendingResourceHandling() const override { return false; }
114     void childrenChanged(const ChildChange&) override;
115
116     const SVGAttributeOwnerProxy& attributeOwnerProxy() const override { return m_attributeOwnerProxy; }
117     static void registerAttributes();
118
119     const SVGPropertyRegistry& propertyRegistry() const override { return m_propertyRegistry; }
120
121     AttributeOwnerProxy m_attributeOwnerProxy { *this };
122     PropertyRegistry m_propertyRegistry { *this };
123     SVGAnimatedEnumerationAttribute<SVGSpreadMethodType> m_spreadMethod { SVGSpreadMethodPad };
124     SVGAnimatedEnumerationAttribute<SVGUnitTypes::SVGUnitType> m_gradientUnits { SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX };
125     SVGAnimatedTransformListAttribute m_gradientTransform;
126 };
127
128 } // namespace WebCore
129
130 SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::SVGGradientElement)
131 static bool isType(const WebCore::SVGElement& element)
132 {
133     return element.hasTagName(WebCore::SVGNames::radialGradientTag) || element.hasTagName(WebCore::SVGNames::linearGradientTag);
134 }
135 static bool isType(const WebCore::Node& node)
136 {
137     return is<WebCore::SVGElement>(node) && isType(downcast<WebCore::SVGElement>(node));
138 }
139 SPECIALIZE_TYPE_TRAITS_END()