diff options
author | vollick@chromium.org <vollick@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-10-17 12:06:06 +0000 |
---|---|---|
committer | vollick@chromium.org <vollick@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-10-17 12:06:06 +0000 |
commit | a25dac83112864a10b03be6c8c024ccdef6e8893 (patch) | |
tree | 94bad779bd4a2279b721c00a739a36cdb9f62636 /ui/gfx | |
parent | 48452c8c4fcfea5d416ff91c5eb3e19b2d8bc813 (diff) | |
download | chromium_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.cc | 5 | ||||
-rw-r--r-- | ui/gfx/transform_unittest.cc | 17 |
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) { |