1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 14:28:12 +00:00

LibWeb: Properly round CSSPixels values in device_to_css_rect

Ceiling width or height of a chrome viewport (this function is only used
when a chrome notifies LibWeb about a new viewport size) is never
correct. If we do that, PageClient::page_did_layout will set content
size to be 1 larger than an actual physical width or height respectively
(it always ceils) and thus a spurious scrollbar will appear.

This prevents occasional scrollbar flickering in Ladybird/Qt on Wayland
with fractional scaling enabled on compositors supporting
wp-fractional-scale-v1.
This commit is contained in:
Dan Klishch 2024-02-07 22:46:39 -05:00 committed by Alexander Kalenik
parent 7bee1c9897
commit 56d355a15e
2 changed files with 13 additions and 4 deletions

View file

@ -120,10 +120,10 @@ CSSPixelRect Page::device_to_css_rect(DevicePixelRect rect) const
{ {
auto scale = client().device_pixels_per_css_pixel(); auto scale = client().device_pixels_per_css_pixel();
return { return {
rect.x().value() / scale, CSSPixels::nearest_value_for(rect.x().value() / scale),
rect.y().value() / scale, CSSPixels::nearest_value_for(rect.y().value() / scale),
rect.width().value() / scale, CSSPixels::floored_value_for(rect.width().value() / scale),
rect.height().value() / scale CSSPixels::floored_value_for(rect.height().value() / scale),
}; };
} }

View file

@ -98,6 +98,15 @@ public:
return from_raw(raw_value); return from_raw(raw_value);
} }
template<FloatingPoint F>
static CSSPixels floored_value_for(F value)
{
i32 raw_value = 0;
if (!isnan(value))
raw_value = AK::clamp_to<int>(floor(value * fixed_point_denominator));
return from_raw(raw_value);
}
template<Unsigned U> template<Unsigned U>
constexpr CSSPixels(U value) constexpr CSSPixels(U value)
{ {