Index: cc/animation/layer_animation_controller.cc |
diff --git a/cc/animation/layer_animation_controller.cc b/cc/animation/layer_animation_controller.cc |
index d649ac739724f91413a33b93a610de119fe26bb3..9c66fabc09fa3d9898fbfd4d87a039a5fe356a2e 100644 |
--- a/cc/animation/layer_animation_controller.cc |
+++ b/cc/animation/layer_animation_controller.cc |
@@ -14,7 +14,6 @@ |
#include "cc/animation/layer_animation_value_observer.h" |
#include "cc/animation/layer_animation_value_provider.h" |
#include "cc/animation/scroll_offset_animation_curve.h" |
-#include "cc/base/scoped_ptr_algorithm.h" |
#include "cc/output/filter_operations.h" |
#include "ui/gfx/geometry/box_f.h" |
#include "ui/gfx/transform.h" |
@@ -53,16 +52,6 @@ void LayerAnimationController::PauseAnimation(int animation_id, |
} |
} |
-struct HasAnimationId { |
- explicit HasAnimationId(int id) : id_(id) {} |
- bool operator()(Animation* animation) const { |
- return animation->id() == id_; |
- } |
- |
- private: |
- int id_; |
-}; |
- |
void LayerAnimationController::UpdatePotentiallyAnimatingTransform() { |
bool was_potentially_animating_transform_for_active_observers = |
potentially_animating_transform_for_active_observers_; |
@@ -72,7 +61,7 @@ void LayerAnimationController::UpdatePotentiallyAnimatingTransform() { |
potentially_animating_transform_for_active_observers_ = false; |
potentially_animating_transform_for_pending_observers_ = false; |
- for (Animation* animation : animations_) { |
+ for (const auto& animation : animations_) { |
if (!animation->is_finished() && |
animation->target_property() == Animation::TRANSFORM) { |
potentially_animating_transform_for_active_observers_ |= |
@@ -98,8 +87,14 @@ void LayerAnimationController::UpdatePotentiallyAnimatingTransform() { |
void LayerAnimationController::RemoveAnimation(int animation_id) { |
bool removed_transform_animation = false; |
- auto animations_to_remove = |
- animations_.remove_if(HasAnimationId(animation_id)); |
+ // Since we want to use the animations that we're going to remove, we need to |
+ // use a stable_parition here instead of remove_if. Remove_if leaves the |
+ // removed items in an unspecified state. |
+ auto animations_to_remove = std::stable_partition( |
+ animations_.begin(), animations_.end(), |
+ [animation_id](const scoped_ptr<Animation>& animation) { |
+ return animation->id() != animation_id; |
+ }); |
for (auto it = animations_to_remove; it != animations_.end(); ++it) { |
if ((*it)->target_property() == Animation::SCROLL_OFFSET) { |
scroll_offset_animation_was_interrupted_ = true; |
@@ -115,25 +110,20 @@ void LayerAnimationController::RemoveAnimation(int animation_id) { |
UpdatePotentiallyAnimatingTransform(); |
} |
-struct HasAnimationIdAndProperty { |
- HasAnimationIdAndProperty(int id, Animation::TargetProperty target_property) |
- : id_(id), target_property_(target_property) {} |
- bool operator()(Animation* animation) const { |
- return animation->id() == id_ && |
- animation->target_property() == target_property_; |
- } |
- |
- private: |
- int id_; |
- Animation::TargetProperty target_property_; |
-}; |
- |
void LayerAnimationController::RemoveAnimation( |
int animation_id, |
Animation::TargetProperty target_property) { |
bool removed_transform_animation = false; |
- auto animations_to_remove = animations_.remove_if( |
- HasAnimationIdAndProperty(animation_id, target_property)); |
+ auto does_not_have_id_or_property = [animation_id, target_property]( |
+ const scoped_ptr<Animation>& animation) { |
+ return animation->id() != animation_id || |
+ animation->target_property() != target_property; |
+ }; |
+ // Since we want to use the animations that we're going to remove, we need to |
+ // use a stable_parition here instead of remove_if. Remove_if leaves the |
+ // removed items in an unspecified state. |
+ auto animations_to_remove = std::stable_partition( |
+ animations_.begin(), animations_.end(), does_not_have_id_or_property); |
if (animations_to_remove == animations_.end()) |
return; |
@@ -202,7 +192,7 @@ void LayerAnimationController::AccumulatePropertyUpdates( |
return; |
for (size_t i = 0; i < animations_.size(); ++i) { |
- Animation* animation = animations_[i]; |
+ Animation* animation = animations_[i].get(); |
if (!animation->is_impl_only()) |
continue; |
@@ -288,13 +278,6 @@ void LayerAnimationController::UpdateState(bool start_ready_animations, |
UpdateActivation(NORMAL_ACTIVATION); |
} |
-struct AffectsNoObservers { |
- bool operator()(Animation* animation) const { |
- return !animation->affects_active_observers() && |
- !animation->affects_pending_observers(); |
- } |
-}; |
- |
void LayerAnimationController::ActivateAnimations() { |
bool changed_transform_animation = false; |
for (size_t i = 0; i < animations_.size(); ++i) { |
@@ -305,10 +288,12 @@ void LayerAnimationController::ActivateAnimations() { |
animations_[i]->set_affects_active_observers( |
animations_[i]->affects_pending_observers()); |
} |
- animations_.erase(cc::remove_if(&animations_, |
- animations_.begin(), |
- animations_.end(), |
- AffectsNoObservers()), |
+ auto affects_no_observers = [](const scoped_ptr<Animation>& animation) { |
+ return !animation->affects_active_observers() && |
+ !animation->affects_pending_observers(); |
+ }; |
+ animations_.erase(std::remove_if(animations_.begin(), animations_.end(), |
+ affects_no_observers), |
animations_.end()); |
scroll_offset_animation_was_interrupted_ = false; |
UpdateActivation(NORMAL_ACTIVATION); |
@@ -331,15 +316,15 @@ Animation* LayerAnimationController::GetAnimation( |
for (size_t i = 0; i < animations_.size(); ++i) { |
size_t index = animations_.size() - i - 1; |
if (animations_[index]->target_property() == target_property) |
- return animations_[index]; |
+ return animations_[index].get(); |
} |
- return 0; |
+ return nullptr; |
} |
Animation* LayerAnimationController::GetAnimationById(int animation_id) const { |
for (size_t i = 0; i < animations_.size(); ++i) |
if (animations_[i]->id() == animation_id) |
- return animations_[i]; |
+ return animations_[i].get(); |
return nullptr; |
} |
@@ -737,11 +722,6 @@ static bool IsCompleted( |
} |
} |
-static bool AffectsActiveOnlyAndIsWaitingForDeletion(Animation* animation) { |
- return animation->run_state() == Animation::WAITING_FOR_DELETION && |
- !animation->affects_pending_observers(); |
-} |
- |
void LayerAnimationController::RemoveAnimationsCompletedOnMainThread( |
LayerAnimationController* controller_impl) const { |
bool removed_transform_animation = false; |
@@ -749,19 +729,23 @@ void LayerAnimationController::RemoveAnimationsCompletedOnMainThread( |
// observers, and should stop affecting active observers after the next call |
// to ActivateAnimations. If already WAITING_FOR_DELETION, they can be removed |
// immediately. |
- ScopedPtrVector<Animation>& animations = controller_impl->animations_; |
- for (size_t i = 0; i < animations.size(); ++i) { |
- if (IsCompleted(animations[i], this)) { |
- animations[i]->set_affects_pending_observers(false); |
- if (animations[i]->target_property() == Animation::TRANSFORM) |
+ auto& animations = controller_impl->animations_; |
+ for (const auto& animation : animations) { |
+ if (IsCompleted(animation.get(), this)) { |
+ animation->set_affects_pending_observers(false); |
+ if (animation->target_property() == Animation::TRANSFORM) |
removed_transform_animation = true; |
} |
} |
- animations.erase(cc::remove_if(&animations, |
- animations.begin(), |
- animations.end(), |
- AffectsActiveOnlyAndIsWaitingForDeletion), |
- animations.end()); |
+ auto affects_active_only_and_is_waiting_for_deletion = []( |
+ const scoped_ptr<Animation>& animation) { |
+ return animation->run_state() == Animation::WAITING_FOR_DELETION && |
+ !animation->affects_pending_observers(); |
+ }; |
+ animations.erase( |
+ std::remove_if(animations.begin(), animations.end(), |
+ affects_active_only_and_is_waiting_for_deletion), |
+ animations.end()); |
if (removed_transform_animation) |
controller_impl->UpdatePotentiallyAnimatingTransform(); |
@@ -810,7 +794,8 @@ void LayerAnimationController::StartAnimations(base::TimeTicks monotonic_time) { |
// Collect all properties for animations with the same group id (they |
// should all also be in the list of animations). |
size_t animation_index = animations_waiting_for_target[i]; |
- Animation* animation_waiting_for_target = animations_[animation_index]; |
+ Animation* animation_waiting_for_target = |
+ animations_[animation_index].get(); |
// Check for the run state again even though the animation was waiting |
// for target because it might have changed the run state while handling |
// previous animation in this loop (if they belong to same group). |
@@ -1009,15 +994,12 @@ void LayerAnimationController::MarkAnimationsForDeletion( |
NotifyObserversAnimationWaitingForDeletion(); |
} |
-static bool IsWaitingForDeletion(Animation* animation) { |
- return animation->run_state() == Animation::WAITING_FOR_DELETION; |
-} |
- |
void LayerAnimationController::PurgeAnimationsMarkedForDeletion() { |
- animations_.erase(cc::remove_if(&animations_, |
- animations_.begin(), |
- animations_.end(), |
- IsWaitingForDeletion), |
+ animations_.erase(std::remove_if(animations_.begin(), animations_.end(), |
+ [](const scoped_ptr<Animation>& animation) { |
+ return animation->run_state() == |
+ Animation::WAITING_FOR_DELETION; |
+ }), |
animations_.end()); |
} |