transform_animation_curve_adapter.cc revision e5d81f57cb97b3b6b7fccc9c5610d21eb81db09d
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 64bool TransformAnimationCurveAdapter::AffectsScale() const { 65 return !initial_value_.IsIdentityOrTranslation() || 66 !target_value_.IsIdentityOrTranslation(); 67} 68 69InverseTransformCurveAdapter::InverseTransformCurveAdapter( 70 TransformAnimationCurveAdapter base_curve, 71 gfx::Transform initial_value, 72 base::TimeDelta duration) 73 : base_curve_(base_curve), 74 initial_value_(initial_value), 75 duration_(duration) { 76 effective_initial_value_ = base_curve_.GetValue(0.0) * initial_value_; 77} 78 79InverseTransformCurveAdapter::~InverseTransformCurveAdapter() { 80} 81 82double InverseTransformCurveAdapter::Duration() const { 83 return duration_.InSeconds(); 84} 85 86scoped_ptr<cc::AnimationCurve> InverseTransformCurveAdapter::Clone() const { 87 scoped_ptr<InverseTransformCurveAdapter> to_return( 88 new InverseTransformCurveAdapter(base_curve_, 89 initial_value_, 90 duration_)); 91 return to_return.PassAs<cc::AnimationCurve>(); 92} 93 94gfx::Transform InverseTransformCurveAdapter::GetValue( 95 double t) const { 96 if (t <= 0.0) 97 return initial_value_; 98 99 gfx::Transform base_transform = base_curve_.GetValue(t); 100 // Invert base 101 gfx::Transform to_return(gfx::Transform::kSkipInitialization); 102 bool is_invertible = base_transform.GetInverse(&to_return); 103 DCHECK(is_invertible); 104 105 to_return.PreconcatTransform(effective_initial_value_); 106 return to_return; 107} 108 109bool InverseTransformCurveAdapter::AnimatedBoundsForBox( 110 const gfx::BoxF& box, 111 gfx::BoxF* bounds) const { 112 // TODO(ajuma): Once cc::TransformOperation::BlendedBoundsForBox supports 113 // computing bounds for TransformOperationMatrix, use that to compute 114 // the bounds we need here. 115 return false; 116} 117 118bool InverseTransformCurveAdapter::AffectsScale() const { 119 return !initial_value_.IsIdentityOrTranslation() || 120 base_curve_.AffectsScale(); 121} 122 123} // namespace ui 124