diff options
author | James Bellamy <j.bellamy99@gmail.com> | 2022-03-21 19:15:01 +0000 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2022-03-25 21:32:19 +0100 |
commit | 7ab62ecd16fe7bb86676d9d56a66d919e48cf685 (patch) | |
tree | ffbb0320687dc7208a14205bb1a4e814219d8191 /Userland | |
parent | 4f786a7f6676df4cd2b3472f32e965727a95dc9e (diff) | |
download | serenity-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.cpp | 12 |
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); |