Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(40)

Unified Diff: ui/compositor/layer_animation_element.cc

Issue 22861008: Add support for inverse transform animations. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Remove duration parameters from the child and have the factory method pass it in. Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/compositor/layer_animation_element.h ('k') | ui/compositor/layer_animation_element_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/compositor/layer_animation_element.cc
diff --git a/ui/compositor/layer_animation_element.cc b/ui/compositor/layer_animation_element.cc
index f70c1084a1db9e134227c54e7a883c83fc2e6433..52d974ca32dc34ee83432307515f33b723a032e3 100644
--- a/ui/compositor/layer_animation_element.cc
+++ b/ui/compositor/layer_animation_element.cc
@@ -563,6 +563,119 @@ class ThreadedTransformTransition : public ThreadedLayerAnimationElement {
DISALLOW_COPY_AND_ASSIGN(ThreadedTransformTransition);
};
+// ChildCounterTransformTransition ---------------------------------------------
Ian Vollick 2013/08/26 14:19:55 I wonder if we could avoid the child/parent verbag
avallee 2013/08/27 19:29:25 Done.
+
+class ChildCounterTransformTransition : public ThreadedLayerAnimationElement {
+ public:
+ ChildCounterTransformTransition(const gfx::Transform& parent_start,
+ const LayerAnimationElement* parent,
+ base::TimeDelta duration)
Ian Vollick 2013/08/26 14:19:55 This duration can be pulled from the 'parent' elem
avallee 2013/08/27 19:29:25 Plumbed through duration in a LAE constructor, mak
+ : ThreadedLayerAnimationElement(GetProperties(), duration),
+ parent_start_(parent_start),
+ parent_transition_(CheckAndCast(parent)) {
+ }
+ virtual ~ChildCounterTransformTransition() {}
+
+ protected:
+ virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE {
+ start_ = delegate->GetTransformForAnimation();
+ effective_start_ = parent_start_ * start_;
+
+ TargetValue target;
+ parent_transition_->GetTargetValue(&target);
+ parent_target_ = target.transform;
+
+ set_tween_type(parent_transition_->tween_type());
+ float device_scale_factor = delegate->GetDeviceScaleFactor();
+ cc_start_ = Layer::ConvertTransformToCCTransform(start_,
+ device_scale_factor);
+ cc_parent_start_ = Layer::ConvertTransformToCCTransform(
+ parent_start_,
+ device_scale_factor);
+ cc_parent_target_ = Layer::ConvertTransformToCCTransform(
+ parent_target_,
+ device_scale_factor);
+ }
+
+ virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {
+ if (delegate && Started()) {
+ ThreadedLayerAnimationElement::OnAbort(delegate);
+ delegate->SetTransformFromAnimation(ComputeCurrentTransform());
+ }
+ }
+
+ virtual void OnEnd(LayerAnimationDelegate* delegate) OVERRIDE {
+ delegate->SetTransformFromAnimation(
+ ComputeWithParentTransform(effective_start_, parent_target_));
+ }
+
+ virtual scoped_ptr<cc::Animation> CreateCCAnimation() OVERRIDE {
+ TransformAnimationCurveAdapter parent_curve(tween_type(),
Ian Vollick 2013/08/26 14:19:55 The values in this function are built based on con
avallee 2013/08/27 19:29:25 Done.
+ cc_parent_start_,
+ cc_parent_target_,
+ duration());
+ scoped_ptr<cc::AnimationCurve> animation_curve(
+ new CounterTransformCurveAdapter(parent_curve,
+ cc_start_,
+ duration()));
+ scoped_ptr<cc::Animation> animation(
+ cc::Animation::Create(animation_curve.Pass(),
+ animation_id(),
+ animation_group_id(),
+ cc::Animation::Transform));
+ return animation.Pass();
+ }
+
+ virtual void OnGetTarget(TargetValue* target) const OVERRIDE {
+ target->transform = ComputeWithParentTransform(effective_start_,
+ parent_target_);
+ }
+
+ private:
+ gfx::Transform ComputeCurrentTransform() const {
+ gfx::Transform parent_current = Tween::ValueBetween(
+ Tween::CalculateValue(tween_type(), last_progressed_fraction()),
+ parent_start_,
+ parent_target_);
+ return ComputeWithParentTransform(effective_start_, parent_current);
+ }
+
+ gfx::Transform ComputeWithParentTransform(gfx::Transform start,
+ gfx::Transform parent) const {
+ gfx::Transform to_return(gfx::Transform::kSkipInitialization);
+ DCHECK(parent.GetInverse(&to_return));
+
+ to_return.PreconcatTransform(start);
+ return to_return;
+ }
+
+ static AnimatableProperties GetProperties() {
+ AnimatableProperties properties;
+ properties.insert(LayerAnimationElement::TRANSFORM);
+ return properties;
+ }
+
+ static const ThreadedTransformTransition* CheckAndCast(
+ const LayerAnimationElement* element) {
+ const AnimatableProperties& properties = element->properties();
+ DCHECK(properties.find(TRANSFORM) != properties.end());
+ return static_cast<const ThreadedTransformTransition*>(element);
+ }
+
+ gfx::Transform start_;
Ian Vollick 2013/08/26 14:19:55 Do we need to store this at all?
avallee 2013/08/27 19:29:25 Thought we did, but reworked it so that it's no lo
+ gfx::Transform cc_start_;
+ gfx::Transform effective_start_;
+
+ const gfx::Transform parent_start_;
+ gfx::Transform cc_parent_start_;
+ gfx::Transform parent_target_;
+ gfx::Transform cc_parent_target_;
+
+ const ThreadedTransformTransition* const parent_transition_;
+
+ DISALLOW_COPY_AND_ASSIGN(ChildCounterTransformTransition);
+};
+
} // namespace
// LayerAnimationElement::TargetValue ------------------------------------------
@@ -729,6 +842,15 @@ LayerAnimationElement* LayerAnimationElement::CreateTransformElement(
}
// static
+LayerAnimationElement* LayerAnimationElement::CreateCounterTransformElement(
+ const gfx::Transform& parent_start,
+ const LayerAnimationElement* parent) {
+ return new ChildCounterTransformTransition(parent_start,
+ parent,
+ parent->duration());
Ian Vollick 2013/08/26 14:19:55 See above about ditching the 3rd param.
avallee 2013/08/27 19:29:25 Done.
+}
+
+// static
LayerAnimationElement*
LayerAnimationElement::CreateInterpolatedTransformElement(
InterpolatedTransform* interpolated_transform,
« no previous file with comments | « ui/compositor/layer_animation_element.h ('k') | ui/compositor/layer_animation_element_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698