9c6633c3e4c6f9d6c4e6bbe3fd3765cb7dbe4ec2
[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     // Takes the given absolute time, and using the start time and the number
96     // of iterations, returns the relative time in the current iteration.
97     double trimTimeToCurrentIteration(double now) const;
98
99     PassOwnPtr<CCActiveAnimation> cloneForImplThread() const;
100
101     void synchronizeProperties(CCActiveAnimation*);
102
103 private:
104     CCActiveAnimation(PassOwnPtr<CCAnimationCurve>, int animationId, int groupId, TargetProperty);
105
106     OwnPtr<CCAnimationCurve> m_curve;
107
108     // IDs are not necessarily unique.
109     int m_id;
110
111     // Animations that must be run together are called 'grouped' and have the same group id
112     // Grouped animations are guaranteed to start at the same time and no other animations
113     // may animate any of the group's target properties until all animations in the
114     // group have finished animating. Note: an active animation's group id and target
115     // property uniquely identify that animation.
116     int m_group;
117
118     TargetProperty m_targetProperty;
119     RunState m_runState;
120     int m_iterations;
121     double m_startTime;
122
123     // These are used in trimTimeToCurrentIteration to account for time
124     // spent while paused. This is not included in AnimationState since it
125     // there is absolutely no need for clients of this controller to know
126     // about these values.
127     double m_pauseTime;
128     double m_totalPausedTime;
129 };
130
131 } // namespace WebCore
132
133 #endif // CCActiveAnimation_h