SVGAnimationElement.h revision 81bc750723a18f21cd17d1b173cd2a4dda9cea6e
1/*
2 * Copyright (C) 2004, 2005 Nikolas Zimmermann <zimmermann@kde.org>
3 * Copyright (C) 2004, 2005, 2006 Rob Buis <buis@kde.org>
4 * Copyright (C) 2007 Eric Seidel <eric@webkit.org>
5 * Copyright (C) 2008 Apple Inc. All rights reserved.
6 * Copyright (C) 2008 Cameron McCormack <cam@mcc.id.au>
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., 51 Franklin Street, Fifth Floor,
21 * Boston, MA 02110-1301, USA.
22 */
23
24#ifndef SVGAnimationElement_h
25#define SVGAnimationElement_h
26
27#if ENABLE(SVG_ANIMATION)
28#include "ElementTimeControl.h"
29#include "Path.h"
30#include "SMILTime.h"
31#include "SVGAnimatedBoolean.h"
32#include "SVGExternalResourcesRequired.h"
33#include "SVGSMILElement.h"
34#include "SVGStringList.h"
35#include "SVGTests.h"
36#include "UnitBezier.h"
37
38namespace WebCore {
39
40class ConditionEventListener;
41class TimeContainer;
42
43class SVGAnimationElement : public SVGSMILElement,
44                            public SVGTests,
45                            public SVGExternalResourcesRequired,
46                            public ElementTimeControl {
47public:
48    // SVGAnimationElement
49    float getStartTime() const;
50    float getCurrentTime() const;
51    float getSimpleDuration(ExceptionCode&) const;
52
53    // ElementTimeControl
54    virtual void beginElement();
55    virtual void beginElementAt(float offset);
56    virtual void endElement();
57    virtual void endElementAt(float offset);
58
59    static bool isTargetAttributeCSSProperty(SVGElement*, const QualifiedName&);
60
61protected:
62    SVGAnimationElement(const QualifiedName&, Document*);
63
64    virtual void parseMappedAttribute(Attribute*);
65
66    enum CalcMode { CalcModeDiscrete, CalcModeLinear, CalcModePaced, CalcModeSpline };
67    CalcMode calcMode() const;
68
69    enum AttributeType { AttributeTypeCSS, AttributeTypeXML, AttributeTypeAuto };
70    AttributeType attributeType() const;
71
72    String toValue() const;
73    String byValue() const;
74    String fromValue() const;
75
76    enum AnimationMode { NoAnimation, ToAnimation, ByAnimation, ValuesAnimation, FromToAnimation, FromByAnimation, PathAnimation };
77    AnimationMode animationMode() const;
78
79    String targetAttributeBaseValue() const;
80    void setTargetAttributeAnimatedValue(const String&);
81
82    bool isAdditive() const;
83    bool isAccumulated() const;
84
85    // from SVGSMILElement
86    virtual void startedActiveInterval();
87    virtual void updateAnimation(float percent, unsigned repeat, SVGSMILElement* resultElement);
88    virtual void endedActiveInterval();
89
90private:
91    virtual void attributeChanged(Attribute*, bool preserveDecls);
92    virtual void synchronizeProperty(const QualifiedName&);
93
94    virtual bool calculateFromAndToValues(const String& fromString, const String& toString) = 0;
95    virtual bool calculateFromAndByValues(const String& fromString, const String& byString) = 0;
96    virtual void calculateAnimatedValue(float percentage, unsigned repeat, SVGSMILElement* resultElement) = 0;
97    virtual float calculateDistance(const String& /*fromString*/, const String& /*toString*/) { return -1.f; }
98    virtual Path animationPath() const { return Path(); }
99
100    void currentValuesForValuesAnimation(float percent, float& effectivePercent, String& from, String& to) const;
101    void calculateKeyTimesForCalcModePaced();
102    float calculatePercentFromKeyPoints(float percent) const;
103    void currentValuesFromKeyPoints(float percent, float& effectivePercent, String& from, String& to) const;
104    float calculatePercentForSpline(float percent, unsigned splineIndex) const;
105    unsigned calculateKeyTimesIndex(float percent) const;
106
107    // Animated property declarations
108
109    // SVGExternalResourcesRequired
110    DECLARE_ANIMATED_BOOLEAN(ExternalResourcesRequired, externalResourcesRequired)
111
112    bool m_animationValid;
113
114    Vector<String> m_values;
115    Vector<float> m_keyTimes;
116    Vector<float> m_keyPoints;
117    Vector<UnitBezier> m_keySplines;
118    String m_lastValuesAnimationFrom;
119    String m_lastValuesAnimationTo;
120};
121
122} // namespace WebCore
123
124#endif // ENABLE(SVG)
125#endif // SVGAnimationElement_h
126