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

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

Issue 429223002: Reduced iterations for group-id check in MarkAnimationsForDeletions (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Added small nit changes Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/animation/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
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;
727 728
729 animations_with_same_group_id.reserve(animations_.size());
728 // Non-aborted animations are marked for deletion after a corresponding 730 // Non-aborted animations are marked for deletion after a corresponding
729 // AnimationEvent::Finished event is sent or received. This means that if 731 // 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 732 // 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. 733 // have received a finished event before marking them for deletion.
732 for (size_t i = 0; i < animations_.size(); i++) { 734 for (size_t i = 0; i < animations_.size(); i++) {
733 int group_id = animations_[i]->group(); 735 int group_id = animations_[i]->group();
734 if (animations_[i]->run_state() == Animation::Aborted) { 736 if (animations_[i]->run_state() == Animation::Aborted) {
735 if (events && !animations_[i]->is_impl_only()) { 737 if (events && !animations_[i]->is_impl_only()) {
736 AnimationEvent aborted_event(AnimationEvent::Aborted, 738 AnimationEvent aborted_event(AnimationEvent::Aborted,
737 id_, 739 id_,
(...skipping 12 matching lines...) Expand all
750 752
751 // Since deleting an animation on the main thread leads to its deletion 753 // 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 754 // 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. 755 // deletion once it has received a Finished event from the impl thread.
754 bool animation_i_will_send_or_has_received_finish_event = 756 bool animation_i_will_send_or_has_received_finish_event =
755 events || animations_[i]->received_finished_event(); 757 events || animations_[i]->received_finished_event();
756 // If an animation is finished, and not already marked for deletion, 758 // 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. 759 // find out if all other animations in the same group are also finished.
758 if (animations_[i]->run_state() == Animation::Finished && 760 if (animations_[i]->run_state() == Animation::Finished &&
759 animation_i_will_send_or_has_received_finish_event) { 761 animation_i_will_send_or_has_received_finish_event) {
762 // Clear the animations_with_same_group_id if it was added for
763 // the previous animation's iteration.
764 if (animations_with_same_group_id.size() > 0)
765 animations_with_same_group_id.clear();
760 all_anims_with_same_id_are_finished = true; 766 all_anims_with_same_id_are_finished = true;
761 for (size_t j = 0; j < animations_.size(); ++j) { 767 for (size_t j = 0; j < animations_.size(); ++j) {
762 bool animation_j_will_send_or_has_received_finish_event = 768 bool animation_j_will_send_or_has_received_finish_event =
763 events || animations_[j]->received_finished_event(); 769 events || animations_[j]->received_finished_event();
764 if (group_id == animations_[j]->group() && 770 if (group_id == animations_[j]->group()) {
765 (!animations_[j]->is_finished() || 771 if (!animations_[j]->is_finished() ||
766 (animations_[j]->run_state() == Animation::Finished && 772 (animations_[j]->run_state() == Animation::Finished &&
767 !animation_j_will_send_or_has_received_finish_event))) { 773 !animation_j_will_send_or_has_received_finish_event)) {
768 all_anims_with_same_id_are_finished = false; 774 all_anims_with_same_id_are_finished = false;
769 break; 775 break;
776 } else if (j >= i &&
777 animations_[j]->run_state() != Animation::Aborted) {
778 // Mark down the animations which belong to the same group
779 // and is not yet aborted. If this current iteration finds that all
780 // animations with same ID are finished, then the marked
781 // animations below will be set to WaitingForDeletion in next
782 // iteration.
783 animations_with_same_group_id.push_back(j);
784 }
770 } 785 }
771 } 786 }
772 } 787 }
773 if (all_anims_with_same_id_are_finished) { 788 if (all_anims_with_same_id_are_finished) {
774 // We now need to remove all animations with the same group id as 789 // We now need to remove all animations with the same group id as
775 // group_id (and send along animation finished notifications, if 790 // group_id (and send along animation finished notifications, if
776 // necessary). 791 // necessary).
777 for (size_t j = i; j < animations_.size(); j++) { 792 for (size_t j = 0; j < animations_with_same_group_id.size(); j++) {
778 if (animations_[j]->group() == group_id && 793 size_t animation_index = animations_with_same_group_id[j];
779 animations_[j]->run_state() != Animation::Aborted) {
780 if (events) { 794 if (events) {
781 AnimationEvent finished_event(AnimationEvent::Finished, 795 AnimationEvent finished_event(
782 id_, 796 AnimationEvent::Finished,
783 animations_[j]->group(), 797 id_,
784 animations_[j]->target_property(), 798 animations_[animation_index]->group(),
785 monotonic_time); 799 animations_[animation_index]->target_property(),
786 finished_event.is_impl_only = animations_[j]->is_impl_only(); 800 monotonic_time);
801 finished_event.is_impl_only =
802 animations_[animation_index]->is_impl_only();
787 if (finished_event.is_impl_only) 803 if (finished_event.is_impl_only)
788 NotifyAnimationFinished(finished_event); 804 NotifyAnimationFinished(finished_event);
789 else 805 else
790 events->push_back(finished_event); 806 events->push_back(finished_event);
791 } 807 }
792 animations_[j]->SetRunState(Animation::WaitingForDeletion, 808 animations_[animation_index]->SetRunState(
793 monotonic_time); 809 Animation::WaitingForDeletion, monotonic_time);
794 }
795 } 810 }
796 marked_animations_for_deletions = true; 811 marked_animations_for_deletions = true;
797 } 812 }
798 } 813 }
799 if (marked_animations_for_deletions) 814 if (marked_animations_for_deletions)
800 NotifyObserversAnimationWaitingForDeletion(); 815 NotifyObserversAnimationWaitingForDeletion();
801 } 816 }
802 817
803 static bool IsWaitingForDeletion(Animation* animation) { 818 static bool IsWaitingForDeletion(Animation* animation) {
804 return animation->run_state() == Animation::WaitingForDeletion; 819 return animation->run_state() == Animation::WaitingForDeletion;
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after
985 value_observers_); 1000 value_observers_);
986 LayerAnimationValueObserver* obs; 1001 LayerAnimationValueObserver* obs;
987 while ((obs = it.GetNext()) != NULL) 1002 while ((obs = it.GetNext()) != NULL)
988 if (obs->IsActive()) 1003 if (obs->IsActive())
989 return true; 1004 return true;
990 } 1005 }
991 return false; 1006 return false;
992 } 1007 }
993 1008
994 } // namespace cc 1009 } // namespace cc
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698