// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "ui/compositor/layer_animator_collection.h" #include #include "base/time/time.h" #include "ui/compositor/compositor.h" #include "ui/compositor/layer_animator.h" namespace ui { LayerAnimatorCollection::LayerAnimatorCollection(Compositor* compositor) : compositor_(compositor), last_tick_time_(base::TimeTicks::Now()) { } LayerAnimatorCollection::~LayerAnimatorCollection() { if (compositor_) compositor_->RemoveAnimationObserver(this); } void LayerAnimatorCollection::StartAnimator( scoped_refptr animator) { DCHECK_EQ(0U, animators_.count(animator)); if (!animators_.size()) last_tick_time_ = base::TimeTicks::Now(); animators_.insert(animator); if (animators_.size() == 1U && compositor_) compositor_->AddAnimationObserver(this); } void LayerAnimatorCollection::StopAnimator( scoped_refptr animator) { DCHECK_GT(animators_.count(animator), 0U); animators_.erase(animator); if (animators_.empty() && compositor_) compositor_->RemoveAnimationObserver(this); } bool LayerAnimatorCollection::HasActiveAnimators() const { return !animators_.empty(); } void LayerAnimatorCollection::OnAnimationStep(base::TimeTicks now) { last_tick_time_ = now; std::set > list = animators_; for (std::set >::iterator iter = list.begin(); iter != list.end(); ++iter) { // Make sure the animator is still valid. if (animators_.count(*iter) > 0) (*iter)->Step(now); } if (!HasActiveAnimators() && compositor_) compositor_->RemoveAnimationObserver(this); } void LayerAnimatorCollection::OnCompositingShuttingDown( Compositor* compositor) { DCHECK_EQ(compositor_, compositor); compositor_->RemoveAnimationObserver(this); compositor_ = nullptr; } } // namespace ui