From 118bfc65c48d53e8a100ba8389bcbf23f6e313e4 Mon Sep 17 00:00:00 2001 From: Jim Graham Date: Tue, 26 Mar 2024 12:03:04 -0700 Subject: [PATCH] [Impeller] Simplify calculation of Matrix::GetMaxBasisXY() (flutter/engine#51664) Since 2D coordinates have a `Z` value of `0.0`, they don't need to include the Z basis vector in calculating a scale. --- .../flutter/impeller/geometry/geometry_unittests.cc | 12 ++++++++++++ engine/src/flutter/impeller/geometry/matrix.cc | 8 -------- engine/src/flutter/impeller/geometry/matrix.h | 5 ++++- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/engine/src/flutter/impeller/geometry/geometry_unittests.cc b/engine/src/flutter/impeller/geometry/geometry_unittests.cc index e5ebf3de82..aa1e5910b7 100644 --- a/engine/src/flutter/impeller/geometry/geometry_unittests.cc +++ b/engine/src/flutter/impeller/geometry/geometry_unittests.cc @@ -352,6 +352,18 @@ TEST(GeometryTest, MatrixGetMaxBasisLengthXY) { auto m = Matrix::MakeScale({-3, 4, 7}); ASSERT_EQ(m.GetMaxBasisLengthXY(), 4); } + + { + // clang-format off + auto m = Matrix::MakeColumn( + 1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, 0.0f, + 4.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f + ); + // clang-format on + ASSERT_EQ(m.GetMaxBasisLengthXY(), 1.0f); + } } TEST(GeometryTest, MatrixMakeOrthographic) { diff --git a/engine/src/flutter/impeller/geometry/matrix.cc b/engine/src/flutter/impeller/geometry/matrix.cc index 0819465591..70ede5866a 100644 --- a/engine/src/flutter/impeller/geometry/matrix.cc +++ b/engine/src/flutter/impeller/geometry/matrix.cc @@ -202,14 +202,6 @@ Scalar Matrix::GetMaxBasisLength() const { return std::sqrt(max); } -Scalar Matrix::GetMaxBasisLengthXY() const { - Scalar max = 0; - for (int i = 0; i < 3; i++) { - max = std::max(max, e[i][0] * e[i][0] + e[i][1] * e[i][1]); - } - return std::sqrt(max); -} - /* * Adapted for Impeller from Graphics Gems: * http://www.realtimerendering.com/resources/GraphicsGems/gemsii/unmatrix.c diff --git a/engine/src/flutter/impeller/geometry/matrix.h b/engine/src/flutter/impeller/geometry/matrix.h index dab9186e69..5e563af6d7 100644 --- a/engine/src/flutter/impeller/geometry/matrix.h +++ b/engine/src/flutter/impeller/geometry/matrix.h @@ -292,7 +292,10 @@ struct Matrix { Scalar GetMaxBasisLength() const; - Scalar GetMaxBasisLengthXY() const; + constexpr Scalar GetMaxBasisLengthXY() const { + return std::sqrt(std::max(e[0][0] * e[0][0] + e[0][1] * e[0][1], + e[1][0] * e[1][0] + e[1][1] * e[1][1])); + } constexpr Vector3 GetBasisX() const { return Vector3(m[0], m[1], m[2]); }