Index: ui/compositor/layer.cc |
diff --git a/ui/compositor/layer.cc b/ui/compositor/layer.cc |
index ca3ff288ee293a43b49d39bee0f6f97311e6a0cd..d57cc3bd533418fa90e9927a12609818793f2a35 100644 |
--- a/ui/compositor/layer.cc |
+++ b/ui/compositor/layer.cc |
@@ -142,10 +142,15 @@ void Layer::SetCompositor(Compositor* compositor) { |
DCHECK(!compositor || !compositor_); |
DCHECK(!compositor || compositor->root_layer() == this); |
DCHECK(!parent_); |
+ if (compositor_) { |
+ RemoveAnimatorsInTreeFromCollection( |
+ compositor_->layer_animator_collection()); |
+ } |
compositor_ = compositor; |
if (compositor) { |
OnDeviceScaleFactorChanged(compositor->device_scale_factor()); |
SendPendingThreadedAnimations(); |
+ AddAnimatorsInTreeToCollection(compositor_->layer_animator_collection()); |
} |
} |
@@ -159,15 +164,21 @@ void Layer::Add(Layer* child) { |
child->OnDeviceScaleFactorChanged(device_scale_factor_); |
if (GetCompositor()) |
child->SendPendingThreadedAnimations(); |
+ LayerAnimatorCollection* collection = GetLayerAnimatorCollection(); |
+ if (collection) |
+ child->AddAnimatorsInTreeToCollection(collection); |
} |
void Layer::Remove(Layer* child) { |
// Current bounds are used to calculate offsets when layers are reparented. |
// Stop (and complete) an ongoing animation to update the bounds immediately. |
- if (child->GetAnimator()) { |
- child->GetAnimator()->StopAnimatingProperty( |
- ui::LayerAnimationElement::BOUNDS); |
- } |
+ LayerAnimator* child_animator = child->animator_; |
+ if (child_animator) |
+ child_animator->StopAnimatingProperty(ui::LayerAnimationElement::BOUNDS); |
+ LayerAnimatorCollection* collection = GetLayerAnimatorCollection(); |
+ if (collection) |
+ child->RemoveAnimatorsInTreeFromCollection(collection); |
+ |
std::vector<Layer*>::iterator i = |
std::find(children_.begin(), children_.end(), child); |
DCHECK(i != children_.end()); |
@@ -605,6 +616,13 @@ void Layer::SendDamagedRects() { |
children_[i]->SendDamagedRects(); |
} |
+void Layer::CompleteAllAnimations() { |
+ std::vector<scoped_refptr<LayerAnimator> > animators; |
+ CollectAnimators(&animators); |
+ std::for_each(animators.begin(), animators.end(), |
+ std::mem_fun(&LayerAnimator::StopAnimating)); |
+} |
+ |
void Layer::SuppressPaint() { |
if (!delegate_) |
return; |
@@ -689,6 +707,15 @@ void Layer::OnAnimationStarted(const cc::AnimationEvent& event) { |
animator_->OnThreadedAnimationStarted(event); |
} |
+void Layer::CollectAnimators( |
+ std::vector<scoped_refptr<LayerAnimator> >* animators) { |
+ if (IsAnimating()) |
+ animators->push_back(animator_); |
+ std::for_each(children_.begin(), children_.end(), |
+ std::bind2nd(std::mem_fun(&Layer::CollectAnimators), |
+ animators)); |
+} |
+ |
void Layer::StackRelativeTo(Layer* child, Layer* other, bool above) { |
DCHECK_NE(child, other); |
DCHECK_EQ(this, child->parent()); |
@@ -873,6 +900,11 @@ void Layer::RemoveThreadedAnimation(int animation_id) { |
pending_threaded_animations_.end()); |
} |
+LayerAnimatorCollection* Layer::GetLayerAnimatorCollection() { |
+ Compositor* compositor = GetCompositor(); |
+ return compositor ? compositor->layer_animator_collection() : NULL; |
+} |
+ |
void Layer::SendPendingThreadedAnimations() { |
for (cc::ScopedPtrVector<cc::Animation>::iterator it = |
pending_threaded_animations_.begin(); |
@@ -930,4 +962,32 @@ void Layer::RecomputePosition() { |
cc_layer_->SetPosition(gfx::PointF(bounds_.x(), bounds_.y())); |
} |
+void Layer::AddAnimatorsInTreeToCollection( |
+ LayerAnimatorCollection* collection) { |
+ DCHECK(collection); |
+ if (IsAnimating()) |
+ animator_->AddToCollection(collection); |
+ std::for_each( |
+ children_.begin(), |
+ children_.end(), |
+ std::bind2nd(std::mem_fun(&Layer::AddAnimatorsInTreeToCollection), |
+ collection)); |
+} |
+ |
+void Layer::RemoveAnimatorsInTreeFromCollection( |
+ LayerAnimatorCollection* collection) { |
+ DCHECK(collection); |
+ if (IsAnimating()) |
+ animator_->RemoveFromCollection(collection); |
+ std::for_each( |
+ children_.begin(), |
+ children_.end(), |
+ std::bind2nd(std::mem_fun(&Layer::RemoveAnimatorsInTreeFromCollection), |
+ collection)); |
+} |
+ |
+bool Layer::IsAnimating() const { |
+ return animator_ && animator_->is_animating(); |
+} |
+ |
} // namespace ui |