Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 | 8 |
| 9 #include "cc/animation/animation.h" | 9 #include "cc/animation/animation.h" |
| 10 #include "cc/animation/animation_delegate.h" | 10 #include "cc/animation/animation_delegate.h" |
| (...skipping 706 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 717 animations_[i]->run_state() != Animation::Aborted && | 717 animations_[i]->run_state() != Animation::Aborted && |
| 718 animations_[i]->run_state() != Animation::WaitingForDeletion) | 718 animations_[i]->run_state() != Animation::WaitingForDeletion) |
| 719 animations_[i]->SetRunState(Animation::Finished, monotonic_time); | 719 animations_[i]->SetRunState(Animation::Finished, monotonic_time); |
| 720 } | 720 } |
| 721 } | 721 } |
| 722 | 722 |
| 723 void LayerAnimationController::MarkAnimationsForDeletion( | 723 void LayerAnimationController::MarkAnimationsForDeletion( |
| 724 base::TimeTicks monotonic_time, | 724 base::TimeTicks monotonic_time, |
| 725 AnimationEventsVector* events) { | 725 AnimationEventsVector* events) { |
| 726 bool marked_animations_for_deletions = false; | 726 bool marked_animations_for_deletions = false; |
| 727 std::vector<size_t> animations_with_same_group_id; | |
| 728 size_t animations_with_same_group_id_count_; | |
| 729 bool animations_with_same_group_id_reserved = false; | |
| 727 | 730 |
| 728 // Non-aborted animations are marked for deletion after a corresponding | 731 // Non-aborted animations are marked for deletion after a corresponding |
| 729 // AnimationEvent::Finished event is sent or received. This means that if | 732 // AnimationEvent::Finished event is sent or received. This means that if |
| 730 // we don't have an events vector, we must ensure that non-aborted animations | 733 // we don't have an events vector, we must ensure that non-aborted animations |
| 731 // have received a finished event before marking them for deletion. | 734 // have received a finished event before marking them for deletion. |
| 732 for (size_t i = 0; i < animations_.size(); i++) { | 735 for (size_t i = 0; i < animations_.size(); i++) { |
| 733 int group_id = animations_[i]->group(); | 736 int group_id = animations_[i]->group(); |
| 734 if (animations_[i]->run_state() == Animation::Aborted) { | 737 if (animations_[i]->run_state() == Animation::Aborted) { |
| 735 if (events && !animations_[i]->is_impl_only()) { | 738 if (events && !animations_[i]->is_impl_only()) { |
| 736 AnimationEvent aborted_event(AnimationEvent::Aborted, | 739 AnimationEvent aborted_event(AnimationEvent::Aborted, |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 749 bool all_anims_with_same_id_are_finished = false; | 752 bool all_anims_with_same_id_are_finished = false; |
| 750 | 753 |
| 751 // Since deleting an animation on the main thread leads to its deletion | 754 // Since deleting an animation on the main thread leads to its deletion |
| 752 // on the impl thread, we only mark a Finished main thread animation for | 755 // on the impl thread, we only mark a Finished main thread animation for |
| 753 // deletion once it has received a Finished event from the impl thread. | 756 // deletion once it has received a Finished event from the impl thread. |
| 754 bool animation_i_will_send_or_has_received_finish_event = | 757 bool animation_i_will_send_or_has_received_finish_event = |
| 755 events || animations_[i]->received_finished_event(); | 758 events || animations_[i]->received_finished_event(); |
| 756 // If an animation is finished, and not already marked for deletion, | 759 // If an animation is finished, and not already marked for deletion, |
| 757 // find out if all other animations in the same group are also finished. | 760 // find out if all other animations in the same group are also finished. |
| 758 if (animations_[i]->run_state() == Animation::Finished && | 761 if (animations_[i]->run_state() == Animation::Finished && |
| 759 animation_i_will_send_or_has_received_finish_event) { | 762 animation_i_will_send_or_has_received_finish_event) { |
|
ajuma
2014/07/30 15:22:47
What if you just create the animations_with_same_g
shreyas.g
2014/07/30 15:52:59
Thanks Ajuma. The problem here is that, if i decla
ajuma
2014/07/30 16:00:00
Hmm. Creating a vector for each animation in the m
shreyas.g
2014/08/01 08:44:04
Yes, clear is working now. I had previously tried
| |
| 763 // Reset the count of marked animations in animations_with_same_group_id. | |
| 764 // This is done to avoid the usage of vector.clear() method | |
| 765 // which is a costly operation. | |
| 766 animations_with_same_group_id_count_ = 0; | |
| 760 all_anims_with_same_id_are_finished = true; | 767 all_anims_with_same_id_are_finished = true; |
| 761 for (size_t j = 0; j < animations_.size(); ++j) { | 768 for (size_t j = 0; j < animations_.size(); ++j) { |
| 762 bool animation_j_will_send_or_has_received_finish_event = | 769 bool animation_j_will_send_or_has_received_finish_event = |
| 763 events || animations_[j]->received_finished_event(); | 770 events || animations_[j]->received_finished_event(); |
| 764 if (group_id == animations_[j]->group() && | 771 if (group_id == animations_[j]->group()) { |
| 765 (!animations_[j]->is_finished() || | 772 if (!animations_[j]->is_finished() || |
| 766 (animations_[j]->run_state() == Animation::Finished && | 773 (animations_[j]->run_state() == Animation::Finished && |
| 767 !animation_j_will_send_or_has_received_finish_event))) { | 774 !animation_j_will_send_or_has_received_finish_event)) { |
| 768 all_anims_with_same_id_are_finished = false; | 775 all_anims_with_same_id_are_finished = false; |
| 769 break; | 776 break; |
| 777 } else if (j >= i && | |
| 778 animations_[j]->run_state() != Animation::Aborted) { | |
| 779 // Mark down the animations which belong to the same group | |
| 780 // and is not yet aborted. If this current iteration finds that all | |
| 781 // animations with same ID are finished, then the marked | |
| 782 // animations below will be set to waitingForDeletion in next | |
| 783 // iteration. | |
| 784 animations_with_same_group_id.push_back(j); | |
| 785 animations_with_same_group_id_count_++; | |
| 786 // The animation list belonging to same group needs to be only | |
| 787 // reserved in case atleast one other animation has the same ID | |
| 788 // and is not aborted yet. Once reserved, it can be used till the | |
| 789 // function exits. This avoids reserving in cases no other animation | |
| 790 // is marked in current iteration. | |
| 791 if (!animations_with_same_group_id_reserved) { | |
| 792 animations_with_same_group_id_reserved = true; | |
| 793 animations_with_same_group_id.reserve(animations_.size()); | |
| 794 } | |
| 795 } | |
| 770 } | 796 } |
| 771 } | 797 } |
| 772 } | 798 } |
| 773 if (all_anims_with_same_id_are_finished) { | 799 if (all_anims_with_same_id_are_finished) { |
| 774 // We now need to remove all animations with the same group id as | 800 // We now need to remove all animations with the same group id as |
| 775 // group_id (and send along animation finished notifications, if | 801 // group_id (and send along animation finished notifications, if |
| 776 // necessary). | 802 // necessary). Since the list is already maintained in anims_same_group |
| 777 for (size_t j = i; j < animations_.size(); j++) { | 803 // just need to traverse that list. |
| 778 if (animations_[j]->group() == group_id && | 804 for (size_t j = 0; j < animations_with_same_group_id_count_; j++) { |
| 779 animations_[j]->run_state() != Animation::Aborted) { | 805 size_t animation_index = animations_with_same_group_id[j]; |
| 780 if (events) { | 806 if (events) { |
| 781 AnimationEvent finished_event(AnimationEvent::Finished, | 807 AnimationEvent finished_event( |
| 782 id_, | 808 AnimationEvent::Finished, |
| 783 animations_[j]->group(), | 809 id_, |
| 784 animations_[j]->target_property(), | 810 animations_[animation_index]->group(), |
| 785 monotonic_time); | 811 animations_[animation_index]->target_property(), |
| 786 finished_event.is_impl_only = animations_[j]->is_impl_only(); | 812 monotonic_time); |
| 813 finished_event.is_impl_only = | |
| 814 animations_[animation_index]->is_impl_only(); | |
| 787 if (finished_event.is_impl_only) | 815 if (finished_event.is_impl_only) |
| 788 NotifyAnimationFinished(finished_event); | 816 NotifyAnimationFinished(finished_event); |
| 789 else | 817 else |
| 790 events->push_back(finished_event); | 818 events->push_back(finished_event); |
| 791 } | 819 } |
| 792 animations_[j]->SetRunState(Animation::WaitingForDeletion, | 820 animations_[animation_index]->SetRunState( |
| 793 monotonic_time); | 821 Animation::WaitingForDeletion, monotonic_time); |
| 794 } | |
| 795 } | 822 } |
| 796 marked_animations_for_deletions = true; | 823 marked_animations_for_deletions = true; |
| 797 } | 824 } |
| 798 } | 825 } |
| 799 if (marked_animations_for_deletions) | 826 if (marked_animations_for_deletions) |
| 800 NotifyObserversAnimationWaitingForDeletion(); | 827 NotifyObserversAnimationWaitingForDeletion(); |
| 801 } | 828 } |
| 802 | 829 |
| 803 static bool IsWaitingForDeletion(Animation* animation) { | 830 static bool IsWaitingForDeletion(Animation* animation) { |
| 804 return animation->run_state() == Animation::WaitingForDeletion; | 831 return animation->run_state() == Animation::WaitingForDeletion; |
| (...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 985 value_observers_); | 1012 value_observers_); |
| 986 LayerAnimationValueObserver* obs; | 1013 LayerAnimationValueObserver* obs; |
| 987 while ((obs = it.GetNext()) != NULL) | 1014 while ((obs = it.GetNext()) != NULL) |
| 988 if (obs->IsActive()) | 1015 if (obs->IsActive()) |
| 989 return true; | 1016 return true; |
| 990 } | 1017 } |
| 991 return false; | 1018 return false; |
| 992 } | 1019 } |
| 993 | 1020 |
| 994 } // namespace cc | 1021 } // namespace cc |
| OLD | NEW |