diff --git a/flow/matrix_decomposition.cc b/flow/matrix_decomposition.cc index 73a774b4dd037..e1ac11a927046 100644 --- a/flow/matrix_decomposition.cc +++ b/flow/matrix_decomposition.cc @@ -28,6 +28,14 @@ static inline SkVector3 SkVector3Cross(const SkVector3& a, const SkVector3& b) { MatrixDecomposition::MatrixDecomposition(const SkMatrix& matrix) : MatrixDecomposition(SkMatrix44{matrix}) {} +// TODO(garyq): use skia row[x].normalize() when skia fixes it +static inline void SkVector3Normalize(SkVector3& v) { + float mag = sqrt(v.fX * v.fX + v.fY * v.fY + v.fZ * v.fZ); + v.fX /= mag; + v.fY /= mag; + v.fZ /= mag; +} + MatrixDecomposition::MatrixDecomposition(SkMatrix44 matrix) : valid_(false) { if (matrix.get(3, 3) == 0) { return; @@ -83,14 +91,14 @@ MatrixDecomposition::MatrixDecomposition(SkMatrix44 matrix) : valid_(false) { scale_.fX = row[0].length(); - row[0].normalize(); + SkVector3Normalize(row[0]); shear_.fX = row[0].dot(row[1]); row[1] = SkVector3Combine(row[1], 1.0, row[0], -shear_.fX); scale_.fY = row[1].length(); - row[1].normalize(); + SkVector3Normalize(row[1]); shear_.fX /= scale_.fY; @@ -101,7 +109,7 @@ MatrixDecomposition::MatrixDecomposition(SkMatrix44 matrix) : valid_(false) { scale_.fZ = row[2].length(); - row[2].normalize(); + SkVector3Normalize(row[2]); shear_.fY /= scale_.fZ; shear_.fZ /= scale_.fZ; diff --git a/flow/matrix_decomposition_unittests.cc b/flow/matrix_decomposition_unittests.cc index 3c1b7d6c9b77b..3b9f8ed815ff6 100644 --- a/flow/matrix_decomposition_unittests.cc +++ b/flow/matrix_decomposition_unittests.cc @@ -95,8 +95,7 @@ TEST(MatrixDecomposition, Combination) { } TEST(MatrixDecomposition, ScaleFloatError) { - // Strange behavior under 0.000245 due to underflow issues. - for (float scale = 0.000245f; scale < 2.0f; scale += 0.000001f) { + for (float scale = 0.0001f; scale < 2.0f; scale += 0.000001f) { SkMatrix44 matrix = SkMatrix44::I(); matrix.setScale(scale, scale, 1.0f);