From 2dacd1252c8a38ad68b98e6aaff7797d0ccbabf1 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sat, 2 Mar 2024 09:55:30 +0100 Subject: [PATCH] LibGfx: Add fast paths for identity/translate-only transforms This shrinks time spent in AffineTransform::map() from 3.3% to 1.6% when hovering links on ziglang.org. --- Userland/Libraries/LibGfx/AffineTransform.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Userland/Libraries/LibGfx/AffineTransform.cpp b/Userland/Libraries/LibGfx/AffineTransform.cpp index f0479fcf51..8ef5b78ea3 100644 --- a/Userland/Libraries/LibGfx/AffineTransform.cpp +++ b/Userland/Libraries/LibGfx/AffineTransform.cpp @@ -89,6 +89,11 @@ AffineTransform& AffineTransform::skew_radians(float x_radians, float y_radians) AffineTransform& AffineTransform::translate(float tx, float ty) { + if (is_identity_or_translation()) { + m_values[4] += tx; + m_values[5] += ty; + return *this; + } m_values[4] += tx * m_values[0] + ty * m_values[2]; m_values[5] += tx * m_values[1] + ty * m_values[3]; return *this; @@ -208,6 +213,12 @@ static T largest_of(T p1, T p2, T p3, T p4) template<> FloatRect AffineTransform::map(FloatRect const& rect) const { + if (is_identity()) { + return rect; + } + if (is_identity_or_translation()) { + return rect.translated(e(), f()); + } FloatPoint p1 = map(rect.top_left()); FloatPoint p2 = map(rect.top_right()); FloatPoint p3 = map(rect.bottom_right());