From 663cc753a736ff06033846e953c47e8ba2ee12ee Mon Sep 17 00:00:00 2001 From: Aliaksandr Kalenik Date: Sun, 26 May 2024 11:09:43 +0100 Subject: [PATCH] LibWeb: Fix clip box calculation in PaintableWithLines All painting commands except SetClipRect are shifted by scroll offset before command list execution. This change removes scroll offset translation for sample/blit corner commands in `PaintableWithLines::paint` so it is only applied once in `CommandList::apply_scroll_offsets()`. --- ...lines-corner-clip-in-scroll-container.html | 50 +++++++++++++++++++ ...s-corner-clip-in-scroll-container-ref.html | 43 ++++++++++++++++ .../LibWeb/Painting/PaintableBox.cpp | 7 +-- 3 files changed, 97 insertions(+), 3 deletions(-) create mode 100644 Tests/LibWeb/Ref/paintablewithlines-corner-clip-in-scroll-container.html create mode 100644 Tests/LibWeb/Ref/reference/paintablewithlines-corner-clip-in-scroll-container-ref.html diff --git a/Tests/LibWeb/Ref/paintablewithlines-corner-clip-in-scroll-container.html b/Tests/LibWeb/Ref/paintablewithlines-corner-clip-in-scroll-container.html new file mode 100644 index 0000000000..aa8df955cb --- /dev/null +++ b/Tests/LibWeb/Ref/paintablewithlines-corner-clip-in-scroll-container.html @@ -0,0 +1,50 @@ + + + +
+
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut ultrices neque + eu nisi facilisis viverra. Integer lacinia, lacus vel condimentum suscipit, + lacus felis porta nulla, eget lacinia sem neque ut neque. In sagittis, eros + vel interdum porta, quam ex rhoncus lectus, vitae suscipit risus orci sit + amet velit. Praesent imperdiet condimentum rutrum. Cras vitae nisl sapien. + Curabitur ligula diam, tincidunt congue tincidunt nec, sodales nec orci. + Vestibulum tincidunt non elit in vehicula. Etiam malesuada neque eu porta + rhoncus. Curabitur vel nunc finibus ligula posuere venenatis. +
+
+
+ diff --git a/Tests/LibWeb/Ref/reference/paintablewithlines-corner-clip-in-scroll-container-ref.html b/Tests/LibWeb/Ref/reference/paintablewithlines-corner-clip-in-scroll-container-ref.html new file mode 100644 index 0000000000..6c44d64480 --- /dev/null +++ b/Tests/LibWeb/Ref/reference/paintablewithlines-corner-clip-in-scroll-container-ref.html @@ -0,0 +1,43 @@ + + +
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut ultrices neque + eu nisi facilisis viverra. Integer lacinia, lacus vel condimentum suscipit, + lacus felis porta nulla, eget lacinia sem neque ut neque. In sagittis, eros + vel interdum porta, quam ex rhoncus lectus, vitae suscipit risus orci sit + amet velit. Praesent imperdiet condimentum rutrum. Cras vitae nisl sapien. + Curabitur ligula diam, tincidunt congue tincidunt nec, sodales nec orci. + Vestibulum tincidunt non elit in vehicula. Etiam malesuada neque eu porta + rhoncus. Curabitur vel nunc finibus ligula posuere venenatis. +
+
diff --git a/Userland/Libraries/LibWeb/Painting/PaintableBox.cpp b/Userland/Libraries/LibWeb/Painting/PaintableBox.cpp index 4360430814..324083da71 100644 --- a/Userland/Libraries/LibWeb/Painting/PaintableBox.cpp +++ b/Userland/Libraries/LibWeb/Painting/PaintableBox.cpp @@ -673,12 +673,13 @@ void PaintableWithLines::paint(PaintContext& context, PaintPhase phase) const clip_box.intersect(get_clip_rect().value()); should_clip_overflow = true; } - if (enclosing_scroll_frame_offset().has_value()) - clip_box.translate_by(enclosing_scroll_frame_offset().value()); if (should_clip_overflow) { context.recording_painter().save(); // FIXME: Handle overflow-x and overflow-y being different values. - context.recording_painter().add_clip_rect(context.rounded_device_rect(clip_box).to_type()); + auto clip_box_with_enclosing_scroll_frame_offset = clip_box; + if (enclosing_scroll_frame_offset().has_value()) + clip_box_with_enclosing_scroll_frame_offset.translate_by(enclosing_scroll_frame_offset().value()); + context.recording_painter().add_clip_rect(context.rounded_device_rect(clip_box_with_enclosing_scroll_frame_offset).to_type()); auto border_radii = normalized_border_radii_data(ShrinkRadiiForBorders::Yes); CornerRadii corner_radii {