animation_test_common.cc revision f2477e01787aa58f445919b809d89e252beef54f
1// Copyright 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 "cc/test/animation_test_common.h"
6
7#include "cc/animation/animation_id_provider.h"
8#include "cc/animation/keyframed_animation_curve.h"
9#include "cc/animation/layer_animation_controller.h"
10#include "cc/animation/transform_operations.h"
11#include "cc/layers/layer.h"
12#include "cc/layers/layer_impl.h"
13
14using cc::Animation;
15using cc::AnimationCurve;
16using cc::EaseTimingFunction;
17using cc::FloatKeyframe;
18using cc::KeyframedFloatAnimationCurve;
19using cc::KeyframedTransformAnimationCurve;
20using cc::TimingFunction;
21using cc::TransformKeyframe;
22
23namespace cc {
24
25template <class Target>
26int AddOpacityTransition(Target* target,
27                         double duration,
28                         float start_opacity,
29                         float end_opacity,
30                         bool use_timing_function) {
31  scoped_ptr<KeyframedFloatAnimationCurve>
32      curve(KeyframedFloatAnimationCurve::Create());
33
34  scoped_ptr<TimingFunction> func;
35  if (!use_timing_function)
36    func = EaseTimingFunction::Create();
37  if (duration > 0.0)
38    curve->AddKeyframe(FloatKeyframe::Create(0.0, start_opacity, func.Pass()));
39  curve->AddKeyframe(FloatKeyframe::Create(duration,
40                                           end_opacity,
41                                           scoped_ptr<cc::TimingFunction>()));
42
43  int id = AnimationIdProvider::NextAnimationId();
44
45  scoped_ptr<Animation> animation(Animation::Create(
46      curve.PassAs<AnimationCurve>(),
47      id,
48      AnimationIdProvider::NextGroupId(),
49      Animation::Opacity));
50  animation->set_needs_synchronized_start_time(true);
51
52  target->AddAnimation(animation.Pass());
53  return id;
54}
55
56template <class Target>
57int AddAnimatedTransform(Target* target,
58                         double duration,
59                         int delta_x,
60                         int delta_y) {
61  scoped_ptr<KeyframedTransformAnimationCurve>
62      curve(KeyframedTransformAnimationCurve::Create());
63
64  if (duration > 0.0) {
65    TransformOperations start_operations;
66    start_operations.AppendTranslate(delta_x, delta_y, 0.0);
67    curve->AddKeyframe(TransformKeyframe::Create(
68        0.0,
69        start_operations,
70        scoped_ptr<cc::TimingFunction>()));
71  }
72
73  TransformOperations operations;
74  operations.AppendTranslate(delta_x, delta_y, 0.0);
75  curve->AddKeyframe(TransformKeyframe::Create(
76      duration,
77      operations,
78      scoped_ptr<cc::TimingFunction>()));
79
80  int id = AnimationIdProvider::NextAnimationId();
81
82  scoped_ptr<Animation> animation(Animation::Create(
83      curve.PassAs<AnimationCurve>(),
84      id,
85      AnimationIdProvider::NextGroupId(),
86      Animation::Transform));
87  animation->set_needs_synchronized_start_time(true);
88
89  target->AddAnimation(animation.Pass());
90  return id;
91}
92
93template <class Target>
94int AddAnimatedFilter(Target* target,
95                      double duration,
96                      float start_brightness,
97                      float end_brightness) {
98  scoped_ptr<KeyframedFilterAnimationCurve>
99      curve(KeyframedFilterAnimationCurve::Create());
100
101  if (duration > 0.0) {
102    FilterOperations start_filters;
103    start_filters.Append(
104        FilterOperation::CreateBrightnessFilter(start_brightness));
105    curve->AddKeyframe(FilterKeyframe::Create(
106        0.0, start_filters, scoped_ptr<cc::TimingFunction>()));
107  }
108
109  FilterOperations filters;
110  filters.Append(FilterOperation::CreateBrightnessFilter(end_brightness));
111  curve->AddKeyframe(FilterKeyframe::Create(
112      duration, filters, scoped_ptr<cc::TimingFunction>()));
113
114  int id = AnimationIdProvider::NextAnimationId();
115
116  scoped_ptr<Animation> animation(Animation::Create(
117      curve.PassAs<AnimationCurve>(),
118      id,
119      AnimationIdProvider::NextGroupId(),
120      Animation::Filter));
121  animation->set_needs_synchronized_start_time(true);
122
123  target->AddAnimation(animation.Pass());
124  return id;
125}
126
127FakeFloatAnimationCurve::FakeFloatAnimationCurve()
128    : duration_(1.0) {}
129
130FakeFloatAnimationCurve::FakeFloatAnimationCurve(double duration)
131    : duration_(duration) {}
132
133FakeFloatAnimationCurve::~FakeFloatAnimationCurve() {}
134
135double FakeFloatAnimationCurve::Duration() const {
136  return duration_;
137}
138
139float FakeFloatAnimationCurve::GetValue(double now) const {
140  return 0.0f;
141}
142
143scoped_ptr<cc::AnimationCurve> FakeFloatAnimationCurve::Clone() const {
144  return make_scoped_ptr(
145      new FakeFloatAnimationCurve).PassAs<cc::AnimationCurve>();
146}
147
148FakeTransformTransition::FakeTransformTransition(double duration)
149    : duration_(duration) {}
150
151FakeTransformTransition::~FakeTransformTransition() {}
152
153double FakeTransformTransition::Duration() const {
154  return duration_;
155}
156
157gfx::Transform FakeTransformTransition::GetValue(double time) const {
158  return gfx::Transform();
159}
160
161bool FakeTransformTransition::AnimatedBoundsForBox(const gfx::BoxF& box,
162                                                   gfx::BoxF* bounds) const {
163  return false;
164}
165
166scoped_ptr<cc::AnimationCurve> FakeTransformTransition::Clone() const {
167  return make_scoped_ptr(
168      new FakeTransformTransition(*this)).PassAs<cc::AnimationCurve>();
169}
170
171
172FakeFloatTransition::FakeFloatTransition(double duration, float from, float to)
173    : duration_(duration), from_(from), to_(to) {}
174
175FakeFloatTransition::~FakeFloatTransition() {}
176
177double FakeFloatTransition::Duration() const {
178  return duration_;
179}
180
181float FakeFloatTransition::GetValue(double time) const {
182  time /= duration_;
183  if (time >= 1.0)
184    time = 1.0;
185  return (1.0 - time) * from_ + time * to_;
186}
187
188FakeLayerAnimationValueObserver::FakeLayerAnimationValueObserver()
189    : opacity_(0.0f),
190      animation_waiting_for_deletion_(false) {}
191
192FakeLayerAnimationValueObserver::~FakeLayerAnimationValueObserver() {}
193
194void FakeLayerAnimationValueObserver::OnFilterAnimated(
195    const FilterOperations& filters) {
196  filters_ = filters;
197}
198
199void FakeLayerAnimationValueObserver::OnOpacityAnimated(float opacity) {
200  opacity_ = opacity;
201}
202
203void FakeLayerAnimationValueObserver::OnTransformAnimated(
204    const gfx::Transform& transform) {
205  transform_ = transform;
206}
207
208void FakeLayerAnimationValueObserver::OnAnimationWaitingForDeletion() {
209  animation_waiting_for_deletion_ = true;
210}
211
212bool FakeLayerAnimationValueObserver::IsActive() const {
213  return true;
214}
215
216bool FakeInactiveLayerAnimationValueObserver::IsActive() const {
217  return false;
218}
219
220scoped_ptr<cc::AnimationCurve> FakeFloatTransition::Clone() const {
221  return make_scoped_ptr(
222      new FakeFloatTransition(*this)).PassAs<cc::AnimationCurve>();
223}
224
225int AddOpacityTransitionToController(cc::LayerAnimationController* controller,
226                                     double duration,
227                                     float start_opacity,
228                                     float end_opacity,
229                                     bool use_timing_function) {
230  return AddOpacityTransition(controller,
231                              duration,
232                              start_opacity,
233                              end_opacity,
234                              use_timing_function);
235}
236
237int AddAnimatedTransformToController(cc::LayerAnimationController* controller,
238                                     double duration,
239                                     int delta_x,
240                                     int delta_y) {
241  return AddAnimatedTransform(controller,
242                              duration,
243                              delta_x,
244                              delta_y);
245}
246
247int AddAnimatedFilterToController(cc::LayerAnimationController* controller,
248                                  double duration,
249                                  float start_brightness,
250                                  float end_brightness) {
251  return AddAnimatedFilter(
252      controller, duration, start_brightness, end_brightness);
253}
254
255int AddOpacityTransitionToLayer(cc::Layer* layer,
256                                double duration,
257                                float start_opacity,
258                                float end_opacity,
259                                bool use_timing_function) {
260  return AddOpacityTransition(layer,
261                              duration,
262                              start_opacity,
263                              end_opacity,
264                              use_timing_function);
265}
266
267int AddOpacityTransitionToLayer(cc::LayerImpl* layer,
268                                double duration,
269                                float start_opacity,
270                                float end_opacity,
271                                bool use_timing_function) {
272  return AddOpacityTransition(layer->layer_animation_controller(),
273                              duration,
274                              start_opacity,
275                              end_opacity,
276                              use_timing_function);
277}
278
279int AddAnimatedTransformToLayer(cc::Layer* layer,
280                                double duration,
281                                int delta_x,
282                                int delta_y) {
283  return AddAnimatedTransform(layer, duration, delta_x, delta_y);
284}
285
286int AddAnimatedTransformToLayer(cc::LayerImpl* layer,
287                                double duration,
288                                int delta_x,
289                                int delta_y) {
290  return AddAnimatedTransform(layer->layer_animation_controller(),
291                              duration,
292                              delta_x,
293                              delta_y);
294}
295
296int AddAnimatedFilterToLayer(cc::Layer* layer,
297                             double duration,
298                             float start_brightness,
299                             float end_brightness) {
300  return AddAnimatedFilter(layer, duration, start_brightness, end_brightness);
301}
302
303int AddAnimatedFilterToLayer(cc::LayerImpl* layer,
304                             double duration,
305                             float start_brightness,
306                             float end_brightness) {
307  return AddAnimatedFilter(layer->layer_animation_controller(),
308                           duration,
309                           start_brightness,
310                           end_brightness);
311}
312
313}  // namespace cc
314