146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// found in the LICENSE file.
446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ui/compositor/layer_animator_collection.h"
646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include <set>
846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/time/time.h"
1046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ui/compositor/layer_animator.h"
1146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ui/gfx/frame_time.h"
1246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace ui {
1446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)LayerAnimatorCollection::LayerAnimatorCollection(
1646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    LayerAnimatorCollectionDelegate* delegate)
1746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    : delegate_(delegate),
1846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      last_tick_time_(gfx::FrameTime::Now()) {
1946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
2046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
2146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)LayerAnimatorCollection::~LayerAnimatorCollection() {
2246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
2346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
2446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void LayerAnimatorCollection::StartAnimator(
2546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    scoped_refptr<LayerAnimator> animator) {
2646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DCHECK_EQ(0U, animators_.count(animator));
2746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (!animators_.size())
2846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    last_tick_time_ = gfx::FrameTime::Now();
2946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  animators_.insert(animator);
3046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (delegate_)
3146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    delegate_->ScheduleAnimationForLayerCollection();
3246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
3346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
3446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void LayerAnimatorCollection::StopAnimator(
3546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    scoped_refptr<LayerAnimator> animator) {
3646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DCHECK_GT(animators_.count(animator), 0U);
3746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  animators_.erase(animator);
3846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
3946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
4046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)bool LayerAnimatorCollection::HasActiveAnimators() const {
4146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return !animators_.empty();
4246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
4346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
4446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void LayerAnimatorCollection::Progress(base::TimeTicks now) {
4546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  last_tick_time_ = now;
4646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  std::set<scoped_refptr<LayerAnimator> > list = animators_;
4746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  for (std::set<scoped_refptr<LayerAnimator> >::iterator iter = list.begin();
4846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)       iter != list.end();
4946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)       ++iter) {
5046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // Make sure the animator is still valid.
5146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (animators_.count(*iter) > 0)
5246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      (*iter)->Step(now);
5346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
5446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
5546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
5646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}  // namespace ui
57