Stop using legacy NODE_TYPE_CASTS() macro in svg/
[WebKit-https.git] / Source / WebCore / svg / SVGTextContentElement.h
1 /*
2  * Copyright (C) 2004, 2005, 2008 Nikolas Zimmermann <zimmermann@kde.org>
3  * Copyright (C) 2004, 2005, 2006, 2008 Rob Buis <buis@kde.org>
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Library General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Library General Public License for more details.
14  *
15  * You should have received a copy of the GNU Library General Public License
16  * along with this library; see the file COPYING.LIB.  If not, write to
17  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18  * Boston, MA 02110-1301, USA.
19  */
20
21 #ifndef SVGTextContentElement_h
22 #define SVGTextContentElement_h
23
24 #include "SVGAnimatedBoolean.h"
25 #include "SVGAnimatedEnumeration.h"
26 #include "SVGAnimatedLength.h"
27 #include "SVGExternalResourcesRequired.h"
28 #include "SVGGraphicsElement.h"
29
30 namespace WebCore {
31
32 enum SVGLengthAdjustType {
33     SVGLengthAdjustUnknown,
34     SVGLengthAdjustSpacing,
35     SVGLengthAdjustSpacingAndGlyphs
36 };
37
38 template<>
39 struct SVGPropertyTraits<SVGLengthAdjustType> {
40     static unsigned highestEnumValue() { return SVGLengthAdjustSpacingAndGlyphs; }
41
42     static String toString(SVGLengthAdjustType type)
43     {
44         switch (type) {
45         case SVGLengthAdjustUnknown:
46             return emptyString();
47         case SVGLengthAdjustSpacing:
48             return "spacing";
49         case SVGLengthAdjustSpacingAndGlyphs:
50             return "spacingAndGlyphs";
51         }
52
53         ASSERT_NOT_REACHED();
54         return emptyString();
55     }
56
57     static SVGLengthAdjustType fromString(const String& value)
58     {
59         if (value == "spacingAndGlyphs")
60             return SVGLengthAdjustSpacingAndGlyphs;
61         if (value == "spacing")
62             return SVGLengthAdjustSpacing;
63         return SVGLengthAdjustUnknown;
64     }
65 };
66
67 class SVGTextContentElement : public SVGGraphicsElement, public SVGExternalResourcesRequired {
68 public:
69     // Forward declare enumerations in the W3C naming scheme, for IDL generation.
70     enum {
71         LENGTHADJUST_UNKNOWN = SVGLengthAdjustUnknown,
72         LENGTHADJUST_SPACING = SVGLengthAdjustSpacing,
73         LENGTHADJUST_SPACINGANDGLYPHS = SVGLengthAdjustSpacingAndGlyphs
74     };
75
76     unsigned getNumberOfChars();
77     float getComputedTextLength();
78     float getSubStringLength(unsigned charnum, unsigned nchars, ExceptionCode&);
79     SVGPoint getStartPositionOfChar(unsigned charnum, ExceptionCode&);
80     SVGPoint getEndPositionOfChar(unsigned charnum, ExceptionCode&);
81     FloatRect getExtentOfChar(unsigned charnum, ExceptionCode&);
82     float getRotationOfChar(unsigned charnum, ExceptionCode&);
83     int getCharNumAtPosition(const SVGPoint&);
84     void selectSubString(unsigned charnum, unsigned nchars, ExceptionCode&);
85
86     static SVGTextContentElement* elementFromRenderer(RenderObject*);
87
88     // textLength is not declared using the standard DECLARE_ANIMATED_LENGTH macro
89     // as its getter needs special handling (return getComputedTextLength(), instead of m_textLength).
90     SVGLength& specifiedTextLength() { return m_specifiedTextLength; }
91     PassRefPtr<SVGAnimatedLength> textLengthAnimated();
92     static const SVGPropertyInfo* textLengthPropertyInfo();
93
94 protected:
95     SVGTextContentElement(const QualifiedName&, Document&);
96
97     virtual bool isValid() const override { return SVGTests::isValid(); }
98
99     bool isSupportedAttribute(const QualifiedName&);
100     virtual void parseAttribute(const QualifiedName&, const AtomicString&) override;
101     virtual bool isPresentationAttribute(const QualifiedName&) const override;
102     virtual void collectStyleForPresentationAttribute(const QualifiedName&, const AtomicString&, MutableStyleProperties&) override;
103     virtual void svgAttributeChanged(const QualifiedName&) override;
104
105     virtual bool selfHasRelativeLengths() const override;
106
107 private:
108     virtual bool isTextContent() const override final { return true; }
109
110     // Custom 'textLength' property
111     static void synchronizeTextLength(SVGElement* contextElement);
112     static PassRefPtr<SVGAnimatedProperty> lookupOrCreateTextLengthWrapper(SVGElement* contextElement);
113     mutable SVGSynchronizableAnimatedProperty<SVGLength> m_textLength;
114     SVGLength m_specifiedTextLength;
115   
116     BEGIN_DECLARE_ANIMATED_PROPERTIES(SVGTextContentElement)
117         DECLARE_ANIMATED_ENUMERATION(LengthAdjust, lengthAdjust, SVGLengthAdjustType)
118         DECLARE_ANIMATED_BOOLEAN(ExternalResourcesRequired, externalResourcesRequired) 
119     END_DECLARE_ANIMATED_PROPERTIES
120 };
121
122 SPECIALIZE_TYPE_TRAITS_BEGIN(SVGTextContentElement)
123     static bool isSVGTextContentElement(const SVGElement& element) { return element.isTextContent(); }
124     static bool isSVGTextContentElement(const Node& node) { return is<SVGElement>(node) && isSVGTextContentElement(downcast<SVGElement>(node)); }
125 SPECIALIZE_TYPE_TRAITS_END()
126
127 } // namespace WebCore
128
129 #endif