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

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

Issue 2357533002: CC Animation: Use std::bitset to update animation state. (Closed)
Patch Set: Reparent. Created 4 years, 2 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 | « cc/animation/animation_player.h ('k') | cc/animation/element_animations.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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/animation_player.h" 5 #include "cc/animation/animation_player.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "cc/animation/animation_delegate.h" 9 #include "cc/animation/animation_delegate.h"
10 #include "cc/animation/animation_host.h" 10 #include "cc/animation/animation_host.h"
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
99 // Destroy ElementAnimations or release it if it's still needed. 99 // Destroy ElementAnimations or release it if it's still needed.
100 animation_host_->UnregisterPlayerForElement(element_id_, this); 100 animation_host_->UnregisterPlayerForElement(element_id_, this);
101 } 101 }
102 102
103 void AnimationPlayer::BindElementAnimations() { 103 void AnimationPlayer::BindElementAnimations() {
104 DCHECK(!element_animations_); 104 DCHECK(!element_animations_);
105 element_animations_ = 105 element_animations_ =
106 animation_host_->GetElementAnimationsForElementId(element_id_); 106 animation_host_->GetElementAnimationsForElementId(element_id_);
107 DCHECK(element_animations_); 107 DCHECK(element_animations_);
108 108
109 for (auto& animation : animations_) 109 if (!animations_.empty())
110 AnimationAddedForProperty(animation->target_property()); 110 AnimationAdded();
111 111
112 SetNeedsPushProperties(); 112 SetNeedsPushProperties();
113 } 113 }
114 114
115 void AnimationPlayer::UnbindElementAnimations() { 115 void AnimationPlayer::UnbindElementAnimations() {
116 SetNeedsPushProperties(); 116 SetNeedsPushProperties();
117 element_animations_ = nullptr; 117 element_animations_ = nullptr;
118 } 118 }
119 119
120 void AnimationPlayer::AddAnimation(std::unique_ptr<Animation> animation) { 120 void AnimationPlayer::AddAnimation(std::unique_ptr<Animation> animation) {
121 DCHECK(animation->target_property() != TargetProperty::SCROLL_OFFSET || 121 DCHECK(animation->target_property() != TargetProperty::SCROLL_OFFSET ||
122 (animation_host_ && animation_host_->SupportsScrollAnimations())); 122 (animation_host_ && animation_host_->SupportsScrollAnimations()));
123 DCHECK(!animation->is_impl_only() || 123 DCHECK(!animation->is_impl_only() ||
124 animation->target_property() == TargetProperty::SCROLL_OFFSET); 124 animation->target_property() == TargetProperty::SCROLL_OFFSET);
125 125
126 TargetProperty::Type target_property = animation->target_property();
127 animations_.push_back(std::move(animation)); 126 animations_.push_back(std::move(animation));
128 if (element_animations_) { 127 if (element_animations_) {
129 AnimationAddedForProperty(target_property); 128 AnimationAdded();
130 SetNeedsPushProperties(); 129 SetNeedsPushProperties();
131 } 130 }
132 } 131 }
133 132
134 void AnimationPlayer::AnimationAddedForProperty( 133 void AnimationPlayer::AnimationAdded() {
135 TargetProperty::Type target_property) {
136 DCHECK(element_animations_); 134 DCHECK(element_animations_);
137 135
138 SetNeedsCommit(); 136 SetNeedsCommit();
139 needs_to_start_animations_ = true; 137 needs_to_start_animations_ = true;
140 138
141 element_animations_->UpdateActivationNormal(); 139 element_animations_->UpdateActivationNormal();
142 element_animations_->UpdateClientAnimationState(target_property); 140 element_animations_->UpdateClientAnimationState();
143 } 141 }
144 142
145 void AnimationPlayer::PauseAnimation(int animation_id, double time_offset) { 143 void AnimationPlayer::PauseAnimation(int animation_id, double time_offset) {
146 const base::TimeDelta time_delta = base::TimeDelta::FromSecondsD(time_offset); 144 const base::TimeDelta time_delta = base::TimeDelta::FromSecondsD(time_offset);
147 145
148 for (size_t i = 0; i < animations_.size(); ++i) { 146 for (size_t i = 0; i < animations_.size(); ++i) {
149 if (animations_[i]->id() == animation_id) { 147 if (animations_[i]->id() == animation_id) {
150 animations_[i]->SetRunState(Animation::PAUSED, 148 animations_[i]->SetRunState(Animation::PAUSED,
151 time_delta + animations_[i]->start_time() + 149 time_delta + animations_[i]->start_time() +
152 animations_[i]->time_offset()); 150 animations_[i]->time_offset());
153 } 151 }
154 } 152 }
155 153
156 if (element_animations_) { 154 if (element_animations_) {
157 SetNeedsCommit(); 155 SetNeedsCommit();
158 SetNeedsPushProperties(); 156 SetNeedsPushProperties();
159 } 157 }
160 } 158 }
161 159
162 void AnimationPlayer::RemoveAnimation(int animation_id) { 160 void AnimationPlayer::RemoveAnimation(int animation_id) {
163 bool removed_transform_animation = false; 161 bool animation_removed = false;
164 bool removed_opacity_animation = false; 162
165 bool removed_filter_animation = false;
166 // Since we want to use the animations that we're going to remove, we need to 163 // Since we want to use the animations that we're going to remove, we need to
167 // use a stable_parition here instead of remove_if. Remove_if leaves the 164 // use a stable_parition here instead of remove_if. Remove_if leaves the
168 // removed items in an unspecified state. 165 // removed items in an unspecified state.
169 auto animations_to_remove = std::stable_partition( 166 auto animations_to_remove = std::stable_partition(
170 animations_.begin(), animations_.end(), 167 animations_.begin(), animations_.end(),
171 [animation_id](const std::unique_ptr<Animation>& animation) { 168 [animation_id](const std::unique_ptr<Animation>& animation) {
172 return animation->id() != animation_id; 169 return animation->id() != animation_id;
173 }); 170 });
174 for (auto it = animations_to_remove; it != animations_.end(); ++it) { 171 for (auto it = animations_to_remove; it != animations_.end(); ++it) {
175 if ((*it)->target_property() == TargetProperty::SCROLL_OFFSET) { 172 if ((*it)->target_property() == TargetProperty::SCROLL_OFFSET) {
176 if (element_animations_) 173 if (element_animations_)
177 element_animations_->SetScrollOffsetAnimationWasInterrupted(); 174 element_animations_->SetScrollOffsetAnimationWasInterrupted();
178 } else if ((*it)->target_property() == TargetProperty::TRANSFORM && 175 } else if (!(*it)->is_finished()) {
179 !(*it)->is_finished()) { 176 animation_removed = true;
180 removed_transform_animation = true;
181 } else if ((*it)->target_property() == TargetProperty::OPACITY &&
182 !(*it)->is_finished()) {
183 removed_opacity_animation = true;
184 } else if ((*it)->target_property() == TargetProperty::FILTER &&
185 !(*it)->is_finished()) {
186 removed_filter_animation = true;
187 } 177 }
188 } 178 }
189 179
190 animations_.erase(animations_to_remove, animations_.end()); 180 animations_.erase(animations_to_remove, animations_.end());
191 181
192 if (element_animations_) { 182 if (element_animations_) {
193 element_animations_->UpdateActivationNormal(); 183 element_animations_->UpdateActivationNormal();
194 element_animations_->UpdateClientAnimationState(removed_transform_animation, 184 if (animation_removed)
195 removed_opacity_animation, 185 element_animations_->UpdateClientAnimationState();
196 removed_filter_animation);
197 SetNeedsCommit(); 186 SetNeedsCommit();
198 SetNeedsPushProperties(); 187 SetNeedsPushProperties();
199 } 188 }
200 } 189 }
201 190
202 void AnimationPlayer::AbortAnimation(int animation_id) { 191 void AnimationPlayer::AbortAnimation(int animation_id) {
203 if (Animation* animation = GetAnimationById(animation_id)) { 192 if (Animation* animation = GetAnimationById(animation_id)) {
204 if (!animation->is_finished()) { 193 if (!animation->is_finished()) {
205 animation->SetRunState(Animation::ABORTED, last_tick_time_); 194 animation->SetRunState(Animation::ABORTED, last_tick_time_);
206 if (element_animations_) 195 if (element_animations_)
207 element_animations_->UpdateClientAnimationState( 196 element_animations_->UpdateClientAnimationState();
208 animation->target_property());
209 } 197 }
210 } 198 }
211 199
212 if (element_animations_) { 200 if (element_animations_) {
213 SetNeedsCommit(); 201 SetNeedsCommit();
214 SetNeedsPushProperties(); 202 SetNeedsPushProperties();
215 } 203 }
216 } 204 }
217 205
218 void AnimationPlayer::AbortAnimations(TargetProperty::Type target_property, 206 void AnimationPlayer::AbortAnimations(TargetProperty::Type target_property,
(...skipping 12 matching lines...) Expand all
231 last_tick_time_); 219 last_tick_time_);
232 } else { 220 } else {
233 animations_[i]->SetRunState(Animation::ABORTED, last_tick_time_); 221 animations_[i]->SetRunState(Animation::ABORTED, last_tick_time_);
234 } 222 }
235 aborted_animation = true; 223 aborted_animation = true;
236 } 224 }
237 } 225 }
238 226
239 if (element_animations_) { 227 if (element_animations_) {
240 if (aborted_animation) 228 if (aborted_animation)
241 element_animations_->UpdateClientAnimationState(target_property); 229 element_animations_->UpdateClientAnimationState();
242 SetNeedsCommit(); 230 SetNeedsCommit();
243 SetNeedsPushProperties(); 231 SetNeedsPushProperties();
244 } 232 }
245 } 233 }
246 234
247 void AnimationPlayer::PushPropertiesTo(AnimationPlayer* player_impl) { 235 void AnimationPlayer::PushPropertiesTo(AnimationPlayer* player_impl) {
248 if (!needs_push_properties_) 236 if (!needs_push_properties_)
249 return; 237 return;
250 needs_push_properties_ = false; 238 needs_push_properties_ = false;
251 239
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after
440 animations_[j]->affects_pending_elements(); 428 animations_[j]->affects_pending_elements();
441 } 429 }
442 } 430 }
443 431
444 // Check to see if intersection of the list of properties affected by 432 // Check to see if intersection of the list of properties affected by
445 // the group and the list of currently blocked properties is null, taking 433 // the group and the list of currently blocked properties is null, taking
446 // into account the type(s) of elements affected by the group. In any 434 // into account the type(s) of elements affected by the group. In any
447 // case, the group's target properties need to be added to the lists of 435 // case, the group's target properties need to be added to the lists of
448 // blocked properties. 436 // blocked properties.
449 bool null_intersection = true; 437 bool null_intersection = true;
450 static_assert(TargetProperty::FIRST_TARGET_PROPERTY == 0,
451 "TargetProperty must be 0-based enum");
452 for (int property = TargetProperty::FIRST_TARGET_PROPERTY; 438 for (int property = TargetProperty::FIRST_TARGET_PROPERTY;
453 property <= TargetProperty::LAST_TARGET_PROPERTY; ++property) { 439 property <= TargetProperty::LAST_TARGET_PROPERTY; ++property) {
454 if (enqueued_properties[property]) { 440 if (enqueued_properties[property]) {
455 if (affects_active_elements) { 441 if (affects_active_elements) {
456 if (blocked_properties_for_active_elements[property]) 442 if (blocked_properties_for_active_elements[property])
457 null_intersection = false; 443 null_intersection = false;
458 else 444 else
459 blocked_properties_for_active_elements[property] = true; 445 blocked_properties_for_active_elements[property] = true;
460 } 446 }
461 if (affects_pending_elements) { 447 if (affects_pending_elements) {
(...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after
719 break; 705 break;
720 } 706 }
721 } 707 }
722 } 708 }
723 } 709 }
724 710
725 last_tick_time_ = monotonic_time; 711 last_tick_time_ = monotonic_time;
726 } 712 }
727 713
728 void AnimationPlayer::MarkFinishedAnimations(base::TimeTicks monotonic_time) { 714 void AnimationPlayer::MarkFinishedAnimations(base::TimeTicks monotonic_time) {
729 bool finished_transform_animation = false; 715 bool animation_finished = false;
730 bool finished_opacity_animation = false; 716
731 bool finished_filter_animation = false;
732 for (size_t i = 0; i < animations_.size(); ++i) { 717 for (size_t i = 0; i < animations_.size(); ++i) {
733 if (!animations_[i]->is_finished() && 718 if (!animations_[i]->is_finished() &&
734 animations_[i]->IsFinishedAt(monotonic_time)) { 719 animations_[i]->IsFinishedAt(monotonic_time)) {
735 animations_[i]->SetRunState(Animation::FINISHED, monotonic_time); 720 animations_[i]->SetRunState(Animation::FINISHED, monotonic_time);
736 if (animations_[i]->target_property() == TargetProperty::TRANSFORM) 721 animation_finished = true;
737 finished_transform_animation = true;
738 else if (animations_[i]->target_property() == TargetProperty::OPACITY)
739 finished_opacity_animation = true;
740 else if (animations_[i]->target_property() == TargetProperty::FILTER)
741 finished_filter_animation = true;
742 } 722 }
743 } 723 }
744 724
745 DCHECK(element_animations_); 725 DCHECK(element_animations_);
746 element_animations_->UpdateClientAnimationState(finished_transform_animation, 726 if (animation_finished)
747 finished_opacity_animation, 727 element_animations_->UpdateClientAnimationState();
748 finished_filter_animation);
749 } 728 }
750 729
751 void AnimationPlayer::ActivateAnimations(bool* changed_transform_animation, 730 void AnimationPlayer::ActivateAnimations() {
752 bool* changed_opacity_animation, 731 bool animation_activated = false;
753 bool* changed_filter_animation) { 732
754 for (size_t i = 0; i < animations_.size(); ++i) { 733 for (size_t i = 0; i < animations_.size(); ++i) {
755 if (animations_[i]->affects_active_elements() != 734 if (animations_[i]->affects_active_elements() !=
756 animations_[i]->affects_pending_elements()) { 735 animations_[i]->affects_pending_elements()) {
757 if (animations_[i]->target_property() == TargetProperty::TRANSFORM) 736 animation_activated = true;
758 *changed_transform_animation = true;
759 else if (animations_[i]->target_property() == TargetProperty::OPACITY)
760 *changed_opacity_animation = true;
761 else if (animations_[i]->target_property() == TargetProperty::FILTER)
762 *changed_filter_animation = true;
763 } 737 }
764 animations_[i]->set_affects_active_elements( 738 animations_[i]->set_affects_active_elements(
765 animations_[i]->affects_pending_elements()); 739 animations_[i]->affects_pending_elements());
766 } 740 }
767 auto affects_no_elements = [](const std::unique_ptr<Animation>& animation) { 741 auto affects_no_elements = [](const std::unique_ptr<Animation>& animation) {
768 return !animation->affects_active_elements() && 742 return !animation->affects_active_elements() &&
769 !animation->affects_pending_elements(); 743 !animation->affects_pending_elements();
770 }; 744 };
771 animations_.erase(std::remove_if(animations_.begin(), animations_.end(), 745 animations_.erase(std::remove_if(animations_.begin(), animations_.end(),
772 affects_no_elements), 746 affects_no_elements),
773 animations_.end()); 747 animations_.end());
748
749 if (animation_activated)
750 element_animations_->UpdateClientAnimationState();
774 } 751 }
775 752
776 bool AnimationPlayer::HasFilterAnimationThatInflatesBounds() const { 753 bool AnimationPlayer::HasFilterAnimationThatInflatesBounds() const {
777 for (size_t i = 0; i < animations_.size(); ++i) { 754 for (size_t i = 0; i < animations_.size(); ++i) {
778 if (!animations_[i]->is_finished() && 755 if (!animations_[i]->is_finished() &&
779 animations_[i]->target_property() == TargetProperty::FILTER && 756 animations_[i]->target_property() == TargetProperty::FILTER &&
780 animations_[i] 757 animations_[i]
781 ->curve() 758 ->curve()
782 ->ToFilterAnimationCurve() 759 ->ToFilterAnimationCurve()
783 ->HasFilterThatMovesPixels()) 760 ->HasFilterThatMovesPixels())
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after
989 return nullptr; 966 return nullptr;
990 } 967 }
991 968
992 Animation* AnimationPlayer::GetAnimationById(int animation_id) const { 969 Animation* AnimationPlayer::GetAnimationById(int animation_id) const {
993 for (size_t i = 0; i < animations_.size(); ++i) 970 for (size_t i = 0; i < animations_.size(); ++i)
994 if (animations_[i]->id() == animation_id) 971 if (animations_[i]->id() == animation_id)
995 return animations_[i].get(); 972 return animations_[i].get();
996 return nullptr; 973 return nullptr;
997 } 974 }
998 975
999 void AnimationPlayer::GetPropertyAnimationStateFor( 976 void AnimationPlayer::GetPropertyAnimationState(
1000 TargetProperty::Type property, 977 PropertyAnimationState* pending_state,
1001 PropertyAnimationState* state) const { 978 PropertyAnimationState* active_state) const {
1002 state->Clear(); 979 pending_state->Clear();
980 active_state->Clear();
981
1003 for (const auto& animation : animations_) { 982 for (const auto& animation : animations_) {
1004 if (!animation->is_finished() && animation->target_property() == property) { 983 if (!animation->is_finished()) {
1005 state->potentially_animating_for_active_elements |= 984 bool in_effect = animation->InEffect(last_tick_time_);
1006 animation->affects_active_elements(); 985 bool active = animation->affects_active_elements();
1007 state->potentially_animating_for_pending_elements |= 986 bool pending = animation->affects_pending_elements();
1008 animation->affects_pending_elements(); 987 TargetProperty::Type property = animation->target_property();
1009 state->currently_running_for_active_elements |= 988
1010 animation->affects_active_elements() && 989 if (pending)
1011 animation->InEffect(last_tick_time_); 990 pending_state->potentially_animating[property] = true;
1012 state->currently_running_for_pending_elements |= 991 if (pending && in_effect)
1013 animation->affects_pending_elements() && 992 pending_state->currently_running[property] = true;
1014 animation->InEffect(last_tick_time_); 993
994 if (active)
995 active_state->potentially_animating[property] = true;
996 if (active && in_effect)
997 active_state->currently_running[property] = true;
1015 } 998 }
1016 } 999 }
1017 } 1000 }
1018 1001
1019 void AnimationPlayer::MarkAbortedAnimationsForDeletion( 1002 void AnimationPlayer::MarkAbortedAnimationsForDeletion(
1020 AnimationPlayer* animation_player_impl) const { 1003 AnimationPlayer* animation_player_impl) const {
1021 bool aborted_transform_animation = false; 1004 bool animation_aborted = false;
1022 bool aborted_opacity_animation = false; 1005
1023 bool aborted_filter_animation = false;
1024 auto& animations_impl = animation_player_impl->animations_; 1006 auto& animations_impl = animation_player_impl->animations_;
1025 for (const auto& animation_impl : animations_impl) { 1007 for (const auto& animation_impl : animations_impl) {
1026 // If the animation has been aborted on the main thread, mark it for 1008 // If the animation has been aborted on the main thread, mark it for
1027 // deletion. 1009 // deletion.
1028 if (Animation* animation = GetAnimationById(animation_impl->id())) { 1010 if (Animation* animation = GetAnimationById(animation_impl->id())) {
1029 if (animation->run_state() == Animation::ABORTED) { 1011 if (animation->run_state() == Animation::ABORTED) {
1030 animation_impl->SetRunState(Animation::WAITING_FOR_DELETION, 1012 animation_impl->SetRunState(Animation::WAITING_FOR_DELETION,
1031 animation_player_impl->last_tick_time_); 1013 animation_player_impl->last_tick_time_);
1032 animation->SetRunState(Animation::WAITING_FOR_DELETION, 1014 animation->SetRunState(Animation::WAITING_FOR_DELETION,
1033 last_tick_time_); 1015 last_tick_time_);
1034 if (animation_impl->target_property() == TargetProperty::TRANSFORM) 1016 animation_aborted = true;
1035 aborted_transform_animation = true;
1036 else if (animation_impl->target_property() == TargetProperty::OPACITY)
1037 aborted_opacity_animation = true;
1038 else if (animation_impl->target_property() == TargetProperty::FILTER)
1039 aborted_filter_animation = true;
1040 } 1017 }
1041 } 1018 }
1042 } 1019 }
1043 1020
1044 if (element_animations_) 1021 if (element_animations_ && animation_aborted)
1045 element_animations_->SetNeedsUpdateImplClientState( 1022 element_animations_->SetNeedsUpdateImplClientState();
1046 aborted_transform_animation, aborted_opacity_animation,
1047 aborted_filter_animation);
1048 } 1023 }
1049 1024
1050 void AnimationPlayer::PurgeAnimationsMarkedForDeletion() { 1025 void AnimationPlayer::PurgeAnimationsMarkedForDeletion() {
1051 animations_.erase( 1026 animations_.erase(
1052 std::remove_if(animations_.begin(), animations_.end(), 1027 std::remove_if(animations_.begin(), animations_.end(),
1053 [](const std::unique_ptr<Animation>& animation) { 1028 [](const std::unique_ptr<Animation>& animation) {
1054 return animation->run_state() == 1029 return animation->run_state() ==
1055 Animation::WAITING_FOR_DELETION; 1030 Animation::WAITING_FOR_DELETION;
1056 }), 1031 }),
1057 animations_.end()); 1032 animations_.end());
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
1100 const AnimationPlayer* main_thread_player) { 1075 const AnimationPlayer* main_thread_player) {
1101 if (animation->is_impl_only()) { 1076 if (animation->is_impl_only()) {
1102 return (animation->run_state() == Animation::WAITING_FOR_DELETION); 1077 return (animation->run_state() == Animation::WAITING_FOR_DELETION);
1103 } else { 1078 } else {
1104 return !main_thread_player->GetAnimationById(animation->id()); 1079 return !main_thread_player->GetAnimationById(animation->id());
1105 } 1080 }
1106 } 1081 }
1107 1082
1108 void AnimationPlayer::RemoveAnimationsCompletedOnMainThread( 1083 void AnimationPlayer::RemoveAnimationsCompletedOnMainThread(
1109 AnimationPlayer* animation_player_impl) const { 1084 AnimationPlayer* animation_player_impl) const {
1110 bool removed_transform_animation = false; 1085 bool animation_completed = false;
1111 bool removed_opacity_animation = false; 1086
1112 bool removed_filter_animation = false;
1113 // Animations removed on the main thread should no longer affect pending 1087 // Animations removed on the main thread should no longer affect pending
1114 // elements, and should stop affecting active elements after the next call 1088 // elements, and should stop affecting active elements after the next call
1115 // to ActivateAnimations. If already WAITING_FOR_DELETION, they can be removed 1089 // to ActivateAnimations. If already WAITING_FOR_DELETION, they can be removed
1116 // immediately. 1090 // immediately.
1117 auto& animations = animation_player_impl->animations_; 1091 auto& animations = animation_player_impl->animations_;
1118 for (const auto& animation : animations) { 1092 for (const auto& animation : animations) {
1119 if (IsCompleted(animation.get(), this)) { 1093 if (IsCompleted(animation.get(), this)) {
1120 animation->set_affects_pending_elements(false); 1094 animation->set_affects_pending_elements(false);
1121 if (animation->target_property() == TargetProperty::TRANSFORM) 1095 animation_completed = true;
1122 removed_transform_animation = true;
1123 else if (animation->target_property() == TargetProperty::OPACITY)
1124 removed_opacity_animation = true;
1125 else if (animation->target_property() == TargetProperty::FILTER)
1126 removed_filter_animation = true;
1127 } 1096 }
1128 } 1097 }
1129 auto affects_active_only_and_is_waiting_for_deletion = 1098 auto affects_active_only_and_is_waiting_for_deletion =
1130 [](const std::unique_ptr<Animation>& animation) { 1099 [](const std::unique_ptr<Animation>& animation) {
1131 return animation->run_state() == Animation::WAITING_FOR_DELETION && 1100 return animation->run_state() == Animation::WAITING_FOR_DELETION &&
1132 !animation->affects_pending_elements(); 1101 !animation->affects_pending_elements();
1133 }; 1102 };
1134 animations.erase( 1103 animations.erase(
1135 std::remove_if(animations.begin(), animations.end(), 1104 std::remove_if(animations.begin(), animations.end(),
1136 affects_active_only_and_is_waiting_for_deletion), 1105 affects_active_only_and_is_waiting_for_deletion),
1137 animations.end()); 1106 animations.end());
1138 1107
1139 if (element_animations_) 1108 if (element_animations_ && animation_completed)
1140 element_animations_->SetNeedsUpdateImplClientState( 1109 element_animations_->SetNeedsUpdateImplClientState();
1141 removed_transform_animation, removed_opacity_animation,
1142 removed_filter_animation);
1143 } 1110 }
1144 1111
1145 void AnimationPlayer::PushPropertiesToImplThread( 1112 void AnimationPlayer::PushPropertiesToImplThread(
1146 AnimationPlayer* animation_player_impl) { 1113 AnimationPlayer* animation_player_impl) {
1147 for (size_t i = 0; i < animations_.size(); ++i) { 1114 for (size_t i = 0; i < animations_.size(); ++i) {
1148 Animation* current_impl = 1115 Animation* current_impl =
1149 animation_player_impl->GetAnimationById(animations_[i]->id()); 1116 animation_player_impl->GetAnimationById(animations_[i]->id());
1150 if (current_impl) 1117 if (current_impl)
1151 animations_[i]->PushPropertiesTo(current_impl); 1118 animations_[i]->PushPropertiesTo(current_impl);
1152 } 1119 }
1153 } 1120 }
1154 1121
1155 } // namespace cc 1122 } // namespace cc
OLDNEW
« no previous file with comments | « cc/animation/animation_player.h ('k') | cc/animation/element_animations.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698