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/base/time_util.h"
12 #include "cc/layers/layer.h"
13 #include "cc/layers/layer_impl.h"
16 using cc::AnimationCurve
;
17 using cc::EaseTimingFunction
;
18 using cc::FloatKeyframe
;
19 using cc::KeyframedFloatAnimationCurve
;
20 using cc::KeyframedTransformAnimationCurve
;
21 using cc::TimingFunction
;
22 using cc::TransformKeyframe
;
26 template <class Target
>
27 int AddOpacityTransition(Target
* target
,
31 bool use_timing_function
) {
32 scoped_ptr
<KeyframedFloatAnimationCurve
>
33 curve(KeyframedFloatAnimationCurve::Create());
35 scoped_ptr
<TimingFunction
> func
;
36 if (!use_timing_function
)
37 func
= EaseTimingFunction::Create();
40 FloatKeyframe::Create(base::TimeDelta(), start_opacity
, func
.Pass()));
41 curve
->AddKeyframe(FloatKeyframe::Create(
42 base::TimeDelta::FromSecondsD(duration
), end_opacity
, nullptr));
44 int id
= AnimationIdProvider::NextAnimationId();
46 scoped_ptr
<Animation
> animation(
47 Animation::Create(curve
.Pass(), id
, AnimationIdProvider::NextGroupId(),
49 animation
->set_needs_synchronized_start_time(true);
51 target
->AddAnimation(animation
.Pass());
55 template <class Target
>
56 int AddAnimatedTransform(Target
* target
,
58 TransformOperations start_operations
,
59 TransformOperations operations
) {
60 scoped_ptr
<KeyframedTransformAnimationCurve
>
61 curve(KeyframedTransformAnimationCurve::Create());
64 curve
->AddKeyframe(TransformKeyframe::Create(base::TimeDelta(),
65 start_operations
, nullptr));
68 curve
->AddKeyframe(TransformKeyframe::Create(
69 base::TimeDelta::FromSecondsD(duration
), operations
, nullptr));
71 int id
= AnimationIdProvider::NextAnimationId();
73 scoped_ptr
<Animation
> animation(
74 Animation::Create(curve
.Pass(), id
, 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
));
110 FilterKeyframe::Create(base::TimeDelta(), start_filters
, nullptr));
113 FilterOperations filters
;
114 filters
.Append(FilterOperation::CreateBrightnessFilter(end_brightness
));
115 curve
->AddKeyframe(FilterKeyframe::Create(
116 base::TimeDelta::FromSecondsD(duration
), filters
, nullptr));
118 int id
= AnimationIdProvider::NextAnimationId();
120 scoped_ptr
<Animation
> animation(Animation::Create(
121 curve
.Pass(), id
, AnimationIdProvider::NextGroupId(), Animation::FILTER
));
122 animation
->set_needs_synchronized_start_time(true);
124 target
->AddAnimation(animation
.Pass());
128 FakeFloatAnimationCurve::FakeFloatAnimationCurve()
129 : duration_(base::TimeDelta::FromSecondsD(1.0)) {
132 FakeFloatAnimationCurve::FakeFloatAnimationCurve(double duration
)
133 : duration_(base::TimeDelta::FromSecondsD(duration
)) {
136 FakeFloatAnimationCurve::~FakeFloatAnimationCurve() {}
138 base::TimeDelta
FakeFloatAnimationCurve::Duration() const {
142 float FakeFloatAnimationCurve::GetValue(base::TimeDelta now
) const {
146 scoped_ptr
<AnimationCurve
> FakeFloatAnimationCurve::Clone() const {
147 return make_scoped_ptr(new FakeFloatAnimationCurve
);
150 FakeTransformTransition::FakeTransformTransition(double duration
)
151 : duration_(base::TimeDelta::FromSecondsD(duration
)) {
154 FakeTransformTransition::~FakeTransformTransition() {}
156 base::TimeDelta
FakeTransformTransition::Duration() const {
160 gfx::Transform
FakeTransformTransition::GetValue(base::TimeDelta time
) const {
161 return gfx::Transform();
164 bool FakeTransformTransition::AnimatedBoundsForBox(const gfx::BoxF
& box
,
165 gfx::BoxF
* bounds
) const {
169 bool FakeTransformTransition::AffectsScale() const { return false; }
171 bool FakeTransformTransition::IsTranslation() const { return true; }
173 bool FakeTransformTransition::PreservesAxisAlignment() const {
177 bool FakeTransformTransition::MaximumTargetScale(bool forward_direction
,
178 float* max_scale
) const {
183 scoped_ptr
<AnimationCurve
> FakeTransformTransition::Clone() const {
184 return make_scoped_ptr(new FakeTransformTransition(*this));
187 FakeFloatTransition::FakeFloatTransition(double duration
, float from
, float to
)
188 : duration_(base::TimeDelta::FromSecondsD(duration
)), from_(from
), to_(to
) {
191 FakeFloatTransition::~FakeFloatTransition() {}
193 base::TimeDelta
FakeFloatTransition::Duration() const {
197 float FakeFloatTransition::GetValue(base::TimeDelta time
) const {
198 double progress
= TimeUtil::Divide(time
, duration_
);
201 return (1.0 - progress
) * from_
+ progress
* to_
;
204 FakeLayerAnimationValueObserver::FakeLayerAnimationValueObserver()
205 : opacity_(0.0f
), animation_waiting_for_deletion_(false) {
208 FakeLayerAnimationValueObserver::~FakeLayerAnimationValueObserver() {}
210 void FakeLayerAnimationValueObserver::OnFilterAnimated(
211 const FilterOperations
& filters
) {
215 void FakeLayerAnimationValueObserver::OnOpacityAnimated(float opacity
) {
219 void FakeLayerAnimationValueObserver::OnTransformAnimated(
220 const gfx::Transform
& transform
) {
221 transform_
= transform
;
224 void FakeLayerAnimationValueObserver::OnScrollOffsetAnimated(
225 const gfx::ScrollOffset
& scroll_offset
) {
226 scroll_offset_
= scroll_offset
;
229 void FakeLayerAnimationValueObserver::OnAnimationWaitingForDeletion() {
230 animation_waiting_for_deletion_
= true;
233 bool FakeLayerAnimationValueObserver::IsActive() const {
237 bool FakeInactiveLayerAnimationValueObserver::IsActive() const {
241 gfx::ScrollOffset
FakeLayerAnimationValueProvider::ScrollOffsetForAnimation()
243 return scroll_offset_
;
246 scoped_ptr
<AnimationCurve
> FakeFloatTransition::Clone() const {
247 return make_scoped_ptr(new FakeFloatTransition(*this));
250 int AddOpacityTransitionToController(LayerAnimationController
* controller
,
254 bool use_timing_function
) {
255 return AddOpacityTransition(controller
,
259 use_timing_function
);
262 int AddAnimatedTransformToController(LayerAnimationController
* controller
,
266 return AddAnimatedTransform(controller
,
272 int AddAnimatedFilterToController(LayerAnimationController
* controller
,
274 float start_brightness
,
275 float end_brightness
) {
276 return AddAnimatedFilter(
277 controller
, duration
, start_brightness
, end_brightness
);
280 int AddOpacityTransitionToLayer(Layer
* layer
,
284 bool use_timing_function
) {
285 return AddOpacityTransition(layer
,
289 use_timing_function
);
292 int AddOpacityTransitionToLayer(LayerImpl
* layer
,
296 bool use_timing_function
) {
297 return AddOpacityTransition(layer
->layer_animation_controller(),
301 use_timing_function
);
304 int AddAnimatedTransformToLayer(Layer
* layer
,
308 return AddAnimatedTransform(layer
, duration
, delta_x
, delta_y
);
311 int AddAnimatedTransformToLayer(LayerImpl
* layer
,
315 return AddAnimatedTransform(layer
->layer_animation_controller(),
321 int AddAnimatedTransformToLayer(Layer
* layer
,
323 TransformOperations start_operations
,
324 TransformOperations operations
) {
325 return AddAnimatedTransform(layer
, duration
, start_operations
, operations
);
328 int AddAnimatedTransformToLayer(LayerImpl
* layer
,
330 TransformOperations start_operations
,
331 TransformOperations operations
) {
332 return AddAnimatedTransform(layer
->layer_animation_controller(),
338 int AddAnimatedFilterToLayer(Layer
* layer
,
340 float start_brightness
,
341 float end_brightness
) {
342 return AddAnimatedFilter(layer
, duration
, start_brightness
, end_brightness
);
345 int AddAnimatedFilterToLayer(LayerImpl
* layer
,
347 float start_brightness
,
348 float end_brightness
) {
349 return AddAnimatedFilter(layer
->layer_animation_controller(),