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

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: Added more NaN checks and 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),
sky 2011/06/28 15:39:14 nit: 4 space indent (same comment for all construc
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 ui::Transform InterpolatedTransform::Interpolate(float t) const {
28 ui::Transform result = InterpolateButDoNotCompose(t);
29 if (child_.get()) {
30 result.ConcatTransform(child_->Interpolate(t));
31 }
32 return result;
33 }
34
35 inline float InterpolatedTransform::ValueBetween(float time,
36 float start_value,
37 float end_value) const
38 {
sky 2011/06/28 15:39:14 nit: { on previous line.
39 // can't handle NaN
40 DCHECK(time == time &&
41 start_time_ == start_time_ &&
42 end_time_ == end_time_);
43
44 if (time != time ||
sky 2011/06/28 15:39:14 nit: fit as much as you can on one line.
45 start_time_ != start_time_ ||
46 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 ui::Transform InterpolatedRotation::InterpolateButDoNotCompose(float t) const {
86 ui::Transform result;
87 result.SetRotate(ValueBetween(t, start_degrees_, end_degrees_));
88 return result;
89 }
90
91
sky 2011/06/28 15:39:14 nit: remove newline.
92 ///////////////////////////////////////////////////////////////////////////////
93 // InterpolatedScale
94 //
95
96 InterpolatedScale::InterpolatedScale(float start_scale,
97 float end_scale)
98 : InterpolatedTransform(),
99 start_scale_(start_scale),
100 end_scale_(end_scale) {
101 }
102
103 InterpolatedScale::InterpolatedScale(float start_scale,
104 float end_scale,
105 float start_time,
106 float end_time)
107 : InterpolatedTransform(start_time, end_time),
108 start_scale_(start_scale),
109 end_scale_(end_scale) {
110 }
111
112 ui::Transform InterpolatedScale::InterpolateButDoNotCompose(float t) const {
113 ui::Transform result;
114 float interpolated_scale = ValueBetween(t, start_scale_, end_scale_);
115 //TODO(vollick) 3d xforms.
116 result.SetScale(interpolated_scale, interpolated_scale);
117 return result;
118 }
119
120 ///////////////////////////////////////////////////////////////////////////////
121 // InterpolatedTranslation
122 //
123
124 InterpolatedTranslation::InterpolatedTranslation(const gfx::Point& start_pos,
125 const gfx::Point& end_pos)
126 : InterpolatedTransform(),
127 start_pos_(start_pos),
128 end_pos_(end_pos) {
129 }
130
131 InterpolatedTranslation::InterpolatedTranslation(const gfx::Point& start_pos,
132 const gfx::Point& end_pos,
133 float start_time,
134 float end_time)
135 : InterpolatedTransform(start_time, end_time),
136 start_pos_(start_pos),
137 end_pos_(end_pos) {
138 }
139
140 ui::Transform
141 InterpolatedTranslation::InterpolateButDoNotCompose(float t) const {
142 ui::Transform result;
143 //TODO(vollick) 3d xforms.
144 result.SetTranslate(ValueBetween(t, start_pos_.x(), end_pos_.x()),
145 ValueBetween(t, start_pos_.y(), end_pos_.y()));
146
147 return result;
148 }
149
150 ///////////////////////////////////////////////////////////////////////////////
151 // InterpolatedConstantTransform
152 //
153
154 InterpolatedConstantTransform::InterpolatedConstantTransform(
155 const ui::Transform& transform)
156 : InterpolatedTransform(),
157 transform_(transform) {
158 }
159
160 ui::Transform
161 InterpolatedConstantTransform::InterpolateButDoNotCompose(float t) const {
162 return transform_;
163 }
164
165 ///////////////////////////////////////////////////////////////////////////////
166 // InterpolatedTransformAboutPivot
167 //
168
169 InterpolatedTransformAboutPivot::InterpolatedTransformAboutPivot(
170 const gfx::Point& pivot,
171 InterpolatedTransform* transform)
172 : InterpolatedTransform() {
173 Init(pivot, transform);
174 }
175
176 InterpolatedTransformAboutPivot::InterpolatedTransformAboutPivot(
177 const gfx::Point& pivot,
178 InterpolatedTransform* transform,
179 float start_time,
180 float end_time)
181 : InterpolatedTransform() {
182 Init(pivot, transform);
183 }
184
185 ui::Transform
186 InterpolatedTransformAboutPivot::InterpolateButDoNotCompose(float t) const {
187 if (transform_.get()) {
188 return transform_->Interpolate(t);
189 }
190 return ui::Transform();
191 }
192
193 void InterpolatedTransformAboutPivot::Init(const gfx::Point& pivot,
194 InterpolatedTransform* xform) {
195 ui::Transform toPivot;
sky 2011/06/28 15:39:14 unix hacker style: to_pivot/from_pivot.
196 ui::Transform fromPivot;
197 toPivot.SetTranslate(-pivot.x(), -pivot.y());
198 fromPivot.SetTranslate(pivot.x(), pivot.y());
199
200 scoped_ptr<InterpolatedTransform> preTransform(
sky 2011/06/28 15:39:14 pre_transform/post_transform.
201 new InterpolatedConstantTransform(toPivot));
202 scoped_ptr<InterpolatedTransform> postTransform(
203 new InterpolatedConstantTransform(fromPivot));
204
205 preTransform->Compose(xform);
206 xform->Compose(postTransform.release());
207 transform_.reset(preTransform.release());
208 }
209
210 } // namespace ui
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698