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

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

Issue 2110683004: cc: Move filters to the effect tree (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address review comments Created 4 years, 5 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/element_animations.h ('k') | cc/animation/element_animations_unittest.cc » ('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/element_animations.h" 5 #include "cc/animation/element_animations.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 10
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
143 RemoveAnimationsCompletedOnMainThread(element_animations_impl.get()); 143 RemoveAnimationsCompletedOnMainThread(element_animations_impl.get());
144 144
145 PushPropertiesToImplThread(element_animations_impl.get()); 145 PushPropertiesToImplThread(element_animations_impl.get());
146 element_animations_impl->UpdateActivation(NORMAL_ACTIVATION); 146 element_animations_impl->UpdateActivation(NORMAL_ACTIVATION);
147 UpdateActivation(NORMAL_ACTIVATION); 147 UpdateActivation(NORMAL_ACTIVATION);
148 } 148 }
149 149
150 void ElementAnimations::AddAnimation(std::unique_ptr<Animation> animation) { 150 void ElementAnimations::AddAnimation(std::unique_ptr<Animation> animation) {
151 DCHECK(!animation->is_impl_only() || 151 DCHECK(!animation->is_impl_only() ||
152 animation->target_property() == TargetProperty::SCROLL_OFFSET); 152 animation->target_property() == TargetProperty::SCROLL_OFFSET);
153 bool added_transform_animation = 153 TargetProperty::Type target_property = animation->target_property();
154 animation->target_property() == TargetProperty::TRANSFORM;
155 bool added_opacity_animation =
156 animation->target_property() == TargetProperty::OPACITY;
157 animations_.push_back(std::move(animation)); 154 animations_.push_back(std::move(animation));
158 needs_to_start_animations_ = true; 155 needs_to_start_animations_ = true;
159 UpdateActivation(NORMAL_ACTIVATION); 156 UpdateActivation(NORMAL_ACTIVATION);
160 if (added_transform_animation) 157 switch (target_property) {
161 UpdateClientAnimationState(TargetProperty::TRANSFORM); 158 case TargetProperty::TRANSFORM:
162 if (added_opacity_animation) 159 case TargetProperty::OPACITY:
163 UpdateClientAnimationState(TargetProperty::OPACITY); 160 case TargetProperty::FILTER:
161 UpdateClientAnimationState(target_property);
162 break;
163 default:
164 break;
165 }
164 } 166 }
165 167
166 void ElementAnimations::Animate(base::TimeTicks monotonic_time) { 168 void ElementAnimations::Animate(base::TimeTicks monotonic_time) {
167 DCHECK(!monotonic_time.is_null()); 169 DCHECK(!monotonic_time.is_null());
168 if (!has_element_in_active_list() && !has_element_in_pending_list()) 170 if (!has_element_in_active_list() && !has_element_in_pending_list())
169 return; 171 return;
170 172
171 if (needs_to_start_animations_) 173 if (needs_to_start_animations_)
172 StartAnimations(monotonic_time); 174 StartAnimations(monotonic_time);
173 TickAnimations(monotonic_time); 175 TickAnimations(monotonic_time);
174 last_tick_time_ = monotonic_time; 176 last_tick_time_ = monotonic_time;
175 UpdateClientAnimationState(TargetProperty::OPACITY); 177 UpdateClientAnimationState(TargetProperty::OPACITY);
176 UpdateClientAnimationState(TargetProperty::TRANSFORM); 178 UpdateClientAnimationState(TargetProperty::TRANSFORM);
179 UpdateClientAnimationState(TargetProperty::FILTER);
177 } 180 }
178 181
179 void ElementAnimations::UpdateState(bool start_ready_animations, 182 void ElementAnimations::UpdateState(bool start_ready_animations,
180 AnimationEvents* events) { 183 AnimationEvents* events) {
181 if (!has_element_in_active_list()) 184 if (!has_element_in_active_list())
182 return; 185 return;
183 186
184 // Animate hasn't been called, this happens if an element has been added 187 // Animate hasn't been called, this happens if an element has been added
185 // between the Commit and Draw phases. 188 // between the Commit and Draw phases.
186 if (last_tick_time_ == base::TimeTicks()) 189 if (last_tick_time_ == base::TimeTicks())
187 return; 190 return;
188 191
189 if (start_ready_animations) 192 if (start_ready_animations)
190 PromoteStartedAnimations(last_tick_time_, events); 193 PromoteStartedAnimations(last_tick_time_, events);
191 194
192 MarkFinishedAnimations(last_tick_time_); 195 MarkFinishedAnimations(last_tick_time_);
193 MarkAnimationsForDeletion(last_tick_time_, events); 196 MarkAnimationsForDeletion(last_tick_time_, events);
194 197
195 if (needs_to_start_animations_ && start_ready_animations) { 198 if (needs_to_start_animations_ && start_ready_animations) {
196 StartAnimations(last_tick_time_); 199 StartAnimations(last_tick_time_);
197 PromoteStartedAnimations(last_tick_time_, events); 200 PromoteStartedAnimations(last_tick_time_, events);
198 } 201 }
199 202
200 UpdateActivation(NORMAL_ACTIVATION); 203 UpdateActivation(NORMAL_ACTIVATION);
201 } 204 }
202 205
203 void ElementAnimations::ActivateAnimations() { 206 void ElementAnimations::ActivateAnimations() {
204 bool changed_transform_animation = false; 207 bool changed_transform_animation = false;
205 bool changed_opacity_animation = false; 208 bool changed_opacity_animation = false;
209 bool changed_filter_animation = false;
206 for (size_t i = 0; i < animations_.size(); ++i) { 210 for (size_t i = 0; i < animations_.size(); ++i) {
207 if (animations_[i]->affects_active_elements() != 211 if (animations_[i]->affects_active_elements() !=
208 animations_[i]->affects_pending_elements()) { 212 animations_[i]->affects_pending_elements()) {
209 if (animations_[i]->target_property() == TargetProperty::TRANSFORM) 213 if (animations_[i]->target_property() == TargetProperty::TRANSFORM)
210 changed_transform_animation = true; 214 changed_transform_animation = true;
211 else if (animations_[i]->target_property() == TargetProperty::OPACITY) 215 else if (animations_[i]->target_property() == TargetProperty::OPACITY)
212 changed_opacity_animation = true; 216 changed_opacity_animation = true;
217 else if (animations_[i]->target_property() == TargetProperty::FILTER)
218 changed_filter_animation = true;
213 } 219 }
214 animations_[i]->set_affects_active_elements( 220 animations_[i]->set_affects_active_elements(
215 animations_[i]->affects_pending_elements()); 221 animations_[i]->affects_pending_elements());
216 } 222 }
217 auto affects_no_elements = [](const std::unique_ptr<Animation>& animation) { 223 auto affects_no_elements = [](const std::unique_ptr<Animation>& animation) {
218 return !animation->affects_active_elements() && 224 return !animation->affects_active_elements() &&
219 !animation->affects_pending_elements(); 225 !animation->affects_pending_elements();
220 }; 226 };
221 animations_.erase(std::remove_if(animations_.begin(), animations_.end(), 227 animations_.erase(std::remove_if(animations_.begin(), animations_.end(),
222 affects_no_elements), 228 affects_no_elements),
223 animations_.end()); 229 animations_.end());
224 scroll_offset_animation_was_interrupted_ = false; 230 scroll_offset_animation_was_interrupted_ = false;
225 UpdateActivation(NORMAL_ACTIVATION); 231 UpdateActivation(NORMAL_ACTIVATION);
226 if (changed_transform_animation) 232 if (changed_transform_animation)
227 UpdateClientAnimationState(TargetProperty::TRANSFORM); 233 UpdateClientAnimationState(TargetProperty::TRANSFORM);
228 if (changed_opacity_animation) 234 if (changed_opacity_animation)
229 UpdateClientAnimationState(TargetProperty::OPACITY); 235 UpdateClientAnimationState(TargetProperty::OPACITY);
236 if (changed_filter_animation)
237 UpdateClientAnimationState(TargetProperty::FILTER);
230 } 238 }
231 239
232 void ElementAnimations::NotifyAnimationStarted(const AnimationEvent& event) { 240 void ElementAnimations::NotifyAnimationStarted(const AnimationEvent& event) {
233 if (event.is_impl_only) { 241 if (event.is_impl_only) {
234 NotifyPlayersAnimationStarted(event.monotonic_time, event.target_property, 242 NotifyPlayersAnimationStarted(event.monotonic_time, event.target_property,
235 event.group_id); 243 event.group_id);
236 return; 244 return;
237 } 245 }
238 246
239 for (size_t i = 0; i < animations_.size(); ++i) { 247 for (size_t i = 0; i < animations_.size(); ++i) {
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
275 DCHECK(event.target_property == TargetProperty::SCROLL_OFFSET); 283 DCHECK(event.target_property == TargetProperty::SCROLL_OFFSET);
276 if (!players_list_->empty()) { 284 if (!players_list_->empty()) {
277 std::unique_ptr<AnimationCurve> animation_curve = event.curve->Clone(); 285 std::unique_ptr<AnimationCurve> animation_curve = event.curve->Clone();
278 NotifyPlayersAnimationTakeover(event.monotonic_time, event.target_property, 286 NotifyPlayersAnimationTakeover(event.monotonic_time, event.target_property,
279 event.animation_start_time, 287 event.animation_start_time,
280 std::move(animation_curve)); 288 std::move(animation_curve));
281 } 289 }
282 } 290 }
283 291
284 void ElementAnimations::NotifyAnimationAborted(const AnimationEvent& event) { 292 void ElementAnimations::NotifyAnimationAborted(const AnimationEvent& event) {
285 bool aborted_transform_animation = false;
286 bool aborted_opacity_animation = false;
287 for (size_t i = 0; i < animations_.size(); ++i) { 293 for (size_t i = 0; i < animations_.size(); ++i) {
288 if (animations_[i]->group() == event.group_id && 294 if (animations_[i]->group() == event.group_id &&
289 animations_[i]->target_property() == event.target_property) { 295 animations_[i]->target_property() == event.target_property) {
290 animations_[i]->SetRunState(Animation::ABORTED, event.monotonic_time); 296 animations_[i]->SetRunState(Animation::ABORTED, event.monotonic_time);
291 animations_[i]->set_received_finished_event(true); 297 animations_[i]->set_received_finished_event(true);
292 NotifyPlayersAnimationAborted(event.monotonic_time, event.target_property, 298 NotifyPlayersAnimationAborted(event.monotonic_time, event.target_property,
293 event.group_id); 299 event.group_id);
294 if (event.target_property == TargetProperty::TRANSFORM)
295 aborted_transform_animation = true;
296 else if (event.target_property == TargetProperty::OPACITY)
297 aborted_opacity_animation = true;
298 break; 300 break;
299 } 301 }
300 } 302 }
301 if (aborted_transform_animation) 303 switch (event.target_property) {
302 UpdateClientAnimationState(TargetProperty::TRANSFORM); 304 case TargetProperty::TRANSFORM:
303 if (aborted_opacity_animation) 305 case TargetProperty::OPACITY:
304 UpdateClientAnimationState(TargetProperty::OPACITY); 306 case TargetProperty::FILTER:
307 UpdateClientAnimationState(event.target_property);
308 break;
309 default:
310 break;
311 }
305 } 312 }
306 313
307 void ElementAnimations::NotifyAnimationPropertyUpdate( 314 void ElementAnimations::NotifyAnimationPropertyUpdate(
308 const AnimationEvent& event) { 315 const AnimationEvent& event) {
309 bool notify_active_elements = true; 316 bool notify_active_elements = true;
310 bool notify_pending_elements = true; 317 bool notify_pending_elements = true;
311 switch (event.target_property) { 318 switch (event.target_property) {
312 case TargetProperty::OPACITY: 319 case TargetProperty::OPACITY:
313 NotifyClientOpacityAnimated(event.opacity, notify_active_elements, 320 NotifyClientOpacityAnimated(event.opacity, notify_active_elements,
314 notify_pending_elements); 321 notify_pending_elements);
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after
553 return (animation->run_state() == Animation::WAITING_FOR_DELETION); 560 return (animation->run_state() == Animation::WAITING_FOR_DELETION);
554 } else { 561 } else {
555 return !main_thread_element_animations->GetAnimationById(animation->id()); 562 return !main_thread_element_animations->GetAnimationById(animation->id());
556 } 563 }
557 } 564 }
558 565
559 void ElementAnimations::RemoveAnimationsCompletedOnMainThread( 566 void ElementAnimations::RemoveAnimationsCompletedOnMainThread(
560 ElementAnimations* element_animations_impl) const { 567 ElementAnimations* element_animations_impl) const {
561 bool removed_transform_animation = false; 568 bool removed_transform_animation = false;
562 bool removed_opacity_animation = false; 569 bool removed_opacity_animation = false;
570 bool removed_filter_animation = false;
563 // Animations removed on the main thread should no longer affect pending 571 // Animations removed on the main thread should no longer affect pending
564 // elements, and should stop affecting active elements after the next call 572 // elements, and should stop affecting active elements after the next call
565 // to ActivateAnimations. If already WAITING_FOR_DELETION, they can be removed 573 // to ActivateAnimations. If already WAITING_FOR_DELETION, they can be removed
566 // immediately. 574 // immediately.
567 auto& animations = element_animations_impl->animations_; 575 auto& animations = element_animations_impl->animations_;
568 for (const auto& animation : animations) { 576 for (const auto& animation : animations) {
569 if (IsCompleted(animation.get(), this)) { 577 if (IsCompleted(animation.get(), this)) {
570 animation->set_affects_pending_elements(false); 578 animation->set_affects_pending_elements(false);
571 if (animation->target_property() == TargetProperty::TRANSFORM) 579 if (animation->target_property() == TargetProperty::TRANSFORM)
572 removed_transform_animation = true; 580 removed_transform_animation = true;
573 else if (animation->target_property() == TargetProperty::OPACITY) 581 else if (animation->target_property() == TargetProperty::OPACITY)
574 removed_opacity_animation = true; 582 removed_opacity_animation = true;
583 else if (animation->target_property() == TargetProperty::FILTER)
584 removed_filter_animation = true;
575 } 585 }
576 } 586 }
577 auto affects_active_only_and_is_waiting_for_deletion = 587 auto affects_active_only_and_is_waiting_for_deletion =
578 [](const std::unique_ptr<Animation>& animation) { 588 [](const std::unique_ptr<Animation>& animation) {
579 return animation->run_state() == Animation::WAITING_FOR_DELETION && 589 return animation->run_state() == Animation::WAITING_FOR_DELETION &&
580 !animation->affects_pending_elements(); 590 !animation->affects_pending_elements();
581 }; 591 };
582 animations.erase( 592 animations.erase(
583 std::remove_if(animations.begin(), animations.end(), 593 std::remove_if(animations.begin(), animations.end(),
584 affects_active_only_and_is_waiting_for_deletion), 594 affects_active_only_and_is_waiting_for_deletion),
585 animations.end()); 595 animations.end());
586 596
587 if (removed_transform_animation) 597 if (removed_transform_animation) {
588 element_animations_impl->UpdateClientAnimationState( 598 element_animations_impl->UpdateClientAnimationState(
589 TargetProperty::TRANSFORM); 599 TargetProperty::TRANSFORM);
590 if (removed_opacity_animation) 600 }
601 if (removed_opacity_animation) {
591 element_animations_impl->UpdateClientAnimationState( 602 element_animations_impl->UpdateClientAnimationState(
592 TargetProperty::OPACITY); 603 TargetProperty::OPACITY);
604 }
605 if (removed_filter_animation) {
606 element_animations_impl->UpdateClientAnimationState(TargetProperty::FILTER);
607 }
593 } 608 }
594 609
595 void ElementAnimations::PushPropertiesToImplThread( 610 void ElementAnimations::PushPropertiesToImplThread(
596 ElementAnimations* element_animations_impl) { 611 ElementAnimations* element_animations_impl) {
597 for (size_t i = 0; i < animations_.size(); ++i) { 612 for (size_t i = 0; i < animations_.size(); ++i) {
598 Animation* current_impl = 613 Animation* current_impl =
599 element_animations_impl->GetAnimationById(animations_[i]->id()); 614 element_animations_impl->GetAnimationById(animations_[i]->id());
600 if (current_impl) 615 if (current_impl)
601 animations_[i]->PushPropertiesTo(current_impl); 616 animations_[i]->PushPropertiesTo(current_impl);
602 } 617 }
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
726 else 741 else
727 events->events_.push_back(started_event); 742 events->events_.push_back(started_event);
728 } 743 }
729 } 744 }
730 } 745 }
731 } 746 }
732 747
733 void ElementAnimations::MarkFinishedAnimations(base::TimeTicks monotonic_time) { 748 void ElementAnimations::MarkFinishedAnimations(base::TimeTicks monotonic_time) {
734 bool finished_transform_animation = false; 749 bool finished_transform_animation = false;
735 bool finished_opacity_animation = false; 750 bool finished_opacity_animation = false;
751 bool finished_filter_animation = false;
736 for (size_t i = 0; i < animations_.size(); ++i) { 752 for (size_t i = 0; i < animations_.size(); ++i) {
737 if (!animations_[i]->is_finished() && 753 if (!animations_[i]->is_finished() &&
738 animations_[i]->IsFinishedAt(monotonic_time)) { 754 animations_[i]->IsFinishedAt(monotonic_time)) {
739 animations_[i]->SetRunState(Animation::FINISHED, monotonic_time); 755 animations_[i]->SetRunState(Animation::FINISHED, monotonic_time);
740 if (animations_[i]->target_property() == TargetProperty::TRANSFORM) 756 if (animations_[i]->target_property() == TargetProperty::TRANSFORM)
741 finished_transform_animation = true; 757 finished_transform_animation = true;
742 else if (animations_[i]->target_property() == TargetProperty::OPACITY) 758 else if (animations_[i]->target_property() == TargetProperty::OPACITY)
743 finished_opacity_animation = true; 759 finished_opacity_animation = true;
760 else if (animations_[i]->target_property() == TargetProperty::FILTER)
761 finished_filter_animation = true;
744 } 762 }
745 } 763 }
746 if (finished_transform_animation) 764 if (finished_transform_animation)
747 UpdateClientAnimationState(TargetProperty::TRANSFORM); 765 UpdateClientAnimationState(TargetProperty::TRANSFORM);
748 if (finished_opacity_animation) 766 if (finished_opacity_animation)
749 UpdateClientAnimationState(TargetProperty::OPACITY); 767 UpdateClientAnimationState(TargetProperty::OPACITY);
768 if (finished_filter_animation)
769 UpdateClientAnimationState(TargetProperty::FILTER);
750 } 770 }
751 771
752 void ElementAnimations::MarkAnimationsForDeletion( 772 void ElementAnimations::MarkAnimationsForDeletion(
753 base::TimeTicks monotonic_time, 773 base::TimeTicks monotonic_time,
754 AnimationEvents* events) { 774 AnimationEvents* events) {
755 bool marked_animations_for_deletions = false; 775 bool marked_animations_for_deletions = false;
756 std::vector<size_t> animations_with_same_group_id; 776 std::vector<size_t> animations_with_same_group_id;
757 777
758 animations_with_same_group_id.reserve(animations_.size()); 778 animations_with_same_group_id.reserve(animations_.size());
759 // Non-aborted animations are marked for deletion after a corresponding 779 // Non-aborted animations are marked for deletion after a corresponding
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
872 } 892 }
873 } 893 }
874 if (marked_animations_for_deletions) 894 if (marked_animations_for_deletions)
875 NotifyClientAnimationWaitingForDeletion(); 895 NotifyClientAnimationWaitingForDeletion();
876 } 896 }
877 897
878 void ElementAnimations::MarkAbortedAnimationsForDeletion( 898 void ElementAnimations::MarkAbortedAnimationsForDeletion(
879 ElementAnimations* element_animations_impl) const { 899 ElementAnimations* element_animations_impl) const {
880 bool aborted_transform_animation = false; 900 bool aborted_transform_animation = false;
881 bool aborted_opacity_animation = false; 901 bool aborted_opacity_animation = false;
902 bool aborted_filter_animation = false;
882 auto& animations_impl = element_animations_impl->animations_; 903 auto& animations_impl = element_animations_impl->animations_;
883 for (const auto& animation_impl : animations_impl) { 904 for (const auto& animation_impl : animations_impl) {
884 // If the animation has been aborted on the main thread, mark it for 905 // If the animation has been aborted on the main thread, mark it for
885 // deletion. 906 // deletion.
886 if (Animation* animation = GetAnimationById(animation_impl->id())) { 907 if (Animation* animation = GetAnimationById(animation_impl->id())) {
887 if (animation->run_state() == Animation::ABORTED) { 908 if (animation->run_state() == Animation::ABORTED) {
888 animation_impl->SetRunState(Animation::WAITING_FOR_DELETION, 909 animation_impl->SetRunState(Animation::WAITING_FOR_DELETION,
889 element_animations_impl->last_tick_time_); 910 element_animations_impl->last_tick_time_);
890 animation->SetRunState(Animation::WAITING_FOR_DELETION, 911 animation->SetRunState(Animation::WAITING_FOR_DELETION,
891 last_tick_time_); 912 last_tick_time_);
892 if (animation_impl->target_property() == TargetProperty::TRANSFORM) 913 if (animation_impl->target_property() == TargetProperty::TRANSFORM)
893 aborted_transform_animation = true; 914 aborted_transform_animation = true;
894 else if (animation_impl->target_property() == TargetProperty::OPACITY) 915 else if (animation_impl->target_property() == TargetProperty::OPACITY)
895 aborted_opacity_animation = true; 916 aborted_opacity_animation = true;
917 else if (animation_impl->target_property() == TargetProperty::FILTER)
918 aborted_filter_animation = true;
896 } 919 }
897 } 920 }
898 } 921 }
899 922
900 if (aborted_transform_animation) 923 if (aborted_transform_animation) {
901 element_animations_impl->UpdateClientAnimationState( 924 element_animations_impl->UpdateClientAnimationState(
902 TargetProperty::TRANSFORM); 925 TargetProperty::TRANSFORM);
903 if (aborted_opacity_animation) 926 }
927 if (aborted_opacity_animation) {
904 element_animations_impl->UpdateClientAnimationState( 928 element_animations_impl->UpdateClientAnimationState(
905 TargetProperty::OPACITY); 929 TargetProperty::OPACITY);
930 }
931 if (aborted_filter_animation) {
932 element_animations_impl->UpdateClientAnimationState(TargetProperty::FILTER);
933 }
906 } 934 }
907 935
908 void ElementAnimations::PurgeAnimationsMarkedForDeletion() { 936 void ElementAnimations::PurgeAnimationsMarkedForDeletion() {
909 animations_.erase( 937 animations_.erase(
910 std::remove_if(animations_.begin(), animations_.end(), 938 std::remove_if(animations_.begin(), animations_.end(),
911 [](const std::unique_ptr<Animation>& animation) { 939 [](const std::unique_ptr<Animation>& animation) {
912 return animation->run_state() == 940 return animation->run_state() ==
913 Animation::WAITING_FOR_DELETION; 941 Animation::WAITING_FOR_DELETION;
914 }), 942 }),
915 animations_.end()); 943 animations_.end());
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
1049 bool notify_elements_about_potential_animation, 1077 bool notify_elements_about_potential_animation,
1050 bool notify_elements_about_running_animation) { 1078 bool notify_elements_about_running_animation) {
1051 struct PropertyAnimationState* animation_state = nullptr; 1079 struct PropertyAnimationState* animation_state = nullptr;
1052 switch (property) { 1080 switch (property) {
1053 case TargetProperty::OPACITY: 1081 case TargetProperty::OPACITY:
1054 animation_state = &opacity_animation_state_; 1082 animation_state = &opacity_animation_state_;
1055 break; 1083 break;
1056 case TargetProperty::TRANSFORM: 1084 case TargetProperty::TRANSFORM:
1057 animation_state = &transform_animation_state_; 1085 animation_state = &transform_animation_state_;
1058 break; 1086 break;
1087 case TargetProperty::FILTER:
1088 animation_state = &filter_animation_state_;
1089 break;
1059 default: 1090 default:
1060 NOTREACHED(); 1091 NOTREACHED();
1061 break; 1092 break;
1062 } 1093 }
1063 1094
1064 bool notify_elements_about_potential_and_running_animation = 1095 bool notify_elements_about_potential_and_running_animation =
1065 notify_elements_about_potential_animation && 1096 notify_elements_about_potential_animation &&
1066 notify_elements_about_running_animation; 1097 notify_elements_about_running_animation;
1067 bool active = list_type == ElementListType::ACTIVE; 1098 bool active = list_type == ElementListType::ACTIVE;
1068 if (notify_elements_about_potential_and_running_animation) { 1099 if (notify_elements_about_potential_and_running_animation) {
(...skipping 24 matching lines...) Expand all
1093 void ElementAnimations::UpdateClientAnimationState( 1124 void ElementAnimations::UpdateClientAnimationState(
1094 TargetProperty::Type property) { 1125 TargetProperty::Type property) {
1095 struct PropertyAnimationState* animation_state = nullptr; 1126 struct PropertyAnimationState* animation_state = nullptr;
1096 switch (property) { 1127 switch (property) {
1097 case TargetProperty::OPACITY: 1128 case TargetProperty::OPACITY:
1098 animation_state = &opacity_animation_state_; 1129 animation_state = &opacity_animation_state_;
1099 break; 1130 break;
1100 case TargetProperty::TRANSFORM: 1131 case TargetProperty::TRANSFORM:
1101 animation_state = &transform_animation_state_; 1132 animation_state = &transform_animation_state_;
1102 break; 1133 break;
1134 case TargetProperty::FILTER:
1135 animation_state = &filter_animation_state_;
1136 break;
1103 default: 1137 default:
1104 NOTREACHED(); 1138 NOTREACHED();
1105 break; 1139 break;
1106 } 1140 }
1107 bool was_currently_running_animation_for_active_elements = 1141 bool was_currently_running_animation_for_active_elements =
1108 animation_state->currently_running_for_active_elements; 1142 animation_state->currently_running_for_active_elements;
1109 bool was_currently_running_animation_for_pending_elements = 1143 bool was_currently_running_animation_for_pending_elements =
1110 animation_state->currently_running_for_pending_elements; 1144 animation_state->currently_running_for_pending_elements;
1111 bool was_potentially_animating_for_active_elements = 1145 bool was_potentially_animating_for_active_elements =
1112 animation_state->potentially_animating_for_active_elements; 1146 animation_state->potentially_animating_for_active_elements;
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
1211 animations_[i]->SetRunState(Animation::PAUSED, 1245 animations_[i]->SetRunState(Animation::PAUSED,
1212 time_offset + animations_[i]->start_time() + 1246 time_offset + animations_[i]->start_time() +
1213 animations_[i]->time_offset()); 1247 animations_[i]->time_offset());
1214 } 1248 }
1215 } 1249 }
1216 } 1250 }
1217 1251
1218 void ElementAnimations::RemoveAnimation(int animation_id) { 1252 void ElementAnimations::RemoveAnimation(int animation_id) {
1219 bool removed_transform_animation = false; 1253 bool removed_transform_animation = false;
1220 bool removed_opacity_animation = false; 1254 bool removed_opacity_animation = false;
1255 bool removed_filter_animation = false;
1221 // Since we want to use the animations that we're going to remove, we need to 1256 // Since we want to use the animations that we're going to remove, we need to
1222 // use a stable_parition here instead of remove_if. Remove_if leaves the 1257 // use a stable_parition here instead of remove_if. Remove_if leaves the
1223 // removed items in an unspecified state. 1258 // removed items in an unspecified state.
1224 auto animations_to_remove = std::stable_partition( 1259 auto animations_to_remove = std::stable_partition(
1225 animations_.begin(), animations_.end(), 1260 animations_.begin(), animations_.end(),
1226 [animation_id](const std::unique_ptr<Animation>& animation) { 1261 [animation_id](const std::unique_ptr<Animation>& animation) {
1227 return animation->id() != animation_id; 1262 return animation->id() != animation_id;
1228 }); 1263 });
1229 for (auto it = animations_to_remove; it != animations_.end(); ++it) { 1264 for (auto it = animations_to_remove; it != animations_.end(); ++it) {
1230 if ((*it)->target_property() == TargetProperty::SCROLL_OFFSET) { 1265 if ((*it)->target_property() == TargetProperty::SCROLL_OFFSET) {
1231 scroll_offset_animation_was_interrupted_ = true; 1266 scroll_offset_animation_was_interrupted_ = true;
1232 } else if ((*it)->target_property() == TargetProperty::TRANSFORM && 1267 } else if ((*it)->target_property() == TargetProperty::TRANSFORM &&
1233 !(*it)->is_finished()) { 1268 !(*it)->is_finished()) {
1234 removed_transform_animation = true; 1269 removed_transform_animation = true;
1235 } else if ((*it)->target_property() == TargetProperty::OPACITY && 1270 } else if ((*it)->target_property() == TargetProperty::OPACITY &&
1236 !(*it)->is_finished()) { 1271 !(*it)->is_finished()) {
1237 removed_opacity_animation = true; 1272 removed_opacity_animation = true;
1273 } else if ((*it)->target_property() == TargetProperty::FILTER &&
1274 !(*it)->is_finished()) {
1275 removed_filter_animation = true;
1238 } 1276 }
1239 } 1277 }
1240 1278
1241 animations_.erase(animations_to_remove, animations_.end()); 1279 animations_.erase(animations_to_remove, animations_.end());
1242 UpdateActivation(NORMAL_ACTIVATION); 1280 UpdateActivation(NORMAL_ACTIVATION);
1243 if (removed_transform_animation) 1281 if (removed_transform_animation)
1244 UpdateClientAnimationState(TargetProperty::TRANSFORM); 1282 UpdateClientAnimationState(TargetProperty::TRANSFORM);
1245 if (removed_opacity_animation) 1283 if (removed_opacity_animation)
1246 UpdateClientAnimationState(TargetProperty::OPACITY); 1284 UpdateClientAnimationState(TargetProperty::OPACITY);
1285 if (removed_filter_animation)
1286 UpdateClientAnimationState(TargetProperty::FILTER);
1247 } 1287 }
1248 1288
1249 void ElementAnimations::AbortAnimation(int animation_id) { 1289 void ElementAnimations::AbortAnimation(int animation_id) {
1250 bool aborted_transform_animation = false;
1251 bool aborted_opacity_animation = false;
1252 if (Animation* animation = GetAnimationById(animation_id)) { 1290 if (Animation* animation = GetAnimationById(animation_id)) {
1253 if (!animation->is_finished()) { 1291 if (!animation->is_finished()) {
1254 animation->SetRunState(Animation::ABORTED, last_tick_time_); 1292 animation->SetRunState(Animation::ABORTED, last_tick_time_);
1255 if (animation->target_property() == TargetProperty::TRANSFORM) 1293 switch (animation->target_property()) {
1256 aborted_transform_animation = true; 1294 case TargetProperty::TRANSFORM:
1257 else if (animation->target_property() == TargetProperty::OPACITY) 1295 case TargetProperty::OPACITY:
1258 aborted_opacity_animation = true; 1296 case TargetProperty::FILTER:
1297 UpdateClientAnimationState(animation->target_property());
1298 break;
1299 default:
1300 break;
1301 }
1259 } 1302 }
1260 } 1303 }
1261 if (aborted_transform_animation)
1262 UpdateClientAnimationState(TargetProperty::TRANSFORM);
1263 if (aborted_opacity_animation)
1264 UpdateClientAnimationState(TargetProperty::OPACITY);
1265 } 1304 }
1266 1305
1267 void ElementAnimations::AbortAnimations(TargetProperty::Type target_property, 1306 void ElementAnimations::AbortAnimations(TargetProperty::Type target_property,
1268 bool needs_completion) { 1307 bool needs_completion) {
1269 if (needs_completion) 1308 if (needs_completion)
1270 DCHECK(target_property == TargetProperty::SCROLL_OFFSET); 1309 DCHECK(target_property == TargetProperty::SCROLL_OFFSET);
1271 1310
1272 bool aborted_transform_animation = false; 1311 bool aborted_animation = false;
1273 bool aborted_opacity_animation = false;
1274 for (size_t i = 0; i < animations_.size(); ++i) { 1312 for (size_t i = 0; i < animations_.size(); ++i) {
1275 if (animations_[i]->target_property() == target_property && 1313 if (animations_[i]->target_property() == target_property &&
1276 !animations_[i]->is_finished()) { 1314 !animations_[i]->is_finished()) {
1277 // Currently only impl-only scroll offset animations can be completed on 1315 // Currently only impl-only scroll offset animations can be completed on
1278 // the main thread. 1316 // the main thread.
1279 if (needs_completion && animations_[i]->is_impl_only()) { 1317 if (needs_completion && animations_[i]->is_impl_only()) {
1280 animations_[i]->SetRunState(Animation::ABORTED_BUT_NEEDS_COMPLETION, 1318 animations_[i]->SetRunState(Animation::ABORTED_BUT_NEEDS_COMPLETION,
1281 last_tick_time_); 1319 last_tick_time_);
1282 } else { 1320 } else {
1283 animations_[i]->SetRunState(Animation::ABORTED, last_tick_time_); 1321 animations_[i]->SetRunState(Animation::ABORTED, last_tick_time_);
1284 } 1322 }
1285 if (target_property == TargetProperty::TRANSFORM) 1323 aborted_animation = true;
1286 aborted_transform_animation = true;
1287 else if (target_property == TargetProperty::OPACITY)
1288 aborted_opacity_animation = true;
1289 } 1324 }
1290 } 1325 }
1291 if (aborted_transform_animation) 1326 if (aborted_animation) {
1292 UpdateClientAnimationState(TargetProperty::TRANSFORM); 1327 switch (target_property) {
1293 if (aborted_opacity_animation) 1328 case TargetProperty::TRANSFORM:
1294 UpdateClientAnimationState(TargetProperty::OPACITY); 1329 case TargetProperty::OPACITY:
1330 case TargetProperty::FILTER:
1331 UpdateClientAnimationState(target_property);
1332 break;
1333 default:
1334 break;
1335 }
1336 }
1295 } 1337 }
1296 1338
1297 Animation* ElementAnimations::GetAnimation( 1339 Animation* ElementAnimations::GetAnimation(
1298 TargetProperty::Type target_property) const { 1340 TargetProperty::Type target_property) const {
1299 for (size_t i = 0; i < animations_.size(); ++i) { 1341 for (size_t i = 0; i < animations_.size(); ++i) {
1300 size_t index = animations_.size() - i - 1; 1342 size_t index = animations_.size() - i - 1;
1301 if (animations_[index]->target_property() == target_property) 1343 if (animations_[index]->target_property() == target_property)
1302 return animations_[index].get(); 1344 return animations_[index].get();
1303 } 1345 }
1304 return nullptr; 1346 return nullptr;
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
1369 ->mutator_host_client() 1411 ->mutator_host_client()
1370 ->ElementOpacityIsAnimatingChanged(element_id(), list_type, 1412 ->ElementOpacityIsAnimatingChanged(element_id(), list_type,
1371 change_type, is_animating); 1413 change_type, is_animating);
1372 break; 1414 break;
1373 case TargetProperty::TRANSFORM: 1415 case TargetProperty::TRANSFORM:
1374 animation_host() 1416 animation_host()
1375 ->mutator_host_client() 1417 ->mutator_host_client()
1376 ->ElementTransformIsAnimatingChanged(element_id(), list_type, 1418 ->ElementTransformIsAnimatingChanged(element_id(), list_type,
1377 change_type, is_animating); 1419 change_type, is_animating);
1378 break; 1420 break;
1421 case TargetProperty::FILTER:
1422 animation_host()
1423 ->mutator_host_client()
1424 ->ElementFilterIsAnimatingChanged(element_id(), list_type,
1425 change_type, is_animating);
1426 break;
1379 default: 1427 default:
1380 NOTREACHED(); 1428 NOTREACHED();
1381 break; 1429 break;
1382 } 1430 }
1383 } 1431 }
1384 } 1432 }
1385 1433
1386 void ElementAnimations::NotifyPlayersAnimationStarted( 1434 void ElementAnimations::NotifyPlayersAnimationStarted(
1387 base::TimeTicks monotonic_time, 1435 base::TimeTicks monotonic_time,
1388 TargetProperty::Type target_property, 1436 TargetProperty::Type target_property,
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
1436 if (animation_host()) { 1484 if (animation_host()) {
1437 DCHECK(animation_host()->mutator_host_client()); 1485 DCHECK(animation_host()->mutator_host_client());
1438 return animation_host()->mutator_host_client()->GetScrollOffsetForAnimation( 1486 return animation_host()->mutator_host_client()->GetScrollOffsetForAnimation(
1439 element_id()); 1487 element_id());
1440 } 1488 }
1441 1489
1442 return gfx::ScrollOffset(); 1490 return gfx::ScrollOffset();
1443 } 1491 }
1444 1492
1445 } // namespace cc 1493 } // namespace cc
OLDNEW
« no previous file with comments | « cc/animation/element_animations.h ('k') | cc/animation/element_animations_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698