summaryrefslogtreecommitdiff
path: root/Userland
diff options
context:
space:
mode:
authorJames Bellamy <j.bellamy99@gmail.com>2022-03-21 19:15:01 +0000
committerAndreas Kling <kling@serenityos.org>2022-03-25 21:32:19 +0100
commit7ab62ecd16fe7bb86676d9d56a66d919e48cf685 (patch)
treeffbb0320687dc7208a14205bb1a4e814219d8191 /Userland
parent4f786a7f6676df4cd2b3472f32e965727a95dc9e (diff)
downloadserenity-7ab62ecd16fe7bb86676d9d56a66d919e48cf685.zip
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%
Diffstat (limited to 'Userland')
-rw-r--r--Userland/Libraries/LibWeb/Painting/BorderPainting.cpp12
1 files 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);