diff --git a/impeller/display_list/dl_dispatcher.cc b/impeller/display_list/dl_dispatcher.cc index 210f64b7f9e24..c73ea1f9962c6 100644 --- a/impeller/display_list/dl_dispatcher.cc +++ b/impeller/display_list/dl_dispatcher.cc @@ -1103,7 +1103,7 @@ void DlDispatcher::drawDisplayList( void DlDispatcher::drawTextBlob(const sk_sp blob, SkScalar x, SkScalar y) { - Scalar scale = canvas_.GetCurrentTransformation().GetMaxBasisLength(); + Scalar scale = canvas_.GetCurrentTransformation().GetMaxBasisLengthXY(); canvas_.DrawTextFrame(TextFrameFromTextBlob(blob, scale), // impeller::Point{x, y}, // paint_ // diff --git a/impeller/geometry/geometry_unittests.cc b/impeller/geometry/geometry_unittests.cc index 964312932881d..632e0e6aeb6b8 100644 --- a/impeller/geometry/geometry_unittests.cc +++ b/impeller/geometry/geometry_unittests.cc @@ -336,6 +336,21 @@ TEST(GeometryTest, MatrixGetMaxBasisLength) { } } +TEST(GeometryTest, MatrixGetMaxBasisLengthXY) { + { + auto m = Matrix::MakeScale({3, 1, 1}); + ASSERT_EQ(m.GetMaxBasisLengthXY(), 3); + + m = m * Matrix::MakeSkew(0, 4); + ASSERT_EQ(m.GetMaxBasisLengthXY(), 5); + } + + { + auto m = Matrix::MakeScale({-3, 4, 7}); + ASSERT_EQ(m.GetMaxBasisLengthXY(), 4); + } +} + TEST(GeometryTest, MatrixMakeOrthographic) { { auto m = Matrix::MakeOrthographic(Size(100, 200)); diff --git a/impeller/geometry/matrix.cc b/impeller/geometry/matrix.cc index 70ede5866aee8..0819465591496 100644 --- a/impeller/geometry/matrix.cc +++ b/impeller/geometry/matrix.cc @@ -202,6 +202,14 @@ 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/impeller/geometry/matrix.h b/impeller/geometry/matrix.h index d30d803491288..6938cf930fffa 100644 --- a/impeller/geometry/matrix.h +++ b/impeller/geometry/matrix.h @@ -290,6 +290,8 @@ struct Matrix { Scalar GetMaxBasisLength() const; + Scalar GetMaxBasisLengthXY() const; + constexpr Vector3 GetBasisX() const { return Vector3(m[0], m[1], m[2]); } constexpr Vector3 GetBasisY() const { return Vector3(m[4], m[5], m[6]); }