summaryrefslogtreecommitdiffstats
path: root/ui/gfx
diff options
context:
space:
mode:
authorvollick@chromium.org <vollick@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-10-17 12:06:06 +0000
committervollick@chromium.org <vollick@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-10-17 12:06:06 +0000
commita25dac83112864a10b03be6c8c024ccdef6e8893 (patch)
tree94bad779bd4a2279b721c00a739a36cdb9f62636 /ui/gfx
parent48452c8c4fcfea5d416ff91c5eb3e19b2d8bc813 (diff)
downloadchromium_src-a25dac83112864a10b03be6c8c024ccdef6e8893.zip
chromium_src-a25dac83112864a10b03be6c8c024ccdef6e8893.tar.gz
chromium_src-a25dac83112864a10b03be6c8c024ccdef6e8893.tar.bz2
Fix logic error in gfx::Transform::TransformPoint
In this function, we only normalize the homogeneous point if the w component meets this condition w != 1 && abs(w) > 0. Unfortunately, that's integer abs, so we won't normalize for w in the range (-1, 1). This CL fixes that. BUG=None Review URL: https://codereview.chromium.org/26477006 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@229098 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui/gfx')
-rw-r--r--ui/gfx/transform.cc5
-rw-r--r--ui/gfx/transform_unittest.cc17
2 files changed, 20 insertions, 2 deletions
diff --git a/ui/gfx/transform.cc b/ui/gfx/transform.cc
index 59e6a60..057c93c 100644
--- a/ui/gfx/transform.cc
+++ b/ui/gfx/transform.cc
@@ -480,8 +480,9 @@ void Transform::TransformPointInternal(const SkMatrix44& xform,
xform.mapMScalars(p);
- if (p[3] != 1 && abs(p[3]) > 0) {
- point->SetPoint(p[0] / p[3], p[1] / p[3], p[2]/ p[3]);
+ if (p[3] != SK_MScalar1 && p[3] != 0.f) {
+ float w_inverse = SK_MScalar1 / p[3];
+ point->SetPoint(p[0] * w_inverse, p[1] * w_inverse, p[2] * w_inverse);
} else {
point->SetPoint(p[0], p[1], p[2]);
}
diff --git a/ui/gfx/transform_unittest.cc b/ui/gfx/transform_unittest.cc
index 8d71e7b..f747e48 100644
--- a/ui/gfx/transform_unittest.cc
+++ b/ui/gfx/transform_unittest.cc
@@ -655,6 +655,23 @@ TEST(XFormTest, SetRotate2D) {
}
}
+TEST(XFormTest, TransformPointWithExtremePerspective) {
+ Point3F point(1.f, 1.f, 1.f);
+ Transform perspective;
+ perspective.ApplyPerspectiveDepth(1.f);
+ Point3F transformed = point;
+ perspective.TransformPoint(&transformed);
+ EXPECT_EQ(point.ToString(), transformed.ToString());
+
+ transformed = point;
+ perspective.MakeIdentity();
+ perspective.ApplyPerspectiveDepth(1.1f);
+ perspective.TransformPoint(&transformed);
+ EXPECT_FLOAT_EQ(11.f, transformed.x());
+ EXPECT_FLOAT_EQ(11.f, transformed.y());
+ EXPECT_FLOAT_EQ(11.f, transformed.z());
+}
+
TEST(XFormTest, BlendTranslate) {
Transform from;
for (int i = -5; i < 15; ++i) {