summaryrefslogtreecommitdiff
path: root/chromium/ui/compositor/layer_animation_element.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/ui/compositor/layer_animation_element.cc')
-rw-r--r--chromium/ui/compositor/layer_animation_element.cc203
1 files changed, 177 insertions, 26 deletions
diff --git a/chromium/ui/compositor/layer_animation_element.cc b/chromium/ui/compositor/layer_animation_element.cc
index f70c1084a1d..1448660240f 100644
--- a/chromium/ui/compositor/layer_animation_element.cc
+++ b/chromium/ui/compositor/layer_animation_element.cc
@@ -7,13 +7,13 @@
#include "base/compiler_specific.h"
#include "cc/animation/animation.h"
#include "cc/animation/animation_id_provider.h"
-#include "ui/base/animation/tween.h"
#include "ui/compositor/float_animation_curve_adapter.h"
#include "ui/compositor/layer.h"
#include "ui/compositor/layer_animation_delegate.h"
#include "ui/compositor/layer_animator.h"
#include "ui/compositor/scoped_animation_duration_scale_mode.h"
#include "ui/compositor/transform_animation_curve_adapter.h"
+#include "ui/gfx/animation/tween.h"
#include "ui/gfx/interpolated_transform.h"
namespace ui {
@@ -63,7 +63,7 @@ class TransformTransition : public LayerAnimationElement {
virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE {
delegate->SetTransformFromAnimation(
- Tween::ValueBetween(t, start_, target_));
+ gfx::Tween::ValueBetween(t, start_, target_));
return true;
}
@@ -141,7 +141,8 @@ class BoundsTransition : public LayerAnimationElement {
}
virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE {
- delegate->SetBoundsFromAnimation(Tween::ValueBetween(t, start_, target_));
+ delegate->SetBoundsFromAnimation(
+ gfx::Tween::ValueBetween(t, start_, target_));
return true;
}
@@ -181,7 +182,8 @@ class OpacityTransition : public LayerAnimationElement {
}
virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE {
- delegate->SetOpacityFromAnimation(Tween::ValueBetween(t, start_, target_));
+ delegate->SetOpacityFromAnimation(
+ gfx::Tween::ValueBetween(t, start_, target_));
return true;
}
@@ -262,7 +264,7 @@ class BrightnessTransition : public LayerAnimationElement {
virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE {
delegate->SetBrightnessFromAnimation(
- Tween::ValueBetween(t, start_, target_));
+ gfx::Tween::ValueBetween(t, start_, target_));
return true;
}
@@ -303,7 +305,7 @@ class GrayscaleTransition : public LayerAnimationElement {
virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE {
delegate->SetGrayscaleFromAnimation(
- Tween::ValueBetween(t, start_, target_));
+ gfx::Tween::ValueBetween(t, start_, target_));
return true;
}
@@ -345,18 +347,18 @@ class ColorTransition : public LayerAnimationElement {
virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE {
delegate->SetColorFromAnimation(
SkColorSetARGB(
- Tween::ValueBetween(t,
- static_cast<int>(SkColorGetA(start_)),
- static_cast<int>(SkColorGetA(target_))),
- Tween::ValueBetween(t,
- static_cast<int>(SkColorGetR(start_)),
- static_cast<int>(SkColorGetR(target_))),
- Tween::ValueBetween(t,
- static_cast<int>(SkColorGetG(start_)),
- static_cast<int>(SkColorGetG(target_))),
- Tween::ValueBetween(t,
- static_cast<int>(SkColorGetB(start_)),
- static_cast<int>(SkColorGetB(target_)))));
+ gfx::Tween::ValueBetween(t,
+ static_cast<int>(SkColorGetA(start_)),
+ static_cast<int>(SkColorGetA(target_))),
+ gfx::Tween::ValueBetween(t,
+ static_cast<int>(SkColorGetR(start_)),
+ static_cast<int>(SkColorGetR(target_))),
+ gfx::Tween::ValueBetween(t,
+ static_cast<int>(SkColorGetG(start_)),
+ static_cast<int>(SkColorGetG(target_))),
+ gfx::Tween::ValueBetween(t,
+ static_cast<int>(SkColorGetB(start_)),
+ static_cast<int>(SkColorGetB(target_)))));
return true;
}
@@ -394,6 +396,10 @@ class ThreadedLayerAnimationElement : public LayerAnimationElement {
}
protected:
+ explicit ThreadedLayerAnimationElement(const LayerAnimationElement& element)
+ : LayerAnimationElement(element) {
+ }
+
virtual bool OnProgress(double t,
LayerAnimationDelegate* delegate) OVERRIDE {
if (t < 1.0)
@@ -453,10 +459,10 @@ class ThreadedOpacityTransition : public ThreadedLayerAnimationElement {
virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {
if (delegate && Started()) {
ThreadedLayerAnimationElement::OnAbort(delegate);
- delegate->SetOpacityFromAnimation(Tween::ValueBetween(
- Tween::CalculateValue(tween_type(), last_progressed_fraction()),
- start_,
- target_));
+ delegate->SetOpacityFromAnimation(gfx::Tween::ValueBetween(
+ gfx::Tween::CalculateValue(tween_type(), last_progressed_fraction()),
+ start_,
+ target_));
}
}
@@ -519,8 +525,8 @@ class ThreadedTransformTransition : public ThreadedLayerAnimationElement {
virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {
if (delegate && Started()) {
ThreadedLayerAnimationElement::OnAbort(delegate);
- delegate->SetTransformFromAnimation(Tween::ValueBetween(
- Tween::CalculateValue(tween_type(), last_progressed_fraction()),
+ delegate->SetTransformFromAnimation(gfx::Tween::ValueBetween(
+ gfx::Tween::CalculateValue(tween_type(), last_progressed_fraction()),
start_,
target_));
}
@@ -563,6 +569,127 @@ class ThreadedTransformTransition : public ThreadedLayerAnimationElement {
DISALLOW_COPY_AND_ASSIGN(ThreadedTransformTransition);
};
+// InverseTransformTransision --------------------------------------------------
+
+class InverseTransformTransition : public ThreadedLayerAnimationElement {
+ public:
+ InverseTransformTransition(const gfx::Transform& base_transform,
+ const LayerAnimationElement* uninverted_transition)
+ : ThreadedLayerAnimationElement(*uninverted_transition),
+ base_transform_(base_transform),
+ uninverted_transition_(
+ CheckAndCast<const ThreadedTransformTransition*>(
+ uninverted_transition)) {
+ }
+ virtual ~InverseTransformTransition() {}
+
+ static InverseTransformTransition* Clone(const LayerAnimationElement* other) {
+ const InverseTransformTransition* other_inverse =
+ CheckAndCast<const InverseTransformTransition*>(other);
+ return new InverseTransformTransition(
+ other_inverse->base_transform_, other_inverse->uninverted_transition_);
+ }
+
+ protected:
+ virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE {
+ gfx::Transform start(delegate->GetTransformForAnimation());
+ effective_start_ = base_transform_ * start;
+
+ TargetValue target;
+ uninverted_transition_->GetTargetValue(&target);
+ base_target_ = target.transform;
+
+ set_tween_type(uninverted_transition_->tween_type());
+
+ float device_scale_factor = delegate->GetDeviceScaleFactor();
+ const gfx::Transform cc_base_start = Layer::ConvertTransformToCCTransform(
+ base_transform_,
+ device_scale_factor);
+ const gfx::Transform cc_base_target = Layer::ConvertTransformToCCTransform(
+ base_target_,
+ device_scale_factor);
+ TransformAnimationCurveAdapter base_curve(tween_type(),
+ cc_base_start,
+ cc_base_target,
+ duration());
+
+ const gfx::Transform cc_start = Layer::ConvertTransformToCCTransform(
+ start, device_scale_factor);
+ animation_curve_.reset(new InverseTransformCurveAdapter(
+ base_curve, cc_start, duration()));
+ computed_target_transform_ = ComputeWithBaseTransform(effective_start_,
+ base_target_);
+ }
+
+ virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {
+ if (delegate && Started()) {
+ ThreadedLayerAnimationElement::OnAbort(delegate);
+ delegate->SetTransformFromAnimation(ComputeCurrentTransform());
+ }
+ }
+
+ virtual void OnEnd(LayerAnimationDelegate* delegate) OVERRIDE {
+ delegate->SetTransformFromAnimation(computed_target_transform_);
+ }
+
+ virtual scoped_ptr<cc::Animation> CreateCCAnimation() OVERRIDE {
+ scoped_ptr<cc::Animation> animation(
+ cc::Animation::Create(animation_curve_->Clone(),
+ animation_id(),
+ animation_group_id(),
+ cc::Animation::Transform));
+ return animation.Pass();
+ }
+
+ virtual void OnGetTarget(TargetValue* target) const OVERRIDE {
+ target->transform = computed_target_transform_;
+ }
+
+ private:
+ gfx::Transform ComputeCurrentTransform() const {
+ gfx::Transform base_current = gfx::Tween::ValueBetween(
+ gfx::Tween::CalculateValue(tween_type(), last_progressed_fraction()),
+ base_transform_,
+ base_target_);
+ return ComputeWithBaseTransform(effective_start_, base_current);
+ }
+
+ gfx::Transform ComputeWithBaseTransform(gfx::Transform start,
+ gfx::Transform target) const {
+ gfx::Transform to_return(gfx::Transform::kSkipInitialization);
+ bool success = target.GetInverse(&to_return);
+ DCHECK(success) << "Target transform must be invertible.";
+
+ to_return.PreconcatTransform(start);
+ return to_return;
+ }
+
+ static AnimatableProperties GetProperties() {
+ AnimatableProperties properties;
+ properties.insert(LayerAnimationElement::TRANSFORM);
+ return properties;
+ }
+
+ template <typename T>
+ static T CheckAndCast(const LayerAnimationElement* element) {
+ const AnimatableProperties& properties = element->properties();
+ DCHECK(properties.find(TRANSFORM) != properties.end());
+ return static_cast<T>(element);
+ }
+
+ gfx::Transform effective_start_;
+ gfx::Transform computed_target_transform_;
+
+ const gfx::Transform base_transform_;
+ gfx::Transform base_target_;
+
+ scoped_ptr<cc::AnimationCurve> animation_curve_;
+
+ const ThreadedTransformTransition* const uninverted_transition_;
+
+ DISALLOW_COPY_AND_ASSIGN(InverseTransformTransition);
+};
+
} // namespace
// LayerAnimationElement::TargetValue ------------------------------------------
@@ -595,12 +722,23 @@ LayerAnimationElement::LayerAnimationElement(
: first_frame_(true),
properties_(properties),
duration_(GetEffectiveDuration(duration)),
- tween_type_(Tween::LINEAR),
+ tween_type_(gfx::Tween::LINEAR),
animation_id_(cc::AnimationIdProvider::NextAnimationId()),
animation_group_id_(0),
last_progressed_fraction_(0.0) {
}
+LayerAnimationElement::LayerAnimationElement(
+ const LayerAnimationElement &element)
+ : first_frame_(element.first_frame_),
+ properties_(element.properties_),
+ duration_(element.duration_),
+ tween_type_(element.tween_type_),
+ animation_id_(cc::AnimationIdProvider::NextAnimationId()),
+ animation_group_id_(element.animation_group_id_),
+ last_progressed_fraction_(element.last_progressed_fraction_) {
+}
+
LayerAnimationElement::~LayerAnimationElement() {
}
@@ -634,7 +772,7 @@ bool LayerAnimationElement::Progress(base::TimeTicks now,
base::TimeDelta elapsed = now - effective_start_time_;
if ((duration_ > base::TimeDelta()) && (elapsed < duration_))
t = elapsed.InMillisecondsF() / duration_.InMillisecondsF();
- need_draw = OnProgress(Tween::CalculateValue(tween_type_, t), delegate);
+ need_draw = OnProgress(gfx::Tween::CalculateValue(tween_type_, t), delegate);
first_frame_ = t == 1.0;
last_progressed_fraction_ = t;
return need_draw;
@@ -729,6 +867,19 @@ LayerAnimationElement* LayerAnimationElement::CreateTransformElement(
}
// static
+LayerAnimationElement* LayerAnimationElement::CreateInverseTransformElement(
+ const gfx::Transform& base_transform,
+ const LayerAnimationElement* uninverted_transition) {
+ return new InverseTransformTransition(base_transform, uninverted_transition);
+}
+
+// static
+LayerAnimationElement* LayerAnimationElement::CloneInverseTransformElement(
+ const LayerAnimationElement* other) {
+ return InverseTransformTransition::Clone(other);
+}
+
+// static
LayerAnimationElement*
LayerAnimationElement::CreateInterpolatedTransformElement(
InterpolatedTransform* interpolated_transform,