1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 17:07:34 +00:00

LibWeb: Avoid some redundant calls to Layout::Box::absolute_rect()

Computing the absolute rect of a box requires walking the chain of
containing blocks and apply any offsets encountered. This can be slow in
deeply nested box trees, so let's at least avoid doing it multiple times
when once is enough.
This commit is contained in:
Andreas Kling 2021-09-15 14:18:17 +02:00
parent 1103eb8d44
commit eac31e21f2
2 changed files with 8 additions and 6 deletions

View file

@ -305,11 +305,12 @@ Box::BorderRadiusData Box::normalized_border_radius_data()
auto top_right_radius = computed_values().border_top_right_radius().resolved_or_zero(*this, width()).to_px(*this);
// Scale overlapping curves according to https://www.w3.org/TR/css-backgrounds-3/#corner-overlap
auto bordered_rect = this->bordered_rect();
auto f = 1.0f;
f = min(f, bordered_rect().width() / (float)(top_left_radius + top_right_radius));
f = min(f, bordered_rect().height() / (float)(top_right_radius + bottom_right_radius));
f = min(f, bordered_rect().width() / (float)(bottom_left_radius + bottom_right_radius));
f = min(f, bordered_rect().height() / (float)(top_left_radius + bottom_left_radius));
f = min(f, bordered_rect.width() / (float)(top_left_radius + top_right_radius));
f = min(f, bordered_rect.height() / (float)(top_right_radius + bottom_right_radius));
f = min(f, bordered_rect.width() / (float)(bottom_left_radius + bottom_right_radius));
f = min(f, bordered_rect.height() / (float)(top_left_radius + bottom_left_radius));
top_left_radius = (int)(top_left_radius * f);
top_right_radius = (int)(top_right_radius * f);