| 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 "cc/animation_id_provider.h" |
| (...skipping 571 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 582 LayerAnimationSequence* sequence, bool abort) { | 582 LayerAnimationSequence* sequence, bool abort) { |
| 583 // For all the running animations, if they animate the same property, | 583 // For all the running animations, if they animate the same property, |
| 584 // progress them to the end and remove them. Note, Aborting or Progressing | 584 // progress them to the end and remove them. Note, Aborting or Progressing |
| 585 // animations may affect the collection of running animations, so we need to | 585 // animations may affect the collection of running animations, so we need to |
| 586 // operate on a copy. | 586 // operate on a copy. |
| 587 RunningAnimations running_animations_copy = running_animations_; | 587 RunningAnimations running_animations_copy = running_animations_; |
| 588 for (size_t i = 0; i < running_animations_copy.size(); ++i) { | 588 for (size_t i = 0; i < running_animations_copy.size(); ++i) { |
| 589 if (!SAFE_INVOKE_BOOL(HasAnimation, running_animations_copy[i])) | 589 if (!SAFE_INVOKE_BOOL(HasAnimation, running_animations_copy[i])) |
| 590 continue; | 590 continue; |
| 591 | 591 |
| 592 if (running_animations_copy[i].sequence()->HasCommonProperty( | 592 if (running_animations_copy[i].sequence()->HasConflictingProperty( |
| 593 sequence->properties())) { | 593 sequence->properties())) { |
| 594 scoped_ptr<LayerAnimationSequence> removed( | 594 scoped_ptr<LayerAnimationSequence> removed( |
| 595 SAFE_INVOKE_PTR(RemoveAnimation, running_animations_copy[i])); | 595 SAFE_INVOKE_PTR(RemoveAnimation, running_animations_copy[i])); |
| 596 if (abort) | 596 if (abort) |
| 597 running_animations_copy[i].sequence()->Abort(delegate()); | 597 running_animations_copy[i].sequence()->Abort(delegate()); |
| 598 else | 598 else |
| 599 SAFE_INVOKE_VOID(ProgressAnimationToEnd, running_animations_copy[i]); | 599 SAFE_INVOKE_VOID(ProgressAnimationToEnd, running_animations_copy[i]); |
| 600 } | 600 } |
| 601 } | 601 } |
| 602 | 602 |
| 603 // 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 |
| 604 // need to operate on a copy. | 604 // need to operate on a copy. |
| 605 std::vector<base::WeakPtr<LayerAnimationSequence> > sequences; | 605 std::vector<base::WeakPtr<LayerAnimationSequence> > sequences; |
| 606 for (AnimationQueue::iterator queue_iter = animation_queue_.begin(); | 606 for (AnimationQueue::iterator queue_iter = animation_queue_.begin(); |
| 607 queue_iter != animation_queue_.end(); ++queue_iter) | 607 queue_iter != animation_queue_.end(); ++queue_iter) |
| 608 sequences.push_back((*queue_iter)->AsWeakPtr()); | 608 sequences.push_back((*queue_iter)->AsWeakPtr()); |
| 609 | 609 |
| 610 for (size_t i = 0; i < sequences.size(); ++i) { | 610 for (size_t i = 0; i < sequences.size(); ++i) { |
| 611 if (!sequences[i] || !HasAnimation(sequences[i])) | 611 if (!sequences[i] || !HasAnimation(sequences[i])) |
| 612 continue; | 612 continue; |
| 613 | 613 |
| 614 if (sequences[i]->HasCommonProperty(sequence->properties())) { | 614 if (sequences[i]->HasConflictingProperty(sequence->properties())) { |
| 615 scoped_ptr<LayerAnimationSequence> removed(RemoveAnimation(sequences[i])); | 615 scoped_ptr<LayerAnimationSequence> removed(RemoveAnimation(sequences[i])); |
| 616 if (abort) | 616 if (abort) |
| 617 sequences[i]->Abort(delegate()); | 617 sequences[i]->Abort(delegate()); |
| 618 else | 618 else |
| 619 ProgressAnimationToEnd(sequences[i]); | 619 ProgressAnimationToEnd(sequences[i]); |
| 620 } | 620 } |
| 621 } | 621 } |
| 622 } | 622 } |
| 623 | 623 |
| 624 void LayerAnimator::ImmediatelySetNewTarget(LayerAnimationSequence* sequence) { | 624 void LayerAnimator::ImmediatelySetNewTarget(LayerAnimationSequence* sequence) { |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 722 // need to operate on a copy. | 722 // need to operate on a copy. |
| 723 std::vector<base::WeakPtr<LayerAnimationSequence> > sequences; | 723 std::vector<base::WeakPtr<LayerAnimationSequence> > sequences; |
| 724 for (AnimationQueue::iterator queue_iter = animation_queue_.begin(); | 724 for (AnimationQueue::iterator queue_iter = animation_queue_.begin(); |
| 725 queue_iter != animation_queue_.end(); ++queue_iter) | 725 queue_iter != animation_queue_.end(); ++queue_iter) |
| 726 sequences.push_back((*queue_iter)->AsWeakPtr()); | 726 sequences.push_back((*queue_iter)->AsWeakPtr()); |
| 727 | 727 |
| 728 for (size_t i = 0; i < sequences.size(); ++i) { | 728 for (size_t i = 0; i < sequences.size(); ++i) { |
| 729 if (!sequences[i] || !HasAnimation(sequences[i])) | 729 if (!sequences[i] || !HasAnimation(sequences[i])) |
| 730 continue; | 730 continue; |
| 731 | 731 |
| 732 if (!sequences[i]->HasCommonProperty(animated)) { | 732 if (!sequences[i]->HasConflictingProperty(animated)) { |
| 733 StartSequenceImmediately(sequences[i].get()); | 733 StartSequenceImmediately(sequences[i].get()); |
| 734 started_sequence = true; | 734 started_sequence = true; |
| 735 break; | 735 break; |
| 736 } | 736 } |
| 737 | 737 |
| 738 // Animation couldn't be started. Add its properties to the collection so | 738 // Animation couldn't be started. Add its properties to the collection so |
| 739 // that we don't start a conflicting animation. For example, if our queue | 739 // that we don't start a conflicting animation. For example, if our queue |
| 740 // has the elements { {T,B}, {B} } (that is, an element that animates both | 740 // has the elements { {T,B}, {B} } (that is, an element that animates both |
| 741 // the transform and the bounds followed by an element that animates the | 741 // the transform and the bounds followed by an element that animates the |
| 742 // bounds), and we're currently animating the transform, we can't start | 742 // bounds), and we're currently animating the transform, we can't start |
| 743 // the first element because it animates the transform, too. We cannot | 743 // the first element because it animates the transform, too. We cannot |
| 744 // start the second element, either, because the first element animates | 744 // start the second element, either, because the first element animates |
| 745 // bounds too, and needs to go first. | 745 // bounds too, and needs to go first. |
| 746 animated.insert(sequences[i]->properties().begin(), | 746 animated.insert(sequences[i]->properties().begin(), |
| 747 sequences[i]->properties().end()); | 747 sequences[i]->properties().end()); |
| 748 } | 748 } |
| 749 | 749 |
| 750 // If we started a sequence, try again. We may be able to start several. | 750 // If we started a sequence, try again. We may be able to start several. |
| 751 } while (started_sequence); | 751 } while (started_sequence); |
| 752 } | 752 } |
| 753 | 753 |
| 754 bool LayerAnimator::StartSequenceImmediately(LayerAnimationSequence* sequence) { | 754 bool LayerAnimator::StartSequenceImmediately(LayerAnimationSequence* sequence) { |
| 755 PurgeDeletedAnimations(); | 755 PurgeDeletedAnimations(); |
| 756 | 756 |
| 757 // Ensure that no one is animating one of the sequence's properties already. | 757 // Ensure that no one is animating one of the sequence's properties already. |
| 758 for (RunningAnimations::const_iterator iter = running_animations_.begin(); | 758 for (RunningAnimations::const_iterator iter = running_animations_.begin(); |
| 759 iter != running_animations_.end(); ++iter) { | 759 iter != running_animations_.end(); ++iter) { |
| 760 if ((*iter).sequence()->HasCommonProperty(sequence->properties())) | 760 if ((*iter).sequence()->HasConflictingProperty(sequence->properties())) |
| 761 return false; | 761 return false; |
| 762 } | 762 } |
| 763 | 763 |
| 764 // All clear, actually start the sequence. Note: base::TimeTicks::Now has | 764 // All clear, actually start the sequence. Note: base::TimeTicks::Now has |
| 765 // a resolution that can be as bad as 15ms. If this causes glitches in the | 765 // a resolution that can be as bad as 15ms. If this causes glitches in the |
| 766 // animations, this can be switched to HighResNow() (animation uses Now() | 766 // animations, this can be switched to HighResNow() (animation uses Now() |
| 767 // internally). | 767 // internally). |
| 768 // All LayerAnimators share the same AnimationContainer. Use the | 768 // All LayerAnimators share the same AnimationContainer. Use the |
| 769 // 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 |
| 770 // event complete at the same time. | 770 // event complete at the same time. |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 850 } | 850 } |
| 851 | 851 |
| 852 LayerAnimator::RunningAnimation::RunningAnimation( | 852 LayerAnimator::RunningAnimation::RunningAnimation( |
| 853 const base::WeakPtr<LayerAnimationSequence>& sequence) | 853 const base::WeakPtr<LayerAnimationSequence>& sequence) |
| 854 : sequence_(sequence) { | 854 : sequence_(sequence) { |
| 855 } | 855 } |
| 856 | 856 |
| 857 LayerAnimator::RunningAnimation::~RunningAnimation() { } | 857 LayerAnimator::RunningAnimation::~RunningAnimation() { } |
| 858 | 858 |
| 859 } // namespace ui | 859 } // namespace ui |
| OLD | NEW |