From 7ab62ecd16fe7bb86676d9d56a66d919e48cf685 Mon Sep 17 00:00:00 2001 From: James Bellamy Date: Mon, 21 Mar 2022 19:15:01 +0000 Subject: [PATCH] LibWeb: When painting, reduce computation cost by using the reciprocal Rather than dividing the rect width and high by the border lengths, this change multiples those lengths by the reciprocal of the width and height because this is a faster operation. When mousing around on the html spec website, the profile showed that inline painting went from ~15% to ~3% --- .../Libraries/LibWeb/Painting/BorderPainting.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/Userland/Libraries/LibWeb/Painting/BorderPainting.cpp b/Userland/Libraries/LibWeb/Painting/BorderPainting.cpp index c875fa672f..527fe08ae6 100644 --- a/Userland/Libraries/LibWeb/Painting/BorderPainting.cpp +++ b/Userland/Libraries/LibWeb/Painting/BorderPainting.cpp @@ -24,10 +24,14 @@ BorderRadiusData normalized_border_radius_data(Layout::Node const& node, Gfx::Fl // Scale overlapping curves according to https://www.w3.org/TR/css-backgrounds-3/#corner-overlap auto f = 1.0f; - f = min(f, rect.width() / (float)(top_left_radius_px + top_right_radius_px)); - f = min(f, rect.height() / (float)(top_right_radius_px + bottom_right_radius_px)); - f = min(f, rect.width() / (float)(bottom_left_radius_px + bottom_right_radius_px)); - f = min(f, rect.height() / (float)(top_left_radius_px + bottom_left_radius_px)); + auto width_reciprocal = 1.0f / rect.width(); + auto height_reciprocal = 1.0f / rect.height(); + f = max(f, width_reciprocal * (top_left_radius_px + top_right_radius_px)); + f = max(f, height_reciprocal * (top_right_radius_px + bottom_right_radius_px)); + f = max(f, width_reciprocal * (bottom_left_radius_px + bottom_right_radius_px)); + f = max(f, height_reciprocal * (top_left_radius_px + bottom_left_radius_px)); + + f = 1.0f / f; top_left_radius_px = (int)(top_left_radius_px * f); top_right_radius_px = (int)(top_right_radius_px * f);