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