summaryrefslogtreecommitdiffstats
path: root/ui/compositor/layer.cc
diff options
context:
space:
mode:
Diffstat (limited to 'ui/compositor/layer.cc')
-rw-r--r--ui/compositor/layer.cc68
1 files changed, 64 insertions, 4 deletions
diff --git a/ui/compositor/layer.cc b/ui/compositor/layer.cc
index ca3ff28..d57cc3b 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