animation_test_common.cc revision c5cede9ae108bb15f6b7a8aea21c7e1fefa2834c
1663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng// Copyright 2012 The Chromium Authors. All rights reserved.
2663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng// Use of this source code is governed by a BSD-style license that can be
3663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng// found in the LICENSE file.
4663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include "cc/test/animation_test_common.h"
6663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
7663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include "cc/animation/animation_id_provider.h"
8663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include "cc/animation/keyframed_animation_curve.h"
9663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include "cc/animation/layer_animation_controller.h"
10663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include "cc/animation/transform_operations.h"
11663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include "cc/layers/layer.h"
12663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include "cc/layers/layer_impl.h"
13663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
14663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengusing cc::Animation;
15663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengusing cc::AnimationCurve;
16663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengusing cc::EaseTimingFunction;
17663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengusing cc::FloatKeyframe;
18663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengusing cc::KeyframedFloatAnimationCurve;
19663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengusing cc::KeyframedTransformAnimationCurve;
20663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengusing cc::TimingFunction;
21663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengusing cc::TransformKeyframe;
22663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
23663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengnamespace cc {
24663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
25663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengtemplate <class Target>
26663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengint AddOpacityTransition(Target* target,
27663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                         double duration,
28663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                         float start_opacity,
29663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                         float end_opacity,
30663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                         bool use_timing_function) {
31663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  scoped_ptr<KeyframedFloatAnimationCurve>
32663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      curve(KeyframedFloatAnimationCurve::Create());
33663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
34663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  scoped_ptr<TimingFunction> func;
35663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  if (!use_timing_function)
36663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    func = EaseTimingFunction::Create();
37663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  if (duration > 0.0)
38663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    curve->AddKeyframe(FloatKeyframe::Create(0.0, start_opacity, func.Pass()));
39663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  curve->AddKeyframe(FloatKeyframe::Create(
40663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      duration, end_opacity, scoped_ptr<TimingFunction>()));
41663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
42663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  int id = AnimationIdProvider::NextAnimationId();
43663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
44663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  scoped_ptr<Animation> animation(Animation::Create(
45663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      curve.PassAs<AnimationCurve>(),
46663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      id,
47663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      AnimationIdProvider::NextGroupId(),
48663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Animation::Opacity));
49663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  animation->set_needs_synchronized_start_time(true);
50663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
51663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  target->AddAnimation(animation.Pass());
52663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  return id;
53663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
54663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
55663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengtemplate <class Target>
56663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengint AddAnimatedTransform(Target* target,
57663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                         double duration,
58663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                         TransformOperations start_operations,
59663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                         TransformOperations operations) {
60663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  scoped_ptr<KeyframedTransformAnimationCurve>
61663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      curve(KeyframedTransformAnimationCurve::Create());
62663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
63663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  if (duration > 0.0) {
64663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    curve->AddKeyframe(TransformKeyframe::Create(
65663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        0.0, start_operations, scoped_ptr<TimingFunction>()));
66663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  }
67663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
68663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  curve->AddKeyframe(TransformKeyframe::Create(
69663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      duration, operations, scoped_ptr<TimingFunction>()));
70663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
71663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  int id = AnimationIdProvider::NextAnimationId();
72663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
73663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  scoped_ptr<Animation> animation(Animation::Create(
74663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      curve.PassAs<AnimationCurve>(),
75663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      id,
76663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      AnimationIdProvider::NextGroupId(),
77663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      Animation::Transform));
78663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  animation->set_needs_synchronized_start_time(true);
79663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
80663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  target->AddAnimation(animation.Pass());
81663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  return id;
82663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
83663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
84663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengtemplate <class Target>
85663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengint AddAnimatedTransform(Target* target,
86663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                         double duration,
87663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                         int delta_x,
88663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                         int delta_y) {
89663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  TransformOperations start_operations;
90663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  if (duration > 0.0) {
91663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    start_operations.AppendTranslate(delta_x, delta_y, 0.0);
92663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  }
93663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
94663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  TransformOperations operations;
95663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  operations.AppendTranslate(delta_x, delta_y, 0.0);
96663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  return AddAnimatedTransform(target, duration, start_operations, operations);
97663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
98663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
99663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengtemplate <class Target>
100663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengint AddAnimatedFilter(Target* target,
101663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                      double duration,
102663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                      float start_brightness,
103663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                      float end_brightness) {
104663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  scoped_ptr<KeyframedFilterAnimationCurve>
105663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      curve(KeyframedFilterAnimationCurve::Create());
106663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
107663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  if (duration > 0.0) {
108663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    FilterOperations start_filters;
109663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    start_filters.Append(
110663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        FilterOperation::CreateBrightnessFilter(start_brightness));
111663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    curve->AddKeyframe(FilterKeyframe::Create(
112        0.0, start_filters, scoped_ptr<TimingFunction>()));
113  }
114
115  FilterOperations filters;
116  filters.Append(FilterOperation::CreateBrightnessFilter(end_brightness));
117  curve->AddKeyframe(
118      FilterKeyframe::Create(duration, filters, scoped_ptr<TimingFunction>()));
119
120  int id = AnimationIdProvider::NextAnimationId();
121
122  scoped_ptr<Animation> animation(Animation::Create(
123      curve.PassAs<AnimationCurve>(),
124      id,
125      AnimationIdProvider::NextGroupId(),
126      Animation::Filter));
127  animation->set_needs_synchronized_start_time(true);
128
129  target->AddAnimation(animation.Pass());
130  return id;
131}
132
133FakeFloatAnimationCurve::FakeFloatAnimationCurve()
134    : duration_(1.0) {}
135
136FakeFloatAnimationCurve::FakeFloatAnimationCurve(double duration)
137    : duration_(duration) {}
138
139FakeFloatAnimationCurve::~FakeFloatAnimationCurve() {}
140
141double FakeFloatAnimationCurve::Duration() const {
142  return duration_;
143}
144
145float FakeFloatAnimationCurve::GetValue(double now) const {
146  return 0.0f;
147}
148
149scoped_ptr<AnimationCurve> FakeFloatAnimationCurve::Clone() const {
150  return make_scoped_ptr(new FakeFloatAnimationCurve).PassAs<AnimationCurve>();
151}
152
153FakeTransformTransition::FakeTransformTransition(double duration)
154    : duration_(duration) {}
155
156FakeTransformTransition::~FakeTransformTransition() {}
157
158double FakeTransformTransition::Duration() const {
159  return duration_;
160}
161
162gfx::Transform FakeTransformTransition::GetValue(double time) const {
163  return gfx::Transform();
164}
165
166bool FakeTransformTransition::AnimatedBoundsForBox(const gfx::BoxF& box,
167                                                   gfx::BoxF* bounds) const {
168  return false;
169}
170
171bool FakeTransformTransition::AffectsScale() const { return false; }
172
173bool FakeTransformTransition::IsTranslation() const { return true; }
174
175bool FakeTransformTransition::MaximumScale(float* max_scale) const {
176  *max_scale = 1.f;
177  return true;
178}
179
180scoped_ptr<AnimationCurve> FakeTransformTransition::Clone() const {
181  return make_scoped_ptr(new FakeTransformTransition(*this))
182      .PassAs<AnimationCurve>();
183}
184
185
186FakeFloatTransition::FakeFloatTransition(double duration, float from, float to)
187    : duration_(duration), from_(from), to_(to) {}
188
189FakeFloatTransition::~FakeFloatTransition() {}
190
191double FakeFloatTransition::Duration() const {
192  return duration_;
193}
194
195float FakeFloatTransition::GetValue(double time) const {
196  time /= duration_;
197  if (time >= 1.0)
198    time = 1.0;
199  return (1.0 - time) * from_ + time * to_;
200}
201
202FakeLayerAnimationValueObserver::FakeLayerAnimationValueObserver()
203    : opacity_(0.0f),
204      animation_waiting_for_deletion_(false) {}
205
206FakeLayerAnimationValueObserver::~FakeLayerAnimationValueObserver() {}
207
208void FakeLayerAnimationValueObserver::OnFilterAnimated(
209    const FilterOperations& filters) {
210  filters_ = filters;
211}
212
213void FakeLayerAnimationValueObserver::OnOpacityAnimated(float opacity) {
214  opacity_ = opacity;
215}
216
217void FakeLayerAnimationValueObserver::OnTransformAnimated(
218    const gfx::Transform& transform) {
219  transform_ = transform;
220}
221
222void FakeLayerAnimationValueObserver::OnScrollOffsetAnimated(
223    const gfx::Vector2dF& scroll_offset) {
224  scroll_offset_ = scroll_offset;
225}
226
227void FakeLayerAnimationValueObserver::OnAnimationWaitingForDeletion() {
228  animation_waiting_for_deletion_ = true;
229}
230
231bool FakeLayerAnimationValueObserver::IsActive() const {
232  return true;
233}
234
235bool FakeInactiveLayerAnimationValueObserver::IsActive() const {
236  return false;
237}
238
239gfx::Vector2dF FakeLayerAnimationValueProvider::ScrollOffsetForAnimation()
240    const {
241  return scroll_offset_;
242}
243
244scoped_ptr<AnimationCurve> FakeFloatTransition::Clone() const {
245  return make_scoped_ptr(new FakeFloatTransition(*this))
246      .PassAs<AnimationCurve>();
247}
248
249int AddOpacityTransitionToController(LayerAnimationController* controller,
250                                     double duration,
251                                     float start_opacity,
252                                     float end_opacity,
253                                     bool use_timing_function) {
254  return AddOpacityTransition(controller,
255                              duration,
256                              start_opacity,
257                              end_opacity,
258                              use_timing_function);
259}
260
261int AddAnimatedTransformToController(LayerAnimationController* controller,
262                                     double duration,
263                                     int delta_x,
264                                     int delta_y) {
265  return AddAnimatedTransform(controller,
266                              duration,
267                              delta_x,
268                              delta_y);
269}
270
271int AddAnimatedFilterToController(LayerAnimationController* controller,
272                                  double duration,
273                                  float start_brightness,
274                                  float end_brightness) {
275  return AddAnimatedFilter(
276      controller, duration, start_brightness, end_brightness);
277}
278
279int AddOpacityTransitionToLayer(Layer* layer,
280                                double duration,
281                                float start_opacity,
282                                float end_opacity,
283                                bool use_timing_function) {
284  return AddOpacityTransition(layer,
285                              duration,
286                              start_opacity,
287                              end_opacity,
288                              use_timing_function);
289}
290
291int AddOpacityTransitionToLayer(LayerImpl* layer,
292                                double duration,
293                                float start_opacity,
294                                float end_opacity,
295                                bool use_timing_function) {
296  return AddOpacityTransition(layer->layer_animation_controller(),
297                              duration,
298                              start_opacity,
299                              end_opacity,
300                              use_timing_function);
301}
302
303int AddAnimatedTransformToLayer(Layer* layer,
304                                double duration,
305                                int delta_x,
306                                int delta_y) {
307  return AddAnimatedTransform(layer, duration, delta_x, delta_y);
308}
309
310int AddAnimatedTransformToLayer(LayerImpl* layer,
311                                double duration,
312                                int delta_x,
313                                int delta_y) {
314  return AddAnimatedTransform(layer->layer_animation_controller(),
315                              duration,
316                              delta_x,
317                              delta_y);
318}
319
320int AddAnimatedTransformToLayer(Layer* layer,
321                                double duration,
322                                TransformOperations start_operations,
323                                TransformOperations operations) {
324  return AddAnimatedTransform(layer, duration, start_operations, operations);
325}
326
327int AddAnimatedTransformToLayer(LayerImpl* layer,
328                                double duration,
329                                TransformOperations start_operations,
330                                TransformOperations operations) {
331  return AddAnimatedTransform(layer->layer_animation_controller(),
332                              duration,
333                              start_operations,
334                              operations);
335}
336
337int AddAnimatedFilterToLayer(Layer* layer,
338                             double duration,
339                             float start_brightness,
340                             float end_brightness) {
341  return AddAnimatedFilter(layer, duration, start_brightness, end_brightness);
342}
343
344int AddAnimatedFilterToLayer(LayerImpl* layer,
345                             double duration,
346                             float start_brightness,
347                             float end_brightness) {
348  return AddAnimatedFilter(layer->layer_animation_controller(),
349                           duration,
350                           start_brightness,
351                           end_brightness);
352}
353
354}  // namespace cc
355