diff --git a/engine/src/flutter/impeller/geometry/matrix.h b/engine/src/flutter/impeller/geometry/matrix.h index 5b70ab9870d..3f9960737c2 100644 --- a/engine/src/flutter/impeller/geometry/matrix.h +++ b/engine/src/flutter/impeller/geometry/matrix.h @@ -245,7 +245,7 @@ struct Matrix { m[0] * t.x + m[4] * t.y + m[8] * t.z + m[12], m[1] * t.x + m[5] * t.y + m[9] * t.z + m[13], m[2] * t.x + m[6] * t.y + m[10] * t.z + m[14], - m[15]); + m[3] * t.x + m[7] * t.y + m[11] * t.z + m[15]); // clang-format on } diff --git a/engine/src/flutter/impeller/geometry/matrix_unittests.cc b/engine/src/flutter/impeller/geometry/matrix_unittests.cc index 1cb7930ec52..ac160086994 100644 --- a/engine/src/flutter/impeller/geometry/matrix_unittests.cc +++ b/engine/src/flutter/impeller/geometry/matrix_unittests.cc @@ -187,5 +187,17 @@ TEST(MatrixTest, GetMaxBasisXYWithLargeAndSmallScalingFactorNonScaleTranslate) { EXPECT_TRUE(std::isinf(m.GetMaxBasisLengthXY())); } +TEST(MatrixTest, TranslateWithPerspective) { + Matrix m = Matrix::MakeRow(1.0, 0.0, 0.0, 10.0, // + 0.0, 1.0, 0.0, 20.0, // + 0.0, 0.0, 1.0, 0.0, // + 0.0, 2.0, 0.0, 30.0); + Matrix result = m.Translate({100, 200}); + EXPECT_TRUE(MatrixNear(result, Matrix::MakeRow(1.0, 0.0, 0.0, 110.0, // + 0.0, 1.0, 0.0, 220.0, // + 0.0, 0.0, 1.0, 0.0, // + 0.0, 2.0, 0.0, 430.0))); +} + } // namespace testing } // namespace impeller