Put the DOM in IsoHeaps
[WebKit-https.git] / Source / WebCore / svg / SVGTextPathElement.h
1 /*
2  * Copyright (C) 2007 Nikolas Zimmermann <zimmermann@kde.org>
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 #pragma once
21
22 #include "SVGNames.h"
23 #include "SVGTextContentElement.h"
24 #include "SVGURIReference.h"
25
26 namespace WebCore {
27
28 enum SVGTextPathMethodType {
29     SVGTextPathMethodUnknown = 0,
30     SVGTextPathMethodAlign,
31     SVGTextPathMethodStretch
32 };
33
34 enum SVGTextPathSpacingType {
35     SVGTextPathSpacingUnknown = 0,
36     SVGTextPathSpacingAuto,
37     SVGTextPathSpacingExact
38 };
39
40 template<>
41 struct SVGPropertyTraits<SVGTextPathMethodType> {
42     static unsigned highestEnumValue() { return SVGTextPathMethodStretch; }
43
44     static String toString(SVGTextPathMethodType type)
45     {
46         switch (type) {
47         case SVGTextPathMethodUnknown:
48             return emptyString();
49         case SVGTextPathMethodAlign:
50             return ASCIILiteral("align");
51         case SVGTextPathMethodStretch:
52             return ASCIILiteral("stretch");
53         }
54     
55         ASSERT_NOT_REACHED();
56         return emptyString();
57     }
58
59     static SVGTextPathMethodType fromString(const String& value)
60     {
61         if (value == "align")
62             return SVGTextPathMethodAlign;
63         if (value == "stretch")
64             return SVGTextPathMethodStretch;
65         return SVGTextPathMethodUnknown;
66     }
67 };
68
69 template<>
70 struct SVGPropertyTraits<SVGTextPathSpacingType> {
71     static unsigned highestEnumValue() { return SVGTextPathSpacingExact; }
72
73     static String toString(SVGTextPathSpacingType type)
74     {
75         switch (type) {
76         case SVGTextPathSpacingUnknown:
77             return emptyString();
78         case SVGTextPathSpacingAuto:
79             return ASCIILiteral("auto");
80         case SVGTextPathSpacingExact:
81             return ASCIILiteral("exact");
82         }
83
84         ASSERT_NOT_REACHED();
85         return emptyString();
86     }
87
88     static SVGTextPathSpacingType fromString(const String& value)
89     {
90         if (value == "auto")
91             return SVGTextPathSpacingAuto;
92         if (value == "exact")
93             return SVGTextPathSpacingExact;
94         return SVGTextPathSpacingUnknown;
95     }
96 };
97
98 class SVGTextPathElement final : public SVGTextContentElement, public SVGURIReference {
99     WTF_MAKE_ISO_ALLOCATED(SVGTextPathElement);
100 public:
101     // Forward declare enumerations in the W3C naming scheme, for IDL generation.
102     enum {
103         TEXTPATH_METHODTYPE_UNKNOWN = SVGTextPathMethodUnknown,
104         TEXTPATH_METHODTYPE_ALIGN = SVGTextPathMethodAlign,
105         TEXTPATH_METHODTYPE_STRETCH = SVGTextPathMethodStretch,
106         TEXTPATH_SPACINGTYPE_UNKNOWN = SVGTextPathSpacingUnknown,
107         TEXTPATH_SPACINGTYPE_AUTO = SVGTextPathSpacingAuto,
108         TEXTPATH_SPACINGTYPE_EXACT = SVGTextPathSpacingExact
109     };
110
111     static Ref<SVGTextPathElement> create(const QualifiedName&, Document&);
112
113 protected:
114     void didFinishInsertingNode() override;
115
116 private:
117     SVGTextPathElement(const QualifiedName&, Document&);
118
119     virtual ~SVGTextPathElement();
120
121     void clearResourceReferences();
122
123     void buildPendingResource() override;
124     InsertedIntoAncestorResult insertedIntoAncestor(InsertionType, ContainerNode&) override;
125     void removedFromAncestor(RemovalType, ContainerNode&) override;
126
127     static bool isSupportedAttribute(const QualifiedName&);
128     void parseAttribute(const QualifiedName&, const AtomicString&) override;
129     void svgAttributeChanged(const QualifiedName&) override;
130
131     RenderPtr<RenderElement> createElementRenderer(RenderStyle&&, const RenderTreePosition&) override;
132     bool childShouldCreateRenderer(const Node&) const override;
133     bool rendererIsNeeded(const RenderStyle&) override;
134
135     bool selfHasRelativeLengths() const override;
136  
137     BEGIN_DECLARE_ANIMATED_PROPERTIES(SVGTextPathElement)
138         DECLARE_ANIMATED_LENGTH(StartOffset, startOffset)
139         DECLARE_ANIMATED_ENUMERATION(Method, method, SVGTextPathMethodType)
140         DECLARE_ANIMATED_ENUMERATION(Spacing, spacing, SVGTextPathSpacingType)
141         DECLARE_ANIMATED_STRING_OVERRIDE(Href, href)
142     END_DECLARE_ANIMATED_PROPERTIES
143 };
144
145 } // namespace WebCore