| 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 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "cc/animation/animation.h" | 10 #include "cc/animation/animation.h" |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 54 explicit HasAnimationId(int id) : id_(id) {} | 54 explicit HasAnimationId(int id) : id_(id) {} |
| 55 bool operator()(Animation* animation) const { | 55 bool operator()(Animation* animation) const { |
| 56 return animation->id() == id_; | 56 return animation->id() == id_; |
| 57 } | 57 } |
| 58 | 58 |
| 59 private: | 59 private: |
| 60 int id_; | 60 int id_; |
| 61 }; | 61 }; |
| 62 | 62 |
| 63 void LayerAnimationController::RemoveAnimation(int animation_id) { | 63 void LayerAnimationController::RemoveAnimation(int animation_id) { |
| 64 animations_.erase(cc::remove_if(&animations_, | 64 auto animations_to_remove = |
| 65 animations_.begin(), | 65 animations_.remove_if(HasAnimationId(animation_id)); |
| 66 animations_.end(), | 66 for (auto it = animations_to_remove; it != animations_.end(); ++it) { |
| 67 HasAnimationId(animation_id)), | 67 if ((*it)->target_property() == Animation::ScrollOffset) { |
| 68 animations_.end()); | 68 NotifyObserversScrollOffsetAnimationRemoved(); |
| 69 break; |
| 70 } |
| 71 } |
| 72 animations_.erase(animations_to_remove, animations_.end()); |
| 69 UpdateActivation(NormalActivation); | 73 UpdateActivation(NormalActivation); |
| 70 } | 74 } |
| 71 | 75 |
| 72 struct HasAnimationIdAndProperty { | 76 struct HasAnimationIdAndProperty { |
| 73 HasAnimationIdAndProperty(int id, Animation::TargetProperty target_property) | 77 HasAnimationIdAndProperty(int id, Animation::TargetProperty target_property) |
| 74 : id_(id), target_property_(target_property) {} | 78 : id_(id), target_property_(target_property) {} |
| 75 bool operator()(Animation* animation) const { | 79 bool operator()(Animation* animation) const { |
| 76 return animation->id() == id_ && | 80 return animation->id() == id_ && |
| 77 animation->target_property() == target_property_; | 81 animation->target_property() == target_property_; |
| 78 } | 82 } |
| 79 | 83 |
| 80 private: | 84 private: |
| 81 int id_; | 85 int id_; |
| 82 Animation::TargetProperty target_property_; | 86 Animation::TargetProperty target_property_; |
| 83 }; | 87 }; |
| 84 | 88 |
| 85 void LayerAnimationController::RemoveAnimation( | 89 void LayerAnimationController::RemoveAnimation( |
| 86 int animation_id, | 90 int animation_id, |
| 87 Animation::TargetProperty target_property) { | 91 Animation::TargetProperty target_property) { |
| 88 animations_.erase( | 92 auto animations_to_remove = animations_.remove_if( |
| 89 cc::remove_if(&animations_, | 93 HasAnimationIdAndProperty(animation_id, target_property)); |
| 90 animations_.begin(), | 94 if (target_property == Animation::ScrollOffset && |
| 91 animations_.end(), | 95 animations_to_remove != animations_.end()) |
| 92 HasAnimationIdAndProperty(animation_id, target_property)), | 96 NotifyObserversScrollOffsetAnimationRemoved(); |
| 93 animations_.end()); | 97 |
| 98 animations_.erase(animations_to_remove, animations_.end()); |
| 94 UpdateActivation(NormalActivation); | 99 UpdateActivation(NormalActivation); |
| 95 } | 100 } |
| 96 | 101 |
| 97 void LayerAnimationController::AbortAnimations( | 102 void LayerAnimationController::AbortAnimations( |
| 98 Animation::TargetProperty target_property) { | 103 Animation::TargetProperty target_property) { |
| 99 for (size_t i = 0; i < animations_.size(); ++i) { | 104 for (size_t i = 0; i < animations_.size(); ++i) { |
| 100 if (animations_[i]->target_property() == target_property && | 105 if (animations_[i]->target_property() == target_property && |
| 101 !animations_[i]->is_finished()) | 106 !animations_[i]->is_finished()) |
| 102 animations_[i]->SetRunState(Animation::Aborted, last_tick_time_); | 107 animations_[i]->SetRunState(Animation::Aborted, last_tick_time_); |
| 103 } | 108 } |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 254 UpdateActivation(NormalActivation); | 259 UpdateActivation(NormalActivation); |
| 255 } | 260 } |
| 256 | 261 |
| 257 void LayerAnimationController::AddAnimation(scoped_ptr<Animation> animation) { | 262 void LayerAnimationController::AddAnimation(scoped_ptr<Animation> animation) { |
| 258 animations_.push_back(animation.Pass()); | 263 animations_.push_back(animation.Pass()); |
| 259 needs_to_start_animations_ = true; | 264 needs_to_start_animations_ = true; |
| 260 UpdateActivation(NormalActivation); | 265 UpdateActivation(NormalActivation); |
| 261 } | 266 } |
| 262 | 267 |
| 263 Animation* LayerAnimationController::GetAnimation( | 268 Animation* LayerAnimationController::GetAnimation( |
| 264 int group_id, | |
| 265 Animation::TargetProperty target_property) const { | |
| 266 for (size_t i = 0; i < animations_.size(); ++i) | |
| 267 if (animations_[i]->group() == group_id && | |
| 268 animations_[i]->target_property() == target_property) | |
| 269 return animations_[i]; | |
| 270 return 0; | |
| 271 } | |
| 272 | |
| 273 Animation* LayerAnimationController::GetAnimation( | |
| 274 Animation::TargetProperty target_property) const { | 269 Animation::TargetProperty target_property) const { |
| 275 for (size_t i = 0; i < animations_.size(); ++i) { | 270 for (size_t i = 0; i < animations_.size(); ++i) { |
| 276 size_t index = animations_.size() - i - 1; | 271 size_t index = animations_.size() - i - 1; |
| 277 if (animations_[index]->target_property() == target_property) | 272 if (animations_[index]->target_property() == target_property) |
| 278 return animations_[index]; | 273 return animations_[index]; |
| 279 } | 274 } |
| 280 return 0; | 275 return 0; |
| 281 } | 276 } |
| 282 | 277 |
| 278 Animation* LayerAnimationController::GetAnimationById(int animation_id) const { |
| 279 for (size_t i = 0; i < animations_.size(); ++i) |
| 280 if (animations_[i]->id() == animation_id) |
| 281 return animations_[i]; |
| 282 return nullptr; |
| 283 } |
| 284 |
| 283 bool LayerAnimationController::HasActiveAnimation() const { | 285 bool LayerAnimationController::HasActiveAnimation() const { |
| 284 for (size_t i = 0; i < animations_.size(); ++i) { | 286 for (size_t i = 0; i < animations_.size(); ++i) { |
| 285 if (!animations_[i]->is_finished()) | 287 if (!animations_[i]->is_finished()) |
| 286 return true; | 288 return true; |
| 287 } | 289 } |
| 288 return false; | 290 return false; |
| 289 } | 291 } |
| 290 | 292 |
| 291 bool LayerAnimationController::IsAnimatingProperty( | 293 bool LayerAnimationController::IsAnimatingProperty( |
| 292 Animation::TargetProperty target_property) const { | 294 Animation::TargetProperty target_property) const { |
| (...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 547 return true; | 549 return true; |
| 548 } | 550 } |
| 549 | 551 |
| 550 void LayerAnimationController::PushNewAnimationsToImplThread( | 552 void LayerAnimationController::PushNewAnimationsToImplThread( |
| 551 LayerAnimationController* controller_impl) const { | 553 LayerAnimationController* controller_impl) const { |
| 552 // Any new animations owned by the main thread's controller are cloned and | 554 // Any new animations owned by the main thread's controller are cloned and |
| 553 // add to the impl thread's controller. | 555 // add to the impl thread's controller. |
| 554 for (size_t i = 0; i < animations_.size(); ++i) { | 556 for (size_t i = 0; i < animations_.size(); ++i) { |
| 555 // If the animation is already running on the impl thread, there is no | 557 // If the animation is already running on the impl thread, there is no |
| 556 // need to copy it over. | 558 // need to copy it over. |
| 557 if (controller_impl->GetAnimation(animations_[i]->group(), | 559 if (controller_impl->GetAnimationById(animations_[i]->id())) |
| 558 animations_[i]->target_property())) | |
| 559 continue; | 560 continue; |
| 560 | 561 |
| 561 // If the animation is not running on the impl thread, it does not | 562 // If the animation is not running on the impl thread, it does not |
| 562 // necessarily mean that it needs to be copied over and started; it may | 563 // necessarily mean that it needs to be copied over and started; it may |
| 563 // have already finished. In this case, the impl thread animation will | 564 // have already finished. In this case, the impl thread animation will |
| 564 // have already notified that it has started and the main thread animation | 565 // have already notified that it has started and the main thread animation |
| 565 // will no longer need | 566 // will no longer need |
| 566 // a synchronized start time. | 567 // a synchronized start time. |
| 567 if (!animations_[i]->needs_synchronized_start_time()) | 568 if (!animations_[i]->needs_synchronized_start_time()) |
| 568 continue; | 569 continue; |
| (...skipping 23 matching lines...) Expand all Loading... |
| 592 controller_impl->AddAnimation(to_add.Pass()); | 593 controller_impl->AddAnimation(to_add.Pass()); |
| 593 } | 594 } |
| 594 } | 595 } |
| 595 | 596 |
| 596 static bool IsCompleted( | 597 static bool IsCompleted( |
| 597 Animation* animation, | 598 Animation* animation, |
| 598 const LayerAnimationController* main_thread_controller) { | 599 const LayerAnimationController* main_thread_controller) { |
| 599 if (animation->is_impl_only()) { | 600 if (animation->is_impl_only()) { |
| 600 return (animation->run_state() == Animation::WaitingForDeletion); | 601 return (animation->run_state() == Animation::WaitingForDeletion); |
| 601 } else { | 602 } else { |
| 602 return !main_thread_controller->GetAnimation(animation->group(), | 603 return !main_thread_controller->GetAnimationById(animation->id()); |
| 603 animation->target_property()); | |
| 604 } | 604 } |
| 605 } | 605 } |
| 606 | 606 |
| 607 static bool AffectsActiveOnlyAndIsWaitingForDeletion(Animation* animation) { | 607 static bool AffectsActiveOnlyAndIsWaitingForDeletion(Animation* animation) { |
| 608 return animation->run_state() == Animation::WaitingForDeletion && | 608 return animation->run_state() == Animation::WaitingForDeletion && |
| 609 !animation->affects_pending_observers(); | 609 !animation->affects_pending_observers(); |
| 610 } | 610 } |
| 611 | 611 |
| 612 void LayerAnimationController::RemoveAnimationsCompletedOnMainThread( | 612 void LayerAnimationController::RemoveAnimationsCompletedOnMainThread( |
| 613 LayerAnimationController* controller_impl) const { | 613 LayerAnimationController* controller_impl) const { |
| 614 // Animations removed on the main thread should no longer affect pending | 614 // Animations removed on the main thread should no longer affect pending |
| 615 // observers, and should stop affecting active observers after the next call | 615 // observers, and should stop affecting active observers after the next call |
| 616 // to ActivateAnimations. If already WaitingForDeletion, they can be removed | 616 // to ActivateAnimations. If already WaitingForDeletion, they can be removed |
| 617 // immediately. | 617 // immediately. |
| 618 ScopedPtrVector<Animation>& animations = controller_impl->animations_; | 618 ScopedPtrVector<Animation>& animations = controller_impl->animations_; |
| 619 for (size_t i = 0; i < animations.size(); ++i) { | 619 for (size_t i = 0; i < animations.size(); ++i) { |
| 620 if (IsCompleted(animations[i], this)) | 620 if (IsCompleted(animations[i], this)) |
| 621 animations[i]->set_affects_pending_observers(false); | 621 animations[i]->set_affects_pending_observers(false); |
| 622 } | 622 } |
| 623 animations.erase(cc::remove_if(&animations, | 623 animations.erase(cc::remove_if(&animations, |
| 624 animations.begin(), | 624 animations.begin(), |
| 625 animations.end(), | 625 animations.end(), |
| 626 AffectsActiveOnlyAndIsWaitingForDeletion), | 626 AffectsActiveOnlyAndIsWaitingForDeletion), |
| 627 animations.end()); | 627 animations.end()); |
| 628 } | 628 } |
| 629 | 629 |
| 630 void LayerAnimationController::PushPropertiesToImplThread( | 630 void LayerAnimationController::PushPropertiesToImplThread( |
| 631 LayerAnimationController* controller_impl) const { | 631 LayerAnimationController* controller_impl) const { |
| 632 for (size_t i = 0; i < animations_.size(); ++i) { | 632 for (size_t i = 0; i < animations_.size(); ++i) { |
| 633 Animation* current_impl = controller_impl->GetAnimation( | 633 Animation* current_impl = |
| 634 animations_[i]->group(), animations_[i]->target_property()); | 634 controller_impl->GetAnimationById(animations_[i]->id()); |
| 635 if (current_impl) | 635 if (current_impl) |
| 636 animations_[i]->PushPropertiesTo(current_impl); | 636 animations_[i]->PushPropertiesTo(current_impl); |
| 637 } | 637 } |
| 638 } | 638 } |
| 639 | 639 |
| 640 void LayerAnimationController::StartAnimations(base::TimeTicks monotonic_time) { | 640 void LayerAnimationController::StartAnimations(base::TimeTicks monotonic_time) { |
| 641 DCHECK(needs_to_start_animations_); | 641 DCHECK(needs_to_start_animations_); |
| 642 needs_to_start_animations_ = false; | 642 needs_to_start_animations_ = false; |
| 643 // First collect running properties affecting each type of observer. | 643 // First collect running properties affecting each type of observer. |
| 644 TargetProperties blocked_properties_for_active_observers; | 644 TargetProperties blocked_properties_for_active_observers; |
| (...skipping 382 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1027 } | 1027 } |
| 1028 } | 1028 } |
| 1029 } | 1029 } |
| 1030 | 1030 |
| 1031 void LayerAnimationController::NotifyObserversAnimationWaitingForDeletion() { | 1031 void LayerAnimationController::NotifyObserversAnimationWaitingForDeletion() { |
| 1032 FOR_EACH_OBSERVER(LayerAnimationValueObserver, | 1032 FOR_EACH_OBSERVER(LayerAnimationValueObserver, |
| 1033 value_observers_, | 1033 value_observers_, |
| 1034 OnAnimationWaitingForDeletion()); | 1034 OnAnimationWaitingForDeletion()); |
| 1035 } | 1035 } |
| 1036 | 1036 |
| 1037 void LayerAnimationController::NotifyObserversScrollOffsetAnimationRemoved() { |
| 1038 FOR_EACH_OBSERVER(LayerAnimationValueObserver, value_observers_, |
| 1039 OnScrollOffsetAnimationRemoved()); |
| 1040 } |
| 1041 |
| 1037 bool LayerAnimationController::HasValueObserver() { | 1042 bool LayerAnimationController::HasValueObserver() { |
| 1038 if (value_observers_.might_have_observers()) { | 1043 if (value_observers_.might_have_observers()) { |
| 1039 ObserverListBase<LayerAnimationValueObserver>::Iterator it( | 1044 ObserverListBase<LayerAnimationValueObserver>::Iterator it( |
| 1040 value_observers_); | 1045 value_observers_); |
| 1041 return it.GetNext() != nullptr; | 1046 return it.GetNext() != nullptr; |
| 1042 } | 1047 } |
| 1043 return false; | 1048 return false; |
| 1044 } | 1049 } |
| 1045 | 1050 |
| 1046 bool LayerAnimationController::HasActiveValueObserver() { | 1051 bool LayerAnimationController::HasActiveValueObserver() { |
| 1047 if (value_observers_.might_have_observers()) { | 1052 if (value_observers_.might_have_observers()) { |
| 1048 ObserverListBase<LayerAnimationValueObserver>::Iterator it( | 1053 ObserverListBase<LayerAnimationValueObserver>::Iterator it( |
| 1049 value_observers_); | 1054 value_observers_); |
| 1050 LayerAnimationValueObserver* obs; | 1055 LayerAnimationValueObserver* obs; |
| 1051 while ((obs = it.GetNext()) != nullptr) | 1056 while ((obs = it.GetNext()) != nullptr) |
| 1052 if (obs->IsActive()) | 1057 if (obs->IsActive()) |
| 1053 return true; | 1058 return true; |
| 1054 } | 1059 } |
| 1055 return false; | 1060 return false; |
| 1056 } | 1061 } |
| 1057 | 1062 |
| 1058 } // namespace cc | 1063 } // namespace cc |
| OLD | NEW |