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.
5 #include "ui/compositor/transform_animation_curve_adapter.h"
9 TransformAnimationCurveAdapter::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
),
18 gfx::DecomposeTransform(&decomposed_initial_value_
, initial_value_
);
19 gfx::DecomposeTransform(&decomposed_target_value_
, target_value_
);
22 TransformAnimationCurveAdapter::~TransformAnimationCurveAdapter() {
25 double TransformAnimationCurveAdapter::Duration() const {
26 return duration_
.InSecondsF();
29 scoped_ptr
<cc::AnimationCurve
> TransformAnimationCurveAdapter::Clone() const {
30 scoped_ptr
<TransformAnimationCurveAdapter
> to_return(
31 new TransformAnimationCurveAdapter(tween_type_
,
35 return to_return
.PassAs
<cc::AnimationCurve
>();
38 gfx::Transform
TransformAnimationCurveAdapter::GetValue(
40 if (t
>= duration_
.InSecondsF())
43 return initial_value_
;
44 double progress
= t
/ duration_
.InSecondsF();
46 gfx::DecomposedTransform to_return
;
47 gfx::BlendDecomposedTransforms(&to_return
,
48 decomposed_target_value_
,
49 decomposed_initial_value_
,
50 gfx::Tween::CalculateValue(tween_type_
,
52 return gfx::ComposeTransform(to_return
);
55 bool TransformAnimationCurveAdapter::AnimatedBoundsForBox(
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.
64 bool TransformAnimationCurveAdapter::AffectsScale() const {
65 return !initial_value_
.IsIdentityOrTranslation() ||
66 !target_value_
.IsIdentityOrTranslation();
69 bool TransformAnimationCurveAdapter::IsTranslation() const {
70 return initial_value_
.IsIdentityOrTranslation() &&
71 target_value_
.IsIdentityOrTranslation();
74 bool TransformAnimationCurveAdapter::MaximumScale(float* max_scale
) const {
78 InverseTransformCurveAdapter::InverseTransformCurveAdapter(
79 TransformAnimationCurveAdapter base_curve
,
80 gfx::Transform initial_value
,
81 base::TimeDelta duration
)
82 : base_curve_(base_curve
),
83 initial_value_(initial_value
),
85 effective_initial_value_
= base_curve_
.GetValue(0.0) * initial_value_
;
88 InverseTransformCurveAdapter::~InverseTransformCurveAdapter() {
91 double InverseTransformCurveAdapter::Duration() const {
92 return duration_
.InSeconds();
95 scoped_ptr
<cc::AnimationCurve
> InverseTransformCurveAdapter::Clone() const {
96 scoped_ptr
<InverseTransformCurveAdapter
> to_return(
97 new InverseTransformCurveAdapter(base_curve_
,
100 return to_return
.PassAs
<cc::AnimationCurve
>();
103 gfx::Transform
InverseTransformCurveAdapter::GetValue(
106 return initial_value_
;
108 gfx::Transform base_transform
= base_curve_
.GetValue(t
);
110 gfx::Transform
to_return(gfx::Transform::kSkipInitialization
);
111 bool is_invertible
= base_transform
.GetInverse(&to_return
);
112 DCHECK(is_invertible
);
114 to_return
.PreconcatTransform(effective_initial_value_
);
118 bool InverseTransformCurveAdapter::AnimatedBoundsForBox(
119 const gfx::BoxF
& box
,
120 gfx::BoxF
* bounds
) const {
121 // TODO(ajuma): Once cc::TransformOperation::BlendedBoundsForBox supports
122 // computing bounds for TransformOperationMatrix, use that to compute
123 // the bounds we need here.
127 bool InverseTransformCurveAdapter::AffectsScale() const {
128 return !initial_value_
.IsIdentityOrTranslation() ||
129 base_curve_
.AffectsScale();
132 bool InverseTransformCurveAdapter::IsTranslation() const {
133 return initial_value_
.IsIdentityOrTranslation() &&
134 base_curve_
.IsTranslation();
137 bool InverseTransformCurveAdapter::MaximumScale(float* max_scale
) const {