Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(732)

Side by Side Diff: ui/gfx/interpolated_transform.cc

Issue 7262024: Interpolated transforms (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: Formatting fixes; more comments. Created 9 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(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
7 #include "base/logging.h"
8 #include "ui/base/animation/tween.h"
9
10 namespace ui {
11
12 ///////////////////////////////////////////////////////////////////////////////
13 // InterpolatedTransform
14 //
15
16 InterpolatedTransform::InterpolatedTransform()
17 : start_time_(0.0f),
18 end_time_(1.0f) {
19 }
20
21 InterpolatedTransform::InterpolatedTransform(float start_time,
22 float end_time)
23 : start_time_(start_time),
24 end_time_(end_time) {
25 }
26
27 InterpolatedTransform::~InterpolatedTransform() {}
28
29 ui::Transform InterpolatedTransform::Interpolate(float t) const {
30 ui::Transform result = InterpolateButDoNotCompose(t);
31 if (child_.get()) {
32 result.ConcatTransform(child_->Interpolate(t));
33 }
34 return result;
35 }
36
37 void InterpolatedTransform::SetChild(InterpolatedTransform* child) {
38 child_.reset(child);
39 }
40
41 inline float InterpolatedTransform::ValueBetween(float time,
42 float start_value,
43 float end_value) const {
44 // can't handle NaN
45 DCHECK(time == time && start_time_ == start_time_ && end_time_ == end_time_);
46 if (time != time || start_time_ != start_time_ || end_time_ != end_time_)
47 return start_value;
48
49 // Ok if equal -- we'll get a step function. Note: if end_time_ ==
50 // start_time_ == x, then if none of the numbers are NaN, then it
51 // must be true that time < x or time >= x, so we will return early
52 // due to one of the following if statements.
53 DCHECK(end_time_ >= start_time_);
54
55 if (time < start_time_)
56 return start_value;
57
58 if (time >= end_time_)
59 return end_value;
60
61 float t = (time - start_time_) / (end_time_ - start_time_);
62 return static_cast<float>(Tween::ValueBetween(t, start_value, end_value));
63 }
64
65 ///////////////////////////////////////////////////////////////////////////////
66 // InterpolatedRotation
67 //
68
69 InterpolatedRotation::InterpolatedRotation(float start_degrees,
70 float end_degrees)
71 : InterpolatedTransform(),
72 start_degrees_(start_degrees),
73 end_degrees_(end_degrees) {
74 }
75
76 InterpolatedRotation::InterpolatedRotation(float start_degrees,
77 float end_degrees,
78 float start_time,
79 float end_time)
80 : InterpolatedTransform(start_time, end_time),
81 start_degrees_(start_degrees),
82 end_degrees_(end_degrees) {
83 }
84
85 InterpolatedRotation::~InterpolatedRotation() {}
86
87 ui::Transform InterpolatedRotation::InterpolateButDoNotCompose(float t) const {
88 ui::Transform result;
89 result.SetRotate(ValueBetween(t, start_degrees_, end_degrees_));
90 return result;
91 }
92
93 ///////////////////////////////////////////////////////////////////////////////
94 // InterpolatedScale
95 //
96
97 InterpolatedScale::InterpolatedScale(float start_scale,
98 float end_scale)
99 : InterpolatedTransform(),
100 start_scale_(start_scale),
101 end_scale_(end_scale) {
102 }
103
104 InterpolatedScale::InterpolatedScale(float start_scale,
105 float end_scale,
106 float start_time,
107 float end_time)
108 : InterpolatedTransform(start_time, end_time),
109 start_scale_(start_scale),
110 end_scale_(end_scale) {
111 }
112
113 InterpolatedScale::~InterpolatedScale() {}
114
115 ui::Transform InterpolatedScale::InterpolateButDoNotCompose(float t) const {
116 ui::Transform result;
117 float interpolated_scale = ValueBetween(t, start_scale_, end_scale_);
118 //TODO(vollick) 3d xforms.
119 result.SetScale(interpolated_scale, interpolated_scale);
120 return result;
121 }
122
123 ///////////////////////////////////////////////////////////////////////////////
124 // InterpolatedTranslation
125 //
126
127 InterpolatedTranslation::InterpolatedTranslation(const gfx::Point& start_pos,
128 const gfx::Point& end_pos)
129 : InterpolatedTransform(),
130 start_pos_(start_pos),
131 end_pos_(end_pos) {
132 }
133
134 InterpolatedTranslation::InterpolatedTranslation(const gfx::Point& start_pos,
135 const gfx::Point& end_pos,
136 float start_time,
137 float end_time)
138 : InterpolatedTransform(start_time, end_time),
139 start_pos_(start_pos),
140 end_pos_(end_pos) {
141 }
142
143 InterpolatedTranslation::~InterpolatedTranslation() {}
144
145 ui::Transform
146 InterpolatedTranslation::InterpolateButDoNotCompose(float t) const {
147 ui::Transform result;
148 //TODO(vollick) 3d xforms.
sky 2011/06/28 18:43:46 nit: '//TODO' -> '// TODO'
149 result.SetTranslate(ValueBetween(t, start_pos_.x(), end_pos_.x()),
150 ValueBetween(t, start_pos_.y(), end_pos_.y()));
151
152 return result;
153 }
154
155 ///////////////////////////////////////////////////////////////////////////////
156 // InterpolatedConstantTransform
157 //
158
159 InterpolatedConstantTransform::InterpolatedConstantTransform(
160 const ui::Transform& transform)
161 : InterpolatedTransform(),
162 transform_(transform) {
163 }
164
165 ui::Transform
166 InterpolatedConstantTransform::InterpolateButDoNotCompose(float t) const {
167 return transform_;
168 }
169
170 InterpolatedConstantTransform::~InterpolatedConstantTransform() {}
171
172 ///////////////////////////////////////////////////////////////////////////////
173 // InterpolatedTransformAboutPivot
174 //
175
176 InterpolatedTransformAboutPivot::InterpolatedTransformAboutPivot(
177 const gfx::Point& pivot,
178 InterpolatedTransform* transform)
179 : InterpolatedTransform() {
180 Init(pivot, transform);
181 }
182
183 InterpolatedTransformAboutPivot::InterpolatedTransformAboutPivot(
184 const gfx::Point& pivot,
185 InterpolatedTransform* transform,
186 float start_time,
187 float end_time)
188 : InterpolatedTransform() {
189 Init(pivot, transform);
190 }
191
192 InterpolatedTransformAboutPivot::~InterpolatedTransformAboutPivot() {}
193
194 ui::Transform
195 InterpolatedTransformAboutPivot::InterpolateButDoNotCompose(float t) const {
196 if (transform_.get()) {
197 return transform_->Interpolate(t);
198 }
199 return ui::Transform();
200 }
201
202 void InterpolatedTransformAboutPivot::Init(const gfx::Point& pivot,
203 InterpolatedTransform* xform) {
204 ui::Transform to_pivot;
205 ui::Transform from_pivot;
206 to_pivot.SetTranslate(-pivot.x(), -pivot.y());
207 from_pivot.SetTranslate(pivot.x(), pivot.y());
208
209 scoped_ptr<InterpolatedTransform> pre_transform(
210 new InterpolatedConstantTransform(to_pivot));
211 scoped_ptr<InterpolatedTransform> post_transform(
212 new InterpolatedConstantTransform(from_pivot));
213
214 pre_transform->SetChild(xform);
215 xform->SetChild(post_transform.release());
216 transform_.reset(pre_transform.release());
217 }
218
219 } // namespace ui
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698