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

Side by Side Diff: cc/animation/layer_animation_controller.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
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/layer_animation_controller.h" 5 #include "cc/animation/layer_animation_controller.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <vector> 8 #include <vector>
9 9
10 #include "cc/animation/animation.h" 10 #include "cc/animation/animation.h"
(...skipping 27 matching lines...) Expand all
38 38
39 scoped_refptr<LayerAnimationController> LayerAnimationController::Create( 39 scoped_refptr<LayerAnimationController> LayerAnimationController::Create(
40 int id) { 40 int id) {
41 return make_scoped_refptr(new LayerAnimationController(id)); 41 return make_scoped_refptr(new LayerAnimationController(id));
42 } 42 }
43 43
44 void LayerAnimationController::PauseAnimation(int animation_id, 44 void LayerAnimationController::PauseAnimation(int animation_id,
45 base::TimeDelta time_offset) { 45 base::TimeDelta time_offset) {
46 for (size_t i = 0; i < animations_.size(); ++i) { 46 for (size_t i = 0; i < animations_.size(); ++i) {
47 if (animations_[i]->id() == animation_id) { 47 if (animations_[i]->id() == animation_id) {
48 animations_[i]->SetRunState(Animation::Paused, 48 animations_[i]->SetRunState(Animation::PAUSED,
49 time_offset + animations_[i]->start_time()); 49 time_offset + animations_[i]->start_time());
50 } 50 }
51 } 51 }
52 } 52 }
53 53
54 struct HasAnimationId { 54 struct HasAnimationId {
55 explicit HasAnimationId(int id) : id_(id) {} 55 explicit HasAnimationId(int id) : id_(id) {}
56 bool operator()(Animation* animation) const { 56 bool operator()(Animation* animation) const {
57 return animation->id() == id_; 57 return animation->id() == id_;
58 } 58 }
59 59
60 private: 60 private:
61 int id_; 61 int id_;
62 }; 62 };
63 63
64 void LayerAnimationController::RemoveAnimation(int animation_id) { 64 void LayerAnimationController::RemoveAnimation(int animation_id) {
65 auto animations_to_remove = 65 auto animations_to_remove =
66 animations_.remove_if(HasAnimationId(animation_id)); 66 animations_.remove_if(HasAnimationId(animation_id));
67 for (auto it = animations_to_remove; it != animations_.end(); ++it) { 67 for (auto it = animations_to_remove; it != animations_.end(); ++it) {
68 if ((*it)->target_property() == Animation::ScrollOffset) { 68 if ((*it)->target_property() == Animation::SCROLL_OFFSET) {
69 scroll_offset_animation_was_interrupted_ = true; 69 scroll_offset_animation_was_interrupted_ = true;
70 break; 70 break;
71 } 71 }
72 } 72 }
73 animations_.erase(animations_to_remove, animations_.end()); 73 animations_.erase(animations_to_remove, animations_.end());
74 UpdateActivation(NormalActivation); 74 UpdateActivation(NORMAL_ACTIVATION);
75 } 75 }
76 76
77 struct HasAnimationIdAndProperty { 77 struct HasAnimationIdAndProperty {
78 HasAnimationIdAndProperty(int id, Animation::TargetProperty target_property) 78 HasAnimationIdAndProperty(int id, Animation::TargetProperty target_property)
79 : id_(id), target_property_(target_property) {} 79 : id_(id), target_property_(target_property) {}
80 bool operator()(Animation* animation) const { 80 bool operator()(Animation* animation) const {
81 return animation->id() == id_ && 81 return animation->id() == id_ &&
82 animation->target_property() == target_property_; 82 animation->target_property() == target_property_;
83 } 83 }
84 84
85 private: 85 private:
86 int id_; 86 int id_;
87 Animation::TargetProperty target_property_; 87 Animation::TargetProperty target_property_;
88 }; 88 };
89 89
90 void LayerAnimationController::RemoveAnimation( 90 void LayerAnimationController::RemoveAnimation(
91 int animation_id, 91 int animation_id,
92 Animation::TargetProperty target_property) { 92 Animation::TargetProperty target_property) {
93 auto animations_to_remove = animations_.remove_if( 93 auto animations_to_remove = animations_.remove_if(
94 HasAnimationIdAndProperty(animation_id, target_property)); 94 HasAnimationIdAndProperty(animation_id, target_property));
95 if (target_property == Animation::ScrollOffset && 95 if (target_property == Animation::SCROLL_OFFSET &&
96 animations_to_remove != animations_.end()) 96 animations_to_remove != animations_.end())
97 scroll_offset_animation_was_interrupted_ = true; 97 scroll_offset_animation_was_interrupted_ = true;
98 98
99 animations_.erase(animations_to_remove, animations_.end()); 99 animations_.erase(animations_to_remove, animations_.end());
100 UpdateActivation(NormalActivation); 100 UpdateActivation(NORMAL_ACTIVATION);
101 } 101 }
102 102
103 void LayerAnimationController::AbortAnimations( 103 void LayerAnimationController::AbortAnimations(
104 Animation::TargetProperty target_property) { 104 Animation::TargetProperty target_property) {
105 for (size_t i = 0; i < animations_.size(); ++i) { 105 for (size_t i = 0; i < animations_.size(); ++i) {
106 if (animations_[i]->target_property() == target_property && 106 if (animations_[i]->target_property() == target_property &&
107 !animations_[i]->is_finished()) 107 !animations_[i]->is_finished())
108 animations_[i]->SetRunState(Animation::Aborted, last_tick_time_); 108 animations_[i]->SetRunState(Animation::ABORTED, last_tick_time_);
109 } 109 }
110 } 110 }
111 111
112 // Ensures that the list of active animations on the main thread and the impl 112 // Ensures that the list of active animations on the main thread and the impl
113 // thread are kept in sync. 113 // thread are kept in sync.
114 void LayerAnimationController::PushAnimationUpdatesTo( 114 void LayerAnimationController::PushAnimationUpdatesTo(
115 LayerAnimationController* controller_impl) { 115 LayerAnimationController* controller_impl) {
116 DCHECK(this != controller_impl); 116 DCHECK(this != controller_impl);
117 if (!has_any_animation() && !controller_impl->has_any_animation()) 117 if (!has_any_animation() && !controller_impl->has_any_animation())
118 return; 118 return;
119 PurgeAnimationsMarkedForDeletion(); 119 PurgeAnimationsMarkedForDeletion();
120 PushNewAnimationsToImplThread(controller_impl); 120 PushNewAnimationsToImplThread(controller_impl);
121 121
122 // Remove finished impl side animations only after pushing, 122 // Remove finished impl side animations only after pushing,
123 // and only after the animations are deleted on the main thread 123 // and only after the animations are deleted on the main thread
124 // this insures we will never push an animation twice. 124 // this insures we will never push an animation twice.
125 RemoveAnimationsCompletedOnMainThread(controller_impl); 125 RemoveAnimationsCompletedOnMainThread(controller_impl);
126 126
127 PushPropertiesToImplThread(controller_impl); 127 PushPropertiesToImplThread(controller_impl);
128 controller_impl->UpdateActivation(NormalActivation); 128 controller_impl->UpdateActivation(NORMAL_ACTIVATION);
129 UpdateActivation(NormalActivation); 129 UpdateActivation(NORMAL_ACTIVATION);
130 } 130 }
131 131
132 void LayerAnimationController::Animate(base::TimeTicks monotonic_time) { 132 void LayerAnimationController::Animate(base::TimeTicks monotonic_time) {
133 DCHECK(!monotonic_time.is_null()); 133 DCHECK(!monotonic_time.is_null());
134 if (!HasValueObserver()) 134 if (!HasValueObserver())
135 return; 135 return;
136 136
137 if (needs_to_start_animations_) 137 if (needs_to_start_animations_)
138 StartAnimations(monotonic_time); 138 StartAnimations(monotonic_time);
139 TickAnimations(monotonic_time); 139 TickAnimations(monotonic_time);
(...skipping 10 matching lines...) Expand all
150 Animation* animation = animations_[i]; 150 Animation* animation = animations_[i];
151 if (!animation->is_impl_only()) 151 if (!animation->is_impl_only())
152 continue; 152 continue;
153 153
154 if (!animation->InEffect(monotonic_time)) 154 if (!animation->InEffect(monotonic_time))
155 continue; 155 continue;
156 156
157 base::TimeDelta trimmed = 157 base::TimeDelta trimmed =
158 animation->TrimTimeToCurrentIteration(monotonic_time); 158 animation->TrimTimeToCurrentIteration(monotonic_time);
159 switch (animation->target_property()) { 159 switch (animation->target_property()) {
160 case Animation::Opacity: { 160 case Animation::OPACITY: {
161 AnimationEvent event(AnimationEvent::PropertyUpdate, 161 AnimationEvent event(AnimationEvent::PROPERTY_UPDATE, id_,
162 id_, 162 animation->group(), Animation::OPACITY,
163 animation->group(),
164 Animation::Opacity,
165 monotonic_time); 163 monotonic_time);
166 const FloatAnimationCurve* float_animation_curve = 164 const FloatAnimationCurve* float_animation_curve =
167 animation->curve()->ToFloatAnimationCurve(); 165 animation->curve()->ToFloatAnimationCurve();
168 event.opacity = float_animation_curve->GetValue(trimmed); 166 event.opacity = float_animation_curve->GetValue(trimmed);
169 event.is_impl_only = true; 167 event.is_impl_only = true;
170 events->push_back(event); 168 events->push_back(event);
171 break; 169 break;
172 } 170 }
173 171
174 case Animation::Transform: { 172 case Animation::TRANSFORM: {
175 AnimationEvent event(AnimationEvent::PropertyUpdate, 173 AnimationEvent event(AnimationEvent::PROPERTY_UPDATE, id_,
176 id_, 174 animation->group(), Animation::TRANSFORM,
177 animation->group(),
178 Animation::Transform,
179 monotonic_time); 175 monotonic_time);
180 const TransformAnimationCurve* transform_animation_curve = 176 const TransformAnimationCurve* transform_animation_curve =
181 animation->curve()->ToTransformAnimationCurve(); 177 animation->curve()->ToTransformAnimationCurve();
182 event.transform = transform_animation_curve->GetValue(trimmed); 178 event.transform = transform_animation_curve->GetValue(trimmed);
183 event.is_impl_only = true; 179 event.is_impl_only = true;
184 events->push_back(event); 180 events->push_back(event);
185 break; 181 break;
186 } 182 }
187 183
188 case Animation::Filter: { 184 case Animation::FILTER: {
189 AnimationEvent event(AnimationEvent::PropertyUpdate, 185 AnimationEvent event(AnimationEvent::PROPERTY_UPDATE, id_,
190 id_, 186 animation->group(), Animation::FILTER,
191 animation->group(),
192 Animation::Filter,
193 monotonic_time); 187 monotonic_time);
194 const FilterAnimationCurve* filter_animation_curve = 188 const FilterAnimationCurve* filter_animation_curve =
195 animation->curve()->ToFilterAnimationCurve(); 189 animation->curve()->ToFilterAnimationCurve();
196 event.filters = filter_animation_curve->GetValue(trimmed); 190 event.filters = filter_animation_curve->GetValue(trimmed);
197 event.is_impl_only = true; 191 event.is_impl_only = true;
198 events->push_back(event); 192 events->push_back(event);
199 break; 193 break;
200 } 194 }
201 195
202 case Animation::BackgroundColor: { break; } 196 case Animation::BACKGROUND_COLOR: {
197 break;
198 }
203 199
204 case Animation::ScrollOffset: { 200 case Animation::SCROLL_OFFSET: {
205 // Impl-side changes to scroll offset are already sent back to the 201 // Impl-side changes to scroll offset are already sent back to the
206 // main thread (e.g. for user-driven scrolling), so a PropertyUpdate 202 // main thread (e.g. for user-driven scrolling), so a PROPERTY_UPDATE
207 // isn't needed. 203 // isn't needed.
208 break; 204 break;
209 } 205 }
210
211 case Animation::TargetPropertyEnumSize:
212 NOTREACHED();
213 } 206 }
214 } 207 }
215 } 208 }
216 209
217 void LayerAnimationController::UpdateState(bool start_ready_animations, 210 void LayerAnimationController::UpdateState(bool start_ready_animations,
218 AnimationEventsVector* events) { 211 AnimationEventsVector* events) {
219 if (!HasActiveValueObserver()) 212 if (!HasActiveValueObserver())
220 return; 213 return;
221 214
222 // Animate hasn't been called, this happens if an observer has been added 215 // Animate hasn't been called, this happens if an observer has been added
223 // between the Commit and Draw phases. 216 // between the Commit and Draw phases.
224 if (last_tick_time_ == base::TimeTicks()) 217 if (last_tick_time_ == base::TimeTicks())
225 return; 218 return;
226 219
227 if (start_ready_animations) 220 if (start_ready_animations)
228 PromoteStartedAnimations(last_tick_time_, events); 221 PromoteStartedAnimations(last_tick_time_, events);
229 222
230 MarkFinishedAnimations(last_tick_time_); 223 MarkFinishedAnimations(last_tick_time_);
231 MarkAnimationsForDeletion(last_tick_time_, events); 224 MarkAnimationsForDeletion(last_tick_time_, events);
232 225
233 if (needs_to_start_animations_ && start_ready_animations) { 226 if (needs_to_start_animations_ && start_ready_animations) {
234 StartAnimations(last_tick_time_); 227 StartAnimations(last_tick_time_);
235 PromoteStartedAnimations(last_tick_time_, events); 228 PromoteStartedAnimations(last_tick_time_, events);
236 } 229 }
237 230
238 AccumulatePropertyUpdates(last_tick_time_, events); 231 AccumulatePropertyUpdates(last_tick_time_, events);
239 232
240 UpdateActivation(NormalActivation); 233 UpdateActivation(NORMAL_ACTIVATION);
241 } 234 }
242 235
243 struct AffectsNoObservers { 236 struct AffectsNoObservers {
244 bool operator()(Animation* animation) const { 237 bool operator()(Animation* animation) const {
245 return !animation->affects_active_observers() && 238 return !animation->affects_active_observers() &&
246 !animation->affects_pending_observers(); 239 !animation->affects_pending_observers();
247 } 240 }
248 }; 241 };
249 242
250 void LayerAnimationController::ActivateAnimations() { 243 void LayerAnimationController::ActivateAnimations() {
251 for (size_t i = 0; i < animations_.size(); ++i) { 244 for (size_t i = 0; i < animations_.size(); ++i) {
252 animations_[i]->set_affects_active_observers( 245 animations_[i]->set_affects_active_observers(
253 animations_[i]->affects_pending_observers()); 246 animations_[i]->affects_pending_observers());
254 } 247 }
255 animations_.erase(cc::remove_if(&animations_, 248 animations_.erase(cc::remove_if(&animations_,
256 animations_.begin(), 249 animations_.begin(),
257 animations_.end(), 250 animations_.end(),
258 AffectsNoObservers()), 251 AffectsNoObservers()),
259 animations_.end()); 252 animations_.end());
260 scroll_offset_animation_was_interrupted_ = false; 253 scroll_offset_animation_was_interrupted_ = false;
261 UpdateActivation(NormalActivation); 254 UpdateActivation(NORMAL_ACTIVATION);
262 } 255 }
263 256
264 void LayerAnimationController::AddAnimation(scoped_ptr<Animation> animation) { 257 void LayerAnimationController::AddAnimation(scoped_ptr<Animation> animation) {
265 animations_.push_back(animation.Pass()); 258 animations_.push_back(animation.Pass());
266 needs_to_start_animations_ = true; 259 needs_to_start_animations_ = true;
267 UpdateActivation(NormalActivation); 260 UpdateActivation(NORMAL_ACTIVATION);
268 } 261 }
269 262
270 Animation* LayerAnimationController::GetAnimation( 263 Animation* LayerAnimationController::GetAnimation(
271 Animation::TargetProperty target_property) const { 264 Animation::TargetProperty target_property) const {
272 for (size_t i = 0; i < animations_.size(); ++i) { 265 for (size_t i = 0; i < animations_.size(); ++i) {
273 size_t index = animations_.size() - i - 1; 266 size_t index = animations_.size() - i - 1;
274 if (animations_[index]->target_property() == target_property) 267 if (animations_[index]->target_property() == target_property)
275 return animations_[index]; 268 return animations_[index];
276 } 269 }
277 return 0; 270 return 0;
(...skipping 30 matching lines...) Expand all
308 if (registrar_ == registrar) 301 if (registrar_ == registrar)
309 return; 302 return;
310 303
311 if (registrar_) 304 if (registrar_)
312 registrar_->UnregisterAnimationController(this); 305 registrar_->UnregisterAnimationController(this);
313 306
314 registrar_ = registrar; 307 registrar_ = registrar;
315 if (registrar_) 308 if (registrar_)
316 registrar_->RegisterAnimationController(this); 309 registrar_->RegisterAnimationController(this);
317 310
318 UpdateActivation(ForceActivation); 311 UpdateActivation(FORCE_ACTIVATION);
319 } 312 }
320 313
321 void LayerAnimationController::NotifyAnimationStarted( 314 void LayerAnimationController::NotifyAnimationStarted(
322 const AnimationEvent& event) { 315 const AnimationEvent& event) {
323 if (event.is_impl_only) { 316 if (event.is_impl_only) {
324 FOR_EACH_OBSERVER(LayerAnimationEventObserver, event_observers_, 317 FOR_EACH_OBSERVER(LayerAnimationEventObserver, event_observers_,
325 OnAnimationStarted(event)); 318 OnAnimationStarted(event));
326 if (layer_animation_delegate_) 319 if (layer_animation_delegate_)
327 layer_animation_delegate_->NotifyAnimationStarted( 320 layer_animation_delegate_->NotifyAnimationStarted(
328 event.monotonic_time, event.target_property, event.group_id); 321 event.monotonic_time, event.target_property, event.group_id);
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
368 return; 361 return;
369 } 362 }
370 } 363 }
371 } 364 }
372 365
373 void LayerAnimationController::NotifyAnimationAborted( 366 void LayerAnimationController::NotifyAnimationAborted(
374 const AnimationEvent& event) { 367 const AnimationEvent& event) {
375 for (size_t i = 0; i < animations_.size(); ++i) { 368 for (size_t i = 0; i < animations_.size(); ++i) {
376 if (animations_[i]->group() == event.group_id && 369 if (animations_[i]->group() == event.group_id &&
377 animations_[i]->target_property() == event.target_property) { 370 animations_[i]->target_property() == event.target_property) {
378 animations_[i]->SetRunState(Animation::Aborted, event.monotonic_time); 371 animations_[i]->SetRunState(Animation::ABORTED, event.monotonic_time);
379 } 372 }
380 } 373 }
381 } 374 }
382 375
383 void LayerAnimationController::NotifyAnimationPropertyUpdate( 376 void LayerAnimationController::NotifyAnimationPropertyUpdate(
384 const AnimationEvent& event) { 377 const AnimationEvent& event) {
385 bool notify_active_observers = true; 378 bool notify_active_observers = true;
386 bool notify_pending_observers = true; 379 bool notify_pending_observers = true;
387 switch (event.target_property) { 380 switch (event.target_property) {
388 case Animation::Opacity: 381 case Animation::OPACITY:
389 NotifyObserversOpacityAnimated( 382 NotifyObserversOpacityAnimated(
390 event.opacity, notify_active_observers, notify_pending_observers); 383 event.opacity, notify_active_observers, notify_pending_observers);
391 break; 384 break;
392 case Animation::Transform: 385 case Animation::TRANSFORM:
393 NotifyObserversTransformAnimated( 386 NotifyObserversTransformAnimated(
394 event.transform, notify_active_observers, notify_pending_observers); 387 event.transform, notify_active_observers, notify_pending_observers);
395 break; 388 break;
396 default: 389 default:
397 NOTREACHED(); 390 NOTREACHED();
398 } 391 }
399 } 392 }
400 393
401 void LayerAnimationController::AddValueObserver( 394 void LayerAnimationController::AddValueObserver(
402 LayerAnimationValueObserver* observer) { 395 LayerAnimationValueObserver* observer) {
(...skipping 13 matching lines...) Expand all
416 } 409 }
417 410
418 void LayerAnimationController::RemoveEventObserver( 411 void LayerAnimationController::RemoveEventObserver(
419 LayerAnimationEventObserver* observer) { 412 LayerAnimationEventObserver* observer) {
420 event_observers_.RemoveObserver(observer); 413 event_observers_.RemoveObserver(observer);
421 } 414 }
422 415
423 bool LayerAnimationController::HasFilterAnimationThatInflatesBounds() const { 416 bool LayerAnimationController::HasFilterAnimationThatInflatesBounds() const {
424 for (size_t i = 0; i < animations_.size(); ++i) { 417 for (size_t i = 0; i < animations_.size(); ++i) {
425 if (!animations_[i]->is_finished() && 418 if (!animations_[i]->is_finished() &&
426 animations_[i]->target_property() == Animation::Filter && 419 animations_[i]->target_property() == Animation::FILTER &&
427 animations_[i] 420 animations_[i]
428 ->curve() 421 ->curve()
429 ->ToFilterAnimationCurve() 422 ->ToFilterAnimationCurve()
430 ->HasFilterThatMovesPixels()) 423 ->HasFilterThatMovesPixels())
431 return true; 424 return true;
432 } 425 }
433 426
434 return false; 427 return false;
435 } 428 }
436 429
437 bool LayerAnimationController::HasTransformAnimationThatInflatesBounds() const { 430 bool LayerAnimationController::HasTransformAnimationThatInflatesBounds() const {
438 return IsAnimatingProperty(Animation::Transform); 431 return IsAnimatingProperty(Animation::TRANSFORM);
439 } 432 }
440 433
441 bool LayerAnimationController::FilterAnimationBoundsForBox( 434 bool LayerAnimationController::FilterAnimationBoundsForBox(
442 const gfx::BoxF& box, gfx::BoxF* bounds) const { 435 const gfx::BoxF& box, gfx::BoxF* bounds) const {
443 // TODO(avallee): Implement. 436 // TODO(avallee): Implement.
444 return false; 437 return false;
445 } 438 }
446 439
447 bool LayerAnimationController::TransformAnimationBoundsForBox( 440 bool LayerAnimationController::TransformAnimationBoundsForBox(
448 const gfx::BoxF& box, 441 const gfx::BoxF& box,
449 gfx::BoxF* bounds) const { 442 gfx::BoxF* bounds) const {
450 DCHECK(HasTransformAnimationThatInflatesBounds()) 443 DCHECK(HasTransformAnimationThatInflatesBounds())
451 << "TransformAnimationBoundsForBox will give incorrect results if there " 444 << "TransformAnimationBoundsForBox will give incorrect results if there "
452 << "are no transform animations affecting bounds, non-animated transform " 445 << "are no transform animations affecting bounds, non-animated transform "
453 << "is not known"; 446 << "is not known";
454 447
455 // Compute bounds based on animations for which is_finished() is false. 448 // Compute bounds based on animations for which is_finished() is false.
456 // Do nothing if there are no such animations; in this case, it is assumed 449 // Do nothing if there are no such animations; in this case, it is assumed
457 // that callers will take care of computing bounds based on the owning layer's 450 // that callers will take care of computing bounds based on the owning layer's
458 // actual transform. 451 // actual transform.
459 *bounds = gfx::BoxF(); 452 *bounds = gfx::BoxF();
460 for (size_t i = 0; i < animations_.size(); ++i) { 453 for (size_t i = 0; i < animations_.size(); ++i) {
461 if (animations_[i]->is_finished() || 454 if (animations_[i]->is_finished() ||
462 animations_[i]->target_property() != Animation::Transform) 455 animations_[i]->target_property() != Animation::TRANSFORM)
463 continue; 456 continue;
464 457
465 const TransformAnimationCurve* transform_animation_curve = 458 const TransformAnimationCurve* transform_animation_curve =
466 animations_[i]->curve()->ToTransformAnimationCurve(); 459 animations_[i]->curve()->ToTransformAnimationCurve();
467 gfx::BoxF animation_bounds; 460 gfx::BoxF animation_bounds;
468 bool success = 461 bool success =
469 transform_animation_curve->AnimatedBoundsForBox(box, &animation_bounds); 462 transform_animation_curve->AnimatedBoundsForBox(box, &animation_bounds);
470 if (!success) 463 if (!success)
471 return false; 464 return false;
472 bounds->Union(animation_bounds); 465 bounds->Union(animation_bounds);
473 } 466 }
474 467
475 return true; 468 return true;
476 } 469 }
477 470
478 bool LayerAnimationController::HasAnimationThatAffectsScale() const { 471 bool LayerAnimationController::HasAnimationThatAffectsScale() const {
479 for (size_t i = 0; i < animations_.size(); ++i) { 472 for (size_t i = 0; i < animations_.size(); ++i) {
480 if (animations_[i]->is_finished() || 473 if (animations_[i]->is_finished() ||
481 animations_[i]->target_property() != Animation::Transform) 474 animations_[i]->target_property() != Animation::TRANSFORM)
482 continue; 475 continue;
483 476
484 const TransformAnimationCurve* transform_animation_curve = 477 const TransformAnimationCurve* transform_animation_curve =
485 animations_[i]->curve()->ToTransformAnimationCurve(); 478 animations_[i]->curve()->ToTransformAnimationCurve();
486 if (transform_animation_curve->AffectsScale()) 479 if (transform_animation_curve->AffectsScale())
487 return true; 480 return true;
488 } 481 }
489 482
490 return false; 483 return false;
491 } 484 }
492 485
493 bool LayerAnimationController::HasOnlyTranslationTransforms() const { 486 bool LayerAnimationController::HasOnlyTranslationTransforms() const {
494 for (size_t i = 0; i < animations_.size(); ++i) { 487 for (size_t i = 0; i < animations_.size(); ++i) {
495 if (animations_[i]->is_finished() || 488 if (animations_[i]->is_finished() ||
496 animations_[i]->target_property() != Animation::Transform) 489 animations_[i]->target_property() != Animation::TRANSFORM)
497 continue; 490 continue;
498 491
499 const TransformAnimationCurve* transform_animation_curve = 492 const TransformAnimationCurve* transform_animation_curve =
500 animations_[i]->curve()->ToTransformAnimationCurve(); 493 animations_[i]->curve()->ToTransformAnimationCurve();
501 if (!transform_animation_curve->IsTranslation()) 494 if (!transform_animation_curve->IsTranslation())
502 return false; 495 return false;
503 } 496 }
504 497
505 return true; 498 return true;
506 } 499 }
507 500
508 bool LayerAnimationController::AnimationsPreserveAxisAlignment() const { 501 bool LayerAnimationController::AnimationsPreserveAxisAlignment() const {
509 for (size_t i = 0; i < animations_.size(); ++i) { 502 for (size_t i = 0; i < animations_.size(); ++i) {
510 if (animations_[i]->is_finished() || 503 if (animations_[i]->is_finished() ||
511 animations_[i]->target_property() != Animation::Transform) 504 animations_[i]->target_property() != Animation::TRANSFORM)
512 continue; 505 continue;
513 506
514 const TransformAnimationCurve* transform_animation_curve = 507 const TransformAnimationCurve* transform_animation_curve =
515 animations_[i]->curve()->ToTransformAnimationCurve(); 508 animations_[i]->curve()->ToTransformAnimationCurve();
516 if (!transform_animation_curve->PreservesAxisAlignment()) 509 if (!transform_animation_curve->PreservesAxisAlignment())
517 return false; 510 return false;
518 } 511 }
519 512
520 return true; 513 return true;
521 } 514 }
522 515
523 bool LayerAnimationController::MaximumTargetScale(float* max_scale) const { 516 bool LayerAnimationController::MaximumTargetScale(float* max_scale) const {
524 *max_scale = 0.f; 517 *max_scale = 0.f;
525 for (size_t i = 0; i < animations_.size(); ++i) { 518 for (size_t i = 0; i < animations_.size(); ++i) {
526 if (animations_[i]->is_finished() || 519 if (animations_[i]->is_finished() ||
527 animations_[i]->target_property() != Animation::Transform) 520 animations_[i]->target_property() != Animation::TRANSFORM)
528 continue; 521 continue;
529 522
530 bool forward_direction = true; 523 bool forward_direction = true;
531 switch (animations_[i]->direction()) { 524 switch (animations_[i]->direction()) {
532 case Animation::Normal: 525 case Animation::DIRECTION_NORMAL:
533 case Animation::Alternate: 526 case Animation::DIRECTION_ALTERNATE:
534 forward_direction = animations_[i]->playback_rate() >= 0.0; 527 forward_direction = animations_[i]->playback_rate() >= 0.0;
535 break; 528 break;
536 case Animation::Reverse: 529 case Animation::DIRECTION_REVERSE:
537 case Animation::AlternateReverse: 530 case Animation::DIRECTION_ALTERNATE_REVERSE:
538 forward_direction = animations_[i]->playback_rate() < 0.0; 531 forward_direction = animations_[i]->playback_rate() < 0.0;
539 break; 532 break;
540 } 533 }
541 534
542 const TransformAnimationCurve* transform_animation_curve = 535 const TransformAnimationCurve* transform_animation_curve =
543 animations_[i]->curve()->ToTransformAnimationCurve(); 536 animations_[i]->curve()->ToTransformAnimationCurve();
544 float animation_scale = 0.f; 537 float animation_scale = 0.f;
545 if (!transform_animation_curve->MaximumTargetScale(forward_direction, 538 if (!transform_animation_curve->MaximumTargetScale(forward_direction,
546 &animation_scale)) 539 &animation_scale))
547 return false; 540 return false;
(...skipping 16 matching lines...) Expand all
564 // If the animation is not running on the impl thread, it does not 557 // If the animation is not running on the impl thread, it does not
565 // necessarily mean that it needs to be copied over and started; it may 558 // necessarily mean that it needs to be copied over and started; it may
566 // have already finished. In this case, the impl thread animation will 559 // have already finished. In this case, the impl thread animation will
567 // have already notified that it has started and the main thread animation 560 // have already notified that it has started and the main thread animation
568 // will no longer need 561 // will no longer need
569 // a synchronized start time. 562 // a synchronized start time.
570 if (!animations_[i]->needs_synchronized_start_time()) 563 if (!animations_[i]->needs_synchronized_start_time())
571 continue; 564 continue;
572 565
573 // Scroll animations always start at the current scroll offset. 566 // Scroll animations always start at the current scroll offset.
574 if (animations_[i]->target_property() == Animation::ScrollOffset) { 567 if (animations_[i]->target_property() == Animation::SCROLL_OFFSET) {
575 gfx::ScrollOffset current_scroll_offset; 568 gfx::ScrollOffset current_scroll_offset;
576 if (controller_impl->value_provider_) { 569 if (controller_impl->value_provider_) {
577 current_scroll_offset = 570 current_scroll_offset =
578 controller_impl->value_provider_->ScrollOffsetForAnimation(); 571 controller_impl->value_provider_->ScrollOffsetForAnimation();
579 } else { 572 } else {
580 // The owning layer isn't yet in the active tree, so the main thread 573 // The owning layer isn't yet in the active tree, so the main thread
581 // scroll offset will be up-to-date. 574 // scroll offset will be up-to-date.
582 current_scroll_offset = value_provider_->ScrollOffsetForAnimation(); 575 current_scroll_offset = value_provider_->ScrollOffsetForAnimation();
583 } 576 }
584 animations_[i]->curve()->ToScrollOffsetAnimationCurve()->SetInitialValue( 577 animations_[i]->curve()->ToScrollOffsetAnimationCurve()->SetInitialValue(
585 current_scroll_offset); 578 current_scroll_offset);
586 } 579 }
587 580
588 // The new animation should be set to run as soon as possible. 581 // The new animation should be set to run as soon as possible.
589 Animation::RunState initial_run_state = 582 Animation::RunState initial_run_state =
590 Animation::WaitingForTargetAvailability; 583 Animation::WAITING_FOR_TARGET_AVAILABILITY;
591 scoped_ptr<Animation> to_add( 584 scoped_ptr<Animation> to_add(
592 animations_[i]->CloneAndInitialize(initial_run_state)); 585 animations_[i]->CloneAndInitialize(initial_run_state));
593 DCHECK(!to_add->needs_synchronized_start_time()); 586 DCHECK(!to_add->needs_synchronized_start_time());
594 to_add->set_affects_active_observers(false); 587 to_add->set_affects_active_observers(false);
595 controller_impl->AddAnimation(to_add.Pass()); 588 controller_impl->AddAnimation(to_add.Pass());
596 } 589 }
597 } 590 }
598 591
599 static bool IsCompleted( 592 static bool IsCompleted(
600 Animation* animation, 593 Animation* animation,
601 const LayerAnimationController* main_thread_controller) { 594 const LayerAnimationController* main_thread_controller) {
602 if (animation->is_impl_only()) { 595 if (animation->is_impl_only()) {
603 return (animation->run_state() == Animation::WaitingForDeletion); 596 return (animation->run_state() == Animation::WAITING_FOR_DELETION);
604 } else { 597 } else {
605 return !main_thread_controller->GetAnimationById(animation->id()); 598 return !main_thread_controller->GetAnimationById(animation->id());
606 } 599 }
607 } 600 }
608 601
609 static bool AffectsActiveOnlyAndIsWaitingForDeletion(Animation* animation) { 602 static bool AffectsActiveOnlyAndIsWaitingForDeletion(Animation* animation) {
610 return animation->run_state() == Animation::WaitingForDeletion && 603 return animation->run_state() == Animation::WAITING_FOR_DELETION &&
611 !animation->affects_pending_observers(); 604 !animation->affects_pending_observers();
612 } 605 }
613 606
614 void LayerAnimationController::RemoveAnimationsCompletedOnMainThread( 607 void LayerAnimationController::RemoveAnimationsCompletedOnMainThread(
615 LayerAnimationController* controller_impl) const { 608 LayerAnimationController* controller_impl) const {
616 // Animations removed on the main thread should no longer affect pending 609 // Animations removed on the main thread should no longer affect pending
617 // observers, and should stop affecting active observers after the next call 610 // observers, and should stop affecting active observers after the next call
618 // to ActivateAnimations. If already WaitingForDeletion, they can be removed 611 // to ActivateAnimations. If already WAITING_FOR_DELETION, they can be removed
619 // immediately. 612 // immediately.
620 ScopedPtrVector<Animation>& animations = controller_impl->animations_; 613 ScopedPtrVector<Animation>& animations = controller_impl->animations_;
621 for (size_t i = 0; i < animations.size(); ++i) { 614 for (size_t i = 0; i < animations.size(); ++i) {
622 if (IsCompleted(animations[i], this)) 615 if (IsCompleted(animations[i], this))
623 animations[i]->set_affects_pending_observers(false); 616 animations[i]->set_affects_pending_observers(false);
624 } 617 }
625 animations.erase(cc::remove_if(&animations, 618 animations.erase(cc::remove_if(&animations,
626 animations.begin(), 619 animations.begin(),
627 animations.end(), 620 animations.end(),
628 AffectsActiveOnlyAndIsWaitingForDeletion), 621 AffectsActiveOnlyAndIsWaitingForDeletion),
(...skipping 16 matching lines...) Expand all
645 void LayerAnimationController::StartAnimations(base::TimeTicks monotonic_time) { 638 void LayerAnimationController::StartAnimations(base::TimeTicks monotonic_time) {
646 DCHECK(needs_to_start_animations_); 639 DCHECK(needs_to_start_animations_);
647 needs_to_start_animations_ = false; 640 needs_to_start_animations_ = false;
648 // First collect running properties affecting each type of observer. 641 // First collect running properties affecting each type of observer.
649 TargetProperties blocked_properties_for_active_observers; 642 TargetProperties blocked_properties_for_active_observers;
650 TargetProperties blocked_properties_for_pending_observers; 643 TargetProperties blocked_properties_for_pending_observers;
651 std::vector<size_t> animations_waiting_for_target; 644 std::vector<size_t> animations_waiting_for_target;
652 645
653 animations_waiting_for_target.reserve(animations_.size()); 646 animations_waiting_for_target.reserve(animations_.size());
654 for (size_t i = 0; i < animations_.size(); ++i) { 647 for (size_t i = 0; i < animations_.size(); ++i) {
655 if (animations_[i]->run_state() == Animation::Starting || 648 if (animations_[i]->run_state() == Animation::STARTING ||
656 animations_[i]->run_state() == Animation::Running) { 649 animations_[i]->run_state() == Animation::RUNNING) {
657 if (animations_[i]->affects_active_observers()) { 650 if (animations_[i]->affects_active_observers()) {
658 blocked_properties_for_active_observers.insert( 651 blocked_properties_for_active_observers.insert(
659 animations_[i]->target_property()); 652 animations_[i]->target_property());
660 } 653 }
661 if (animations_[i]->affects_pending_observers()) { 654 if (animations_[i]->affects_pending_observers()) {
662 blocked_properties_for_pending_observers.insert( 655 blocked_properties_for_pending_observers.insert(
663 animations_[i]->target_property()); 656 animations_[i]->target_property());
664 } 657 }
665 } else if (animations_[i]->run_state() == 658 } else if (animations_[i]->run_state() ==
666 Animation::WaitingForTargetAvailability) { 659 Animation::WAITING_FOR_TARGET_AVAILABILITY) {
667 animations_waiting_for_target.push_back(i); 660 animations_waiting_for_target.push_back(i);
668 } 661 }
669 } 662 }
670 663
671 for (size_t i = 0; i < animations_waiting_for_target.size(); ++i) { 664 for (size_t i = 0; i < animations_waiting_for_target.size(); ++i) {
672 // Collect all properties for animations with the same group id (they 665 // Collect all properties for animations with the same group id (they
673 // should all also be in the list of animations). 666 // should all also be in the list of animations).
674 size_t animation_index = animations_waiting_for_target[i]; 667 size_t animation_index = animations_waiting_for_target[i];
675 Animation* animation_waiting_for_target = animations_[animation_index]; 668 Animation* animation_waiting_for_target = animations_[animation_index];
676 // Check for the run state again even though the animation was waiting 669 // Check for the run state again even though the animation was waiting
677 // for target because it might have changed the run state while handling 670 // for target because it might have changed the run state while handling
678 // previous animation in this loop (if they belong to same group). 671 // previous animation in this loop (if they belong to same group).
679 if (animation_waiting_for_target->run_state() == 672 if (animation_waiting_for_target->run_state() ==
680 Animation::WaitingForTargetAvailability) { 673 Animation::WAITING_FOR_TARGET_AVAILABILITY) {
681 TargetProperties enqueued_properties; 674 TargetProperties enqueued_properties;
682 bool affects_active_observers = 675 bool affects_active_observers =
683 animation_waiting_for_target->affects_active_observers(); 676 animation_waiting_for_target->affects_active_observers();
684 bool affects_pending_observers = 677 bool affects_pending_observers =
685 animation_waiting_for_target->affects_pending_observers(); 678 animation_waiting_for_target->affects_pending_observers();
686 enqueued_properties.insert( 679 enqueued_properties.insert(
687 animation_waiting_for_target->target_property()); 680 animation_waiting_for_target->target_property());
688 for (size_t j = animation_index + 1; j < animations_.size(); ++j) { 681 for (size_t j = animation_index + 1; j < animations_.size(); ++j) {
689 if (animation_waiting_for_target->group() == animations_[j]->group()) { 682 if (animation_waiting_for_target->group() == animations_[j]->group()) {
690 enqueued_properties.insert(animations_[j]->target_property()); 683 enqueued_properties.insert(animations_[j]->target_property());
(...skipping 17 matching lines...) Expand all
708 !blocked_properties_for_active_observers.insert(*p_iter).second) 701 !blocked_properties_for_active_observers.insert(*p_iter).second)
709 null_intersection = false; 702 null_intersection = false;
710 if (affects_pending_observers && 703 if (affects_pending_observers &&
711 !blocked_properties_for_pending_observers.insert(*p_iter).second) 704 !blocked_properties_for_pending_observers.insert(*p_iter).second)
712 null_intersection = false; 705 null_intersection = false;
713 } 706 }
714 707
715 // If the intersection is null, then we are free to start the animations 708 // If the intersection is null, then we are free to start the animations
716 // in the group. 709 // in the group.
717 if (null_intersection) { 710 if (null_intersection) {
718 animation_waiting_for_target->SetRunState(Animation::Starting, 711 animation_waiting_for_target->SetRunState(Animation::STARTING,
719 monotonic_time); 712 monotonic_time);
720 for (size_t j = animation_index + 1; j < animations_.size(); ++j) { 713 for (size_t j = animation_index + 1; j < animations_.size(); ++j) {
721 if (animation_waiting_for_target->group() == 714 if (animation_waiting_for_target->group() ==
722 animations_[j]->group()) { 715 animations_[j]->group()) {
723 animations_[j]->SetRunState(Animation::Starting, monotonic_time); 716 animations_[j]->SetRunState(Animation::STARTING, monotonic_time);
724 } 717 }
725 } 718 }
726 } else { 719 } else {
727 needs_to_start_animations_ = true; 720 needs_to_start_animations_ = true;
728 } 721 }
729 } 722 }
730 } 723 }
731 } 724 }
732 725
733 void LayerAnimationController::PromoteStartedAnimations( 726 void LayerAnimationController::PromoteStartedAnimations(
734 base::TimeTicks monotonic_time, 727 base::TimeTicks monotonic_time,
735 AnimationEventsVector* events) { 728 AnimationEventsVector* events) {
736 for (size_t i = 0; i < animations_.size(); ++i) { 729 for (size_t i = 0; i < animations_.size(); ++i) {
737 if (animations_[i]->run_state() == Animation::Starting && 730 if (animations_[i]->run_state() == Animation::STARTING &&
738 animations_[i]->affects_active_observers()) { 731 animations_[i]->affects_active_observers()) {
739 animations_[i]->SetRunState(Animation::Running, monotonic_time); 732 animations_[i]->SetRunState(Animation::RUNNING, monotonic_time);
740 if (!animations_[i]->has_set_start_time() && 733 if (!animations_[i]->has_set_start_time() &&
741 !animations_[i]->needs_synchronized_start_time()) 734 !animations_[i]->needs_synchronized_start_time())
742 animations_[i]->set_start_time(monotonic_time); 735 animations_[i]->set_start_time(monotonic_time);
743 if (events) { 736 if (events) {
744 AnimationEvent started_event(AnimationEvent::Started, 737 AnimationEvent started_event(
745 id_, 738 AnimationEvent::STARTED, id_, animations_[i]->group(),
746 animations_[i]->group(), 739 animations_[i]->target_property(), monotonic_time);
747 animations_[i]->target_property(),
748 monotonic_time);
749 started_event.is_impl_only = animations_[i]->is_impl_only(); 740 started_event.is_impl_only = animations_[i]->is_impl_only();
750 if (started_event.is_impl_only) 741 if (started_event.is_impl_only)
751 NotifyAnimationStarted(started_event); 742 NotifyAnimationStarted(started_event);
752 else 743 else
753 events->push_back(started_event); 744 events->push_back(started_event);
754 } 745 }
755 } 746 }
756 } 747 }
757 } 748 }
758 749
759 void LayerAnimationController::MarkFinishedAnimations( 750 void LayerAnimationController::MarkFinishedAnimations(
760 base::TimeTicks monotonic_time) { 751 base::TimeTicks monotonic_time) {
761 for (size_t i = 0; i < animations_.size(); ++i) { 752 for (size_t i = 0; i < animations_.size(); ++i) {
762 if (animations_[i]->IsFinishedAt(monotonic_time) && 753 if (animations_[i]->IsFinishedAt(monotonic_time) &&
763 animations_[i]->run_state() != Animation::Aborted && 754 animations_[i]->run_state() != Animation::ABORTED &&
764 animations_[i]->run_state() != Animation::WaitingForDeletion) 755 animations_[i]->run_state() != Animation::WAITING_FOR_DELETION)
765 animations_[i]->SetRunState(Animation::Finished, monotonic_time); 756 animations_[i]->SetRunState(Animation::FINISHED, monotonic_time);
766 } 757 }
767 } 758 }
768 759
769 void LayerAnimationController::MarkAnimationsForDeletion( 760 void LayerAnimationController::MarkAnimationsForDeletion(
770 base::TimeTicks monotonic_time, 761 base::TimeTicks monotonic_time,
771 AnimationEventsVector* events) { 762 AnimationEventsVector* events) {
772 bool marked_animations_for_deletions = false; 763 bool marked_animations_for_deletions = false;
773 std::vector<size_t> animations_with_same_group_id; 764 std::vector<size_t> animations_with_same_group_id;
774 765
775 animations_with_same_group_id.reserve(animations_.size()); 766 animations_with_same_group_id.reserve(animations_.size());
776 // Non-aborted animations are marked for deletion after a corresponding 767 // Non-aborted animations are marked for deletion after a corresponding
777 // AnimationEvent::Finished event is sent or received. This means that if 768 // AnimationEvent::FINISHED event is sent or received. This means that if
778 // we don't have an events vector, we must ensure that non-aborted animations 769 // we don't have an events vector, we must ensure that non-aborted animations
779 // have received a finished event before marking them for deletion. 770 // have received a finished event before marking them for deletion.
780 for (size_t i = 0; i < animations_.size(); i++) { 771 for (size_t i = 0; i < animations_.size(); i++) {
781 int group_id = animations_[i]->group(); 772 int group_id = animations_[i]->group();
782 if (animations_[i]->run_state() == Animation::Aborted) { 773 if (animations_[i]->run_state() == Animation::ABORTED) {
783 if (events && !animations_[i]->is_impl_only()) { 774 if (events && !animations_[i]->is_impl_only()) {
784 AnimationEvent aborted_event(AnimationEvent::Aborted, 775 AnimationEvent aborted_event(AnimationEvent::ABORTED, id_, group_id,
785 id_,
786 group_id,
787 animations_[i]->target_property(), 776 animations_[i]->target_property(),
788 monotonic_time); 777 monotonic_time);
789 events->push_back(aborted_event); 778 events->push_back(aborted_event);
790 } 779 }
791 animations_[i]->SetRunState(Animation::WaitingForDeletion, 780 animations_[i]->SetRunState(Animation::WAITING_FOR_DELETION,
792 monotonic_time); 781 monotonic_time);
793 marked_animations_for_deletions = true; 782 marked_animations_for_deletions = true;
794 continue; 783 continue;
795 } 784 }
796 785
797 bool all_anims_with_same_id_are_finished = false; 786 bool all_anims_with_same_id_are_finished = false;
798 787
799 // Since deleting an animation on the main thread leads to its deletion 788 // Since deleting an animation on the main thread leads to its deletion
800 // on the impl thread, we only mark a Finished main thread animation for 789 // on the impl thread, we only mark a FINISHED main thread animation for
801 // deletion once it has received a Finished event from the impl thread. 790 // deletion once it has received a FINISHED event from the impl thread.
802 bool animation_i_will_send_or_has_received_finish_event = 791 bool animation_i_will_send_or_has_received_finish_event =
803 events || animations_[i]->received_finished_event(); 792 events || animations_[i]->received_finished_event();
804 // If an animation is finished, and not already marked for deletion, 793 // If an animation is finished, and not already marked for deletion,
805 // find out if all other animations in the same group are also finished. 794 // find out if all other animations in the same group are also finished.
806 if (animations_[i]->run_state() == Animation::Finished && 795 if (animations_[i]->run_state() == Animation::FINISHED &&
807 animation_i_will_send_or_has_received_finish_event) { 796 animation_i_will_send_or_has_received_finish_event) {
808 // Clear the animations_with_same_group_id if it was added for 797 // Clear the animations_with_same_group_id if it was added for
809 // the previous animation's iteration. 798 // the previous animation's iteration.
810 if (animations_with_same_group_id.size() > 0) 799 if (animations_with_same_group_id.size() > 0)
811 animations_with_same_group_id.clear(); 800 animations_with_same_group_id.clear();
812 all_anims_with_same_id_are_finished = true; 801 all_anims_with_same_id_are_finished = true;
813 for (size_t j = 0; j < animations_.size(); ++j) { 802 for (size_t j = 0; j < animations_.size(); ++j) {
814 bool animation_j_will_send_or_has_received_finish_event = 803 bool animation_j_will_send_or_has_received_finish_event =
815 events || animations_[j]->received_finished_event(); 804 events || animations_[j]->received_finished_event();
816 if (group_id == animations_[j]->group()) { 805 if (group_id == animations_[j]->group()) {
817 if (!animations_[j]->is_finished() || 806 if (!animations_[j]->is_finished() ||
818 (animations_[j]->run_state() == Animation::Finished && 807 (animations_[j]->run_state() == Animation::FINISHED &&
819 !animation_j_will_send_or_has_received_finish_event)) { 808 !animation_j_will_send_or_has_received_finish_event)) {
820 all_anims_with_same_id_are_finished = false; 809 all_anims_with_same_id_are_finished = false;
821 break; 810 break;
822 } else if (j >= i && 811 } else if (j >= i &&
823 animations_[j]->run_state() != Animation::Aborted) { 812 animations_[j]->run_state() != Animation::ABORTED) {
824 // Mark down the animations which belong to the same group 813 // Mark down the animations which belong to the same group
825 // and is not yet aborted. If this current iteration finds that all 814 // and is not yet aborted. If this current iteration finds that all
826 // animations with same ID are finished, then the marked 815 // animations with same ID are finished, then the marked
827 // animations below will be set to WaitingForDeletion in next 816 // animations below will be set to WAITING_FOR_DELETION in next
828 // iteration. 817 // iteration.
829 animations_with_same_group_id.push_back(j); 818 animations_with_same_group_id.push_back(j);
830 } 819 }
831 } 820 }
832 } 821 }
833 } 822 }
834 if (all_anims_with_same_id_are_finished) { 823 if (all_anims_with_same_id_are_finished) {
835 // We now need to remove all animations with the same group id as 824 // We now need to remove all animations with the same group id as
836 // group_id (and send along animation finished notifications, if 825 // group_id (and send along animation finished notifications, if
837 // necessary). 826 // necessary).
838 for (size_t j = 0; j < animations_with_same_group_id.size(); j++) { 827 for (size_t j = 0; j < animations_with_same_group_id.size(); j++) {
839 size_t animation_index = animations_with_same_group_id[j]; 828 size_t animation_index = animations_with_same_group_id[j];
840 if (events) { 829 if (events) {
841 AnimationEvent finished_event( 830 AnimationEvent finished_event(
842 AnimationEvent::Finished, 831 AnimationEvent::FINISHED, id_,
843 id_,
844 animations_[animation_index]->group(), 832 animations_[animation_index]->group(),
845 animations_[animation_index]->target_property(), 833 animations_[animation_index]->target_property(),
846 monotonic_time); 834 monotonic_time);
847 finished_event.is_impl_only = 835 finished_event.is_impl_only =
848 animations_[animation_index]->is_impl_only(); 836 animations_[animation_index]->is_impl_only();
849 if (finished_event.is_impl_only) 837 if (finished_event.is_impl_only)
850 NotifyAnimationFinished(finished_event); 838 NotifyAnimationFinished(finished_event);
851 else 839 else
852 events->push_back(finished_event); 840 events->push_back(finished_event);
853 } 841 }
854 animations_[animation_index]->SetRunState( 842 animations_[animation_index]->SetRunState(
855 Animation::WaitingForDeletion, monotonic_time); 843 Animation::WAITING_FOR_DELETION, monotonic_time);
856 } 844 }
857 marked_animations_for_deletions = true; 845 marked_animations_for_deletions = true;
858 } 846 }
859 } 847 }
860 if (marked_animations_for_deletions) 848 if (marked_animations_for_deletions)
861 NotifyObserversAnimationWaitingForDeletion(); 849 NotifyObserversAnimationWaitingForDeletion();
862 } 850 }
863 851
864 static bool IsWaitingForDeletion(Animation* animation) { 852 static bool IsWaitingForDeletion(Animation* animation) {
865 return animation->run_state() == Animation::WaitingForDeletion; 853 return animation->run_state() == Animation::WAITING_FOR_DELETION;
866 } 854 }
867 855
868 void LayerAnimationController::PurgeAnimationsMarkedForDeletion() { 856 void LayerAnimationController::PurgeAnimationsMarkedForDeletion() {
869 animations_.erase(cc::remove_if(&animations_, 857 animations_.erase(cc::remove_if(&animations_,
870 animations_.begin(), 858 animations_.begin(),
871 animations_.end(), 859 animations_.end(),
872 IsWaitingForDeletion), 860 IsWaitingForDeletion),
873 animations_.end()); 861 animations_.end());
874 } 862 }
875 863
876 void LayerAnimationController::TickAnimations(base::TimeTicks monotonic_time) { 864 void LayerAnimationController::TickAnimations(base::TimeTicks monotonic_time) {
877 for (size_t i = 0; i < animations_.size(); ++i) { 865 for (size_t i = 0; i < animations_.size(); ++i) {
878 if (animations_[i]->run_state() == Animation::Starting || 866 if (animations_[i]->run_state() == Animation::STARTING ||
879 animations_[i]->run_state() == Animation::Running || 867 animations_[i]->run_state() == Animation::RUNNING ||
880 animations_[i]->run_state() == Animation::Paused) { 868 animations_[i]->run_state() == Animation::PAUSED) {
881 if (!animations_[i]->InEffect(monotonic_time)) 869 if (!animations_[i]->InEffect(monotonic_time))
882 continue; 870 continue;
883 871
884 base::TimeDelta trimmed = 872 base::TimeDelta trimmed =
885 animations_[i]->TrimTimeToCurrentIteration(monotonic_time); 873 animations_[i]->TrimTimeToCurrentIteration(monotonic_time);
886 874
887 switch (animations_[i]->target_property()) { 875 switch (animations_[i]->target_property()) {
888 case Animation::Transform: { 876 case Animation::TRANSFORM: {
889 const TransformAnimationCurve* transform_animation_curve = 877 const TransformAnimationCurve* transform_animation_curve =
890 animations_[i]->curve()->ToTransformAnimationCurve(); 878 animations_[i]->curve()->ToTransformAnimationCurve();
891 const gfx::Transform transform = 879 const gfx::Transform transform =
892 transform_animation_curve->GetValue(trimmed); 880 transform_animation_curve->GetValue(trimmed);
893 NotifyObserversTransformAnimated( 881 NotifyObserversTransformAnimated(
894 transform, 882 transform,
895 animations_[i]->affects_active_observers(), 883 animations_[i]->affects_active_observers(),
896 animations_[i]->affects_pending_observers()); 884 animations_[i]->affects_pending_observers());
897 break; 885 break;
898 } 886 }
899 887
900 case Animation::Opacity: { 888 case Animation::OPACITY: {
901 const FloatAnimationCurve* float_animation_curve = 889 const FloatAnimationCurve* float_animation_curve =
902 animations_[i]->curve()->ToFloatAnimationCurve(); 890 animations_[i]->curve()->ToFloatAnimationCurve();
903 const float opacity = std::max( 891 const float opacity = std::max(
904 std::min(float_animation_curve->GetValue(trimmed), 1.0f), 0.f); 892 std::min(float_animation_curve->GetValue(trimmed), 1.0f), 0.f);
905 NotifyObserversOpacityAnimated( 893 NotifyObserversOpacityAnimated(
906 opacity, 894 opacity,
907 animations_[i]->affects_active_observers(), 895 animations_[i]->affects_active_observers(),
908 animations_[i]->affects_pending_observers()); 896 animations_[i]->affects_pending_observers());
909 break; 897 break;
910 } 898 }
911 899
912 case Animation::Filter: { 900 case Animation::FILTER: {
913 const FilterAnimationCurve* filter_animation_curve = 901 const FilterAnimationCurve* filter_animation_curve =
914 animations_[i]->curve()->ToFilterAnimationCurve(); 902 animations_[i]->curve()->ToFilterAnimationCurve();
915 const FilterOperations filter = 903 const FilterOperations filter =
916 filter_animation_curve->GetValue(trimmed); 904 filter_animation_curve->GetValue(trimmed);
917 NotifyObserversFilterAnimated( 905 NotifyObserversFilterAnimated(
918 filter, 906 filter,
919 animations_[i]->affects_active_observers(), 907 animations_[i]->affects_active_observers(),
920 animations_[i]->affects_pending_observers()); 908 animations_[i]->affects_pending_observers());
921 break; 909 break;
922 } 910 }
923 911
924 case Animation::BackgroundColor: { 912 case Animation::BACKGROUND_COLOR: {
925 // Not yet implemented. 913 // Not yet implemented.
926 break; 914 break;
927 } 915 }
928 916
929 case Animation::ScrollOffset: { 917 case Animation::SCROLL_OFFSET: {
930 const ScrollOffsetAnimationCurve* scroll_offset_animation_curve = 918 const ScrollOffsetAnimationCurve* scroll_offset_animation_curve =
931 animations_[i]->curve()->ToScrollOffsetAnimationCurve(); 919 animations_[i]->curve()->ToScrollOffsetAnimationCurve();
932 const gfx::ScrollOffset scroll_offset = 920 const gfx::ScrollOffset scroll_offset =
933 scroll_offset_animation_curve->GetValue(trimmed); 921 scroll_offset_animation_curve->GetValue(trimmed);
934 NotifyObserversScrollOffsetAnimated( 922 NotifyObserversScrollOffsetAnimated(
935 scroll_offset, 923 scroll_offset,
936 animations_[i]->affects_active_observers(), 924 animations_[i]->affects_active_observers(),
937 animations_[i]->affects_pending_observers()); 925 animations_[i]->affects_pending_observers());
938 break; 926 break;
939 } 927 }
940
941 // Do nothing for sentinel value.
942 case Animation::TargetPropertyEnumSize:
943 NOTREACHED();
944 } 928 }
945 } 929 }
946 } 930 }
947 } 931 }
948 932
949 void LayerAnimationController::UpdateActivation(UpdateActivationType type) { 933 void LayerAnimationController::UpdateActivation(UpdateActivationType type) {
950 bool force = type == ForceActivation; 934 bool force = type == FORCE_ACTIVATION;
951 if (registrar_) { 935 if (registrar_) {
952 bool was_active = is_active_; 936 bool was_active = is_active_;
953 is_active_ = false; 937 is_active_ = false;
954 for (size_t i = 0; i < animations_.size(); ++i) { 938 for (size_t i = 0; i < animations_.size(); ++i) {
955 if (animations_[i]->run_state() != Animation::WaitingForDeletion) { 939 if (animations_[i]->run_state() != Animation::WAITING_FOR_DELETION) {
956 is_active_ = true; 940 is_active_ = true;
957 break; 941 break;
958 } 942 }
959 } 943 }
960 944
961 if (is_active_ && (!was_active || force)) 945 if (is_active_ && (!was_active || force))
962 registrar_->DidActivateAnimationController(this); 946 registrar_->DidActivateAnimationController(this);
963 else if (!is_active_ && (was_active || force)) 947 else if (!is_active_ && (was_active || force))
964 registrar_->DidDeactivateAnimationController(this); 948 registrar_->DidDeactivateAnimationController(this);
965 } 949 }
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
1054 value_observers_); 1038 value_observers_);
1055 LayerAnimationValueObserver* obs; 1039 LayerAnimationValueObserver* obs;
1056 while ((obs = it.GetNext()) != nullptr) 1040 while ((obs = it.GetNext()) != nullptr)
1057 if (obs->IsActive()) 1041 if (obs->IsActive())
1058 return true; 1042 return true;
1059 } 1043 }
1060 return false; 1044 return false;
1061 } 1045 }
1062 1046
1063 } // namespace cc 1047 } // namespace cc
OLDNEW
« no previous file with comments | « cc/animation/layer_animation_controller.h ('k') | cc/animation/layer_animation_controller_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698