[chromium] Animation events should only be used for synchronizing animation start...
[WebKit-https.git] / Source / WebCore / platform / graphics / chromium / cc / CCActiveAnimation.h
1 /*
2  * Copyright (C) 2012 Google Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1.  Redistributions of source code must retain the above copyright
8  *     notice, this list of conditions and the following disclaimer.
9  * 2.  Redistributions in binary form must reproduce the above copyright
10  *     notice, this list of conditions and the following disclaimer in the
11  *     documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
16  * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
17  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
18  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
19  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
20  * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
22  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23  */
24
25 #ifndef CCActiveAnimation_h
26 #define CCActiveAnimation_h
27
28 #include "cc/CCAnimationCurve.h"
29
30 #include <wtf/Noncopyable.h>
31 #include <wtf/OwnPtr.h>
32 #include <wtf/PassOwnPtr.h>
33
34 namespace WebCore {
35
36 // A CCActiveAnimation, contains all the state required to play a CCAnimationCurve.
37 // Specifically, the affected property, the run state (paused, finished, etc.),
38 // loop count, last pause time, and the total time spent paused.
39 class CCActiveAnimation {
40     WTF_MAKE_NONCOPYABLE(CCActiveAnimation);
41 public:
42     // Animations begin in one of the 'waiting' states. Animations waiting for the next tick
43     // will start the next time the controller animates. Animations waiting for target
44     // availibility will run as soon as their target property is free (and all the animations
45     // animating with it are also able to run). Animations waiting for their start time to
46     // come have be scheduled to run at a particular point in time. When this time arrives,
47     // the controller will move the animations into the Running state. Running animations
48     // may toggle between Running and Paused, and may be stopped by moving into either the
49     // Aborted or Finished states. A Finished animation was allowed to run to completion, but
50     // an Aborted animation was not.
51     enum RunState {
52         WaitingForNextTick = 1,
53         WaitingForTargetAvailability,
54         WaitingForStartTime,
55         Running,
56         Paused,
57         Finished,
58         Aborted
59     };
60
61     enum TargetProperty {
62         Transform = 1,
63         Opacity
64     };
65
66     static PassOwnPtr<CCActiveAnimation> create(PassOwnPtr<CCAnimationCurve>, int animationId, int groupId, TargetProperty);
67
68     virtual ~CCActiveAnimation();
69
70     int id() const { return m_id; }
71     int group() const { return m_group; }
72     TargetProperty targetProperty() const { return m_targetProperty; }
73
74     RunState runState() const { return m_runState; }
75     void setRunState(RunState, double now);
76
77     // This is the number of times that the animation will play. If this
78     // value is zero the animation will not play. If it is negative, then
79     // the animation will loop indefinitely.
80     int iterations() const { return m_iterations; }
81     void setIterations(int n) { m_iterations = n; }
82
83     double startTime() const { return m_startTime; }
84     void setStartTime(double startTime) { m_startTime = startTime; }
85
86     bool isFinishedAt(double time) const;
87     bool isFinished() const { return m_runState == Finished || m_runState == Aborted; }
88
89     bool isWaiting() const;
90     bool isRunningOrHasRun() const;
91
92     CCAnimationCurve* curve() { return m_curve.get(); }
93     const CCAnimationCurve* curve() const { return m_curve.get(); }
94
95     // If this is true, even if the animation is running, it will not be tickable until
96     // it is given a start time. This is true for animations running on the main thread.
97     bool needsSynchronizedStartTime() const { return m_needsSynchronizedStartTime; }
98     void setNeedsSynchronizedStartTime(bool needsSynchronizedStartTime) { m_needsSynchronizedStartTime = needsSynchronizedStartTime; }
99
100     // Takes the given absolute time, and using the start time and the number
101     // of iterations, returns the relative time in the current iteration.
102     double trimTimeToCurrentIteration(double now) const;
103
104     PassOwnPtr<CCActiveAnimation> cloneForImplThread() const;
105
106     void synchronizeProperties(CCActiveAnimation*);
107
108 private:
109     CCActiveAnimation(PassOwnPtr<CCAnimationCurve>, int animationId, int groupId, TargetProperty);
110
111     OwnPtr<CCAnimationCurve> m_curve;
112
113     // IDs are not necessarily unique.
114     int m_id;
115
116     // Animations that must be run together are called 'grouped' and have the same group id
117     // Grouped animations are guaranteed to start at the same time and no other animations
118     // may animate any of the group's target properties until all animations in the
119     // group have finished animating. Note: an active animation's group id and target
120     // property uniquely identify that animation.
121     int m_group;
122
123     TargetProperty m_targetProperty;
124     RunState m_runState;
125     int m_iterations;
126     double m_startTime;
127
128     bool m_needsSynchronizedStartTime;
129
130     // These are used in trimTimeToCurrentIteration to account for time
131     // spent while paused. This is not included in AnimationState since it
132     // there is absolutely no need for clients of this controller to know
133     // about these values.
134     double m_pauseTime;
135     double m_totalPausedTime;
136 };
137
138 } // namespace WebCore
139
140 #endif // CCActiveAnimation_h