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