animation.h revision c5cede9ae108bb15f6b7a8aea21c7e1fefa2834c
1// Copyright 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CC_ANIMATION_ANIMATION_H_
6#define CC_ANIMATION_ANIMATION_H_
7
8#include "base/basictypes.h"
9#include "base/memory/scoped_ptr.h"
10#include "cc/base/cc_export.h"
11
12namespace cc {
13
14class AnimationCurve;
15
16// An Animation contains all the state required to play an AnimationCurve.
17// Specifically, the affected property, the run state (paused, finished, etc.),
18// loop count, last pause time, and the total time spent paused.
19class CC_EXPORT Animation {
20 public:
21  // Animations begin in the 'WaitingForTargetAvailability' state. An Animation
22  // waiting for target availibility will run as soon as its target property
23  // is free (and all the animations animating with it are also able to run).
24  // When this time arrives, the controller will move the animation into the
25  // Starting state, and then into the Running state. Running animations may
26  // toggle between Running and Paused, and may be stopped by moving into either
27  // the Aborted or Finished states. A Finished animation was allowed to run to
28  // completion, but an Aborted animation was not.
29  enum RunState {
30    WaitingForTargetAvailability = 0,
31    WaitingForDeletion,
32    Starting,
33    Running,
34    Paused,
35    Finished,
36    Aborted,
37    // This sentinel must be last.
38    RunStateEnumSize
39  };
40
41  enum TargetProperty {
42    Transform = 0,
43    Opacity,
44    Filter,
45    ScrollOffset,
46    BackgroundColor,
47    // This sentinel must be last.
48    TargetPropertyEnumSize
49  };
50
51  static scoped_ptr<Animation> Create(scoped_ptr<AnimationCurve> curve,
52                                      int animation_id,
53                                      int group_id,
54                                      TargetProperty target_property);
55
56  virtual ~Animation();
57
58  int id() const { return id_; }
59  int group() const { return group_; }
60  TargetProperty target_property() const { return target_property_; }
61
62  RunState run_state() const { return run_state_; }
63  void SetRunState(RunState run_state, double monotonic_time);
64
65  // This is the number of times that the animation will play. If this
66  // value is zero the animation will not play. If it is negative, then
67  // the animation will loop indefinitely.
68  int iterations() const { return iterations_; }
69  void set_iterations(int n) { iterations_ = n; }
70
71  double start_time() const { return start_time_; }
72  void set_start_time(double monotonic_time) { start_time_ = monotonic_time; }
73  bool has_set_start_time() const { return !!start_time_; }
74
75  double time_offset() const { return time_offset_; }
76  void set_time_offset(double monotonic_time) { time_offset_ = monotonic_time; }
77
78  void Suspend(double monotonic_time);
79  void Resume(double monotonic_time);
80
81  // If alternates_direction is true, on odd numbered iterations we reverse the
82  // curve.
83  bool alternates_direction() const { return alternates_direction_; }
84  void set_alternates_direction(bool alternates) {
85    alternates_direction_ = alternates;
86  }
87
88  bool IsFinishedAt(double monotonic_time) const;
89  bool is_finished() const {
90    return run_state_ == Finished ||
91        run_state_ == Aborted ||
92        run_state_ == WaitingForDeletion;
93  }
94
95  AnimationCurve* curve() { return curve_.get(); }
96  const AnimationCurve* curve() const { return curve_.get(); }
97
98  // If this is true, even if the animation is running, it will not be tickable
99  // until it is given a start time. This is true for animations running on the
100  // main thread.
101  bool needs_synchronized_start_time() const {
102    return needs_synchronized_start_time_;
103  }
104  void set_needs_synchronized_start_time(bool needs_synchronized_start_time) {
105    needs_synchronized_start_time_ = needs_synchronized_start_time;
106  }
107
108  // This is true for animations running on the main thread when the Finished
109  // event sent by the corresponding impl animation has been received.
110  bool received_finished_event() const {
111    return received_finished_event_;
112  }
113  void set_received_finished_event(bool received_finished_event) {
114    received_finished_event_ = received_finished_event;
115  }
116
117  // Takes the given absolute time, and using the start time and the number
118  // of iterations, returns the relative time in the current iteration.
119  double TrimTimeToCurrentIteration(double monotonic_time) const;
120
121  scoped_ptr<Animation> CloneAndInitialize(RunState initial_run_state) const;
122  bool is_controlling_instance() const { return is_controlling_instance_; }
123
124  void PushPropertiesTo(Animation* other) const;
125
126  void set_is_impl_only(bool is_impl_only) { is_impl_only_ = is_impl_only; }
127  bool is_impl_only() const { return is_impl_only_; }
128
129 private:
130  Animation(scoped_ptr<AnimationCurve> curve,
131            int animation_id,
132            int group_id,
133            TargetProperty target_property);
134
135  scoped_ptr<AnimationCurve> curve_;
136
137  // IDs are not necessarily unique.
138  int id_;
139
140  // Animations that must be run together are called 'grouped' and have the same
141  // group id. Grouped animations are guaranteed to start at the same time and
142  // no other animations may animate any of the group's target properties until
143  // all animations in the group have finished animating. Note: an active
144  // animation's group id and target property uniquely identify that animation.
145  int group_;
146
147  TargetProperty target_property_;
148  RunState run_state_;
149  int iterations_;
150  double start_time_;
151  bool alternates_direction_;
152
153  // The time offset effectively pushes the start of the animation back in time.
154  // This is used for resuming paused animations -- an animation is added with a
155  // non-zero time offset, causing the animation to skip ahead to the desired
156  // point in time.
157  double time_offset_;
158
159  bool needs_synchronized_start_time_;
160  bool received_finished_event_;
161
162  // When an animation is suspended, it behaves as if it is paused and it also
163  // ignores all run state changes until it is resumed. This is used for testing
164  // purposes.
165  bool suspended_;
166
167  // These are used in TrimTimeToCurrentIteration to account for time
168  // spent while paused. This is not included in AnimationState since it
169  // there is absolutely no need for clients of this controller to know
170  // about these values.
171  double pause_time_;
172  double total_paused_time_;
173
174  // Animations lead dual lives. An active animation will be conceptually owned
175  // by two controllers, one on the impl thread and one on the main. In reality,
176  // there will be two separate Animation instances for the same animation. They
177  // will have the same group id and the same target property (these two values
178  // uniquely identify an animation). The instance on the impl thread is the
179  // instance that ultimately controls the values of the animating layer and so
180  // we will refer to it as the 'controlling instance'.
181  bool is_controlling_instance_;
182
183  bool is_impl_only_;
184
185  DISALLOW_COPY_AND_ASSIGN(Animation);
186};
187
188}  // namespace cc
189
190#endif  // CC_ANIMATION_ANIMATION_H_
191