animation_test_common.cc revision 90dce4d38c5ff5333bea97d859d4e484e27edf0c
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "cc/test/animation_test_common.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "cc/animation/animation_id_provider.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "cc/animation/keyframed_animation_curve.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "cc/animation/layer_animation_controller.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "cc/animation/transform_operations.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "cc/layers/layer.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "cc/layers/layer_impl.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using cc::Animation;
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using cc::AnimationCurve;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using cc::EaseTimingFunction;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using cc::FloatKeyframe;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using cc::KeyframedFloatAnimationCurve;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using cc::KeyframedTransformAnimationCurve;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using cc::TimingFunction;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using cc::TransformKeyframe;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace cc {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <class Target>
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int AddOpacityTransition(Target* target,
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         double duration,
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         float start_opacity,
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         float end_opacity,
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         bool use_timing_function) {
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<KeyframedFloatAnimationCurve>
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      curve(KeyframedFloatAnimationCurve::Create());
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<TimingFunction> func;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!use_timing_function)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    func = EaseTimingFunction::Create();
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (duration > 0.0)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    curve->AddKeyframe(FloatKeyframe::Create(0.0, start_opacity, func.Pass()));
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  curve->AddKeyframe(FloatKeyframe::Create(duration,
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           end_opacity,
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           scoped_ptr<cc::TimingFunction>()));
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int id = AnimationIdProvider::NextAnimationId();
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Animation> animation(Animation::Create(
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      curve.PassAs<AnimationCurve>(),
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      id,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AnimationIdProvider::NextGroupId(),
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Animation::Opacity));
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  animation->set_needs_synchronized_start_time(true);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  target->AddAnimation(animation.Pass());
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return id;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <class Target>
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int AddAnimatedTransform(Target* target,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         double duration,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         int delta_x,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         int delta_y) {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<KeyframedTransformAnimationCurve>
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      curve(KeyframedTransformAnimationCurve::Create());
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (duration > 0.0) {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TransformOperations start_operations;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    start_operations.AppendTranslate(delta_x, delta_y, 0.0);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    curve->AddKeyframe(TransformKeyframe::Create(
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        0.0,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        start_operations,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        scoped_ptr<cc::TimingFunction>()));
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TransformOperations operations;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  operations.AppendTranslate(delta_x, delta_y, 0.0);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  curve->AddKeyframe(TransformKeyframe::Create(
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      duration,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      operations,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_ptr<cc::TimingFunction>()));
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int id = AnimationIdProvider::NextAnimationId();
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Animation> animation(Animation::Create(
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      curve.PassAs<AnimationCurve>(),
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      id,
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AnimationIdProvider::NextGroupId(),
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Animation::Transform));
87  animation->set_needs_synchronized_start_time(true);
88
89  target->AddAnimation(animation.Pass());
90  return id;
91}
92
93FakeFloatAnimationCurve::FakeFloatAnimationCurve()
94    : duration_(1.0) {}
95
96FakeFloatAnimationCurve::FakeFloatAnimationCurve(double duration)
97    : duration_(duration) {}
98
99FakeFloatAnimationCurve::~FakeFloatAnimationCurve() {}
100
101double FakeFloatAnimationCurve::Duration() const {
102  return duration_;
103}
104
105float FakeFloatAnimationCurve::GetValue(double now) const {
106  return 0.0f;
107}
108
109scoped_ptr<cc::AnimationCurve> FakeFloatAnimationCurve::Clone() const {
110  return make_scoped_ptr(
111      new FakeFloatAnimationCurve).PassAs<cc::AnimationCurve>();
112}
113
114FakeTransformTransition::FakeTransformTransition(double duration)
115    : duration_(duration) {}
116
117FakeTransformTransition::~FakeTransformTransition() {}
118
119double FakeTransformTransition::Duration() const {
120  return duration_;
121}
122
123gfx::Transform FakeTransformTransition::GetValue(double time) const {
124  return gfx::Transform();
125}
126
127scoped_ptr<cc::AnimationCurve> FakeTransformTransition::Clone() const {
128  return make_scoped_ptr(
129      new FakeTransformTransition(*this)).PassAs<cc::AnimationCurve>();
130}
131
132
133FakeFloatTransition::FakeFloatTransition(double duration, float from, float to)
134    : duration_(duration), from_(from), to_(to) {}
135
136FakeFloatTransition::~FakeFloatTransition() {}
137
138double FakeFloatTransition::Duration() const {
139  return duration_;
140}
141
142float FakeFloatTransition::GetValue(double time) const {
143  time /= duration_;
144  if (time >= 1.0)
145    time = 1.0;
146  return (1.0 - time) * from_ + time * to_;
147}
148
149FakeLayerAnimationValueObserver::FakeLayerAnimationValueObserver()
150    : opacity_(0.0f) {}
151
152FakeLayerAnimationValueObserver::~FakeLayerAnimationValueObserver() {}
153
154void FakeLayerAnimationValueObserver::OnOpacityAnimated(float opacity) {
155  opacity_ = opacity;
156}
157
158void FakeLayerAnimationValueObserver::OnTransformAnimated(
159    const gfx::Transform& transform) {
160  transform_ = transform;
161}
162
163bool FakeLayerAnimationValueObserver::IsActive() const {
164  return true;
165}
166
167bool FakeInactiveLayerAnimationValueObserver::IsActive() const {
168  return false;
169}
170
171scoped_ptr<cc::AnimationCurve> FakeFloatTransition::Clone() const {
172  return make_scoped_ptr(
173      new FakeFloatTransition(*this)).PassAs<cc::AnimationCurve>();
174}
175
176int AddOpacityTransitionToController(cc::LayerAnimationController* controller,
177                                     double duration,
178                                     float start_opacity,
179                                     float end_opacity,
180                                     bool use_timing_function) {
181  return AddOpacityTransition(controller,
182                              duration,
183                              start_opacity,
184                              end_opacity,
185                              use_timing_function);
186}
187
188int AddAnimatedTransformToController(cc::LayerAnimationController* controller,
189                                     double duration,
190                                     int delta_x,
191                                     int delta_y) {
192  return AddAnimatedTransform(controller,
193                              duration,
194                              delta_x,
195                              delta_y);
196}
197
198int AddOpacityTransitionToLayer(cc::Layer* layer,
199                                double duration,
200                                float start_opacity,
201                                float end_opacity,
202                                bool use_timing_function) {
203  return AddOpacityTransition(layer,
204                              duration,
205                              start_opacity,
206                              end_opacity,
207                              use_timing_function);
208}
209
210int AddOpacityTransitionToLayer(cc::LayerImpl* layer,
211                                double duration,
212                                float start_opacity,
213                                float end_opacity,
214                                bool use_timing_function) {
215  return AddOpacityTransition(layer->layer_animation_controller(),
216                              duration,
217                              start_opacity,
218                              end_opacity,
219                              use_timing_function);
220}
221
222int AddAnimatedTransformToLayer(cc::Layer* layer,
223                                double duration,
224                                int delta_x,
225                                int delta_y) {
226  return AddAnimatedTransform(layer, duration, delta_x, delta_y);
227}
228
229int AddAnimatedTransformToLayer(cc::LayerImpl* layer,
230                                double duration,
231                                int delta_x,
232                                int delta_y) {
233  return AddAnimatedTransform(layer->layer_animation_controller(),
234                              duration,
235                              delta_x,
236                              delta_y);
237}
238
239}  // namespace cc
240