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

Unified 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | ui/gfx/interpolated_transform_unittest.cc » ('j') | ui/gfx/interpolated_transform_unittest.cc » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/gfx/interpolated_transform.cc
diff --git a/ui/gfx/interpolated_transform.cc b/ui/gfx/interpolated_transform.cc
index 6989fdaff2528e330489beb6fc18f4d1cdb46e47..9209809c1db0ae2de75be6c8fd3f0bdee036ab7d 100644
--- a/ui/gfx/interpolated_transform.cc
+++ b/ui/gfx/interpolated_transform.cc
@@ -17,6 +17,48 @@ namespace {
static const float EPSILON = 1e-6f;
+bool IsAMultipleOfNinetyDegrees(float degrees)
James Cook 2012/04/24 17:18:18 nit: Maybe just IsMultipleOfNinetyDegrees()?
+{
+ float remainder = fabs(fmod(degrees, 90.0f));
+ return remainder < EPSILON || 90.0f - remainder < EPSILON;
+}
+
+// Returns false if |degrees| is not a multiple of ninety degrees or if
+// |rotation| is NULL. It does not affect |rotation| in this case. Otherwise
+// *rotation is set to be the appropriate sanitized rotation matrix. That is,
+// the rotation matrix corresponding to |degrees| which has entries that are all
+// either 0, 1 or -1.
+bool MassageRotationIfMultipleOfNinetyDegrees(ui::Transform* rotation,
+ float degrees)
+{
+ if (!IsAMultipleOfNinetyDegrees(degrees) || !rotation)
+ return false;
+
+ ui::Transform transform;
+ transform.SetRotate(degrees);
+ SkMatrix44& m = transform.matrix();
+
+ // A rotation that is a multiple of ninety degrees will have entries that are
+ // either 0, 1, or -1.
+ for (int row = 0; row < 4; ++row) {
+ for (int col = 0; col < 4; ++col) {
+ float entry = m.get(row, col);
+ if (fabs(entry) < EPSILON)
piman 2012/04/24 17:15:43 I worry that we may miss this, especially for larg
+ entry = 0;
+ else if (fabs(entry + 1) < EPSILON)
+ entry = -1;
+ else if (fabs(entry - 1) < EPSILON)
+ entry = 1;
+ else
+ NOTREACHED();
+ m.set(row, col, entry);
+ }
+ }
+
+ *rotation = transform;
+ return true;
+}
+
} // namespace
namespace ui {
@@ -157,7 +199,9 @@ InterpolatedRotation::~InterpolatedRotation() {}
ui::Transform InterpolatedRotation::InterpolateButDoNotCompose(float t) const {
ui::Transform result;
- result.SetRotate(ValueBetween(t, start_degrees_, end_degrees_));
+ float interpolated_degrees = ValueBetween(t, start_degrees_, end_degrees_);
+ result.SetRotate(interpolated_degrees);
+ MassageRotationIfMultipleOfNinetyDegrees(&result, interpolated_degrees);
James Cook 2012/04/24 17:18:18 Do we want to always do this or just when t == 0 o
return result;
}
@@ -268,7 +312,6 @@ InterpolatedTranslation::InterpolateButDoNotCompose(float t) const {
// TODO(vollick) 3d xforms.
result.SetTranslate(ValueBetween(t, start_pos_.x(), end_pos_.x()),
ValueBetween(t, start_pos_.y(), end_pos_.y()));
-
return result;
}
« no previous file with comments | « no previous file | ui/gfx/interpolated_transform_unittest.cc » ('j') | ui/gfx/interpolated_transform_unittest.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698