transform_animation_curve_adapter.cc revision d0247b1b59f9c528cb6df88b4f2b9afaf80d181e
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 3// found in the LICENSE file. 4 5#include "ui/compositor/transform_animation_curve_adapter.h" 6 7namespace ui { 8 9TransformAnimationCurveAdapter::TransformAnimationCurveAdapter( 10 gfx::Tween::Type tween_type, 11 gfx::Transform initial_value, 12 gfx::Transform target_value, 13 base::TimeDelta duration) 14 : tween_type_(tween_type), 15 initial_value_(initial_value), 16 target_value_(target_value), 17 duration_(duration) { 18 gfx::DecomposeTransform(&decomposed_initial_value_, initial_value_); 19 gfx::DecomposeTransform(&decomposed_target_value_, target_value_); 20} 21 22TransformAnimationCurveAdapter::~TransformAnimationCurveAdapter() { 23} 24 25double TransformAnimationCurveAdapter::Duration() const { 26 return duration_.InSecondsF(); 27} 28 29scoped_ptr<cc::AnimationCurve> TransformAnimationCurveAdapter::Clone() const { 30 scoped_ptr<TransformAnimationCurveAdapter> to_return( 31 new TransformAnimationCurveAdapter(tween_type_, 32 initial_value_, 33 target_value_, 34 duration_)); 35 return to_return.PassAs<cc::AnimationCurve>(); 36} 37 38gfx::Transform TransformAnimationCurveAdapter::GetValue( 39 double t) const { 40 if (t >= duration_.InSecondsF()) 41 return target_value_; 42 if (t <= 0.0) 43 return initial_value_; 44 double progress = t / duration_.InSecondsF(); 45 46 gfx::DecomposedTransform to_return; 47 gfx::BlendDecomposedTransforms(&to_return, 48 decomposed_target_value_, 49 decomposed_initial_value_, 50 gfx::Tween::CalculateValue(tween_type_, 51 progress)); 52 return gfx::ComposeTransform(to_return); 53} 54 55bool TransformAnimationCurveAdapter::AnimatedBoundsForBox( 56 const gfx::BoxF& box, 57 gfx::BoxF* bounds) const { 58 // TODO(ajuma): Once cc::TransformOperation::BlendedBoundsForBox supports 59 // computing bounds for TransformOperationMatrix, use that to compute 60 // the bounds we need here. 61 return false; 62} 63 64InverseTransformCurveAdapter::InverseTransformCurveAdapter( 65 TransformAnimationCurveAdapter base_curve, 66 gfx::Transform initial_value, 67 base::TimeDelta duration) 68 : base_curve_(base_curve), 69 initial_value_(initial_value), 70 duration_(duration) { 71 effective_initial_value_ = base_curve_.GetValue(0.0) * initial_value_; 72} 73 74InverseTransformCurveAdapter::~InverseTransformCurveAdapter() { 75} 76 77double InverseTransformCurveAdapter::Duration() const { 78 return duration_.InSeconds(); 79} 80 81scoped_ptr<cc::AnimationCurve> InverseTransformCurveAdapter::Clone() const { 82 scoped_ptr<InverseTransformCurveAdapter> to_return( 83 new InverseTransformCurveAdapter(base_curve_, 84 initial_value_, 85 duration_)); 86 return to_return.PassAs<cc::AnimationCurve>(); 87} 88 89gfx::Transform InverseTransformCurveAdapter::GetValue( 90 double t) const { 91 if (t <= 0.0) 92 return initial_value_; 93 94 gfx::Transform base_transform = base_curve_.GetValue(t); 95 // Invert base 96 gfx::Transform to_return(gfx::Transform::kSkipInitialization); 97 bool is_invertible = base_transform.GetInverse(&to_return); 98 DCHECK(is_invertible); 99 100 to_return.PreconcatTransform(effective_initial_value_); 101 return to_return; 102} 103 104bool InverseTransformCurveAdapter::AnimatedBoundsForBox( 105 const gfx::BoxF& box, 106 gfx::BoxF* bounds) const { 107 // TODO(ajuma): Once cc::TransformOperation::BlendedBoundsForBox supports 108 // computing bounds for TransformOperationMatrix, use that to compute 109 // the bounds we need here. 110 return false; 111} 112 113} // namespace ui 114