8d3d6c3512fe95713ae68a0cefa806e4cff486ab
[WebKit-https.git] / WebCore / ksvg2 / svg / SVGAnimationElement.h
1 /*
2     Copyright (C) 2004, 2005 Nikolas Zimmermann <wildfox@kde.org>
3                   2004, 2005, 2006 Rob Buis <buis@kde.org>
4
5     This file is part of the KDE project
6
7     This library is free software; you can redistribute it and/or
8     modify it under the terms of the GNU Library General Public
9     License as published by the Free Software Foundation; either
10     version 2 of the License, or (at your option) any later version.
11
12     This library is distributed in the hope that it will be useful,
13     but WITHOUT ANY WARRANTY; without even the implied warranty of
14     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15     Library General Public License for more details.
16
17     You should have received a copy of the GNU Library General Public License
18     along with this library; see the file COPYING.LIB.  If not, write to
19     the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20     Boston, MA 02111-1307, USA.
21 */
22
23 #ifndef SVGAnimationElement_H
24 #define SVGAnimationElement_H
25 #ifdef SVG_SUPPORT
26
27 #include "SVGExternalResourcesRequired.h"
28 #include "SVGStringList.h"
29 #include "SVGTests.h"
30
31 namespace WebCore {
32
33     enum EFillMode {
34         FILL_REMOVE = 0,
35         FILL_FREEZE
36     };
37
38     enum EAdditiveMode {
39         ADDITIVE_REPLACE = 0,
40         ADDITIVE_SUM
41     };
42
43     enum EAccumulateMode {
44         ACCUMULATE_NONE = 0,
45         ACCUMULATE_SUM
46     };
47
48     enum ECalcMode {
49         CALCMODE_DISCRETE = 0,
50         CALCMODE_LINEAR,
51         CALCMODE_PACED,
52         CALCMODE_SPLINE
53     };
54
55     enum ERestart {
56         RESTART_ALWAYS = 0,
57         RESTART_WHENNOTACTIVE,
58         RESTART_NEVER
59     };
60
61     enum EAttributeType {
62         ATTRIBUTETYPE_CSS = 0,
63         ATTRIBUTETYPE_XML,
64         ATTRIBUTETYPE_AUTO
65     };
66
67     // internal
68     enum EAnimationMode {
69         NO_ANIMATION = 0,
70         TO_ANIMATION,
71         BY_ANIMATION,
72         VALUES_ANIMATION,
73         FROM_TO_ANIMATION,
74         FROM_BY_ANIMATION
75     };
76
77     class SVGAnimationElement : public SVGElement,
78                                 public SVGTests,
79                                 public SVGExternalResourcesRequired
80     {
81     public:
82         SVGAnimationElement(const QualifiedName&, Document*);
83         virtual ~SVGAnimationElement();
84
85         // 'SVGAnimationElement' functions
86         SVGElement* targetElement() const;
87         
88         virtual bool isValid() const { return SVGTests::isValid(); }
89
90         double getEndTime() const;
91         double getStartTime() const;
92         double getCurrentTime() const;
93         double getSimpleDuration(ExceptionCode&) const;
94     
95         virtual void parseMappedAttribute(MappedAttribute* attr);
96         virtual bool rendererIsNeeded(RenderStyle*) { return false; }
97
98         virtual void closeRenderer();
99
100         // Helpers
101         bool updateForElapsedSeconds(double);
102         void handleTimerEvent(double timePercentage);
103
104         double parseClockValue(const String&) const;
105
106         String targetAttribute() const;
107         void setTargetAttribute(const String&);
108
109         static void setTargetAttribute(SVGElement* target, const String& name, const String& value, EAttributeType = ATTRIBUTETYPE_AUTO);
110
111         String attributeName() const;
112
113         bool connectedToTimer() const;
114
115         bool isFrozen() const;
116         bool isAdditive() const;
117         bool isAccumulated() const;
118
119         EAnimationMode detectAnimationMode() const;
120
121         int calculateCurrentValueItem(double timePercentage);
122         double calculateRelativeTimePercentage(double timePercentage, int currentItem);
123
124         double repeations() const;
125         bool isIndefinite(double value) const;
126
127     protected:
128         mutable SVGElement* m_targetElement;
129         
130         void connectTimer();
131         void disconnectTimer();
132         
133         virtual bool updateCurrentValue(double timePercentage) = 0;
134         virtual bool handleStartCondition() = 0;
135         virtual void handleEndCondition() = 0;
136
137         ANIMATED_PROPERTY_FORWARD_DECLARATIONS(SVGExternalResourcesRequired, bool, ExternalResourcesRequired, externalResourcesRequired)
138
139         bool m_connectedToTimer : 1;
140         
141         double m_currentTime;
142         double m_simpleDuration;
143
144         // Shared animation properties
145         unsigned m_fill : 1; // EFillMode m_fill
146         unsigned m_restart : 2; // ERestart
147         unsigned m_calcMode : 2; // ECalcMode
148         unsigned m_additive : 1; // EAdditiveMode
149         unsigned m_accumulate : 1; // EAccumulateMode
150         unsigned m_attributeType : 2; // EAttributeType
151         
152         String m_to;
153         String m_by;
154         String m_from;
155         String m_href;
156         String m_repeatDur;
157         String m_attributeName;
158
159         double m_max;
160         double m_min;
161         double m_end;
162         double m_begin;
163
164         double m_repeations;
165         double m_repeatCount;
166
167         RefPtr<SVGStringList> m_values;
168         RefPtr<SVGStringList> m_keyTimes;
169         RefPtr<SVGStringList> m_keySplines;
170     };
171
172 } // namespace WebCore
173
174 #endif // SVG_SUPPORT
175 #endif // SVGAnimationElement_H
176
177 // vim:ts=4:noet