OLD | NEW |
---|---|
(Empty) | |
1 // Copyright (c) 2011 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/gfx/interpolated_transform.h" | |
6 #include "ui/base/animation/tween.h" | |
7 | |
8 namespace ui { | |
9 | |
10 /////////////////////////////////////////////////////////////////////////////// | |
11 // InterpolatedTransform | |
12 // | |
13 | |
14 InterpolatedTransform::InterpolatedTransform() | |
15 : start_time_(0.0f), | |
16 end_time_(1.0f) { | |
17 } | |
18 | |
19 InterpolatedTransform::InterpolatedTransform(float start_time, | |
20 float end_time) | |
21 : start_time_(start_time), | |
22 end_time_(end_time) { | |
wjmaclean
2011/06/27 19:13:17
DCHECK(end_time > start_time)
| |
23 } | |
24 | |
25 ui::Transform InterpolatedTransform::Interpolate(float t) const { | |
26 ui::Transform result = InterpolateButDoNotCompose(t); | |
27 if (child_.get()) { | |
28 result.ConcatTransform(child_->Interpolate(t)); | |
29 } | |
30 return result; | |
31 } | |
32 | |
33 inline float InterpolatedTransform::ValueBetween(float time, | |
34 float start_value, | |
35 float end_value) const | |
36 { | |
37 if (time <= start_time_) | |
wjmaclean
2011/06/27 19:13:17
time < start_time_ ?
| |
38 return start_value; | |
39 | |
40 if (time >= end_time_) | |
41 return end_value; | |
42 | |
43 float t = (time - start_time_) / (end_time_ - start_time_); | |
44 return static_cast<float>(Tween::ValueBetween(t, start_value, end_value)); | |
45 } | |
46 | |
47 /////////////////////////////////////////////////////////////////////////////// | |
48 // InterpolatedRotation | |
49 // | |
50 | |
51 InterpolatedRotation::InterpolatedRotation(float start_degrees, | |
52 float end_degrees) | |
53 : InterpolatedTransform(), | |
54 start_degrees_(start_degrees), | |
55 end_degrees_(end_degrees) { | |
56 } | |
57 | |
58 InterpolatedRotation::InterpolatedRotation(float start_degrees, | |
59 float end_degrees, | |
60 float start_time, | |
61 float end_time) | |
62 : InterpolatedTransform(start_time, end_time), | |
63 start_degrees_(start_degrees), | |
64 end_degrees_(end_degrees) { | |
65 } | |
66 | |
67 ui::Transform InterpolatedRotation::InterpolateButDoNotCompose(float t) const { | |
68 ui::Transform result; | |
69 result.SetRotate(ValueBetween(t, start_degrees_, end_degrees_)); | |
70 return result; | |
71 } | |
72 | |
73 | |
74 /////////////////////////////////////////////////////////////////////////////// | |
75 // InterpolatedScale | |
76 // | |
77 | |
78 InterpolatedScale::InterpolatedScale(float start_scale, | |
79 float end_scale) | |
80 : InterpolatedTransform(), | |
81 start_scale_(start_scale), | |
82 end_scale_(end_scale) { | |
83 } | |
84 | |
85 InterpolatedScale::InterpolatedScale(float start_scale, | |
86 float end_scale, | |
87 float start_time, | |
88 float end_time) | |
89 : InterpolatedTransform(start_time, end_time), | |
90 start_scale_(start_scale), | |
91 end_scale_(end_scale) { | |
92 } | |
93 | |
94 ui::Transform InterpolatedScale::InterpolateButDoNotCompose(float t) const { | |
95 ui::Transform result; | |
96 float interpolated_scale = ValueBetween(t, start_scale_, end_scale_); | |
97 //TODO(vollick) 3d xforms. | |
98 result.SetScale(interpolated_scale, interpolated_scale); | |
99 return result; | |
100 } | |
101 | |
102 /////////////////////////////////////////////////////////////////////////////// | |
103 // InterpolatedTranslation | |
104 // | |
105 | |
106 InterpolatedTranslation::InterpolatedTranslation(const gfx::Point& start_pos, | |
107 const gfx::Point& end_pos) | |
108 : InterpolatedTransform(), | |
109 start_pos_(start_pos), | |
110 end_pos_(end_pos) { | |
111 } | |
112 | |
113 InterpolatedTranslation::InterpolatedTranslation(const gfx::Point& start_pos, | |
114 const gfx::Point& end_pos, | |
115 float start_time, | |
116 float end_time) | |
117 : InterpolatedTransform(start_time, end_time), | |
118 start_pos_(start_pos), | |
119 end_pos_(end_pos) { | |
120 } | |
121 | |
122 ui::Transform | |
123 InterpolatedTranslation::InterpolateButDoNotCompose(float t) const { | |
124 ui::Transform result; | |
125 //TODO(vollick) 3d xforms. | |
126 result.SetTranslate(ValueBetween(t, start_pos_.x(), end_pos_.x()), | |
127 ValueBetween(t, start_pos_.y(), end_pos_.y())); | |
128 | |
129 return result; | |
130 } | |
131 | |
132 /////////////////////////////////////////////////////////////////////////////// | |
133 // InterpolatedConstantTransform | |
134 // | |
135 | |
136 InterpolatedConstantTransform::InterpolatedConstantTransform( | |
137 const ui::Transform& transform) | |
138 : InterpolatedTransform(), | |
139 transform_(transform) { | |
140 } | |
141 | |
142 ui::Transform | |
143 InterpolatedConstantTransform::InterpolateButDoNotCompose(float t) const { | |
144 return transform_; | |
145 } | |
146 | |
147 /////////////////////////////////////////////////////////////////////////////// | |
148 // InterpolatedTransformAboutPivot | |
149 // | |
150 | |
151 InterpolatedTransformAboutPivot::InterpolatedTransformAboutPivot( | |
152 const gfx::Point& pivot, | |
153 InterpolatedTransform* transform) | |
154 : InterpolatedTransform() { | |
155 Init(pivot, transform); | |
156 } | |
157 | |
158 InterpolatedTransformAboutPivot::InterpolatedTransformAboutPivot( | |
159 const gfx::Point& pivot, | |
160 InterpolatedTransform* transform, | |
161 float start_time, | |
162 float end_time) | |
163 : InterpolatedTransform() { | |
164 Init(pivot, transform); | |
165 } | |
166 | |
167 ui::Transform | |
168 InterpolatedTransformAboutPivot::InterpolateButDoNotCompose(float t) const { | |
169 if (transform_.get()) { | |
170 return transform_->Interpolate(t); | |
171 } | |
172 return ui::Transform(); | |
173 } | |
174 | |
175 void InterpolatedTransformAboutPivot::Init(const gfx::Point& pivot, | |
176 InterpolatedTransform* xform) { | |
177 ui::Transform toPivot; | |
178 ui::Transform fromPivot; | |
179 toPivot.SetTranslate(-pivot.x(), -pivot.y()); | |
180 fromPivot.SetTranslate(pivot.x(), pivot.y()); | |
181 | |
182 scoped_ptr<InterpolatedTransform> preTransform( | |
183 new InterpolatedConstantTransform(toPivot)); | |
184 scoped_ptr<InterpolatedTransform> postTransform( | |
185 new InterpolatedConstantTransform(fromPivot)); | |
186 | |
187 preTransform->Compose(xform); | |
188 xform->Compose(postTransform.release()); | |
189 transform_.reset(preTransform.release()); | |
190 } | |
191 | |
192 } // namespace ui | |
OLD | NEW |