OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 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 "ui/compositor/layer_animator.h" | 5 #include "ui/compositor/layer_animator.h" |
6 | 6 |
7 #include "base/debug/trace_event.h" | 7 #include "base/debug/trace_event.h" |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
| 10 #include "cc/animation_id_provider.h" |
10 #include "ui/base/animation/animation_container.h" | 11 #include "ui/base/animation/animation_container.h" |
11 #include "ui/compositor/compositor.h" | 12 #include "ui/compositor/compositor.h" |
12 #include "ui/compositor/layer.h" | 13 #include "ui/compositor/layer.h" |
13 #include "ui/compositor/layer_animation_delegate.h" | 14 #include "ui/compositor/layer_animation_delegate.h" |
14 #include "ui/compositor/layer_animation_observer.h" | 15 #include "ui/compositor/layer_animation_observer.h" |
15 #include "ui/compositor/layer_animation_sequence.h" | 16 #include "ui/compositor/layer_animation_sequence.h" |
16 | 17 |
17 #define SAFE_INVOKE_VOID(function, running_anim, ...) \ | 18 #define SAFE_INVOKE_VOID(function, running_anim, ...) \ |
18 if (running_anim.is_sequence_alive()) \ | 19 if (running_anim.is_sequence_alive()) \ |
19 function(running_anim.sequence(), ##__VA_ARGS__) | 20 function(running_anim.sequence(), ##__VA_ARGS__) |
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
195 } | 196 } |
196 | 197 |
197 // Starting a zero duration pause that affects all the animated properties | 198 // Starting a zero duration pause that affects all the animated properties |
198 // will prevent any of the sequences from animating until there are no | 199 // will prevent any of the sequences from animating until there are no |
199 // running animations that affect any of these properties, as well as | 200 // running animations that affect any of these properties, as well as |
200 // handle preemption strategy. | 201 // handle preemption strategy. |
201 StartAnimation(new LayerAnimationSequence( | 202 StartAnimation(new LayerAnimationSequence( |
202 LayerAnimationElement::CreatePauseElement(animated_properties, | 203 LayerAnimationElement::CreatePauseElement(animated_properties, |
203 base::TimeDelta()))); | 204 base::TimeDelta()))); |
204 | 205 |
| 206 bool wait_for_group_start = false; |
| 207 for (iter = animations.begin(); iter != animations.end(); ++iter) |
| 208 wait_for_group_start |= (*iter)->IsFirstElementThreaded(); |
| 209 |
| 210 int group_id = cc::AnimationIdProvider::NextGroupId(); |
| 211 |
205 // These animations (provided they don't animate any common properties) will | 212 // These animations (provided they don't animate any common properties) will |
206 // now animate together if trivially scheduled. | 213 // now animate together if trivially scheduled. |
207 for (iter = animations.begin(); iter != animations.end(); ++iter) { | 214 for (iter = animations.begin(); iter != animations.end(); ++iter) { |
| 215 (*iter)->set_animation_group_id(group_id); |
| 216 (*iter)->set_waiting_for_group_start(wait_for_group_start); |
208 ScheduleAnimation(*iter); | 217 ScheduleAnimation(*iter); |
209 } | 218 } |
210 | 219 |
211 adding_animations_ = false; | 220 adding_animations_ = false; |
212 UpdateAnimationState(); | 221 UpdateAnimationState(); |
213 } | 222 } |
214 | 223 |
215 | 224 |
216 void LayerAnimator::ScheduleTogether( | 225 void LayerAnimator::ScheduleTogether( |
217 const std::vector<LayerAnimationSequence*>& animations) { | 226 const std::vector<LayerAnimationSequence*>& animations) { |
218 scoped_refptr<LayerAnimator> retain(this); | 227 scoped_refptr<LayerAnimator> retain(this); |
219 | 228 |
220 // Collect all the affected properties. | 229 // Collect all the affected properties. |
221 LayerAnimationElement::AnimatableProperties animated_properties; | 230 LayerAnimationElement::AnimatableProperties animated_properties; |
222 std::vector<LayerAnimationSequence*>::const_iterator iter; | 231 std::vector<LayerAnimationSequence*>::const_iterator iter; |
223 for (iter = animations.begin(); iter != animations.end(); ++iter) { | 232 for (iter = animations.begin(); iter != animations.end(); ++iter) { |
224 animated_properties.insert((*iter)->properties().begin(), | 233 animated_properties.insert((*iter)->properties().begin(), |
225 (*iter)->properties().end()); | 234 (*iter)->properties().end()); |
226 } | 235 } |
227 | 236 |
228 // Scheduling a zero duration pause that affects all the animated properties | 237 // Scheduling a zero duration pause that affects all the animated properties |
229 // will prevent any of the sequences from animating until there are no | 238 // will prevent any of the sequences from animating until there are no |
230 // running animations that affect any of these properties. | 239 // running animations that affect any of these properties. |
231 ScheduleAnimation(new LayerAnimationSequence( | 240 ScheduleAnimation(new LayerAnimationSequence( |
232 LayerAnimationElement::CreatePauseElement(animated_properties, | 241 LayerAnimationElement::CreatePauseElement(animated_properties, |
233 base::TimeDelta()))); | 242 base::TimeDelta()))); |
234 | 243 |
| 244 bool wait_for_group_start = false; |
| 245 for (iter = animations.begin(); iter != animations.end(); ++iter) |
| 246 wait_for_group_start |= (*iter)->IsFirstElementThreaded(); |
| 247 |
| 248 int group_id = cc::AnimationIdProvider::NextGroupId(); |
| 249 |
235 // These animations (provided they don't animate any common properties) will | 250 // These animations (provided they don't animate any common properties) will |
236 // now animate together if trivially scheduled. | 251 // now animate together if trivially scheduled. |
237 for (iter = animations.begin(); iter != animations.end(); ++iter) { | 252 for (iter = animations.begin(); iter != animations.end(); ++iter) { |
| 253 (*iter)->set_animation_group_id(group_id); |
| 254 (*iter)->set_waiting_for_group_start(wait_for_group_start); |
238 ScheduleAnimation(*iter); | 255 ScheduleAnimation(*iter); |
239 } | 256 } |
240 | 257 |
241 UpdateAnimationState(); | 258 UpdateAnimationState(); |
242 } | 259 } |
243 | 260 |
244 void LayerAnimator::SchedulePauseForProperties( | 261 void LayerAnimator::SchedulePauseForProperties( |
245 base::TimeDelta duration, | 262 base::TimeDelta duration, |
246 LayerAnimationElement::AnimatableProperty property, | 263 LayerAnimationElement::AnimatableProperty property, |
247 ...) { | 264 ...) { |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
292 | 309 |
293 void LayerAnimator::RemoveObserver(LayerAnimationObserver* observer) { | 310 void LayerAnimator::RemoveObserver(LayerAnimationObserver* observer) { |
294 observers_.RemoveObserver(observer); | 311 observers_.RemoveObserver(observer); |
295 // Remove the observer from all sequences as well. | 312 // Remove the observer from all sequences as well. |
296 for (AnimationQueue::iterator queue_iter = animation_queue_.begin(); | 313 for (AnimationQueue::iterator queue_iter = animation_queue_.begin(); |
297 queue_iter != animation_queue_.end(); ++queue_iter) { | 314 queue_iter != animation_queue_.end(); ++queue_iter) { |
298 (*queue_iter)->RemoveObserver(observer); | 315 (*queue_iter)->RemoveObserver(observer); |
299 } | 316 } |
300 } | 317 } |
301 | 318 |
| 319 void LayerAnimator::OnThreadedAnimationStarted( |
| 320 const cc::AnimationEvent& event) { |
| 321 LayerAnimationElement::AnimatableProperty property = |
| 322 LayerAnimationElement::ToAnimatableProperty(event.targetProperty); |
| 323 |
| 324 RunningAnimation* running = GetRunningAnimation(property); |
| 325 if (!running) |
| 326 return; |
| 327 DCHECK(running->is_sequence_alive()); |
| 328 |
| 329 if (running->sequence()->animation_group_id() != event.groupId) |
| 330 return; |
| 331 |
| 332 running->sequence()->OnThreadedAnimationStarted(event); |
| 333 if (!running->sequence()->waiting_for_group_start()) |
| 334 return; |
| 335 |
| 336 base::TimeTicks start_time = base::TimeTicks::FromInternalValue( |
| 337 event.monotonicTime * base::Time::kMicrosecondsPerSecond); |
| 338 |
| 339 running->sequence()->set_waiting_for_group_start(false); |
| 340 |
| 341 // The call to GetRunningAnimation made above already purged deleted |
| 342 // animations, so we are guaranteed that all the animations we iterate |
| 343 // over now are alive. |
| 344 for (RunningAnimations::iterator iter = running_animations_.begin(); |
| 345 iter != running_animations_.end(); ++iter) { |
| 346 // Ensure that each sequence is only Started once, regardless of the |
| 347 // number of sequences in the group that have threaded first elements. |
| 348 if (((*iter).sequence()->animation_group_id() == event.groupId) && |
| 349 !(*iter).sequence()->IsFirstElementThreaded() && |
| 350 (*iter).sequence()->waiting_for_group_start()) { |
| 351 (*iter).sequence()->set_start_time(start_time); |
| 352 (*iter).sequence()->set_waiting_for_group_start(false); |
| 353 (*iter).sequence()->Start(delegate()); |
| 354 } |
| 355 } |
| 356 } |
| 357 |
302 // LayerAnimator protected ----------------------------------------------------- | 358 // LayerAnimator protected ----------------------------------------------------- |
303 | 359 |
304 void LayerAnimator::ProgressAnimation(LayerAnimationSequence* sequence, | 360 void LayerAnimator::ProgressAnimation(LayerAnimationSequence* sequence, |
305 base::TimeTicks now) { | 361 base::TimeTicks now) { |
306 if (!delegate()) | 362 if (!delegate() || sequence->waiting_for_group_start()) |
307 return; | 363 return; |
308 | 364 |
309 sequence->Progress(now, delegate()); | 365 sequence->Progress(now, delegate()); |
310 } | 366 } |
311 | 367 |
312 void LayerAnimator::ProgressAnimationToEnd(LayerAnimationSequence* sequence) { | 368 void LayerAnimator::ProgressAnimationToEnd(LayerAnimationSequence* sequence) { |
313 if (!delegate()) | 369 if (!delegate()) |
314 return; | 370 return; |
315 | 371 |
316 sequence->ProgressToEnd(delegate()); | 372 sequence->ProgressToEnd(delegate()); |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
392 else if (!should_start && is_started_) | 448 else if (!should_start && is_started_) |
393 GetAnimationContainer()->Stop(this); | 449 GetAnimationContainer()->Stop(this); |
394 | 450 |
395 is_started_ = should_start; | 451 is_started_ = should_start; |
396 } | 452 } |
397 | 453 |
398 LayerAnimationSequence* LayerAnimator::RemoveAnimation( | 454 LayerAnimationSequence* LayerAnimator::RemoveAnimation( |
399 LayerAnimationSequence* sequence) { | 455 LayerAnimationSequence* sequence) { |
400 linked_ptr<LayerAnimationSequence> to_return; | 456 linked_ptr<LayerAnimationSequence> to_return; |
401 | 457 |
| 458 bool is_running = false; |
| 459 |
402 // First remove from running animations | 460 // First remove from running animations |
403 for (RunningAnimations::iterator iter = running_animations_.begin(); | 461 for (RunningAnimations::iterator iter = running_animations_.begin(); |
404 iter != running_animations_.end(); ++iter) { | 462 iter != running_animations_.end(); ++iter) { |
405 if ((*iter).sequence() == sequence) { | 463 if ((*iter).sequence() == sequence) { |
406 running_animations_.erase(iter); | 464 running_animations_.erase(iter); |
| 465 is_running = true; |
407 break; | 466 break; |
408 } | 467 } |
409 } | 468 } |
410 | 469 |
411 // Then remove from the queue | 470 // Then remove from the queue |
412 for (AnimationQueue::iterator queue_iter = animation_queue_.begin(); | 471 for (AnimationQueue::iterator queue_iter = animation_queue_.begin(); |
413 queue_iter != animation_queue_.end(); ++queue_iter) { | 472 queue_iter != animation_queue_.end(); ++queue_iter) { |
414 if ((*queue_iter) == sequence) { | 473 if ((*queue_iter) == sequence) { |
415 to_return = *queue_iter; | 474 to_return = *queue_iter; |
416 animation_queue_.erase(queue_iter); | 475 animation_queue_.erase(queue_iter); |
417 break; | 476 break; |
418 } | 477 } |
419 } | 478 } |
420 | 479 |
| 480 if (!to_return.get() || |
| 481 !to_return->waiting_for_group_start() || |
| 482 !to_return->IsFirstElementThreaded()) |
| 483 return to_return.release(); |
| 484 |
| 485 // The removed sequence may have been responsible for making other sequences |
| 486 // wait for a group start. If no other sequences in the group have a |
| 487 // threaded first element, the group no longer needs the additional wait. |
| 488 bool is_wait_still_needed = false; |
| 489 int group_id = to_return->animation_group_id(); |
| 490 for (AnimationQueue::iterator queue_iter = animation_queue_.begin(); |
| 491 queue_iter != animation_queue_.end(); ++queue_iter) { |
| 492 if (((*queue_iter)->animation_group_id() == group_id) && |
| 493 (*queue_iter)->IsFirstElementThreaded()) { |
| 494 is_wait_still_needed = true; |
| 495 break; |
| 496 } |
| 497 } |
| 498 |
| 499 if (is_wait_still_needed) |
| 500 return to_return.release(); |
| 501 |
| 502 for (AnimationQueue::iterator queue_iter = animation_queue_.begin(); |
| 503 queue_iter != animation_queue_.end(); ++queue_iter) { |
| 504 if ((*queue_iter)->animation_group_id() == group_id && |
| 505 (*queue_iter)->waiting_for_group_start()) { |
| 506 (*queue_iter)->set_waiting_for_group_start(false); |
| 507 if (is_running) { |
| 508 (*queue_iter)->set_start_time(last_step_time_); |
| 509 (*queue_iter)->Start(delegate()); |
| 510 } |
| 511 } |
| 512 } |
421 return to_return.release(); | 513 return to_return.release(); |
422 } | 514 } |
423 | 515 |
424 void LayerAnimator::FinishAnimation( | 516 void LayerAnimator::FinishAnimation( |
425 LayerAnimationSequence* sequence, bool abort) { | 517 LayerAnimationSequence* sequence, bool abort) { |
426 scoped_refptr<LayerAnimator> retain(this); | 518 scoped_refptr<LayerAnimator> retain(this); |
427 scoped_ptr<LayerAnimationSequence> removed(RemoveAnimation(sequence)); | 519 scoped_ptr<LayerAnimationSequence> removed(RemoveAnimation(sequence)); |
428 if (abort) | 520 if (abort) |
429 sequence->Abort(); | 521 sequence->Abort(delegate()); |
430 else | 522 else |
431 ProgressAnimationToEnd(sequence); | 523 ProgressAnimationToEnd(sequence); |
432 ProcessQueue(); | 524 ProcessQueue(); |
433 UpdateAnimationState(); | 525 UpdateAnimationState(); |
434 } | 526 } |
435 | 527 |
436 void LayerAnimator::FinishAnyAnimationWithZeroDuration() { | 528 void LayerAnimator::FinishAnyAnimationWithZeroDuration() { |
437 scoped_refptr<LayerAnimator> retain(this); | 529 scoped_refptr<LayerAnimator> retain(this); |
438 // Special case: if we've started a 0 duration animation, just finish it now | 530 // Special case: if we've started a 0 duration animation, just finish it now |
439 // and get rid of it. We need to make a copy because Progress may indirectly | 531 // and get rid of it. We need to make a copy because Progress may indirectly |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
495 RunningAnimations running_animations_copy = running_animations_; | 587 RunningAnimations running_animations_copy = running_animations_; |
496 for (size_t i = 0; i < running_animations_copy.size(); ++i) { | 588 for (size_t i = 0; i < running_animations_copy.size(); ++i) { |
497 if (!SAFE_INVOKE_BOOL(HasAnimation, running_animations_copy[i])) | 589 if (!SAFE_INVOKE_BOOL(HasAnimation, running_animations_copy[i])) |
498 continue; | 590 continue; |
499 | 591 |
500 if (running_animations_copy[i].sequence()->HasCommonProperty( | 592 if (running_animations_copy[i].sequence()->HasCommonProperty( |
501 sequence->properties())) { | 593 sequence->properties())) { |
502 scoped_ptr<LayerAnimationSequence> removed( | 594 scoped_ptr<LayerAnimationSequence> removed( |
503 SAFE_INVOKE_PTR(RemoveAnimation, running_animations_copy[i])); | 595 SAFE_INVOKE_PTR(RemoveAnimation, running_animations_copy[i])); |
504 if (abort) | 596 if (abort) |
505 running_animations_copy[i].sequence()->Abort(); | 597 running_animations_copy[i].sequence()->Abort(delegate()); |
506 else | 598 else |
507 SAFE_INVOKE_VOID(ProgressAnimationToEnd, running_animations_copy[i]); | 599 SAFE_INVOKE_VOID(ProgressAnimationToEnd, running_animations_copy[i]); |
508 } | 600 } |
509 } | 601 } |
510 | 602 |
511 // Same for the queued animations that haven't been started. Again, we'll | 603 // Same for the queued animations that haven't been started. Again, we'll |
512 // need to operate on a copy. | 604 // need to operate on a copy. |
513 std::vector<base::WeakPtr<LayerAnimationSequence> > sequences; | 605 std::vector<base::WeakPtr<LayerAnimationSequence> > sequences; |
514 for (AnimationQueue::iterator queue_iter = animation_queue_.begin(); | 606 for (AnimationQueue::iterator queue_iter = animation_queue_.begin(); |
515 queue_iter != animation_queue_.end(); ++queue_iter) | 607 queue_iter != animation_queue_.end(); ++queue_iter) |
516 sequences.push_back((*queue_iter)->AsWeakPtr()); | 608 sequences.push_back((*queue_iter)->AsWeakPtr()); |
517 | 609 |
518 for (size_t i = 0; i < sequences.size(); ++i) { | 610 for (size_t i = 0; i < sequences.size(); ++i) { |
519 if (!sequences[i] || !HasAnimation(sequences[i])) | 611 if (!sequences[i] || !HasAnimation(sequences[i])) |
520 continue; | 612 continue; |
521 | 613 |
522 if (sequences[i]->HasCommonProperty(sequence->properties())) { | 614 if (sequences[i]->HasCommonProperty(sequence->properties())) { |
523 scoped_ptr<LayerAnimationSequence> removed(RemoveAnimation(sequences[i])); | 615 scoped_ptr<LayerAnimationSequence> removed(RemoveAnimation(sequences[i])); |
524 if (abort) | 616 if (abort) |
525 sequences[i]->Abort(); | 617 sequences[i]->Abort(delegate()); |
526 else | 618 else |
527 ProgressAnimationToEnd(sequences[i]); | 619 ProgressAnimationToEnd(sequences[i]); |
528 } | 620 } |
529 } | 621 } |
530 } | 622 } |
531 | 623 |
532 void LayerAnimator::ImmediatelySetNewTarget(LayerAnimationSequence* sequence) { | 624 void LayerAnimator::ImmediatelySetNewTarget(LayerAnimationSequence* sequence) { |
533 // Need to detect if our sequence gets destroyed. | 625 // Need to detect if our sequence gets destroyed. |
534 base::WeakPtr<LayerAnimationSequence> weak_sequence_ptr = | 626 base::WeakPtr<LayerAnimationSequence> weak_sequence_ptr = |
535 sequence->AsWeakPtr(); | 627 sequence->AsWeakPtr(); |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
677 // last_tick_time() from there to ensure animations started during the same | 769 // last_tick_time() from there to ensure animations started during the same |
678 // event complete at the same time. | 770 // event complete at the same time. |
679 base::TimeTicks start_time; | 771 base::TimeTicks start_time; |
680 if (is_animating() || adding_animations_) | 772 if (is_animating() || adding_animations_) |
681 start_time = last_step_time_; | 773 start_time = last_step_time_; |
682 else if (GetAnimationContainer()->is_running()) | 774 else if (GetAnimationContainer()->is_running()) |
683 start_time = GetAnimationContainer()->last_tick_time(); | 775 start_time = GetAnimationContainer()->last_tick_time(); |
684 else | 776 else |
685 start_time = base::TimeTicks::Now(); | 777 start_time = base::TimeTicks::Now(); |
686 | 778 |
687 sequence->set_start_time(start_time); | 779 if (!sequence->animation_group_id()) |
| 780 sequence->set_animation_group_id(cc::AnimationIdProvider::NextGroupId()); |
| 781 if (!sequence->waiting_for_group_start() || |
| 782 sequence->IsFirstElementThreaded()) { |
| 783 sequence->set_start_time(start_time); |
| 784 sequence->Start(delegate()); |
| 785 } |
688 running_animations_.push_back( | 786 running_animations_.push_back( |
689 RunningAnimation(sequence->AsWeakPtr())); | 787 RunningAnimation(sequence->AsWeakPtr())); |
690 | 788 |
691 // Need to keep a reference to the animation. | 789 // Need to keep a reference to the animation. |
692 AddToQueueIfNotPresent(sequence); | 790 AddToQueueIfNotPresent(sequence); |
693 | 791 |
694 // Ensure that animations get stepped at their start time. | 792 // Ensure that animations get stepped at their start time. |
695 Step(start_time); | 793 Step(start_time); |
696 | 794 |
697 return true; | 795 return true; |
(...skipping 28 matching lines...) Expand all Loading... |
726 // Abort should never affect the set of running animations, but just in case | 824 // Abort should never affect the set of running animations, but just in case |
727 // clients are badly behaved, we will use a copy of the running animations. | 825 // clients are badly behaved, we will use a copy of the running animations. |
728 RunningAnimations running_animations_copy = running_animations_; | 826 RunningAnimations running_animations_copy = running_animations_; |
729 for (size_t i = 0; i < running_animations_copy.size(); ++i) { | 827 for (size_t i = 0; i < running_animations_copy.size(); ++i) { |
730 if (!SAFE_INVOKE_BOOL(HasAnimation, running_animations_copy[i])) | 828 if (!SAFE_INVOKE_BOOL(HasAnimation, running_animations_copy[i])) |
731 continue; | 829 continue; |
732 | 830 |
733 scoped_ptr<LayerAnimationSequence> removed( | 831 scoped_ptr<LayerAnimationSequence> removed( |
734 RemoveAnimation(running_animations_copy[i].sequence())); | 832 RemoveAnimation(running_animations_copy[i].sequence())); |
735 if (removed.get()) | 833 if (removed.get()) |
736 removed->Abort(); | 834 removed->Abort(delegate()); |
737 } | 835 } |
738 // This *should* have cleared the list of running animations. | 836 // This *should* have cleared the list of running animations. |
739 DCHECK(running_animations_.empty()); | 837 DCHECK(running_animations_.empty()); |
740 running_animations_.clear(); | 838 running_animations_.clear(); |
741 animation_queue_.clear(); | 839 animation_queue_.clear(); |
742 UpdateAnimationState(); | 840 UpdateAnimationState(); |
743 } | 841 } |
744 | 842 |
745 void LayerAnimator::PurgeDeletedAnimations() { | 843 void LayerAnimator::PurgeDeletedAnimations() { |
746 for (size_t i = 0; i < running_animations_.size();) { | 844 for (size_t i = 0; i < running_animations_.size();) { |
747 if (!running_animations_[i].is_sequence_alive()) | 845 if (!running_animations_[i].is_sequence_alive()) |
748 running_animations_.erase(running_animations_.begin() + i); | 846 running_animations_.erase(running_animations_.begin() + i); |
749 else | 847 else |
750 i++; | 848 i++; |
751 } | 849 } |
752 } | 850 } |
753 | 851 |
754 LayerAnimator::RunningAnimation::RunningAnimation( | 852 LayerAnimator::RunningAnimation::RunningAnimation( |
755 const base::WeakPtr<LayerAnimationSequence>& sequence) | 853 const base::WeakPtr<LayerAnimationSequence>& sequence) |
756 : sequence_(sequence) { | 854 : sequence_(sequence) { |
757 } | 855 } |
758 | 856 |
759 LayerAnimator::RunningAnimation::~RunningAnimation() { } | 857 LayerAnimator::RunningAnimation::~RunningAnimation() { } |
760 | 858 |
761 } // namespace ui | 859 } // namespace ui |
OLD | NEW |