b4c392b354979604c951e6e79e0cf74cd81d6847
[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 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     SVGSpreadMethodType spreadMethod() const { return m_spreadMethod.currentValue(attributeOwnerProxy()); }
92     SVGUnitTypes::SVGUnitType gradientUnits() const { return m_gradientUnits.currentValue(attributeOwnerProxy()); }
93     const SVGTransformListValues& gradientTransform() const { return m_gradientTransform.currentValue(attributeOwnerProxy()); }
94
95     RefPtr<SVGAnimatedEnumeration> spreadMethodAnimated() { return m_spreadMethod.animatedProperty(attributeOwnerProxy()); }
96     RefPtr<SVGAnimatedEnumeration> gradientUnitsAnimated() { return m_gradientUnits.animatedProperty(attributeOwnerProxy()); }
97     RefPtr<SVGAnimatedTransformList> gradientTransformAnimated() { return m_gradientTransform.animatedProperty(attributeOwnerProxy()); }
98
99 protected:
100     SVGGradientElement(const QualifiedName&, Document&);
101
102     static bool isKnownAttribute(const QualifiedName& attributeName) { return AttributeOwnerProxy::isKnownAttribute(attributeName); }
103     void parseAttribute(const QualifiedName&, const AtomicString&) override;
104     void svgAttributeChanged(const QualifiedName&) override;
105
106 private:
107     bool needsPendingResourceHandling() const override { return false; }
108     void childrenChanged(const ChildChange&) override;
109
110     const SVGAttributeOwnerProxy& attributeOwnerProxy() const override { return m_attributeOwnerProxy; }
111     static void registerAttributes();
112
113     AttributeOwnerProxy m_attributeOwnerProxy { *this };
114     SVGAnimatedEnumerationAttribute<SVGSpreadMethodType> m_spreadMethod { SVGSpreadMethodPad };
115     SVGAnimatedEnumerationAttribute<SVGUnitTypes::SVGUnitType> m_gradientUnits { SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX };
116     SVGAnimatedTransformListAttribute m_gradientTransform;
117 };
118
119 } // namespace WebCore
120
121 SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::SVGGradientElement)
122 static bool isType(const WebCore::SVGElement& element)
123 {
124     return element.hasTagName(WebCore::SVGNames::radialGradientTag) || element.hasTagName(WebCore::SVGNames::linearGradientTag);
125 }
126 static bool isType(const WebCore::Node& node)
127 {
128     return is<WebCore::SVGElement>(node) && isType(downcast<WebCore::SVGElement>(node));
129 }
130 SPECIALIZE_TYPE_TRAITS_END()