layer_animation_element.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "ui/compositor/layer_animation_element.h"
6
7#include "base/compiler_specific.h"
8#include "ui/base/animation/tween.h"
9#include "ui/compositor/layer_animation_delegate.h"
10#include "ui/compositor/layer_animator.h"
11#include "ui/gfx/interpolated_transform.h"
12
13namespace ui {
14
15namespace {
16
17// Pause -----------------------------------------------------------------------
18class Pause : public LayerAnimationElement {
19 public:
20  Pause(const AnimatableProperties& properties, base::TimeDelta duration)
21      : LayerAnimationElement(properties, duration) {
22  }
23  virtual ~Pause() {}
24
25 private:
26  virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE {}
27  virtual bool OnProgress(double t,
28                          LayerAnimationDelegate* delegate) OVERRIDE {
29    return false;
30  }
31  virtual void OnGetTarget(TargetValue* target) const OVERRIDE {}
32  virtual void OnAbort() OVERRIDE {}
33
34  DISALLOW_COPY_AND_ASSIGN(Pause);
35};
36
37// TransformTransition ---------------------------------------------------------
38
39class TransformTransition : public LayerAnimationElement {
40 public:
41    TransformTransition(const gfx::Transform& target, base::TimeDelta duration)
42      : LayerAnimationElement(GetProperties(), duration),
43        target_(target) {
44  }
45  virtual ~TransformTransition() {}
46
47 protected:
48  virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE {
49    start_ = delegate->GetTransformForAnimation();
50  }
51
52  virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE {
53    delegate->SetTransformFromAnimation(
54        Tween::ValueBetween(t, start_, target_));
55    return true;
56  }
57
58  virtual void OnGetTarget(TargetValue* target) const OVERRIDE {
59    target->transform = target_;
60  }
61
62  virtual void OnAbort() OVERRIDE {}
63
64 private:
65  static AnimatableProperties GetProperties() {
66    AnimatableProperties properties;
67    properties.insert(LayerAnimationElement::TRANSFORM);
68    return properties;
69  }
70
71  gfx::Transform start_;
72  const gfx::Transform target_;
73
74  DISALLOW_COPY_AND_ASSIGN(TransformTransition);
75};
76
77// InterpolatedTransformTransition ---------------------------------------------
78
79class InterpolatedTransformTransition : public LayerAnimationElement {
80 public:
81  InterpolatedTransformTransition(InterpolatedTransform* interpolated_transform,
82                                  base::TimeDelta duration)
83      : LayerAnimationElement(GetProperties(), duration),
84        interpolated_transform_(interpolated_transform) {
85  }
86  virtual ~InterpolatedTransformTransition() {}
87
88 protected:
89  virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE {
90  }
91
92  virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE {
93    delegate->SetTransformFromAnimation(
94        interpolated_transform_->Interpolate(static_cast<float>(t)));
95    return true;
96  }
97
98  virtual void OnGetTarget(TargetValue* target) const OVERRIDE {
99    target->transform = interpolated_transform_->Interpolate(1.0f);
100  }
101
102  virtual void OnAbort() OVERRIDE {}
103
104 private:
105  static AnimatableProperties GetProperties() {
106    AnimatableProperties properties;
107    properties.insert(LayerAnimationElement::TRANSFORM);
108    return properties;
109  }
110
111  scoped_ptr<InterpolatedTransform> interpolated_transform_;
112
113  DISALLOW_COPY_AND_ASSIGN(InterpolatedTransformTransition);
114};
115
116// BoundsTransition ------------------------------------------------------------
117
118class BoundsTransition : public LayerAnimationElement {
119 public:
120  BoundsTransition(const gfx::Rect& target, base::TimeDelta duration)
121      : LayerAnimationElement(GetProperties(), duration),
122        target_(target) {
123  }
124  virtual ~BoundsTransition() {}
125
126 protected:
127  virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE {
128    start_ = delegate->GetBoundsForAnimation();
129  }
130
131  virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE {
132    delegate->SetBoundsFromAnimation(Tween::ValueBetween(t, start_, target_));
133    return true;
134  }
135
136  virtual void OnGetTarget(TargetValue* target) const OVERRIDE {
137    target->bounds = target_;
138  }
139
140  virtual void OnAbort() OVERRIDE {}
141
142 private:
143  static AnimatableProperties GetProperties() {
144    AnimatableProperties properties;
145    properties.insert(LayerAnimationElement::BOUNDS);
146    return properties;
147  }
148
149  gfx::Rect start_;
150  const gfx::Rect target_;
151
152  DISALLOW_COPY_AND_ASSIGN(BoundsTransition);
153};
154
155// OpacityTransition -----------------------------------------------------------
156
157class OpacityTransition : public LayerAnimationElement {
158 public:
159  OpacityTransition(float target, base::TimeDelta duration)
160      : LayerAnimationElement(GetProperties(), duration),
161        start_(0.0f),
162        target_(target) {
163  }
164  virtual ~OpacityTransition() {}
165
166 protected:
167  virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE {
168    start_ = delegate->GetOpacityForAnimation();
169  }
170
171  virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE {
172    delegate->SetOpacityFromAnimation(Tween::ValueBetween(t, start_, target_));
173    return true;
174  }
175
176  virtual void OnGetTarget(TargetValue* target) const OVERRIDE {
177    target->opacity = target_;
178  }
179
180  virtual void OnAbort() OVERRIDE {}
181
182 private:
183  static AnimatableProperties GetProperties() {
184    AnimatableProperties properties;
185    properties.insert(LayerAnimationElement::OPACITY);
186    return properties;
187  }
188
189  float start_;
190  const float target_;
191
192  DISALLOW_COPY_AND_ASSIGN(OpacityTransition);
193};
194
195// VisibilityTransition --------------------------------------------------------
196
197class VisibilityTransition : public LayerAnimationElement {
198 public:
199  VisibilityTransition(bool target, base::TimeDelta duration)
200      : LayerAnimationElement(GetProperties(), duration),
201        start_(false),
202        target_(target) {
203  }
204  virtual ~VisibilityTransition() {}
205
206 protected:
207  virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE {
208    start_ = delegate->GetVisibilityForAnimation();
209  }
210
211  virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE {
212    delegate->SetVisibilityFromAnimation(t == 1.0 ? target_ : start_);
213    return t == 1.0;
214  }
215
216  virtual void OnGetTarget(TargetValue* target) const OVERRIDE {
217    target->visibility = target_;
218  }
219
220  virtual void OnAbort() OVERRIDE {}
221
222 private:
223  static AnimatableProperties GetProperties() {
224    AnimatableProperties properties;
225    properties.insert(LayerAnimationElement::VISIBILITY);
226    return properties;
227  }
228
229  bool start_;
230  const bool target_;
231
232  DISALLOW_COPY_AND_ASSIGN(VisibilityTransition);
233};
234
235// BrightnessTransition --------------------------------------------------------
236
237class BrightnessTransition : public LayerAnimationElement {
238 public:
239  BrightnessTransition(float target, base::TimeDelta duration)
240      : LayerAnimationElement(GetProperties(), duration),
241        start_(0.0f),
242        target_(target) {
243  }
244  virtual ~BrightnessTransition() {}
245
246 protected:
247  virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE {
248    start_ = delegate->GetBrightnessForAnimation();
249  }
250
251  virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE {
252    delegate->SetBrightnessFromAnimation(
253        Tween::ValueBetween(t, start_, target_));
254    return true;
255  }
256
257  virtual void OnGetTarget(TargetValue* target) const OVERRIDE {
258    target->brightness = target_;
259  }
260
261  virtual void OnAbort() OVERRIDE {}
262
263 private:
264  static AnimatableProperties GetProperties() {
265    AnimatableProperties properties;
266    properties.insert(LayerAnimationElement::BRIGHTNESS);
267    return properties;
268  }
269
270  float start_;
271  const float target_;
272
273  DISALLOW_COPY_AND_ASSIGN(BrightnessTransition);
274};
275
276// GrayscaleTransition ---------------------------------------------------------
277
278class GrayscaleTransition : public LayerAnimationElement {
279 public:
280  GrayscaleTransition(float target, base::TimeDelta duration)
281      : LayerAnimationElement(GetProperties(), duration),
282        start_(0.0f),
283        target_(target) {
284  }
285  virtual ~GrayscaleTransition() {}
286
287 protected:
288  virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE {
289    start_ = delegate->GetGrayscaleForAnimation();
290  }
291
292  virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE {
293    delegate->SetGrayscaleFromAnimation(
294        Tween::ValueBetween(t, start_, target_));
295    return true;
296  }
297
298  virtual void OnGetTarget(TargetValue* target) const OVERRIDE {
299    target->grayscale = target_;
300  }
301
302  virtual void OnAbort() OVERRIDE {}
303
304 private:
305  static AnimatableProperties GetProperties() {
306    AnimatableProperties properties;
307    properties.insert(LayerAnimationElement::GRAYSCALE);
308    return properties;
309  }
310
311  float start_;
312  const float target_;
313
314  DISALLOW_COPY_AND_ASSIGN(GrayscaleTransition);
315};
316
317// ColorTransition -------------------------------------------------------------
318
319class ColorTransition : public LayerAnimationElement {
320 public:
321  ColorTransition(SkColor target, base::TimeDelta duration)
322      : LayerAnimationElement(GetProperties(), duration),
323        start_(SK_ColorBLACK),
324        target_(target) {
325  }
326  virtual ~ColorTransition() {}
327
328 protected:
329  virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE {
330    start_ = delegate->GetColorForAnimation();
331  }
332
333  virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE {
334    delegate->SetColorFromAnimation(
335        SkColorSetARGB(
336            Tween::ValueBetween(t,
337                                static_cast<int>(SkColorGetA(start_)),
338                                static_cast<int>(SkColorGetA(target_))),
339            Tween::ValueBetween(t,
340                                static_cast<int>(SkColorGetR(start_)),
341                                static_cast<int>(SkColorGetR(target_))),
342            Tween::ValueBetween(t,
343                                static_cast<int>(SkColorGetG(start_)),
344                                static_cast<int>(SkColorGetG(target_))),
345            Tween::ValueBetween(t,
346                                static_cast<int>(SkColorGetB(start_)),
347                                static_cast<int>(SkColorGetB(target_)))));
348    return true;
349  }
350
351  virtual void OnGetTarget(TargetValue* target) const OVERRIDE {
352    target->color = target_;
353  }
354
355  virtual void OnAbort() OVERRIDE {}
356
357 private:
358  static AnimatableProperties GetProperties() {
359    AnimatableProperties properties;
360    properties.insert(LayerAnimationElement::COLOR);
361    return properties;
362  }
363
364  SkColor start_;
365  const SkColor target_;
366
367  DISALLOW_COPY_AND_ASSIGN(ColorTransition);
368};
369
370}  // namespace
371
372// LayerAnimationElement::TargetValue ------------------------------------------
373
374LayerAnimationElement::TargetValue::TargetValue()
375    : opacity(0.0f),
376      visibility(false),
377      brightness(0.0f),
378      grayscale(0.0f),
379      color(SK_ColorBLACK) {
380}
381
382LayerAnimationElement::TargetValue::TargetValue(
383    const LayerAnimationDelegate* delegate)
384    : bounds(delegate ? delegate->GetBoundsForAnimation() : gfx::Rect()),
385      transform(delegate ?
386                delegate->GetTransformForAnimation() : gfx::Transform()),
387      opacity(delegate ? delegate->GetOpacityForAnimation() : 0.0f),
388      visibility(delegate ? delegate->GetVisibilityForAnimation() : false),
389      brightness(delegate ? delegate->GetBrightnessForAnimation() : 0.0f),
390      grayscale(delegate ? delegate->GetGrayscaleForAnimation() : 0.0f),
391      color(delegate ? delegate->GetColorForAnimation() : 0.0f) {
392}
393
394// LayerAnimationElement -------------------------------------------------------
395
396LayerAnimationElement::LayerAnimationElement(
397    const AnimatableProperties& properties,
398    base::TimeDelta duration)
399    : first_frame_(true),
400      properties_(properties),
401      duration_(GetEffectiveDuration(duration)),
402      tween_type_(Tween::LINEAR) {
403}
404
405LayerAnimationElement::~LayerAnimationElement() {
406}
407
408bool LayerAnimationElement::Progress(double t,
409                                     LayerAnimationDelegate* delegate) {
410  if (first_frame_)
411    OnStart(delegate);
412  bool need_draw = OnProgress(Tween::CalculateValue(tween_type_, t), delegate);
413  first_frame_ = t == 1.0;
414  return need_draw;
415}
416
417void LayerAnimationElement::GetTargetValue(TargetValue* target) const {
418  OnGetTarget(target);
419}
420
421void LayerAnimationElement::Abort() {
422  first_frame_ = true;
423  OnAbort();
424}
425
426// static
427base::TimeDelta LayerAnimationElement::GetEffectiveDuration(
428    const base::TimeDelta& duration) {
429  if (LayerAnimator::disable_animations_for_test())
430    return base::TimeDelta();
431
432  if (LayerAnimator::slow_animation_mode())
433    return duration * LayerAnimator::slow_animation_scale_factor();
434
435  return duration;
436}
437
438// static
439LayerAnimationElement* LayerAnimationElement::CreateTransformElement(
440    const gfx::Transform& transform,
441    base::TimeDelta duration) {
442  return new TransformTransition(transform, duration);
443}
444
445// static
446LayerAnimationElement*
447LayerAnimationElement::CreateInterpolatedTransformElement(
448    InterpolatedTransform* interpolated_transform,
449    base::TimeDelta duration) {
450  return new InterpolatedTransformTransition(interpolated_transform, duration);
451}
452
453// static
454LayerAnimationElement* LayerAnimationElement::CreateBoundsElement(
455    const gfx::Rect& bounds,
456    base::TimeDelta duration) {
457  return new BoundsTransition(bounds, duration);
458}
459
460// static
461LayerAnimationElement* LayerAnimationElement::CreateOpacityElement(
462    float opacity,
463    base::TimeDelta duration) {
464  return new OpacityTransition(opacity, duration);
465}
466
467// static
468LayerAnimationElement* LayerAnimationElement::CreateVisibilityElement(
469    bool visibility,
470    base::TimeDelta duration) {
471  return new VisibilityTransition(visibility, duration);
472}
473
474// static
475LayerAnimationElement* LayerAnimationElement::CreateBrightnessElement(
476    float brightness,
477    base::TimeDelta duration) {
478  return new BrightnessTransition(brightness, duration);
479}
480
481// static
482LayerAnimationElement* LayerAnimationElement::CreateGrayscaleElement(
483    float grayscale,
484    base::TimeDelta duration) {
485  return new GrayscaleTransition(grayscale, duration);
486}
487
488// static
489LayerAnimationElement* LayerAnimationElement::CreatePauseElement(
490    const AnimatableProperties& properties,
491    base::TimeDelta duration) {
492  return new Pause(properties, duration);
493}
494
495// static
496LayerAnimationElement* LayerAnimationElement::CreateColorElement(
497    SkColor color,
498    base::TimeDelta duration) {
499  return new ColorTransition(color, duration);
500}
501
502}  // namespace ui
503