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

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

Issue 10210002: Interpolated rotations should end cleanly where possible. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 8 years, 8 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
« no previous file with comments | « no previous file | ui/gfx/interpolated_transform_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ui/gfx/interpolated_transform.h" 5 #include "ui/gfx/interpolated_transform.h"
6 6
7 #include <cmath> 7 #include <cmath>
8 8
9 #ifndef M_PI 9 #ifndef M_PI
10 #define M_PI 3.14159265358979323846 10 #define M_PI 3.14159265358979323846
11 #endif 11 #endif
12 12
13 #include "base/logging.h" 13 #include "base/logging.h"
14 #include "ui/base/animation/tween.h" 14 #include "ui/base/animation/tween.h"
15 15
16 namespace { 16 namespace {
17 17
18 static const float EPSILON = 1e-6f; 18 static const float EPSILON = 1e-6f;
19 19
20 bool IsMultipleOfNinetyDegrees(float degrees)
21 {
sky 2012/04/24 19:43:00 nit: { on previous line (33 too).
22 float remainder = fabs(fmod(degrees, 90.0f));
23 return remainder < EPSILON || 90.0f - remainder < EPSILON;
24 }
25
26 // Returns false if |degrees| is not a multiple of ninety degrees or if
27 // |rotation| is NULL. It does not affect |rotation| in this case. Otherwise
28 // *rotation is set to be the appropriate sanitized rotation matrix. That is,
29 // the rotation matrix corresponding to |degrees| which has entries that are all
30 // either 0, 1 or -1.
31 bool MassageRotationIfMultipleOfNinetyDegrees(ui::Transform* rotation,
32 float degrees)
33 {
34 if (!IsMultipleOfNinetyDegrees(degrees) || !rotation)
35 return false;
36
37 ui::Transform transform;
38 SkMatrix44& m = transform.matrix();
39 float degrees_by_ninety = degrees / 90.0f;
40
41 int n = static_cast<int>(degrees_by_ninety > 0
42 ? floor(degrees_by_ninety + 0.5f)
43 : ceil(degrees_by_ninety - 0.5f));
44
45 n %= 4;
46 if (n < 0)
47 n += 4;
48
49 // n should now be in the range [0, 3]
50 if (n == 1) {
51 m.set3x3( 0, 1, 0,
52 -1, 0, 0,
53 0, 0, 1);
54 } else if (n == 2) {
55 m.set3x3(-1, 0, 0,
56 0, -1, 0,
57 0, 0, 1);
58 } else if (n == 3) {
59 m.set3x3( 0, -1, 0,
60 1, 0, 0,
61 0, 0, 1);
62 }
63
64 *rotation = transform;
65 return true;
66 }
67
20 } // namespace 68 } // namespace
21 69
22 namespace ui { 70 namespace ui {
23 71
24 /////////////////////////////////////////////////////////////////////////////// 72 ///////////////////////////////////////////////////////////////////////////////
25 // InterpolatedTransform 73 // InterpolatedTransform
26 // 74 //
27 75
28 InterpolatedTransform::InterpolatedTransform() 76 InterpolatedTransform::InterpolatedTransform()
29 : start_time_(0.0f), 77 : start_time_(0.0f),
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
150 float end_time) 198 float end_time)
151 : InterpolatedTransform(start_time, end_time), 199 : InterpolatedTransform(start_time, end_time),
152 start_degrees_(start_degrees), 200 start_degrees_(start_degrees),
153 end_degrees_(end_degrees) { 201 end_degrees_(end_degrees) {
154 } 202 }
155 203
156 InterpolatedRotation::~InterpolatedRotation() {} 204 InterpolatedRotation::~InterpolatedRotation() {}
157 205
158 ui::Transform InterpolatedRotation::InterpolateButDoNotCompose(float t) const { 206 ui::Transform InterpolatedRotation::InterpolateButDoNotCompose(float t) const {
159 ui::Transform result; 207 ui::Transform result;
160 result.SetRotate(ValueBetween(t, start_degrees_, end_degrees_)); 208 float interpolated_degrees = ValueBetween(t, start_degrees_, end_degrees_);
209 result.SetRotate(interpolated_degrees);
210 if (t == 0.0f || t == 1.0f)
211 MassageRotationIfMultipleOfNinetyDegrees(&result, interpolated_degrees);
161 return result; 212 return result;
162 } 213 }
163 214
164 /////////////////////////////////////////////////////////////////////////////// 215 ///////////////////////////////////////////////////////////////////////////////
165 // InterpolatedAxisAngleRotation 216 // InterpolatedAxisAngleRotation
166 // 217 //
167 218
168 InterpolatedAxisAngleRotation::InterpolatedAxisAngleRotation( 219 InterpolatedAxisAngleRotation::InterpolatedAxisAngleRotation(
169 gfx::Point3f axis, 220 gfx::Point3f axis,
170 float start_degrees, 221 float start_degrees,
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
261 } 312 }
262 313
263 InterpolatedTranslation::~InterpolatedTranslation() {} 314 InterpolatedTranslation::~InterpolatedTranslation() {}
264 315
265 ui::Transform 316 ui::Transform
266 InterpolatedTranslation::InterpolateButDoNotCompose(float t) const { 317 InterpolatedTranslation::InterpolateButDoNotCompose(float t) const {
267 ui::Transform result; 318 ui::Transform result;
268 // TODO(vollick) 3d xforms. 319 // TODO(vollick) 3d xforms.
269 result.SetTranslate(ValueBetween(t, start_pos_.x(), end_pos_.x()), 320 result.SetTranslate(ValueBetween(t, start_pos_.x(), end_pos_.x()),
270 ValueBetween(t, start_pos_.y(), end_pos_.y())); 321 ValueBetween(t, start_pos_.y(), end_pos_.y()));
271
272 return result; 322 return result;
273 } 323 }
274 324
275 /////////////////////////////////////////////////////////////////////////////// 325 ///////////////////////////////////////////////////////////////////////////////
276 // InterpolatedConstantTransform 326 // InterpolatedConstantTransform
277 // 327 //
278 328
279 InterpolatedConstantTransform::InterpolatedConstantTransform( 329 InterpolatedConstantTransform::InterpolatedConstantTransform(
280 const ui::Transform& transform) 330 const ui::Transform& transform)
281 : InterpolatedTransform(), 331 : InterpolatedTransform(),
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
389 439
390 rotation->SetChild(translation.release()); 440 rotation->SetChild(translation.release());
391 scale->SetChild(rotation.release()); 441 scale->SetChild(rotation.release());
392 transform_.reset(scale.release()); 442 transform_.reset(scale.release());
393 } else { 443 } else {
394 transform_.reset(new InterpolatedConstantTransform(end_transform)); 444 transform_.reset(new InterpolatedConstantTransform(end_transform));
395 } 445 }
396 } 446 }
397 447
398 } // namespace ui 448 } // namespace ui
OLDNEW
« no previous file with comments | « no previous file | ui/gfx/interpolated_transform_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698