| 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/animation.h" | 8 #include "cc/animation/animation.h" |
| 9 #include "cc/animation/animation_id_provider.h" | 9 #include "cc/animation/animation_id_provider.h" |
| 10 #include "ui/base/animation/tween.h" | 10 #include "ui/base/animation/tween.h" |
| (...skipping 376 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 387 base::TimeDelta duration) | 387 base::TimeDelta duration) |
| 388 : LayerAnimationElement(properties, duration) { | 388 : LayerAnimationElement(properties, duration) { |
| 389 } | 389 } |
| 390 virtual ~ThreadedLayerAnimationElement() {} | 390 virtual ~ThreadedLayerAnimationElement() {} |
| 391 | 391 |
| 392 virtual bool IsThreaded() const OVERRIDE { | 392 virtual bool IsThreaded() const OVERRIDE { |
| 393 return (duration() != base::TimeDelta()); | 393 return (duration() != base::TimeDelta()); |
| 394 } | 394 } |
| 395 | 395 |
| 396 protected: | 396 protected: |
| 397 explicit ThreadedLayerAnimationElement(const LayerAnimationElement& element) | |
| 398 : LayerAnimationElement(element) { | |
| 399 } | |
| 400 | |
| 401 virtual bool OnProgress(double t, | 397 virtual bool OnProgress(double t, |
| 402 LayerAnimationDelegate* delegate) OVERRIDE { | 398 LayerAnimationDelegate* delegate) OVERRIDE { |
| 403 if (t < 1.0) | 399 if (t < 1.0) |
| 404 return false; | 400 return false; |
| 405 | 401 |
| 406 if (Started()) { | 402 if (Started()) { |
| 407 delegate->RemoveThreadedAnimation(animation_id()); | 403 delegate->RemoveThreadedAnimation(animation_id()); |
| 408 } | 404 } |
| 409 | 405 |
| 410 OnEnd(delegate); | 406 OnEnd(delegate); |
| (...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 560 } | 556 } |
| 561 | 557 |
| 562 gfx::Transform start_; | 558 gfx::Transform start_; |
| 563 gfx::Transform cc_start_; | 559 gfx::Transform cc_start_; |
| 564 const gfx::Transform target_; | 560 const gfx::Transform target_; |
| 565 gfx::Transform cc_target_; | 561 gfx::Transform cc_target_; |
| 566 | 562 |
| 567 DISALLOW_COPY_AND_ASSIGN(ThreadedTransformTransition); | 563 DISALLOW_COPY_AND_ASSIGN(ThreadedTransformTransition); |
| 568 }; | 564 }; |
| 569 | 565 |
| 570 // InverseTransformTransision -------------------------------------------------- | |
| 571 | |
| 572 class InverseTransformTransition : public ThreadedLayerAnimationElement { | |
| 573 public: | |
| 574 InverseTransformTransition(const gfx::Transform& base_transform, | |
| 575 const LayerAnimationElement* uninverted_transition) | |
| 576 : ThreadedLayerAnimationElement(*uninverted_transition), | |
| 577 base_transform_(base_transform), | |
| 578 uninverted_transition_(CheckAndCast(uninverted_transition)) { | |
| 579 } | |
| 580 virtual ~InverseTransformTransition() {} | |
| 581 | |
| 582 protected: | |
| 583 virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE { | |
| 584 gfx::Transform start(delegate->GetTransformForAnimation()); | |
| 585 effective_start_ = base_transform_ * start; | |
| 586 | |
| 587 TargetValue target; | |
| 588 uninverted_transition_->GetTargetValue(&target); | |
| 589 base_target_ = target.transform; | |
| 590 | |
| 591 set_tween_type(uninverted_transition_->tween_type()); | |
| 592 | |
| 593 float device_scale_factor = delegate->GetDeviceScaleFactor(); | |
| 594 const gfx::Transform cc_base_start = Layer::ConvertTransformToCCTransform( | |
| 595 base_transform_, | |
| 596 device_scale_factor); | |
| 597 const gfx::Transform cc_base_target = Layer::ConvertTransformToCCTransform( | |
| 598 base_target_, | |
| 599 device_scale_factor); | |
| 600 TransformAnimationCurveAdapter base_curve(tween_type(), | |
| 601 cc_base_start, | |
| 602 cc_base_target, | |
| 603 duration()); | |
| 604 | |
| 605 const gfx::Transform cc_start = Layer::ConvertTransformToCCTransform( | |
| 606 start, device_scale_factor); | |
| 607 animation_curve_.reset(new InverseTransformCurveAdapter( | |
| 608 base_curve, cc_start, duration())); | |
| 609 computed_target_transform_ = ComputeWithBaseTransform(effective_start_, | |
| 610 base_target_); | |
| 611 } | |
| 612 | |
| 613 virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE { | |
| 614 if (delegate && Started()) { | |
| 615 ThreadedLayerAnimationElement::OnAbort(delegate); | |
| 616 delegate->SetTransformFromAnimation(ComputeCurrentTransform()); | |
| 617 } | |
| 618 } | |
| 619 | |
| 620 virtual void OnEnd(LayerAnimationDelegate* delegate) OVERRIDE { | |
| 621 delegate->SetTransformFromAnimation(computed_target_transform_); | |
| 622 } | |
| 623 | |
| 624 virtual scoped_ptr<cc::Animation> CreateCCAnimation() OVERRIDE { | |
| 625 scoped_ptr<cc::Animation> animation( | |
| 626 cc::Animation::Create(animation_curve_->Clone(), | |
| 627 animation_id(), | |
| 628 animation_group_id(), | |
| 629 cc::Animation::Transform)); | |
| 630 return animation.Pass(); | |
| 631 } | |
| 632 | |
| 633 virtual void OnGetTarget(TargetValue* target) const OVERRIDE { | |
| 634 target->transform = computed_target_transform_; | |
| 635 } | |
| 636 | |
| 637 private: | |
| 638 gfx::Transform ComputeCurrentTransform() const { | |
| 639 gfx::Transform base_current = Tween::ValueBetween( | |
| 640 Tween::CalculateValue(tween_type(), last_progressed_fraction()), | |
| 641 base_transform_, | |
| 642 base_target_); | |
| 643 return ComputeWithBaseTransform(effective_start_, base_current); | |
| 644 } | |
| 645 | |
| 646 gfx::Transform ComputeWithBaseTransform(gfx::Transform start, | |
| 647 gfx::Transform target) const { | |
| 648 gfx::Transform to_return(gfx::Transform::kSkipInitialization); | |
| 649 DCHECK(target.GetInverse(&to_return)); | |
| 650 | |
| 651 to_return.PreconcatTransform(start); | |
| 652 return to_return; | |
| 653 } | |
| 654 | |
| 655 static AnimatableProperties GetProperties() { | |
| 656 AnimatableProperties properties; | |
| 657 properties.insert(LayerAnimationElement::TRANSFORM); | |
| 658 return properties; | |
| 659 } | |
| 660 | |
| 661 static const ThreadedTransformTransition* CheckAndCast( | |
| 662 const LayerAnimationElement* element) { | |
| 663 const AnimatableProperties& properties = element->properties(); | |
| 664 DCHECK(properties.find(TRANSFORM) != properties.end()); | |
| 665 return static_cast<const ThreadedTransformTransition*>(element); | |
| 666 } | |
| 667 | |
| 668 gfx::Transform effective_start_; | |
| 669 gfx::Transform computed_target_transform_; | |
| 670 | |
| 671 const gfx::Transform base_transform_; | |
| 672 gfx::Transform base_target_; | |
| 673 | |
| 674 scoped_ptr<cc::AnimationCurve> animation_curve_; | |
| 675 | |
| 676 const ThreadedTransformTransition* const uninverted_transition_; | |
| 677 | |
| 678 DISALLOW_COPY_AND_ASSIGN(InverseTransformTransition); | |
| 679 }; | |
| 680 | |
| 681 } // namespace | 566 } // namespace |
| 682 | 567 |
| 683 // LayerAnimationElement::TargetValue ------------------------------------------ | 568 // LayerAnimationElement::TargetValue ------------------------------------------ |
| 684 | 569 |
| 685 LayerAnimationElement::TargetValue::TargetValue() | 570 LayerAnimationElement::TargetValue::TargetValue() |
| 686 : opacity(0.0f), | 571 : opacity(0.0f), |
| 687 visibility(false), | 572 visibility(false), |
| 688 brightness(0.0f), | 573 brightness(0.0f), |
| 689 grayscale(0.0f), | 574 grayscale(0.0f), |
| 690 color(SK_ColorBLACK) { | 575 color(SK_ColorBLACK) { |
| (...skipping 18 matching lines...) Expand all Loading... |
| 709 base::TimeDelta duration) | 594 base::TimeDelta duration) |
| 710 : first_frame_(true), | 595 : first_frame_(true), |
| 711 properties_(properties), | 596 properties_(properties), |
| 712 duration_(GetEffectiveDuration(duration)), | 597 duration_(GetEffectiveDuration(duration)), |
| 713 tween_type_(Tween::LINEAR), | 598 tween_type_(Tween::LINEAR), |
| 714 animation_id_(cc::AnimationIdProvider::NextAnimationId()), | 599 animation_id_(cc::AnimationIdProvider::NextAnimationId()), |
| 715 animation_group_id_(0), | 600 animation_group_id_(0), |
| 716 last_progressed_fraction_(0.0) { | 601 last_progressed_fraction_(0.0) { |
| 717 } | 602 } |
| 718 | 603 |
| 719 LayerAnimationElement::LayerAnimationElement( | |
| 720 const LayerAnimationElement &element) | |
| 721 : first_frame_(element.first_frame_), | |
| 722 properties_(element.properties_), | |
| 723 duration_(element.duration_), | |
| 724 tween_type_(element.tween_type_), | |
| 725 animation_id_(cc::AnimationIdProvider::NextAnimationId()), | |
| 726 animation_group_id_(element.animation_group_id_), | |
| 727 last_progressed_fraction_(element.last_progressed_fraction_) { | |
| 728 } | |
| 729 | |
| 730 LayerAnimationElement::~LayerAnimationElement() { | 604 LayerAnimationElement::~LayerAnimationElement() { |
| 731 } | 605 } |
| 732 | 606 |
| 733 void LayerAnimationElement::Start(LayerAnimationDelegate* delegate, | 607 void LayerAnimationElement::Start(LayerAnimationDelegate* delegate, |
| 734 int animation_group_id) { | 608 int animation_group_id) { |
| 735 DCHECK(requested_start_time_ != base::TimeTicks()); | 609 DCHECK(requested_start_time_ != base::TimeTicks()); |
| 736 DCHECK(first_frame_); | 610 DCHECK(first_frame_); |
| 737 animation_group_id_ = animation_group_id; | 611 animation_group_id_ = animation_group_id; |
| 738 last_progressed_fraction_ = 0.0; | 612 last_progressed_fraction_ = 0.0; |
| 739 OnStart(delegate); | 613 OnStart(delegate); |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 848 } | 722 } |
| 849 | 723 |
| 850 // static | 724 // static |
| 851 LayerAnimationElement* LayerAnimationElement::CreateTransformElement( | 725 LayerAnimationElement* LayerAnimationElement::CreateTransformElement( |
| 852 const gfx::Transform& transform, | 726 const gfx::Transform& transform, |
| 853 base::TimeDelta duration) { | 727 base::TimeDelta duration) { |
| 854 return new ThreadedTransformTransition(transform, duration); | 728 return new ThreadedTransformTransition(transform, duration); |
| 855 } | 729 } |
| 856 | 730 |
| 857 // static | 731 // static |
| 858 LayerAnimationElement* LayerAnimationElement::CreateInverseTransformElement( | |
| 859 const gfx::Transform& base_transform, | |
| 860 const LayerAnimationElement* uninverted_transition) { | |
| 861 return new InverseTransformTransition(base_transform, uninverted_transition); | |
| 862 } | |
| 863 | |
| 864 // static | |
| 865 LayerAnimationElement* | 732 LayerAnimationElement* |
| 866 LayerAnimationElement::CreateInterpolatedTransformElement( | 733 LayerAnimationElement::CreateInterpolatedTransformElement( |
| 867 InterpolatedTransform* interpolated_transform, | 734 InterpolatedTransform* interpolated_transform, |
| 868 base::TimeDelta duration) { | 735 base::TimeDelta duration) { |
| 869 return new InterpolatedTransformTransition(interpolated_transform, duration); | 736 return new InterpolatedTransformTransition(interpolated_transform, duration); |
| 870 } | 737 } |
| 871 | 738 |
| 872 // static | 739 // static |
| 873 LayerAnimationElement* LayerAnimationElement::CreateBoundsElement( | 740 LayerAnimationElement* LayerAnimationElement::CreateBoundsElement( |
| 874 const gfx::Rect& bounds, | 741 const gfx::Rect& bounds, |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 912 } | 779 } |
| 913 | 780 |
| 914 // static | 781 // static |
| 915 LayerAnimationElement* LayerAnimationElement::CreateColorElement( | 782 LayerAnimationElement* LayerAnimationElement::CreateColorElement( |
| 916 SkColor color, | 783 SkColor color, |
| 917 base::TimeDelta duration) { | 784 base::TimeDelta duration) { |
| 918 return new ColorTransition(color, duration); | 785 return new ColorTransition(color, duration); |
| 919 } | 786 } |
| 920 | 787 |
| 921 } // namespace ui | 788 } // namespace ui |
| OLD | NEW |