1f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti// Use of this source code is governed by a BSD-style license that can be
3f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti// found in the LICENSE file.
4f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
5f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti#include "ui/compositor/layer_animation_element.h"
6f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
7f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti#include "base/compiler_specific.h"
8f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti#include "cc/animation/animation.h"
9f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti#include "cc/animation/animation_id_provider.h"
10f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti#include "ui/compositor/float_animation_curve_adapter.h"
11f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti#include "ui/compositor/layer.h"
12f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti#include "ui/compositor/layer_animation_delegate.h"
13f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti#include "ui/compositor/layer_animator.h"
14f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti#include "ui/compositor/scoped_animation_duration_scale_mode.h"
15f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti#include "ui/compositor/transform_animation_curve_adapter.h"
16f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti#include "ui/gfx/animation/tween.h"
17f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti#include "ui/gfx/interpolated_transform.h"
18f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
19f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colittinamespace ui {
20f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
21f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colittinamespace {
22f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
23f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti// The factor by which duration is scaled up or down when using
24f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti// ScopedAnimationDurationScaleMode.
25f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitticonst int kSlowDurationScaleMultiplier = 4;
26f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitticonst int kFastDurationScaleDivisor = 4;
27f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitticonst int kNonZeroDurationScaleDivisor = 20;
28f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
29f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti// Pause -----------------------------------------------------------------------
30f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitticlass Pause : public LayerAnimationElement {
31f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti public:
32f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  Pause(AnimatableProperties properties, base::TimeDelta duration)
33f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti      : LayerAnimationElement(properties, duration) {
34f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  }
35f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual ~Pause() {}
36f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
37f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti private:
38f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE {}
39f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual bool OnProgress(double t,
40f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti                          LayerAnimationDelegate* delegate) OVERRIDE {
41f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    return false;
42f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  }
43f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual void OnGetTarget(TargetValue* target) const OVERRIDE {}
44f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {}
45f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
46f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  DISALLOW_COPY_AND_ASSIGN(Pause);
47f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti};
48f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
49f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti// TransformTransition ---------------------------------------------------------
50f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
51f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitticlass TransformTransition : public LayerAnimationElement {
52f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti public:
53f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    TransformTransition(const gfx::Transform& target, base::TimeDelta duration)
54f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti      : LayerAnimationElement(TRANSFORM, duration),
55f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti        target_(target) {
56f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  }
57f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual ~TransformTransition() {}
58f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
59f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti protected:
60f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE {
61f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    start_ = delegate->GetTransformForAnimation();
62f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  }
63f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
64f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE {
65f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    delegate->SetTransformFromAnimation(
66f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti        gfx::Tween::TransformValueBetween(t, start_, target_));
67f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    return true;
68f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  }
69f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
70f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual void OnGetTarget(TargetValue* target) const OVERRIDE {
71f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    target->transform = target_;
72f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  }
73f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
74f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {}
75f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
76f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti private:
77f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  gfx::Transform start_;
78f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  const gfx::Transform target_;
79f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
80f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  DISALLOW_COPY_AND_ASSIGN(TransformTransition);
81f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti};
82f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
83f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti// InterpolatedTransformTransition ---------------------------------------------
84f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
85f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitticlass InterpolatedTransformTransition : public LayerAnimationElement {
86f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti public:
87f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  InterpolatedTransformTransition(InterpolatedTransform* interpolated_transform,
88f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti                                  base::TimeDelta duration)
89f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti      : LayerAnimationElement(TRANSFORM, duration),
90f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti        interpolated_transform_(interpolated_transform) {
91f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  }
92f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual ~InterpolatedTransformTransition() {}
93f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
94f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti protected:
95f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE {
96f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  }
97f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
98f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE {
99f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    delegate->SetTransformFromAnimation(
100f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti        interpolated_transform_->Interpolate(static_cast<float>(t)));
101f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    return true;
102f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  }
103f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
104fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom  virtual void OnGetTarget(TargetValue* target) const OVERRIDE {
105f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    target->transform = interpolated_transform_->Interpolate(1.0f);
106f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  }
107f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
108f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {}
109f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
110fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom private:
111f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  scoped_ptr<InterpolatedTransform> interpolated_transform_;
112f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
113f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  DISALLOW_COPY_AND_ASSIGN(InterpolatedTransformTransition);
114f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti};
115f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
116fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom// BoundsTransition ------------------------------------------------------------
117f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
118f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitticlass BoundsTransition : public LayerAnimationElement {
119f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti public:
120f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  BoundsTransition(const gfx::Rect& target, base::TimeDelta duration)
121fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom      : LayerAnimationElement(BOUNDS, duration),
122fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom        target_(target) {
123fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom  }
124f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual ~BoundsTransition() {}
125fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom
126f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti protected:
127f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE {
128f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    start_ = delegate->GetBoundsForAnimation();
129f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  }
130f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
131f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE {
132f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    delegate->SetBoundsFromAnimation(
133f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti        gfx::Tween::RectValueBetween(t, start_, target_));
134f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    return true;
135fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom  }
136f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
137f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual void OnGetTarget(TargetValue* target) const OVERRIDE {
138f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    target->bounds = target_;
139f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  }
140f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
141f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {}
142f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
143f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti private:
144f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  gfx::Rect start_;
145fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom  const gfx::Rect target_;
146f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
147f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  DISALLOW_COPY_AND_ASSIGN(BoundsTransition);
148f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti};
149f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
150f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti// OpacityTransition -----------------------------------------------------------
151f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
152f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitticlass OpacityTransition : public LayerAnimationElement {
153fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom public:
154fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom  OpacityTransition(float target, base::TimeDelta duration)
155fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom      : LayerAnimationElement(OPACITY, duration),
156f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti        start_(0.0f),
157fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom        target_(target) {
158f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  }
159f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual ~OpacityTransition() {}
160f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
161f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti protected:
162f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE {
163f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    start_ = delegate->GetOpacityForAnimation();
164f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  }
165f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
166f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE {
167f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    delegate->SetOpacityFromAnimation(
168f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti        gfx::Tween::FloatValueBetween(t, start_, target_));
169f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    return true;
170f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  }
171f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
172f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual void OnGetTarget(TargetValue* target) const OVERRIDE {
173fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom    target->opacity = target_;
174fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom  }
175f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
176f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {}
177f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
178f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti private:
179f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  float start_;
180f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  const float target_;
181f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
182f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  DISALLOW_COPY_AND_ASSIGN(OpacityTransition);
183f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti};
184f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
185f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti// VisibilityTransition --------------------------------------------------------
186f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
187f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitticlass VisibilityTransition : public LayerAnimationElement {
188f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti public:
189f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  VisibilityTransition(bool target, base::TimeDelta duration)
190f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti      : LayerAnimationElement(VISIBILITY, duration),
191f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti        start_(false),
192f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti        target_(target) {
193f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  }
194f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual ~VisibilityTransition() {}
195f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
196f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti protected:
197f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE {
198f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    start_ = delegate->GetVisibilityForAnimation();
199f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  }
200fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom
201f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE {
202f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    delegate->SetVisibilityFromAnimation(t == 1.0 ? target_ : start_);
203f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    return t == 1.0;
204f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  }
205f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
206f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual void OnGetTarget(TargetValue* target) const OVERRIDE {
207f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    target->visibility = target_;
208f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  }
209f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
210f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {}
211f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
212f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti private:
213f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  bool start_;
214f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  const bool target_;
215f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
216f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  DISALLOW_COPY_AND_ASSIGN(VisibilityTransition);
217f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti};
218f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
219f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti// BrightnessTransition --------------------------------------------------------
220f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
221f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitticlass BrightnessTransition : public LayerAnimationElement {
222f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti public:
223f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  BrightnessTransition(float target, base::TimeDelta duration)
224f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti      : LayerAnimationElement(BRIGHTNESS, duration),
225f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti        start_(0.0f),
226f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti        target_(target) {
227f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  }
228f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual ~BrightnessTransition() {}
229f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
230f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti protected:
231f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE {
232f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    start_ = delegate->GetBrightnessForAnimation();
233f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  }
234f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
235f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE {
236f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    delegate->SetBrightnessFromAnimation(
237f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti        gfx::Tween::FloatValueBetween(t, start_, target_));
238f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    return true;
239f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  }
240f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
241f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual void OnGetTarget(TargetValue* target) const OVERRIDE {
242f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    target->brightness = target_;
243f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  }
244f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
245f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {}
246f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
247f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti private:
248f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  float start_;
249f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  const float target_;
250f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
251f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  DISALLOW_COPY_AND_ASSIGN(BrightnessTransition);
252f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti};
253f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
254f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti// GrayscaleTransition ---------------------------------------------------------
255f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
256f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitticlass GrayscaleTransition : public LayerAnimationElement {
257f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti public:
258f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  GrayscaleTransition(float target, base::TimeDelta duration)
259f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti      : LayerAnimationElement(GRAYSCALE, duration),
260f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti        start_(0.0f),
261f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti        target_(target) {
262f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  }
263f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual ~GrayscaleTransition() {}
264f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
265f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti protected:
266f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE {
267f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    start_ = delegate->GetGrayscaleForAnimation();
268f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  }
269f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
270f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE {
271f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    delegate->SetGrayscaleFromAnimation(
272f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti        gfx::Tween::FloatValueBetween(t, start_, target_));
273f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    return true;
274f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  }
275f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
276f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual void OnGetTarget(TargetValue* target) const OVERRIDE {
277f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    target->grayscale = target_;
278f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  }
279f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
280f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {}
281f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
282f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti private:
283f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  float start_;
284f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  const float target_;
285fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom
286fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom  DISALLOW_COPY_AND_ASSIGN(GrayscaleTransition);
287f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti};
288f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
289f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti// ColorTransition -------------------------------------------------------------
290f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
291fcac410fa15613873a07143ccd46470b869346a3Brian Carlstromclass ColorTransition : public LayerAnimationElement {
292f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti public:
293f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  ColorTransition(SkColor target, base::TimeDelta duration)
294fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom      : LayerAnimationElement(COLOR, duration),
295f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti        start_(SK_ColorBLACK),
296f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti        target_(target) {
297f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  }
298f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual ~ColorTransition() {}
299f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
300f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti protected:
301f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE {
302f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    start_ = delegate->GetColorForAnimation();
303f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  }
304f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
305f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE {
306f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    delegate->SetColorFromAnimation(
307f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti        gfx::Tween::ColorValueBetween(t, start_, target_));
308f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    return true;
309f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  }
310f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
311f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual void OnGetTarget(TargetValue* target) const OVERRIDE {
312f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    target->color = target_;
313f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  }
314f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
315f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {}
316f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
317f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti private:
318f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  SkColor start_;
319f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  const SkColor target_;
320f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
321f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  DISALLOW_COPY_AND_ASSIGN(ColorTransition);
322f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti};
323f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
324f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti// ThreadedLayerAnimationElement -----------------------------------------------
325f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
326f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitticlass ThreadedLayerAnimationElement : public LayerAnimationElement {
327f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti public:
328f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  ThreadedLayerAnimationElement(AnimatableProperties properties,
329f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti                                base::TimeDelta duration)
330f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti      : LayerAnimationElement(properties, duration) {
331f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  }
332f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual ~ThreadedLayerAnimationElement() {}
333f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
334f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual bool IsThreaded() const OVERRIDE {
335f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    return (duration() != base::TimeDelta());
336f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  }
337f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
338f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti protected:
339f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  explicit ThreadedLayerAnimationElement(const LayerAnimationElement& element)
340f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    : LayerAnimationElement(element) {
341f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  }
342f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
343f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual bool OnProgress(double t,
344f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti                          LayerAnimationDelegate* delegate) OVERRIDE {
345f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    if (t < 1.0)
346f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti      return false;
347f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
348f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    if (Started()) {
349f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti      delegate->RemoveThreadedAnimation(animation_id());
350f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    }
351f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
352f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    OnEnd(delegate);
353f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    return true;
354f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  }
355f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
356f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {
357f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    if (delegate && Started()) {
358f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti      delegate->RemoveThreadedAnimation(animation_id());
359f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    }
360f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  }
361f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
362f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual void RequestEffectiveStart(
363f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti      LayerAnimationDelegate* delegate) OVERRIDE {
364f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    DCHECK(animation_group_id());
365f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    if (duration() == base::TimeDelta()) {
366f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti      set_effective_start_time(requested_start_time());
367f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti      return;
368f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    }
369f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    set_effective_start_time(base::TimeTicks());
370f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    scoped_ptr<cc::Animation> animation = CreateCCAnimation();
371f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    animation->set_needs_synchronized_start_time(true);
372f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    delegate->AddThreadedAnimation(animation.Pass());
373fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom  }
374f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
375f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual void OnEnd(LayerAnimationDelegate* delegate) = 0;
376f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
377f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual scoped_ptr<cc::Animation> CreateCCAnimation() = 0;
378f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
379f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti private:
380f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  DISALLOW_COPY_AND_ASSIGN(ThreadedLayerAnimationElement);
381f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti};
382f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
383f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti// ThreadedOpacityTransition ---------------------------------------------------
384f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
385f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitticlass ThreadedOpacityTransition : public ThreadedLayerAnimationElement {
386f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti public:
387f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  ThreadedOpacityTransition(float target, base::TimeDelta duration)
388f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti      : ThreadedLayerAnimationElement(OPACITY, duration),
389f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti        start_(0.0f),
390f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti        target_(target) {
391f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  }
392f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual ~ThreadedOpacityTransition() {}
393f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
394f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti protected:
395fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom  virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE {
396f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    start_ = delegate->GetOpacityForAnimation();
397fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom  }
398f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
399f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {
400f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    if (delegate && Started()) {
401f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti      ThreadedLayerAnimationElement::OnAbort(delegate);
402f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti      delegate->SetOpacityFromAnimation(gfx::Tween::FloatValueBetween(
403f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti          gfx::Tween::CalculateValue(tween_type(), last_progressed_fraction()),
404f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti              start_,
405f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti              target_));
406f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    }
407f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  }
408f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
409f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual void OnEnd(LayerAnimationDelegate* delegate) OVERRIDE {
410f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    delegate->SetOpacityFromAnimation(target_);
411f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  }
412f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
413f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual scoped_ptr<cc::Animation> CreateCCAnimation() OVERRIDE {
414f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    scoped_ptr<cc::AnimationCurve> animation_curve(
415f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti        new FloatAnimationCurveAdapter(tween_type(),
416f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti                                       start_,
417f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti                                       target_,
418f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti                                       duration()));
419f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    scoped_ptr<cc::Animation> animation(
420f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti        cc::Animation::Create(animation_curve.Pass(),
421fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom                              animation_id(),
422f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti                              animation_group_id(),
423f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti                              cc::Animation::Opacity));
424f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    return animation.Pass();
425f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  }
426f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
427f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual void OnGetTarget(TargetValue* target) const OVERRIDE {
428f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    target->opacity = target_;
429f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  }
430f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
431f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti private:
432f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  float start_;
433f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  const float target_;
434f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
435f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  DISALLOW_COPY_AND_ASSIGN(ThreadedOpacityTransition);
436f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti};
437f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
438f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti// ThreadedTransformTransition -------------------------------------------------
439f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
440f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitticlass ThreadedTransformTransition : public ThreadedLayerAnimationElement {
441f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti public:
442f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  ThreadedTransformTransition(const gfx::Transform& target,
443f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti                              base::TimeDelta duration)
444f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti      : ThreadedLayerAnimationElement(TRANSFORM, duration),
445f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti        target_(target) {
446f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  }
447f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual ~ThreadedTransformTransition() {}
448f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
449f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti protected:
450f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE {
451f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    start_ = delegate->GetTransformForAnimation();
452f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  }
453f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
454f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {
455f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    if (delegate && Started()) {
456f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti      ThreadedLayerAnimationElement::OnAbort(delegate);
457f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti      delegate->SetTransformFromAnimation(gfx::Tween::TransformValueBetween(
458f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti          gfx::Tween::CalculateValue(tween_type(), last_progressed_fraction()),
459f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti          start_,
460f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti          target_));
461f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    }
462f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  }
463f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
464f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual void OnEnd(LayerAnimationDelegate* delegate) OVERRIDE {
465f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    delegate->SetTransformFromAnimation(target_);
466f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  }
467f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
468f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual scoped_ptr<cc::Animation> CreateCCAnimation() OVERRIDE {
469f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    scoped_ptr<cc::AnimationCurve> animation_curve(
470f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti        new TransformAnimationCurveAdapter(tween_type(),
471f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti                                           start_,
472f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti                                           target_,
473f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti                                           duration()));
474fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom    scoped_ptr<cc::Animation> animation(
475fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom        cc::Animation::Create(animation_curve.Pass(),
476fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom                              animation_id(),
477f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti                              animation_group_id(),
478f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti                              cc::Animation::Transform));
479f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    return animation.Pass();
480f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  }
481f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
482f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual void OnGetTarget(TargetValue* target) const OVERRIDE {
483fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom    target->transform = target_;
484fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom  }
485f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
486f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti private:
487f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  gfx::Transform start_;
488f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  const gfx::Transform target_;
489f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
490f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  DISALLOW_COPY_AND_ASSIGN(ThreadedTransformTransition);
491f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti};
492f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
493f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti// InverseTransformTransision --------------------------------------------------
494f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
495fcac410fa15613873a07143ccd46470b869346a3Brian Carlstromclass InverseTransformTransition : public ThreadedLayerAnimationElement {
496f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti public:
497f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  InverseTransformTransition(const gfx::Transform& base_transform,
498f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti                             const LayerAnimationElement* uninverted_transition)
499f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti      : ThreadedLayerAnimationElement(*uninverted_transition),
500fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom        base_transform_(base_transform),
501f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti        uninverted_transition_(
502f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti            CheckAndCast<const ThreadedTransformTransition*>(
503f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti              uninverted_transition)) {
504f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  }
505f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual ~InverseTransformTransition() {}
506f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
507f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  static InverseTransformTransition* Clone(const LayerAnimationElement* other) {
508f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    const InverseTransformTransition* other_inverse =
509f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti      CheckAndCast<const InverseTransformTransition*>(other);
510f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    return new InverseTransformTransition(
511f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti        other_inverse->base_transform_, other_inverse->uninverted_transition_);
512f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  }
513f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
514f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti protected:
515f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE {
516f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    gfx::Transform start(delegate->GetTransformForAnimation());
517f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    effective_start_ = base_transform_ * start;
518f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
519fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom    TargetValue target;
520f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    uninverted_transition_->GetTargetValue(&target);
521f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    base_target_ = target.transform;
522fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom
523f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    set_tween_type(uninverted_transition_->tween_type());
524f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
525fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom    TransformAnimationCurveAdapter base_curve(tween_type(),
526f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti                                              base_transform_,
527f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti                                              base_target_,
528f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti                                              duration());
529f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
530fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom    animation_curve_.reset(new InverseTransformCurveAdapter(
531f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti        base_curve, start, duration()));
532f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    computed_target_transform_ = ComputeWithBaseTransform(effective_start_,
533f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti                                                          base_target_);
534f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  }
535f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
536fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom  virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {
537f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    if (delegate && Started()) {
538f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti      ThreadedLayerAnimationElement::OnAbort(delegate);
539f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti      delegate->SetTransformFromAnimation(ComputeCurrentTransform());
540f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    }
541f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  }
542fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom
543f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual void OnEnd(LayerAnimationDelegate* delegate) OVERRIDE {
544f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    delegate->SetTransformFromAnimation(computed_target_transform_);
545fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom  }
546f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
547f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual scoped_ptr<cc::Animation> CreateCCAnimation() OVERRIDE {
548f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    scoped_ptr<cc::Animation> animation(
549fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom        cc::Animation::Create(animation_curve_->Clone(),
550f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti                              animation_id(),
551f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti                              animation_group_id(),
552f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti                              cc::Animation::Transform));
553f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    return animation.Pass();
554f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  }
555f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
556f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  virtual void OnGetTarget(TargetValue* target) const OVERRIDE {
557f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    target->transform = computed_target_transform_;
558f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  }
559f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
560f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti private:
561f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  gfx::Transform ComputeCurrentTransform() const {
562f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    gfx::Transform base_current = gfx::Tween::TransformValueBetween(
563f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti        gfx::Tween::CalculateValue(tween_type(), last_progressed_fraction()),
564f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti        base_transform_,
565f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti        base_target_);
566f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    return ComputeWithBaseTransform(effective_start_, base_current);
567f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  }
568f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
569f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  gfx::Transform ComputeWithBaseTransform(gfx::Transform start,
570fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom                                          gfx::Transform target) const {
571fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom    gfx::Transform to_return(gfx::Transform::kSkipInitialization);
572f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    bool success = target.GetInverse(&to_return);
573f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    DCHECK(success) << "Target transform must be invertible.";
574f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
575f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    to_return.PreconcatTransform(start);
576f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    return to_return;
577fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom  }
578fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom
579f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  template <typename T>
580f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  static T CheckAndCast(const LayerAnimationElement* element) {
581f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    AnimatableProperties properties = element->properties();
582f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    DCHECK(properties & TRANSFORM);
583f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    return static_cast<T>(element);
584f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  }
585f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
586fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom  gfx::Transform effective_start_;
587fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom  gfx::Transform computed_target_transform_;
588f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
589f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  const gfx::Transform base_transform_;
590f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  gfx::Transform base_target_;
591f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
592f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  scoped_ptr<cc::AnimationCurve> animation_curve_;
593fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom
594fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom  const ThreadedTransformTransition* const uninverted_transition_;
595f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
596f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  DISALLOW_COPY_AND_ASSIGN(InverseTransformTransition);
597f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti};
598f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
599f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti}  // namespace
600f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
601f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti// LayerAnimationElement::TargetValue ------------------------------------------
602f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
603f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo ColittiLayerAnimationElement::TargetValue::TargetValue()
604f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    : opacity(0.0f),
605f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti      visibility(false),
606f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti      brightness(0.0f),
607f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti      grayscale(0.0f),
608f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti      color(SK_ColorBLACK) {
609f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti}
610f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
611f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo ColittiLayerAnimationElement::TargetValue::TargetValue(
612f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    const LayerAnimationDelegate* delegate)
613f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    : bounds(delegate ? delegate->GetBoundsForAnimation() : gfx::Rect()),
614f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti      transform(delegate ?
615f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti                delegate->GetTransformForAnimation() : gfx::Transform()),
616f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti      opacity(delegate ? delegate->GetOpacityForAnimation() : 0.0f),
617f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti      visibility(delegate ? delegate->GetVisibilityForAnimation() : false),
618f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti      brightness(delegate ? delegate->GetBrightnessForAnimation() : 0.0f),
619f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti      grayscale(delegate ? delegate->GetGrayscaleForAnimation() : 0.0f),
620f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti      color(delegate ? delegate->GetColorForAnimation() : 0.0f) {
621f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti}
622f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
623f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti// LayerAnimationElement -------------------------------------------------------
624f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
625f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo ColittiLayerAnimationElement::LayerAnimationElement(
626f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    AnimatableProperties properties, base::TimeDelta duration)
627f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    : first_frame_(true),
628f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti      properties_(properties),
629f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti      duration_(GetEffectiveDuration(duration)),
630f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti      tween_type_(gfx::Tween::LINEAR),
631f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti      animation_id_(cc::AnimationIdProvider::NextAnimationId()),
632f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti      animation_group_id_(0),
633f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti      last_progressed_fraction_(0.0),
634f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti      weak_ptr_factory_(this) {
635f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti}
636f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
637f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo ColittiLayerAnimationElement::LayerAnimationElement(
638f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    const LayerAnimationElement &element)
639f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti    : first_frame_(element.first_frame_),
640f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti      properties_(element.properties_),
641f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti      duration_(element.duration_),
642f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti      tween_type_(element.tween_type_),
643f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti      animation_id_(cc::AnimationIdProvider::NextAnimationId()),
644f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti      animation_group_id_(element.animation_group_id_),
645f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti      last_progressed_fraction_(element.last_progressed_fraction_),
646fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom      weak_ptr_factory_(this) {
647fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom}
648f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
649f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo ColittiLayerAnimationElement::~LayerAnimationElement() {
650f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti}
651f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
652f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colittivoid LayerAnimationElement::Start(LayerAnimationDelegate* delegate,
653f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti                                  int animation_group_id) {
654f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  DCHECK(requested_start_time_ != base::TimeTicks());
655fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom  DCHECK(first_frame_);
656fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom  animation_group_id_ = animation_group_id;
657f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  last_progressed_fraction_ = 0.0;
658f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  OnStart(delegate);
659f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  RequestEffectiveStart(delegate);
660f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  first_frame_ = false;
661f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti}
662f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
663f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colittibool LayerAnimationElement::Progress(base::TimeTicks now,
664f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti                                     LayerAnimationDelegate* delegate) {
665f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  DCHECK(requested_start_time_ != base::TimeTicks());
666f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  DCHECK(!first_frame_);
667f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
668f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  bool need_draw;
669f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  double t = 1.0;
670f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti
671f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti  if ((effective_start_time_ == base::TimeTicks()) ||
672f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti      (now < effective_start_time_))  {
673    // This hasn't actually started yet.
674    need_draw = false;
675    last_progressed_fraction_ = 0.0;
676    return need_draw;
677  }
678
679  base::TimeDelta elapsed = now - effective_start_time_;
680  if ((duration_ > base::TimeDelta()) && (elapsed < duration_))
681    t = elapsed.InMillisecondsF() / duration_.InMillisecondsF();
682  base::WeakPtr<LayerAnimationElement> alive(weak_ptr_factory_.GetWeakPtr());
683  need_draw = OnProgress(gfx::Tween::CalculateValue(tween_type_, t), delegate);
684  if (!alive)
685    return need_draw;
686  first_frame_ = t == 1.0;
687  last_progressed_fraction_ = t;
688  return need_draw;
689}
690
691bool LayerAnimationElement::IsFinished(base::TimeTicks time,
692                                       base::TimeDelta* total_duration) {
693  // If an effective start has been requested but the effective start time
694  // hasn't yet been set, the animation is not finished, regardless of the
695  // value of |time|.
696  if (!first_frame_ && (effective_start_time_ == base::TimeTicks()))
697    return false;
698
699  base::TimeDelta queueing_delay;
700  if (!first_frame_)
701    queueing_delay = effective_start_time_ - requested_start_time_;
702
703  base::TimeDelta elapsed = time - requested_start_time_;
704  if (elapsed >= duration_ + queueing_delay) {
705    *total_duration = duration_ + queueing_delay;
706    return true;
707  }
708  return false;
709}
710
711bool LayerAnimationElement::ProgressToEnd(LayerAnimationDelegate* delegate) {
712  if (first_frame_)
713    OnStart(delegate);
714  base::WeakPtr<LayerAnimationElement> alive(weak_ptr_factory_.GetWeakPtr());
715  bool need_draw = OnProgress(1.0, delegate);
716  if (!alive)
717    return need_draw;
718  last_progressed_fraction_ = 1.0;
719  first_frame_ = true;
720  return need_draw;
721}
722
723void LayerAnimationElement::GetTargetValue(TargetValue* target) const {
724  OnGetTarget(target);
725}
726
727bool LayerAnimationElement::IsThreaded() const {
728  return false;
729}
730
731void LayerAnimationElement::Abort(LayerAnimationDelegate* delegate) {
732  OnAbort(delegate);
733  first_frame_ = true;
734}
735
736void LayerAnimationElement::RequestEffectiveStart(
737    LayerAnimationDelegate* delegate) {
738  DCHECK(requested_start_time_ != base::TimeTicks());
739  effective_start_time_ = requested_start_time_;
740}
741
742// static
743LayerAnimationElement::AnimatableProperty
744LayerAnimationElement::ToAnimatableProperty(
745    cc::Animation::TargetProperty property) {
746  switch (property) {
747    case cc::Animation::Transform:
748      return TRANSFORM;
749    case cc::Animation::Opacity:
750      return OPACITY;
751    default:
752      NOTREACHED();
753      return AnimatableProperty();
754  }
755}
756
757// static
758base::TimeDelta LayerAnimationElement::GetEffectiveDuration(
759    const base::TimeDelta& duration) {
760  switch (ScopedAnimationDurationScaleMode::duration_scale_mode()) {
761    case ScopedAnimationDurationScaleMode::NORMAL_DURATION:
762      return duration;
763    case ScopedAnimationDurationScaleMode::FAST_DURATION:
764      return duration / kFastDurationScaleDivisor;
765    case ScopedAnimationDurationScaleMode::SLOW_DURATION:
766      return duration * kSlowDurationScaleMultiplier;
767    case ScopedAnimationDurationScaleMode::NON_ZERO_DURATION:
768      return duration / kNonZeroDurationScaleDivisor;
769    case ScopedAnimationDurationScaleMode::ZERO_DURATION:
770      return base::TimeDelta();
771    default:
772      NOTREACHED();
773      return base::TimeDelta();
774  }
775}
776
777// static
778LayerAnimationElement* LayerAnimationElement::CreateTransformElement(
779    const gfx::Transform& transform,
780    base::TimeDelta duration) {
781  return new ThreadedTransformTransition(transform, duration);
782}
783
784// static
785LayerAnimationElement* LayerAnimationElement::CreateInverseTransformElement(
786    const gfx::Transform& base_transform,
787    const LayerAnimationElement* uninverted_transition) {
788  return new InverseTransformTransition(base_transform, uninverted_transition);
789}
790
791// static
792LayerAnimationElement* LayerAnimationElement::CloneInverseTransformElement(
793    const LayerAnimationElement* other) {
794  return InverseTransformTransition::Clone(other);
795}
796
797// static
798LayerAnimationElement*
799LayerAnimationElement::CreateInterpolatedTransformElement(
800    InterpolatedTransform* interpolated_transform,
801    base::TimeDelta duration) {
802  return new InterpolatedTransformTransition(interpolated_transform, duration);
803}
804
805// static
806LayerAnimationElement* LayerAnimationElement::CreateBoundsElement(
807    const gfx::Rect& bounds,
808    base::TimeDelta duration) {
809  return new BoundsTransition(bounds, duration);
810}
811
812// static
813LayerAnimationElement* LayerAnimationElement::CreateOpacityElement(
814    float opacity,
815    base::TimeDelta duration) {
816  return new ThreadedOpacityTransition(opacity, duration);
817}
818
819// static
820LayerAnimationElement* LayerAnimationElement::CreateVisibilityElement(
821    bool visibility,
822    base::TimeDelta duration) {
823  return new VisibilityTransition(visibility, duration);
824}
825
826// static
827LayerAnimationElement* LayerAnimationElement::CreateBrightnessElement(
828    float brightness,
829    base::TimeDelta duration) {
830  return new BrightnessTransition(brightness, duration);
831}
832
833// static
834LayerAnimationElement* LayerAnimationElement::CreateGrayscaleElement(
835    float grayscale,
836    base::TimeDelta duration) {
837  return new GrayscaleTransition(grayscale, duration);
838}
839
840// static
841LayerAnimationElement* LayerAnimationElement::CreatePauseElement(
842    AnimatableProperties properties,
843    base::TimeDelta duration) {
844  return new Pause(properties, duration);
845}
846
847// static
848LayerAnimationElement* LayerAnimationElement::CreateColorElement(
849    SkColor color,
850    base::TimeDelta duration) {
851  return new ColorTransition(color, duration);
852}
853
854}  // namespace ui
855