2012-04-03 Nikolas Zimmermann <nzimmermann@rim.com>
[WebKit-https.git] / Source / WebCore / svg / SVGMarkerElement.h
1 /*
2  * Copyright (C) 2004, 2005, 2006, 2007, 2008 Nikolas Zimmermann <zimmermann@kde.org>
3  * Copyright (C) 2004, 2005, 2006 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 SVGMarkerElement_h
22 #define SVGMarkerElement_h
23
24 #if ENABLE(SVG)
25 #include "SVGAnimatedAngle.h"
26 #include "SVGAnimatedBoolean.h"
27 #include "SVGAnimatedEnumeration.h"
28 #include "SVGAnimatedLength.h"
29 #include "SVGAnimatedPreserveAspectRatio.h"
30 #include "SVGAnimatedRect.h"
31 #include "SVGExternalResourcesRequired.h"
32 #include "SVGFitToViewBox.h"
33 #include "SVGLangSpace.h"
34 #include "SVGStyledElement.h"
35
36 namespace WebCore {
37
38 enum SVGMarkerUnitsType {
39     SVGMarkerUnitsUnknown = 0,
40     SVGMarkerUnitsUserSpaceOnUse,
41     SVGMarkerUnitsStrokeWidth
42 };
43
44 enum SVGMarkerOrientType {
45     SVGMarkerOrientUnknown = 0,
46     SVGMarkerOrientAuto,
47     SVGMarkerOrientAngle
48 };
49
50 template<>
51 struct SVGPropertyTraits<SVGMarkerUnitsType> {
52     static unsigned highestEnumValue() { return SVGMarkerUnitsStrokeWidth; }
53
54     static String toString(SVGMarkerUnitsType type)
55     {
56         switch (type) {
57         case SVGMarkerUnitsUnknown:
58             return emptyString();
59         case SVGMarkerUnitsUserSpaceOnUse:
60             return "userSpaceOnUse";
61         case SVGMarkerUnitsStrokeWidth:
62             return "strokeWidth";
63         }
64
65         ASSERT_NOT_REACHED();
66         return emptyString();
67     }
68
69     static SVGMarkerUnitsType fromString(const String& value)
70     {
71         if (value == "userSpaceOnUse")
72             return SVGMarkerUnitsUserSpaceOnUse;
73         if (value == "strokeWidth")
74             return SVGMarkerUnitsStrokeWidth;
75         return SVGMarkerUnitsUnknown;
76     }
77 };
78
79 template<>
80 struct SVGPropertyTraits<SVGMarkerOrientType> {
81     static unsigned highestEnumValue() { return SVGMarkerOrientAngle; }
82
83     // toString is not needed, synchronizeOrientType() handles this on its own.
84
85     static SVGMarkerOrientType fromString(const String& value, SVGAngle& angle)
86     {
87         if (value == "auto")
88             return SVGMarkerOrientAuto;
89
90         ExceptionCode ec = 0;
91         angle.setValueAsString(value, ec);
92         if (!ec)
93             return SVGMarkerOrientAngle;
94         return SVGMarkerOrientUnknown;
95     }
96 };
97
98 class SVGMarkerElement : public SVGStyledElement,
99                          public SVGLangSpace,
100                          public SVGExternalResourcesRequired,
101                          public SVGFitToViewBox {
102 public:
103     // Forward declare enumerations in the W3C naming scheme, for IDL generation.
104     enum {
105         SVG_MARKERUNITS_UNKNOWN = SVGMarkerUnitsUnknown,
106         SVG_MARKERUNITS_USERSPACEONUSE = SVGMarkerUnitsUserSpaceOnUse,
107         SVG_MARKERUNITS_STROKEWIDTH = SVGMarkerUnitsStrokeWidth
108     };
109
110     enum {
111         SVG_MARKER_ORIENT_UNKNOWN = SVGMarkerOrientUnknown,
112         SVG_MARKER_ORIENT_AUTO = SVGMarkerOrientAuto,
113         SVG_MARKER_ORIENT_ANGLE = SVGMarkerOrientAngle
114     };
115
116     static PassRefPtr<SVGMarkerElement> create(const QualifiedName&, Document*);
117
118     AffineTransform viewBoxToViewTransform(float viewWidth, float viewHeight) const;
119
120     void setOrientToAuto();
121     void setOrientToAngle(const SVGAngle&);
122
123     static const SVGPropertyInfo* orientTypePropertyInfo();
124
125 private:
126     SVGMarkerElement(const QualifiedName&, Document*);
127
128     virtual bool needsPendingResourceHandling() const { return false; }
129
130     bool isSupportedAttribute(const QualifiedName&);
131     virtual void parseAttribute(Attribute*) OVERRIDE;
132     virtual void svgAttributeChanged(const QualifiedName&);
133     virtual void childrenChanged(bool changedByParser = false, Node* beforeChange = 0, Node* afterChange = 0, int childCountDelta = 0);
134
135     virtual RenderObject* createRenderer(RenderArena*, RenderStyle*);
136     virtual bool rendererIsNeeded(const NodeRenderingContext&) { return true; }
137
138     virtual bool selfHasRelativeLengths() const;
139
140     void synchronizeOrientType();
141
142     static const AtomicString& orientTypeIdentifier();
143     static const AtomicString& orientAngleIdentifier();
144  
145     BEGIN_DECLARE_ANIMATED_PROPERTIES(SVGMarkerElement)
146         DECLARE_ANIMATED_LENGTH(RefX, refX)
147         DECLARE_ANIMATED_LENGTH(RefY, refY)
148         DECLARE_ANIMATED_LENGTH(MarkerWidth, markerWidth)
149         DECLARE_ANIMATED_LENGTH(MarkerHeight, markerHeight)
150         DECLARE_ANIMATED_ENUMERATION(MarkerUnits, markerUnits, SVGMarkerUnitsType)
151         DECLARE_ANIMATED_ANGLE(OrientAngle, orientAngle)
152         DECLARE_ANIMATED_BOOLEAN(ExternalResourcesRequired, externalResourcesRequired)
153         DECLARE_ANIMATED_RECT(ViewBox, viewBox)
154         DECLARE_ANIMATED_PRESERVEASPECTRATIO(PreserveAspectRatio, preserveAspectRatio)
155     END_DECLARE_ANIMATED_PROPERTIES
156   
157 public:
158     // Custom 'orientType' property.
159     static void synchronizeOrientType(void* contextElement);
160     static PassRefPtr<SVGAnimatedProperty> lookupOrCreateOrientTypeWrapper(void* contextElement);
161     SVGMarkerOrientType& orientType() const { return m_orientType.value; }
162     SVGMarkerOrientType& orientTypeBaseValue() const { return m_orientType.value; }
163     void setOrientTypeBaseValue(const SVGMarkerOrientType& type) { m_orientType.value = type; }
164     PassRefPtr<SVGAnimatedEnumerationPropertyTearOff<SVGMarkerOrientType> > orientTypeAnimated();
165
166 private:
167     mutable SVGSynchronizableAnimatedProperty<SVGMarkerOrientType> m_orientType;
168 };
169
170 }
171
172 #endif
173 #endif