OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ui/compositor/layer_animation_element.h" | 5 #include "ui/compositor/layer_animation_element.h" |
6 | 6 |
7 #include "base/compiler_specific.h" | 7 #include "base/compiler_specific.h" |
| 8 #include "cc/animation.h" |
| 9 #include "cc/animation_id_provider.h" |
8 #include "ui/base/animation/tween.h" | 10 #include "ui/base/animation/tween.h" |
| 11 #include "ui/compositor/float_animation_curve_adapter.h" |
9 #include "ui/compositor/layer_animation_delegate.h" | 12 #include "ui/compositor/layer_animation_delegate.h" |
10 #include "ui/compositor/layer_animator.h" | 13 #include "ui/compositor/layer_animator.h" |
11 #include "ui/gfx/interpolated_transform.h" | 14 #include "ui/gfx/interpolated_transform.h" |
12 | 15 |
13 namespace ui { | 16 namespace ui { |
14 | 17 |
15 namespace { | 18 namespace { |
16 | 19 |
17 // Pause ----------------------------------------------------------------------- | 20 // Pause ----------------------------------------------------------------------- |
18 class Pause : public LayerAnimationElement { | 21 class Pause : public LayerAnimationElement { |
19 public: | 22 public: |
20 Pause(const AnimatableProperties& properties, base::TimeDelta duration) | 23 Pause(const AnimatableProperties& properties, base::TimeDelta duration) |
21 : LayerAnimationElement(properties, duration) { | 24 : LayerAnimationElement(properties, duration) { |
22 } | 25 } |
23 virtual ~Pause() {} | 26 virtual ~Pause() {} |
24 | 27 |
25 private: | 28 private: |
26 virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE {} | 29 virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE {} |
27 virtual bool OnProgress(double t, | 30 virtual bool OnProgress(double t, |
28 LayerAnimationDelegate* delegate) OVERRIDE { | 31 LayerAnimationDelegate* delegate) OVERRIDE { |
29 return false; | 32 return false; |
30 } | 33 } |
31 virtual void OnGetTarget(TargetValue* target) const OVERRIDE {} | 34 virtual void OnGetTarget(TargetValue* target) const OVERRIDE {} |
32 virtual void OnAbort() OVERRIDE {} | 35 virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {} |
33 | 36 |
34 DISALLOW_COPY_AND_ASSIGN(Pause); | 37 DISALLOW_COPY_AND_ASSIGN(Pause); |
35 }; | 38 }; |
36 | 39 |
37 // TransformTransition --------------------------------------------------------- | 40 // TransformTransition --------------------------------------------------------- |
38 | 41 |
39 class TransformTransition : public LayerAnimationElement { | 42 class TransformTransition : public LayerAnimationElement { |
40 public: | 43 public: |
41 TransformTransition(const gfx::Transform& target, base::TimeDelta duration) | 44 TransformTransition(const gfx::Transform& target, base::TimeDelta duration) |
42 : LayerAnimationElement(GetProperties(), duration), | 45 : LayerAnimationElement(GetProperties(), duration), |
43 target_(target) { | 46 target_(target) { |
44 } | 47 } |
45 virtual ~TransformTransition() {} | 48 virtual ~TransformTransition() {} |
46 | 49 |
47 protected: | 50 protected: |
48 virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE { | 51 virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE { |
49 start_ = delegate->GetTransformForAnimation(); | 52 start_ = delegate->GetTransformForAnimation(); |
50 } | 53 } |
51 | 54 |
52 virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE { | 55 virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE { |
53 delegate->SetTransformFromAnimation( | 56 delegate->SetTransformFromAnimation( |
54 Tween::ValueBetween(t, start_, target_)); | 57 Tween::ValueBetween(t, start_, target_)); |
55 return true; | 58 return true; |
56 } | 59 } |
57 | 60 |
58 virtual void OnGetTarget(TargetValue* target) const OVERRIDE { | 61 virtual void OnGetTarget(TargetValue* target) const OVERRIDE { |
59 target->transform = target_; | 62 target->transform = target_; |
60 } | 63 } |
61 | 64 |
62 virtual void OnAbort() OVERRIDE {} | 65 virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {} |
63 | 66 |
64 private: | 67 private: |
65 static AnimatableProperties GetProperties() { | 68 static AnimatableProperties GetProperties() { |
66 AnimatableProperties properties; | 69 AnimatableProperties properties; |
67 properties.insert(LayerAnimationElement::TRANSFORM); | 70 properties.insert(LayerAnimationElement::TRANSFORM); |
68 return properties; | 71 return properties; |
69 } | 72 } |
70 | 73 |
71 gfx::Transform start_; | 74 gfx::Transform start_; |
72 const gfx::Transform target_; | 75 const gfx::Transform target_; |
(...skipping 19 matching lines...) Expand all Loading... |
92 virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE { | 95 virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE { |
93 delegate->SetTransformFromAnimation( | 96 delegate->SetTransformFromAnimation( |
94 interpolated_transform_->Interpolate(static_cast<float>(t))); | 97 interpolated_transform_->Interpolate(static_cast<float>(t))); |
95 return true; | 98 return true; |
96 } | 99 } |
97 | 100 |
98 virtual void OnGetTarget(TargetValue* target) const OVERRIDE { | 101 virtual void OnGetTarget(TargetValue* target) const OVERRIDE { |
99 target->transform = interpolated_transform_->Interpolate(1.0f); | 102 target->transform = interpolated_transform_->Interpolate(1.0f); |
100 } | 103 } |
101 | 104 |
102 virtual void OnAbort() OVERRIDE {} | 105 virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {} |
103 | 106 |
104 private: | 107 private: |
105 static AnimatableProperties GetProperties() { | 108 static AnimatableProperties GetProperties() { |
106 AnimatableProperties properties; | 109 AnimatableProperties properties; |
107 properties.insert(LayerAnimationElement::TRANSFORM); | 110 properties.insert(LayerAnimationElement::TRANSFORM); |
108 return properties; | 111 return properties; |
109 } | 112 } |
110 | 113 |
111 scoped_ptr<InterpolatedTransform> interpolated_transform_; | 114 scoped_ptr<InterpolatedTransform> interpolated_transform_; |
112 | 115 |
(...skipping 17 matching lines...) Expand all Loading... |
130 | 133 |
131 virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE { | 134 virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE { |
132 delegate->SetBoundsFromAnimation(Tween::ValueBetween(t, start_, target_)); | 135 delegate->SetBoundsFromAnimation(Tween::ValueBetween(t, start_, target_)); |
133 return true; | 136 return true; |
134 } | 137 } |
135 | 138 |
136 virtual void OnGetTarget(TargetValue* target) const OVERRIDE { | 139 virtual void OnGetTarget(TargetValue* target) const OVERRIDE { |
137 target->bounds = target_; | 140 target->bounds = target_; |
138 } | 141 } |
139 | 142 |
140 virtual void OnAbort() OVERRIDE {} | 143 virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {} |
141 | 144 |
142 private: | 145 private: |
143 static AnimatableProperties GetProperties() { | 146 static AnimatableProperties GetProperties() { |
144 AnimatableProperties properties; | 147 AnimatableProperties properties; |
145 properties.insert(LayerAnimationElement::BOUNDS); | 148 properties.insert(LayerAnimationElement::BOUNDS); |
146 return properties; | 149 return properties; |
147 } | 150 } |
148 | 151 |
149 gfx::Rect start_; | 152 gfx::Rect start_; |
150 const gfx::Rect target_; | 153 const gfx::Rect target_; |
(...skipping 19 matching lines...) Expand all Loading... |
170 | 173 |
171 virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE { | 174 virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE { |
172 delegate->SetOpacityFromAnimation(Tween::ValueBetween(t, start_, target_)); | 175 delegate->SetOpacityFromAnimation(Tween::ValueBetween(t, start_, target_)); |
173 return true; | 176 return true; |
174 } | 177 } |
175 | 178 |
176 virtual void OnGetTarget(TargetValue* target) const OVERRIDE { | 179 virtual void OnGetTarget(TargetValue* target) const OVERRIDE { |
177 target->opacity = target_; | 180 target->opacity = target_; |
178 } | 181 } |
179 | 182 |
180 virtual void OnAbort() OVERRIDE {} | 183 virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {} |
181 | 184 |
182 private: | 185 private: |
183 static AnimatableProperties GetProperties() { | 186 static AnimatableProperties GetProperties() { |
184 AnimatableProperties properties; | 187 AnimatableProperties properties; |
185 properties.insert(LayerAnimationElement::OPACITY); | 188 properties.insert(LayerAnimationElement::OPACITY); |
186 return properties; | 189 return properties; |
187 } | 190 } |
188 | 191 |
189 float start_; | 192 float start_; |
190 const float target_; | 193 const float target_; |
(...skipping 19 matching lines...) Expand all Loading... |
210 | 213 |
211 virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE { | 214 virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE { |
212 delegate->SetVisibilityFromAnimation(t == 1.0 ? target_ : start_); | 215 delegate->SetVisibilityFromAnimation(t == 1.0 ? target_ : start_); |
213 return t == 1.0; | 216 return t == 1.0; |
214 } | 217 } |
215 | 218 |
216 virtual void OnGetTarget(TargetValue* target) const OVERRIDE { | 219 virtual void OnGetTarget(TargetValue* target) const OVERRIDE { |
217 target->visibility = target_; | 220 target->visibility = target_; |
218 } | 221 } |
219 | 222 |
220 virtual void OnAbort() OVERRIDE {} | 223 virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {} |
221 | 224 |
222 private: | 225 private: |
223 static AnimatableProperties GetProperties() { | 226 static AnimatableProperties GetProperties() { |
224 AnimatableProperties properties; | 227 AnimatableProperties properties; |
225 properties.insert(LayerAnimationElement::VISIBILITY); | 228 properties.insert(LayerAnimationElement::VISIBILITY); |
226 return properties; | 229 return properties; |
227 } | 230 } |
228 | 231 |
229 bool start_; | 232 bool start_; |
230 const bool target_; | 233 const bool target_; |
(...skipping 20 matching lines...) Expand all Loading... |
251 virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE { | 254 virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE { |
252 delegate->SetBrightnessFromAnimation( | 255 delegate->SetBrightnessFromAnimation( |
253 Tween::ValueBetween(t, start_, target_)); | 256 Tween::ValueBetween(t, start_, target_)); |
254 return true; | 257 return true; |
255 } | 258 } |
256 | 259 |
257 virtual void OnGetTarget(TargetValue* target) const OVERRIDE { | 260 virtual void OnGetTarget(TargetValue* target) const OVERRIDE { |
258 target->brightness = target_; | 261 target->brightness = target_; |
259 } | 262 } |
260 | 263 |
261 virtual void OnAbort() OVERRIDE {} | 264 virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {} |
262 | 265 |
263 private: | 266 private: |
264 static AnimatableProperties GetProperties() { | 267 static AnimatableProperties GetProperties() { |
265 AnimatableProperties properties; | 268 AnimatableProperties properties; |
266 properties.insert(LayerAnimationElement::BRIGHTNESS); | 269 properties.insert(LayerAnimationElement::BRIGHTNESS); |
267 return properties; | 270 return properties; |
268 } | 271 } |
269 | 272 |
270 float start_; | 273 float start_; |
271 const float target_; | 274 const float target_; |
(...skipping 20 matching lines...) Expand all Loading... |
292 virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE { | 295 virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE { |
293 delegate->SetGrayscaleFromAnimation( | 296 delegate->SetGrayscaleFromAnimation( |
294 Tween::ValueBetween(t, start_, target_)); | 297 Tween::ValueBetween(t, start_, target_)); |
295 return true; | 298 return true; |
296 } | 299 } |
297 | 300 |
298 virtual void OnGetTarget(TargetValue* target) const OVERRIDE { | 301 virtual void OnGetTarget(TargetValue* target) const OVERRIDE { |
299 target->grayscale = target_; | 302 target->grayscale = target_; |
300 } | 303 } |
301 | 304 |
302 virtual void OnAbort() OVERRIDE {} | 305 virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {} |
303 | 306 |
304 private: | 307 private: |
305 static AnimatableProperties GetProperties() { | 308 static AnimatableProperties GetProperties() { |
306 AnimatableProperties properties; | 309 AnimatableProperties properties; |
307 properties.insert(LayerAnimationElement::GRAYSCALE); | 310 properties.insert(LayerAnimationElement::GRAYSCALE); |
308 return properties; | 311 return properties; |
309 } | 312 } |
310 | 313 |
311 float start_; | 314 float start_; |
312 const float target_; | 315 const float target_; |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
345 Tween::ValueBetween(t, | 348 Tween::ValueBetween(t, |
346 static_cast<int>(SkColorGetB(start_)), | 349 static_cast<int>(SkColorGetB(start_)), |
347 static_cast<int>(SkColorGetB(target_))))); | 350 static_cast<int>(SkColorGetB(target_))))); |
348 return true; | 351 return true; |
349 } | 352 } |
350 | 353 |
351 virtual void OnGetTarget(TargetValue* target) const OVERRIDE { | 354 virtual void OnGetTarget(TargetValue* target) const OVERRIDE { |
352 target->color = target_; | 355 target->color = target_; |
353 } | 356 } |
354 | 357 |
355 virtual void OnAbort() OVERRIDE {} | 358 virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {} |
356 | 359 |
357 private: | 360 private: |
358 static AnimatableProperties GetProperties() { | 361 static AnimatableProperties GetProperties() { |
359 AnimatableProperties properties; | 362 AnimatableProperties properties; |
360 properties.insert(LayerAnimationElement::COLOR); | 363 properties.insert(LayerAnimationElement::COLOR); |
361 return properties; | 364 return properties; |
362 } | 365 } |
363 | 366 |
364 SkColor start_; | 367 SkColor start_; |
365 const SkColor target_; | 368 const SkColor target_; |
366 | 369 |
367 DISALLOW_COPY_AND_ASSIGN(ColorTransition); | 370 DISALLOW_COPY_AND_ASSIGN(ColorTransition); |
368 }; | 371 }; |
369 | 372 |
| 373 // ThreadedLayerAnimationElement ----------------------------------------------- |
| 374 |
| 375 class ThreadedLayerAnimationElement : public LayerAnimationElement { |
| 376 public: |
| 377 ThreadedLayerAnimationElement(const AnimatableProperties& properties, |
| 378 base::TimeDelta duration) |
| 379 : LayerAnimationElement(properties, duration) { |
| 380 } |
| 381 virtual ~ThreadedLayerAnimationElement() {} |
| 382 |
| 383 virtual bool IsThreaded() const OVERRIDE { |
| 384 return (duration() != base::TimeDelta()); |
| 385 } |
| 386 |
| 387 protected: |
| 388 virtual bool OnProgress(double t, |
| 389 LayerAnimationDelegate* delegate) OVERRIDE { |
| 390 if (t < 1.0) |
| 391 return false; |
| 392 |
| 393 if (Started()) { |
| 394 delegate->RemoveThreadedAnimation(animation_id()); |
| 395 } |
| 396 |
| 397 OnEnd(delegate); |
| 398 return true; |
| 399 } |
| 400 |
| 401 virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE { |
| 402 if (delegate && Started()) { |
| 403 delegate->RemoveThreadedAnimation(animation_id()); |
| 404 } |
| 405 } |
| 406 |
| 407 virtual void RequestEffectiveStart( |
| 408 LayerAnimationDelegate* delegate) OVERRIDE { |
| 409 DCHECK(animation_group_id()); |
| 410 if (duration() == base::TimeDelta()) { |
| 411 set_effective_start_time(requested_start_time()); |
| 412 return; |
| 413 } |
| 414 set_effective_start_time(base::TimeTicks()); |
| 415 scoped_ptr<cc::Animation> animation = CreateCCAnimation(); |
| 416 animation->setNeedsSynchronizedStartTime(true); |
| 417 delegate->AddThreadedAnimation(animation.Pass()); |
| 418 } |
| 419 |
| 420 virtual void OnEnd(LayerAnimationDelegate* delegate) = 0; |
| 421 |
| 422 virtual scoped_ptr<cc::Animation> CreateCCAnimation() = 0; |
| 423 |
| 424 private: |
| 425 DISALLOW_COPY_AND_ASSIGN(ThreadedLayerAnimationElement); |
| 426 }; |
| 427 |
| 428 // ThreadedOpacityTransition --------------------------------------------------- |
| 429 |
| 430 class ThreadedOpacityTransition : public ThreadedLayerAnimationElement { |
| 431 public: |
| 432 ThreadedOpacityTransition(float target, base::TimeDelta duration) |
| 433 : ThreadedLayerAnimationElement(GetProperties(), duration), |
| 434 start_(0.0f), |
| 435 target_(target) { |
| 436 } |
| 437 virtual ~ThreadedOpacityTransition() {} |
| 438 |
| 439 protected: |
| 440 virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE { |
| 441 start_ = delegate->GetOpacityForAnimation(); |
| 442 } |
| 443 |
| 444 virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE { |
| 445 if (delegate && Started()) { |
| 446 ThreadedLayerAnimationElement::OnAbort(delegate); |
| 447 delegate->SetOpacityFromAnimation( |
| 448 Tween::ValueBetween(last_progressed_fraction(), start_, target_)); |
| 449 } |
| 450 } |
| 451 |
| 452 virtual void OnEnd(LayerAnimationDelegate* delegate) OVERRIDE { |
| 453 delegate->SetOpacityFromAnimation(target_); |
| 454 } |
| 455 |
| 456 virtual scoped_ptr<cc::Animation> CreateCCAnimation() OVERRIDE { |
| 457 scoped_ptr<cc::AnimationCurve> animation_curve( |
| 458 new FloatAnimationCurveAdapter(tween_type(), |
| 459 start_, |
| 460 target_, |
| 461 duration())); |
| 462 scoped_ptr<cc::Animation> animation( |
| 463 cc::Animation::create(animation_curve.Pass(), |
| 464 animation_id(), |
| 465 animation_group_id(), |
| 466 cc::Animation::Opacity)); |
| 467 return animation.Pass(); |
| 468 } |
| 469 |
| 470 virtual void OnGetTarget(TargetValue* target) const OVERRIDE { |
| 471 target->opacity = target_; |
| 472 } |
| 473 |
| 474 private: |
| 475 static AnimatableProperties GetProperties() { |
| 476 AnimatableProperties properties; |
| 477 properties.insert(LayerAnimationElement::OPACITY); |
| 478 return properties; |
| 479 } |
| 480 |
| 481 float start_; |
| 482 const float target_; |
| 483 |
| 484 DISALLOW_COPY_AND_ASSIGN(ThreadedOpacityTransition); |
| 485 }; |
| 486 |
370 } // namespace | 487 } // namespace |
371 | 488 |
372 // LayerAnimationElement::TargetValue ------------------------------------------ | 489 // LayerAnimationElement::TargetValue ------------------------------------------ |
373 | 490 |
374 LayerAnimationElement::TargetValue::TargetValue() | 491 LayerAnimationElement::TargetValue::TargetValue() |
375 : opacity(0.0f), | 492 : opacity(0.0f), |
376 visibility(false), | 493 visibility(false), |
377 brightness(0.0f), | 494 brightness(0.0f), |
378 grayscale(0.0f), | 495 grayscale(0.0f), |
379 color(SK_ColorBLACK) { | 496 color(SK_ColorBLACK) { |
(...skipping 12 matching lines...) Expand all Loading... |
392 } | 509 } |
393 | 510 |
394 // LayerAnimationElement ------------------------------------------------------- | 511 // LayerAnimationElement ------------------------------------------------------- |
395 | 512 |
396 LayerAnimationElement::LayerAnimationElement( | 513 LayerAnimationElement::LayerAnimationElement( |
397 const AnimatableProperties& properties, | 514 const AnimatableProperties& properties, |
398 base::TimeDelta duration) | 515 base::TimeDelta duration) |
399 : first_frame_(true), | 516 : first_frame_(true), |
400 properties_(properties), | 517 properties_(properties), |
401 duration_(GetEffectiveDuration(duration)), | 518 duration_(GetEffectiveDuration(duration)), |
402 tween_type_(Tween::LINEAR) { | 519 tween_type_(Tween::LINEAR), |
| 520 animation_id_(cc::AnimationIdProvider::NextAnimationId()), |
| 521 animation_group_id_(0), |
| 522 last_progressed_fraction_(0.0) { |
403 } | 523 } |
404 | 524 |
405 LayerAnimationElement::~LayerAnimationElement() { | 525 LayerAnimationElement::~LayerAnimationElement() { |
406 } | 526 } |
407 | 527 |
| 528 void LayerAnimationElement::Start(LayerAnimationDelegate* delegate, |
| 529 int animation_group_id) { |
| 530 DCHECK(requested_start_time_ != base::TimeTicks()); |
| 531 DCHECK(first_frame_); |
| 532 animation_group_id_ = animation_group_id; |
| 533 last_progressed_fraction_ = 0.0; |
| 534 OnStart(delegate); |
| 535 RequestEffectiveStart(delegate); |
| 536 first_frame_ = false; |
| 537 } |
| 538 |
408 bool LayerAnimationElement::Progress(base::TimeTicks now, | 539 bool LayerAnimationElement::Progress(base::TimeTicks now, |
409 LayerAnimationDelegate* delegate) { | 540 LayerAnimationDelegate* delegate) { |
410 DCHECK(start_time_ != base::TimeTicks()); | 541 DCHECK(requested_start_time_ != base::TimeTicks()); |
411 base::TimeDelta elapsed = now - start_time_; | 542 DCHECK(!first_frame_); |
412 if (first_frame_) | 543 |
413 OnStart(delegate); | 544 bool need_draw; |
414 double t = 1.0; | 545 double t = 1.0; |
| 546 |
| 547 if (effective_start_time_ == base::TimeTicks()) { |
| 548 // This hasn't actually started yet. |
| 549 need_draw = false; |
| 550 last_progressed_fraction_ = 0.0; |
| 551 return need_draw; |
| 552 } |
| 553 |
| 554 base::TimeDelta elapsed = now - effective_start_time_; |
415 if ((duration_ > base::TimeDelta()) && (elapsed < duration_)) | 555 if ((duration_ > base::TimeDelta()) && (elapsed < duration_)) |
416 t = elapsed.InMillisecondsF() / duration_.InMillisecondsF(); | 556 t = elapsed.InMillisecondsF() / duration_.InMillisecondsF(); |
417 bool need_draw = OnProgress(Tween::CalculateValue(tween_type_, t), delegate); | 557 need_draw = OnProgress(Tween::CalculateValue(tween_type_, t), delegate); |
418 first_frame_ = t == 1.0; | 558 first_frame_ = t == 1.0; |
| 559 last_progressed_fraction_ = t; |
419 return need_draw; | 560 return need_draw; |
420 } | 561 } |
421 | 562 |
422 bool LayerAnimationElement::IsFinished(base::TimeTicks time, | 563 bool LayerAnimationElement::IsFinished(base::TimeTicks time, |
423 base::TimeDelta* total_duration) { | 564 base::TimeDelta* total_duration) { |
424 base::TimeDelta elapsed = time - start_time_; | 565 // If an effective start has been requested but the effective start time |
425 if (elapsed >= duration_) { | 566 // hasn't yet been set, the animation is not finished, regardless of the |
426 *total_duration = duration_; | 567 // value of |time|. |
| 568 if (!first_frame_ && (effective_start_time_ == base::TimeTicks())) |
| 569 return false; |
| 570 |
| 571 base::TimeDelta queueing_delay; |
| 572 if (!first_frame_) |
| 573 queueing_delay = effective_start_time_ - requested_start_time_; |
| 574 |
| 575 base::TimeDelta elapsed = time - requested_start_time_; |
| 576 if (elapsed >= duration_ + queueing_delay) { |
| 577 *total_duration = duration_ + queueing_delay; |
427 return true; | 578 return true; |
428 } | 579 } |
429 return false; | 580 return false; |
430 } | 581 } |
431 | 582 |
432 bool LayerAnimationElement::ProgressToEnd(LayerAnimationDelegate* delegate) { | 583 bool LayerAnimationElement::ProgressToEnd(LayerAnimationDelegate* delegate) { |
433 if (first_frame_) | 584 if (first_frame_) |
434 OnStart(delegate); | 585 OnStart(delegate); |
435 bool need_draw = OnProgress(1.0, delegate); | 586 bool need_draw = OnProgress(1.0, delegate); |
| 587 last_progressed_fraction_ = 1.0; |
436 first_frame_ = true; | 588 first_frame_ = true; |
437 return need_draw; | 589 return need_draw; |
438 } | 590 } |
439 | 591 |
440 void LayerAnimationElement::GetTargetValue(TargetValue* target) const { | 592 void LayerAnimationElement::GetTargetValue(TargetValue* target) const { |
441 OnGetTarget(target); | 593 OnGetTarget(target); |
442 } | 594 } |
443 | 595 |
444 void LayerAnimationElement::Abort() { | 596 bool LayerAnimationElement::IsThreaded() const { |
| 597 return false; |
| 598 } |
| 599 |
| 600 void LayerAnimationElement::Abort(LayerAnimationDelegate* delegate) { |
| 601 OnAbort(delegate); |
445 first_frame_ = true; | 602 first_frame_ = true; |
446 OnAbort(); | 603 } |
| 604 |
| 605 void LayerAnimationElement::RequestEffectiveStart( |
| 606 LayerAnimationDelegate* delegate) { |
| 607 DCHECK(requested_start_time_ != base::TimeTicks()); |
| 608 effective_start_time_ = requested_start_time_; |
447 } | 609 } |
448 | 610 |
449 // static | 611 // static |
| 612 LayerAnimationElement::AnimatableProperty |
| 613 LayerAnimationElement::ToAnimatableProperty( |
| 614 cc::Animation::TargetProperty property) { |
| 615 switch (property) { |
| 616 case cc::Animation::Transform: |
| 617 return TRANSFORM; |
| 618 case cc::Animation::Opacity: |
| 619 return OPACITY; |
| 620 default: |
| 621 NOTREACHED(); |
| 622 return AnimatableProperty(); |
| 623 } |
| 624 } |
| 625 |
| 626 // static |
450 base::TimeDelta LayerAnimationElement::GetEffectiveDuration( | 627 base::TimeDelta LayerAnimationElement::GetEffectiveDuration( |
451 const base::TimeDelta& duration) { | 628 const base::TimeDelta& duration) { |
452 if (LayerAnimator::disable_animations_for_test()) | 629 if (LayerAnimator::disable_animations_for_test()) |
453 return base::TimeDelta(); | 630 return base::TimeDelta(); |
454 | 631 |
455 if (LayerAnimator::slow_animation_mode()) | 632 if (LayerAnimator::slow_animation_mode()) |
456 return duration * LayerAnimator::slow_animation_scale_factor(); | 633 return duration * LayerAnimator::slow_animation_scale_factor(); |
457 | 634 |
458 return duration; | 635 return duration; |
459 } | 636 } |
(...skipping 17 matching lines...) Expand all Loading... |
477 LayerAnimationElement* LayerAnimationElement::CreateBoundsElement( | 654 LayerAnimationElement* LayerAnimationElement::CreateBoundsElement( |
478 const gfx::Rect& bounds, | 655 const gfx::Rect& bounds, |
479 base::TimeDelta duration) { | 656 base::TimeDelta duration) { |
480 return new BoundsTransition(bounds, duration); | 657 return new BoundsTransition(bounds, duration); |
481 } | 658 } |
482 | 659 |
483 // static | 660 // static |
484 LayerAnimationElement* LayerAnimationElement::CreateOpacityElement( | 661 LayerAnimationElement* LayerAnimationElement::CreateOpacityElement( |
485 float opacity, | 662 float opacity, |
486 base::TimeDelta duration) { | 663 base::TimeDelta duration) { |
487 return new OpacityTransition(opacity, duration); | 664 return new ThreadedOpacityTransition(opacity, duration); |
488 } | 665 } |
489 | 666 |
490 // static | 667 // static |
491 LayerAnimationElement* LayerAnimationElement::CreateVisibilityElement( | 668 LayerAnimationElement* LayerAnimationElement::CreateVisibilityElement( |
492 bool visibility, | 669 bool visibility, |
493 base::TimeDelta duration) { | 670 base::TimeDelta duration) { |
494 return new VisibilityTransition(visibility, duration); | 671 return new VisibilityTransition(visibility, duration); |
495 } | 672 } |
496 | 673 |
497 // static | 674 // static |
(...skipping 18 matching lines...) Expand all Loading... |
516 } | 693 } |
517 | 694 |
518 // static | 695 // static |
519 LayerAnimationElement* LayerAnimationElement::CreateColorElement( | 696 LayerAnimationElement* LayerAnimationElement::CreateColorElement( |
520 SkColor color, | 697 SkColor color, |
521 base::TimeDelta duration) { | 698 base::TimeDelta duration) { |
522 return new ColorTransition(color, duration); | 699 return new ColorTransition(color, duration); |
523 } | 700 } |
524 | 701 |
525 } // namespace ui | 702 } // namespace ui |
OLD | NEW |