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
7 namespace ui {
8
TransformAnimationCurveAdapter(gfx::Tween::Type tween_type,gfx::Transform initial_value,gfx::Transform target_value,base::TimeDelta duration)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),
17 duration_(duration) {
18 gfx::DecomposeTransform(&decomposed_initial_value_, initial_value_);
19 gfx::DecomposeTransform(&decomposed_target_value_, target_value_);
20 }
21
~TransformAnimationCurveAdapter()22 TransformAnimationCurveAdapter::~TransformAnimationCurveAdapter() {
23 }
24
Duration() const25 double TransformAnimationCurveAdapter::Duration() const {
26 return duration_.InSecondsF();
27 }
28
Clone() const29 scoped_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
GetValue(double t) const38 gfx::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
AnimatedBoundsForBox(const gfx::BoxF & box,gfx::BoxF * bounds) const55 bool 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
AffectsScale() const64 bool TransformAnimationCurveAdapter::AffectsScale() const {
65 return !initial_value_.IsIdentityOrTranslation() ||
66 !target_value_.IsIdentityOrTranslation();
67 }
68
IsTranslation() const69 bool TransformAnimationCurveAdapter::IsTranslation() const {
70 return initial_value_.IsIdentityOrTranslation() &&
71 target_value_.IsIdentityOrTranslation();
72 }
73
MaximumTargetScale(bool forward_direction,float * max_scale) const74 bool TransformAnimationCurveAdapter::MaximumTargetScale(
75 bool forward_direction,
76 float* max_scale) const {
77 return false;
78 }
79
InverseTransformCurveAdapter(TransformAnimationCurveAdapter base_curve,gfx::Transform initial_value,base::TimeDelta duration)80 InverseTransformCurveAdapter::InverseTransformCurveAdapter(
81 TransformAnimationCurveAdapter base_curve,
82 gfx::Transform initial_value,
83 base::TimeDelta duration)
84 : base_curve_(base_curve),
85 initial_value_(initial_value),
86 duration_(duration) {
87 effective_initial_value_ = base_curve_.GetValue(0.0) * initial_value_;
88 }
89
~InverseTransformCurveAdapter()90 InverseTransformCurveAdapter::~InverseTransformCurveAdapter() {
91 }
92
Duration() const93 double InverseTransformCurveAdapter::Duration() const {
94 return duration_.InSeconds();
95 }
96
Clone() const97 scoped_ptr<cc::AnimationCurve> InverseTransformCurveAdapter::Clone() const {
98 scoped_ptr<InverseTransformCurveAdapter> to_return(
99 new InverseTransformCurveAdapter(base_curve_,
100 initial_value_,
101 duration_));
102 return to_return.PassAs<cc::AnimationCurve>();
103 }
104
GetValue(double t) const105 gfx::Transform InverseTransformCurveAdapter::GetValue(
106 double t) const {
107 if (t <= 0.0)
108 return initial_value_;
109
110 gfx::Transform base_transform = base_curve_.GetValue(t);
111 // Invert base
112 gfx::Transform to_return(gfx::Transform::kSkipInitialization);
113 bool is_invertible = base_transform.GetInverse(&to_return);
114 DCHECK(is_invertible);
115
116 to_return.PreconcatTransform(effective_initial_value_);
117 return to_return;
118 }
119
AnimatedBoundsForBox(const gfx::BoxF & box,gfx::BoxF * bounds) const120 bool InverseTransformCurveAdapter::AnimatedBoundsForBox(
121 const gfx::BoxF& box,
122 gfx::BoxF* bounds) const {
123 // TODO(ajuma): Once cc::TransformOperation::BlendedBoundsForBox supports
124 // computing bounds for TransformOperationMatrix, use that to compute
125 // the bounds we need here.
126 return false;
127 }
128
AffectsScale() const129 bool InverseTransformCurveAdapter::AffectsScale() const {
130 return !initial_value_.IsIdentityOrTranslation() ||
131 base_curve_.AffectsScale();
132 }
133
IsTranslation() const134 bool InverseTransformCurveAdapter::IsTranslation() const {
135 return initial_value_.IsIdentityOrTranslation() &&
136 base_curve_.IsTranslation();
137 }
138
MaximumTargetScale(bool forward_direction,float * max_scale) const139 bool InverseTransformCurveAdapter::MaximumTargetScale(bool forward_direction,
140 float* max_scale) const {
141 return false;
142 }
143
144 } // namespace ui
145