Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(56)

Side by Side Diff: cc/animation/animation.cc

Issue 952893003: Update from https://crrev.com/317530 (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Fix gn for nacl Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « cc/animation/animation.h ('k') | cc/animation/animation_curve.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/animation/animation.h" 5 #include "cc/animation/animation.h"
6 6
7 #include <cmath> 7 #include <cmath>
8 8
9 #include "base/strings/string_util.h" 9 #include "base/strings/string_util.h"
10 #include "base/trace_event/trace_event.h" 10 #include "base/trace_event/trace_event.h"
11 #include "cc/animation/animation_curve.h" 11 #include "cc/animation/animation_curve.h"
12 #include "cc/base/time_util.h" 12 #include "cc/base/time_util.h"
13 13
14 namespace { 14 namespace {
15 15
16 // This should match the RunState enum. 16 // This should match the RunState enum.
17 static const char* const s_runStateNames[] = { 17 static const char* const s_runStateNames[] = {"WAITING_FOR_TARGET_AVAILABILITY",
18 "WaitingForTargetAvailability", 18 "WAITING_FOR_DELETION",
19 "WaitingForDeletion", 19 "STARTING",
20 "Starting", 20 "RUNNING",
21 "Running", 21 "PAUSED",
22 "Paused", 22 "FINISHED",
23 "Finished", 23 "ABORTED"};
24 "Aborted"
25 };
26 24
27 static_assert(static_cast<int>(cc::Animation::RunStateEnumSize) == 25 static_assert(static_cast<int>(cc::Animation::LAST_RUN_STATE) + 1 ==
28 arraysize(s_runStateNames), 26 arraysize(s_runStateNames),
29 "RunStateEnumSize should equal the number of elements in " 27 "RunStateEnumSize should equal the number of elements in "
30 "s_runStateNames"); 28 "s_runStateNames");
31 29
32 // This should match the TargetProperty enum. 30 // This should match the TargetProperty enum.
33 static const char* const s_targetPropertyNames[] = { 31 static const char* const s_targetPropertyNames[] = {"TRANSFORM",
34 "Transform", 32 "OPACITY",
35 "Opacity", 33 "FILTER",
36 "Filter", 34 "SCROLL_OFFSET",
37 "ScrollOffset", 35 "BACKGROUND_COLOR"};
38 "BackgroundColor"
39 };
40 36
41 static_assert(static_cast<int>(cc::Animation::TargetPropertyEnumSize) == 37 static_assert(static_cast<int>(cc::Animation::LAST_TARGET_PROPERTY) + 1 ==
42 arraysize(s_targetPropertyNames), 38 arraysize(s_targetPropertyNames),
43 "TargetPropertyEnumSize should equal the number of elements in " 39 "TargetPropertyEnumSize should equal the number of elements in "
44 "s_targetPropertyNames"); 40 "s_targetPropertyNames");
45 41
46 } // namespace 42 } // namespace
47 43
48 namespace cc { 44 namespace cc {
49 45
50 scoped_ptr<Animation> Animation::Create( 46 scoped_ptr<Animation> Animation::Create(
51 scoped_ptr<AnimationCurve> curve, 47 scoped_ptr<AnimationCurve> curve,
52 int animation_id, 48 int animation_id,
53 int group_id, 49 int group_id,
54 TargetProperty target_property) { 50 TargetProperty target_property) {
55 return make_scoped_ptr(new Animation(curve.Pass(), 51 return make_scoped_ptr(new Animation(curve.Pass(),
56 animation_id, 52 animation_id,
57 group_id, 53 group_id,
58 target_property)); } 54 target_property)); }
59 55
60 Animation::Animation(scoped_ptr<AnimationCurve> curve, 56 Animation::Animation(scoped_ptr<AnimationCurve> curve,
61 int animation_id, 57 int animation_id,
62 int group_id, 58 int group_id,
63 TargetProperty target_property) 59 TargetProperty target_property)
64 : curve_(curve.Pass()), 60 : curve_(curve.Pass()),
65 id_(animation_id), 61 id_(animation_id),
66 group_(group_id), 62 group_(group_id),
67 target_property_(target_property), 63 target_property_(target_property),
68 run_state_(WaitingForTargetAvailability), 64 run_state_(WAITING_FOR_TARGET_AVAILABILITY),
69 iterations_(1), 65 iterations_(1),
70 iteration_start_(0), 66 iteration_start_(0),
71 direction_(Normal), 67 direction_(DIRECTION_NORMAL),
72 playback_rate_(1), 68 playback_rate_(1),
73 fill_mode_(FillModeBoth), 69 fill_mode_(FILL_MODE_BOTH),
74 needs_synchronized_start_time_(false), 70 needs_synchronized_start_time_(false),
75 received_finished_event_(false), 71 received_finished_event_(false),
76 suspended_(false), 72 suspended_(false),
77 is_controlling_instance_(false), 73 is_controlling_instance_(false),
78 is_impl_only_(false), 74 is_impl_only_(false),
79 affects_active_observers_(true), 75 affects_active_observers_(true),
80 affects_pending_observers_(true) { 76 affects_pending_observers_(true) {
81 } 77 }
82 78
83 Animation::~Animation() { 79 Animation::~Animation() {
84 if (run_state_ == Running || run_state_ == Paused) 80 if (run_state_ == RUNNING || run_state_ == PAUSED)
85 SetRunState(Aborted, base::TimeTicks()); 81 SetRunState(ABORTED, base::TimeTicks());
86 } 82 }
87 83
88 void Animation::SetRunState(RunState run_state, 84 void Animation::SetRunState(RunState run_state,
89 base::TimeTicks monotonic_time) { 85 base::TimeTicks monotonic_time) {
90 if (suspended_) 86 if (suspended_)
91 return; 87 return;
92 88
93 char name_buffer[256]; 89 char name_buffer[256];
94 base::snprintf(name_buffer, 90 base::snprintf(name_buffer,
95 sizeof(name_buffer), 91 sizeof(name_buffer),
96 "%s-%d", 92 "%s-%d",
97 s_targetPropertyNames[target_property_], 93 s_targetPropertyNames[target_property_],
98 group_); 94 group_);
99 95
100 bool is_waiting_to_start = run_state_ == WaitingForTargetAvailability || 96 bool is_waiting_to_start =
101 run_state_ == Starting; 97 run_state_ == WAITING_FOR_TARGET_AVAILABILITY || run_state_ == STARTING;
102 98
103 if (is_controlling_instance_ && is_waiting_to_start && run_state == Running) { 99 if (is_controlling_instance_ && is_waiting_to_start && run_state == RUNNING) {
104 TRACE_EVENT_ASYNC_BEGIN1( 100 TRACE_EVENT_ASYNC_BEGIN1(
105 "cc", "Animation", this, "Name", TRACE_STR_COPY(name_buffer)); 101 "cc", "Animation", this, "Name", TRACE_STR_COPY(name_buffer));
106 } 102 }
107 103
108 bool was_finished = is_finished(); 104 bool was_finished = is_finished();
109 105
110 const char* old_run_state_name = s_runStateNames[run_state_]; 106 const char* old_run_state_name = s_runStateNames[run_state_];
111 107
112 if (run_state == Running && run_state_ == Paused) 108 if (run_state == RUNNING && run_state_ == PAUSED)
113 total_paused_time_ += (monotonic_time - pause_time_); 109 total_paused_time_ += (monotonic_time - pause_time_);
114 else if (run_state == Paused) 110 else if (run_state == PAUSED)
115 pause_time_ = monotonic_time; 111 pause_time_ = monotonic_time;
116 run_state_ = run_state; 112 run_state_ = run_state;
117 113
118 const char* new_run_state_name = s_runStateNames[run_state]; 114 const char* new_run_state_name = s_runStateNames[run_state];
119 115
120 if (is_controlling_instance_ && !was_finished && is_finished()) 116 if (is_controlling_instance_ && !was_finished && is_finished())
121 TRACE_EVENT_ASYNC_END0("cc", "Animation", this); 117 TRACE_EVENT_ASYNC_END0("cc", "Animation", this);
122 118
123 char state_buffer[256]; 119 char state_buffer[256];
124 base::snprintf(state_buffer, 120 base::snprintf(state_buffer,
125 sizeof(state_buffer), 121 sizeof(state_buffer),
126 "%s->%s", 122 "%s->%s",
127 old_run_state_name, 123 old_run_state_name,
128 new_run_state_name); 124 new_run_state_name);
129 125
130 TRACE_EVENT_INSTANT2("cc", 126 TRACE_EVENT_INSTANT2("cc",
131 "LayerAnimationController::SetRunState", 127 "LayerAnimationController::SetRunState",
132 TRACE_EVENT_SCOPE_THREAD, 128 TRACE_EVENT_SCOPE_THREAD,
133 "Name", 129 "Name",
134 TRACE_STR_COPY(name_buffer), 130 TRACE_STR_COPY(name_buffer),
135 "State", 131 "State",
136 TRACE_STR_COPY(state_buffer)); 132 TRACE_STR_COPY(state_buffer));
137 } 133 }
138 134
139 void Animation::Suspend(base::TimeTicks monotonic_time) { 135 void Animation::Suspend(base::TimeTicks monotonic_time) {
140 SetRunState(Paused, monotonic_time); 136 SetRunState(PAUSED, monotonic_time);
141 suspended_ = true; 137 suspended_ = true;
142 } 138 }
143 139
144 void Animation::Resume(base::TimeTicks monotonic_time) { 140 void Animation::Resume(base::TimeTicks monotonic_time) {
145 suspended_ = false; 141 suspended_ = false;
146 SetRunState(Running, monotonic_time); 142 SetRunState(RUNNING, monotonic_time);
147 } 143 }
148 144
149 bool Animation::IsFinishedAt(base::TimeTicks monotonic_time) const { 145 bool Animation::IsFinishedAt(base::TimeTicks monotonic_time) const {
150 if (is_finished()) 146 if (is_finished())
151 return true; 147 return true;
152 148
153 if (needs_synchronized_start_time_) 149 if (needs_synchronized_start_time_)
154 return false; 150 return false;
155 151
156 if (playback_rate_ == 0) 152 if (playback_rate_ == 0)
157 return false; 153 return false;
158 154
159 return run_state_ == Running && iterations_ >= 0 && 155 return run_state_ == RUNNING && iterations_ >= 0 &&
160 TimeUtil::Scale(curve_->Duration(), 156 TimeUtil::Scale(curve_->Duration(),
161 iterations_ / std::abs(playback_rate_)) <= 157 iterations_ / std::abs(playback_rate_)) <=
162 (monotonic_time + time_offset_ - start_time_ - total_paused_time_); 158 (monotonic_time + time_offset_ - start_time_ - total_paused_time_);
163 } 159 }
164 160
165 bool Animation::InEffect(base::TimeTicks monotonic_time) const { 161 bool Animation::InEffect(base::TimeTicks monotonic_time) const {
166 return ConvertToActiveTime(monotonic_time) >= base::TimeDelta() || 162 return ConvertToActiveTime(monotonic_time) >= base::TimeDelta() ||
167 (fill_mode_ == FillModeBoth || fill_mode_ == FillModeBackwards); 163 (fill_mode_ == FILL_MODE_BOTH || fill_mode_ == FILL_MODE_BACKWARDS);
168 } 164 }
169 165
170 base::TimeDelta Animation::ConvertToActiveTime( 166 base::TimeDelta Animation::ConvertToActiveTime(
171 base::TimeTicks monotonic_time) const { 167 base::TimeTicks monotonic_time) const {
172 base::TimeTicks trimmed = monotonic_time + time_offset_; 168 base::TimeTicks trimmed = monotonic_time + time_offset_;
173 169
174 // If we're paused, time is 'stuck' at the pause time. 170 // If we're paused, time is 'stuck' at the pause time.
175 if (run_state_ == Paused) 171 if (run_state_ == PAUSED)
176 trimmed = pause_time_; 172 trimmed = pause_time_;
177 173
178 // Returned time should always be relative to the start time and should 174 // Returned time should always be relative to the start time and should
179 // subtract all time spent paused. 175 // subtract all time spent paused.
180 trimmed -= (start_time_ - base::TimeTicks()) + total_paused_time_; 176 trimmed -= (start_time_ - base::TimeTicks()) + total_paused_time_;
181 177
182 // If we're just starting or we're waiting on receiving a start time, 178 // If we're just starting or we're waiting on receiving a start time,
183 // time is 'stuck' at the initial state. 179 // time is 'stuck' at the initial state.
184 if ((run_state_ == Starting && !has_set_start_time()) || 180 if ((run_state_ == STARTING && !has_set_start_time()) ||
185 needs_synchronized_start_time()) 181 needs_synchronized_start_time())
186 trimmed = base::TimeTicks() + time_offset_; 182 trimmed = base::TimeTicks() + time_offset_;
187 183
188 return (trimmed - base::TimeTicks()); 184 return (trimmed - base::TimeTicks());
189 } 185 }
190 186
191 base::TimeDelta Animation::TrimTimeToCurrentIteration( 187 base::TimeDelta Animation::TrimTimeToCurrentIteration(
192 base::TimeTicks monotonic_time) const { 188 base::TimeTicks monotonic_time) const {
193 // Check for valid parameters 189 // Check for valid parameters
194 DCHECK(playback_rate_); 190 DCHECK(playback_rate_);
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
240 int iteration; 236 int iteration;
241 if (scaled_active_time <= base::TimeDelta()) 237 if (scaled_active_time <= base::TimeDelta())
242 iteration = 0; 238 iteration = 0;
243 else if (iteration_time == curve_->Duration()) 239 else if (iteration_time == curve_->Duration())
244 iteration = ceil(iteration_start_ + iterations_ - 1); 240 iteration = ceil(iteration_start_ + iterations_ - 1);
245 else 241 else
246 iteration = static_cast<int>(scaled_active_time / curve_->Duration()); 242 iteration = static_cast<int>(scaled_active_time / curve_->Duration());
247 243
248 // Check if we are running the animation in reverse direction for the current 244 // Check if we are running the animation in reverse direction for the current
249 // iteration 245 // iteration
250 bool reverse = (direction_ == Reverse) || 246 bool reverse =
251 (direction_ == Alternate && iteration % 2 == 1) || 247 (direction_ == DIRECTION_REVERSE) ||
252 (direction_ == AlternateReverse && iteration % 2 == 0); 248 (direction_ == DIRECTION_ALTERNATE && iteration % 2 == 1) ||
249 (direction_ == DIRECTION_ALTERNATE_REVERSE && iteration % 2 == 0);
253 250
254 // If we are running the animation in reverse direction, reverse the result 251 // If we are running the animation in reverse direction, reverse the result
255 if (reverse) 252 if (reverse)
256 iteration_time = curve_->Duration() - iteration_time; 253 iteration_time = curve_->Duration() - iteration_time;
257 254
258 return iteration_time; 255 return iteration_time;
259 } 256 }
260 257
261 scoped_ptr<Animation> Animation::CloneAndInitialize( 258 scoped_ptr<Animation> Animation::CloneAndInitialize(
262 RunState initial_run_state) const { 259 RunState initial_run_state) const {
(...skipping 10 matching lines...) Expand all
273 to_return->playback_rate_ = playback_rate_; 270 to_return->playback_rate_ = playback_rate_;
274 to_return->fill_mode_ = fill_mode_; 271 to_return->fill_mode_ = fill_mode_;
275 DCHECK(!to_return->is_controlling_instance_); 272 DCHECK(!to_return->is_controlling_instance_);
276 to_return->is_controlling_instance_ = true; 273 to_return->is_controlling_instance_ = true;
277 return to_return.Pass(); 274 return to_return.Pass();
278 } 275 }
279 276
280 void Animation::PushPropertiesTo(Animation* other) const { 277 void Animation::PushPropertiesTo(Animation* other) const {
281 // Currently, we only push changes due to pausing and resuming animations on 278 // Currently, we only push changes due to pausing and resuming animations on
282 // the main thread. 279 // the main thread.
283 if (run_state_ == Animation::Paused || 280 if (run_state_ == Animation::PAUSED ||
284 other->run_state_ == Animation::Paused) { 281 other->run_state_ == Animation::PAUSED) {
285 other->run_state_ = run_state_; 282 other->run_state_ = run_state_;
286 other->pause_time_ = pause_time_; 283 other->pause_time_ = pause_time_;
287 other->total_paused_time_ = total_paused_time_; 284 other->total_paused_time_ = total_paused_time_;
288 } 285 }
289 } 286 }
290 287
291 } // namespace cc 288 } // namespace cc
OLDNEW
« no previous file with comments | « cc/animation/animation.h ('k') | cc/animation/animation_curve.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698