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.
5 #include "cc/test/animation_test_common.h"
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"
15 using cc::AnimationCurve;
16 using cc::EaseTimingFunction;
17 using cc::FloatKeyframe;
18 using cc::KeyframedFloatAnimationCurve;
19 using cc::KeyframedTransformAnimationCurve;
20 using cc::TimingFunction;
21 using cc::TransformKeyframe;
25 template <class Target>
26 int AddOpacityTransition(Target* target,
30 bool use_timing_function) {
31 scoped_ptr<KeyframedFloatAnimationCurve>
32 curve(KeyframedFloatAnimationCurve::Create());
34 scoped_ptr<TimingFunction> func;
35 if (!use_timing_function)
36 func = EaseTimingFunction::Create();
38 curve->AddKeyframe(FloatKeyframe::Create(0.0, start_opacity, func.Pass()));
39 curve->AddKeyframe(FloatKeyframe::Create(duration, end_opacity, nullptr));
41 int id = AnimationIdProvider::NextAnimationId();
43 scoped_ptr<Animation> animation(
44 Animation::Create(curve.Pass(),
46 AnimationIdProvider::NextGroupId(),
48 animation->set_needs_synchronized_start_time(true);
50 target->AddAnimation(animation.Pass());
54 template <class Target>
55 int AddAnimatedTransform(Target* target,
57 TransformOperations start_operations,
58 TransformOperations operations) {
59 scoped_ptr<KeyframedTransformAnimationCurve>
60 curve(KeyframedTransformAnimationCurve::Create());
64 TransformKeyframe::Create(0.0, start_operations, nullptr));
67 curve->AddKeyframe(TransformKeyframe::Create(duration, operations, nullptr));
69 int id = AnimationIdProvider::NextAnimationId();
71 scoped_ptr<Animation> animation(
72 Animation::Create(curve.Pass(),
74 AnimationIdProvider::NextGroupId(),
75 Animation::Transform));
76 animation->set_needs_synchronized_start_time(true);
78 target->AddAnimation(animation.Pass());
82 template <class Target>
83 int AddAnimatedTransform(Target* target,
87 TransformOperations start_operations;
89 start_operations.AppendTranslate(delta_x, delta_y, 0.0);
92 TransformOperations operations;
93 operations.AppendTranslate(delta_x, delta_y, 0.0);
94 return AddAnimatedTransform(target, duration, start_operations, operations);
97 template <class Target>
98 int AddAnimatedFilter(Target* target,
100 float start_brightness,
101 float end_brightness) {
102 scoped_ptr<KeyframedFilterAnimationCurve>
103 curve(KeyframedFilterAnimationCurve::Create());
105 if (duration > 0.0) {
106 FilterOperations start_filters;
107 start_filters.Append(
108 FilterOperation::CreateBrightnessFilter(start_brightness));
109 curve->AddKeyframe(FilterKeyframe::Create(0.0, start_filters, nullptr));
112 FilterOperations filters;
113 filters.Append(FilterOperation::CreateBrightnessFilter(end_brightness));
114 curve->AddKeyframe(FilterKeyframe::Create(duration, filters, nullptr));
116 int id = AnimationIdProvider::NextAnimationId();
118 scoped_ptr<Animation> animation(Animation::Create(
119 curve.Pass(), id, AnimationIdProvider::NextGroupId(), Animation::Filter));
120 animation->set_needs_synchronized_start_time(true);
122 target->AddAnimation(animation.Pass());
126 FakeFloatAnimationCurve::FakeFloatAnimationCurve()
129 FakeFloatAnimationCurve::FakeFloatAnimationCurve(double duration)
130 : duration_(duration) {}
132 FakeFloatAnimationCurve::~FakeFloatAnimationCurve() {}
134 double FakeFloatAnimationCurve::Duration() const {
138 float FakeFloatAnimationCurve::GetValue(double now) const {
142 scoped_ptr<AnimationCurve> FakeFloatAnimationCurve::Clone() const {
143 return make_scoped_ptr(new FakeFloatAnimationCurve);
146 FakeTransformTransition::FakeTransformTransition(double duration)
147 : duration_(duration) {}
149 FakeTransformTransition::~FakeTransformTransition() {}
151 double FakeTransformTransition::Duration() const {
155 gfx::Transform FakeTransformTransition::GetValue(double time) const {
156 return gfx::Transform();
159 bool FakeTransformTransition::AnimatedBoundsForBox(const gfx::BoxF& box,
160 gfx::BoxF* bounds) const {
164 bool FakeTransformTransition::AffectsScale() const { return false; }
166 bool FakeTransformTransition::IsTranslation() const { return true; }
168 bool FakeTransformTransition::MaximumTargetScale(bool forward_direction,
169 float* max_scale) const {
174 scoped_ptr<AnimationCurve> FakeTransformTransition::Clone() const {
175 return make_scoped_ptr(new FakeTransformTransition(*this));
179 FakeFloatTransition::FakeFloatTransition(double duration, float from, float to)
180 : duration_(duration), from_(from), to_(to) {}
182 FakeFloatTransition::~FakeFloatTransition() {}
184 double FakeFloatTransition::Duration() const {
188 float FakeFloatTransition::GetValue(double time) const {
192 return (1.0 - time) * from_ + time * to_;
195 FakeLayerAnimationValueObserver::FakeLayerAnimationValueObserver()
197 animation_waiting_for_deletion_(false) {}
199 FakeLayerAnimationValueObserver::~FakeLayerAnimationValueObserver() {}
201 void FakeLayerAnimationValueObserver::OnFilterAnimated(
202 const FilterOperations& filters) {
206 void FakeLayerAnimationValueObserver::OnOpacityAnimated(float opacity) {
210 void FakeLayerAnimationValueObserver::OnTransformAnimated(
211 const gfx::Transform& transform) {
212 transform_ = transform;
215 void FakeLayerAnimationValueObserver::OnScrollOffsetAnimated(
216 const gfx::ScrollOffset& scroll_offset) {
217 scroll_offset_ = scroll_offset;
220 void FakeLayerAnimationValueObserver::OnAnimationWaitingForDeletion() {
221 animation_waiting_for_deletion_ = true;
224 bool FakeLayerAnimationValueObserver::IsActive() const {
228 bool FakeInactiveLayerAnimationValueObserver::IsActive() const {
232 gfx::ScrollOffset FakeLayerAnimationValueProvider::ScrollOffsetForAnimation()
234 return scroll_offset_;
237 scoped_ptr<AnimationCurve> FakeFloatTransition::Clone() const {
238 return make_scoped_ptr(new FakeFloatTransition(*this));
241 int AddOpacityTransitionToController(LayerAnimationController* controller,
245 bool use_timing_function) {
246 return AddOpacityTransition(controller,
250 use_timing_function);
253 int AddAnimatedTransformToController(LayerAnimationController* controller,
257 return AddAnimatedTransform(controller,
263 int AddAnimatedFilterToController(LayerAnimationController* controller,
265 float start_brightness,
266 float end_brightness) {
267 return AddAnimatedFilter(
268 controller, duration, start_brightness, end_brightness);
271 int AddOpacityTransitionToLayer(Layer* layer,
275 bool use_timing_function) {
276 return AddOpacityTransition(layer,
280 use_timing_function);
283 int AddOpacityTransitionToLayer(LayerImpl* layer,
287 bool use_timing_function) {
288 return AddOpacityTransition(layer->layer_animation_controller(),
292 use_timing_function);
295 int AddAnimatedTransformToLayer(Layer* layer,
299 return AddAnimatedTransform(layer, duration, delta_x, delta_y);
302 int AddAnimatedTransformToLayer(LayerImpl* layer,
306 return AddAnimatedTransform(layer->layer_animation_controller(),
312 int AddAnimatedTransformToLayer(Layer* layer,
314 TransformOperations start_operations,
315 TransformOperations operations) {
316 return AddAnimatedTransform(layer, duration, start_operations, operations);
319 int AddAnimatedTransformToLayer(LayerImpl* layer,
321 TransformOperations start_operations,
322 TransformOperations operations) {
323 return AddAnimatedTransform(layer->layer_animation_controller(),
329 int AddAnimatedFilterToLayer(Layer* layer,
331 float start_brightness,
332 float end_brightness) {
333 return AddAnimatedFilter(layer, duration, start_brightness, end_brightness);
336 int AddAnimatedFilterToLayer(LayerImpl* layer,
338 float start_brightness,
339 float end_brightness) {
340 return AddAnimatedFilter(layer->layer_animation_controller(),