From d27b37669979072d42fa1b4d230906dba402838b Mon Sep 17 00:00:00 2001 From: Aliaksandr Kalenik Date: Tue, 30 Jan 2024 09:45:10 +0100 Subject: [PATCH] LibWeb: Store clip border radii in CSSPixels instead of DevicePixels Paintable boxes should not hold information stored in device pixels. It should be converted from CSS pixels only by the time painting command recording occurs. --- Userland/Libraries/LibWeb/HTML/Navigable.cpp | 2 +- Userland/Libraries/LibWeb/Painting/PaintableBox.cpp | 8 ++++++-- Userland/Libraries/LibWeb/Painting/PaintableBox.h | 4 ++-- Userland/Libraries/LibWeb/Painting/ViewportPaintable.cpp | 7 +++---- Userland/Libraries/LibWeb/Painting/ViewportPaintable.h | 2 +- 5 files changed, 13 insertions(+), 10 deletions(-) diff --git a/Userland/Libraries/LibWeb/HTML/Navigable.cpp b/Userland/Libraries/LibWeb/HTML/Navigable.cpp index 7f66f140ee..8f8bec3af0 100644 --- a/Userland/Libraries/LibWeb/HTML/Navigable.cpp +++ b/Userland/Libraries/LibWeb/HTML/Navigable.cpp @@ -2085,7 +2085,7 @@ void Navigable::paint(Painting::RecordingPainter& recording_painter, PaintConfig HashMap scroll_frames; if (is_traversable()) { document->paintable()->assign_scroll_frame_ids(scroll_frames); - document->paintable()->assign_clip_rectangles(context); + document->paintable()->assign_clip_rectangles(); } document->paintable()->paint_all_phases(context); diff --git a/Userland/Libraries/LibWeb/Painting/PaintableBox.cpp b/Userland/Libraries/LibWeb/Painting/PaintableBox.cpp index 1f691acd5c..eb2f4f5456 100644 --- a/Userland/Libraries/LibWeb/Painting/PaintableBox.cpp +++ b/Userland/Libraries/LibWeb/Painting/PaintableBox.cpp @@ -412,7 +412,9 @@ void PaintableBox::apply_clip_overflow_rect(PaintContext& context, PaintPhase ph if (m_corner_clip_radii.has_value()) { VERIFY(!m_corner_clipper_id.has_value()); m_corner_clipper_id = context.allocate_corner_clipper_id(); - context.recording_painter().sample_under_corners(*m_corner_clipper_id, *m_corner_clip_radii, context.rounded_device_rect(overflow_clip_rect).to_type(), CornerClip::Outside); + auto corner_radii = m_corner_clip_radii->as_corners(context); + if (corner_radii.has_any_radius()) + context.recording_painter().sample_under_corners(*m_corner_clipper_id, m_corner_clip_radii->as_corners(context), context.rounded_device_rect(overflow_clip_rect).to_type(), CornerClip::Outside); } } } @@ -426,7 +428,9 @@ void PaintableBox::clear_clip_overflow_rect(PaintContext& context, PaintPhase ph m_clipping_overflow = false; if (m_corner_clip_radii.has_value()) { VERIFY(m_corner_clipper_id.has_value()); - context.recording_painter().blit_corner_clipping(*m_corner_clipper_id, context.rounded_device_rect(*m_clip_rect).to_type()); + auto corner_radii = m_corner_clip_radii->as_corners(context); + if (corner_radii.has_any_radius()) + context.recording_painter().blit_corner_clipping(*m_corner_clipper_id, context.rounded_device_rect(*m_clip_rect).to_type()); m_corner_clipper_id = {}; } context.recording_painter().restore(); diff --git a/Userland/Libraries/LibWeb/Painting/PaintableBox.h b/Userland/Libraries/LibWeb/Painting/PaintableBox.h index f84c939724..b9dc4b2cb9 100644 --- a/Userland/Libraries/LibWeb/Painting/PaintableBox.h +++ b/Userland/Libraries/LibWeb/Painting/PaintableBox.h @@ -196,7 +196,7 @@ public: void set_clip_rect(Optional rect) { m_clip_rect = rect; } void set_scroll_frame_id(int id) { m_scroll_frame_id = id; } void set_enclosing_scroll_frame_offset(CSSPixelPoint offset) { m_enclosing_scroll_frame_offset = offset; } - void set_corner_clip_radii(CornerRadii const& corner_radii) { m_corner_clip_radii = corner_radii; } + void set_corner_clip_radii(BorderRadiiData const& corner_radii) { m_corner_clip_radii = corner_radii; } protected: explicit PaintableBox(Layout::Box const&); @@ -228,7 +228,7 @@ private: Optional m_clip_rect; Optional m_scroll_frame_id; Optional m_enclosing_scroll_frame_offset; - Optional m_corner_clip_radii; + Optional m_corner_clip_radii; Optional m_override_borders_data; Optional m_table_cell_coordinates; diff --git a/Userland/Libraries/LibWeb/Painting/ViewportPaintable.cpp b/Userland/Libraries/LibWeb/Painting/ViewportPaintable.cpp index 5c234e79f1..c7bd5df984 100644 --- a/Userland/Libraries/LibWeb/Painting/ViewportPaintable.cpp +++ b/Userland/Libraries/LibWeb/Painting/ViewportPaintable.cpp @@ -95,7 +95,7 @@ void ViewportPaintable::assign_scroll_frame_ids(HashMap clip_rects; // Calculate clip rects for all boxes that either have hidden overflow or a CSS clip property. @@ -129,10 +129,9 @@ void ViewportPaintable::assign_clip_rectangles(PaintContext const& context) for (auto block = paintable_box.containing_block(); block; block = block->containing_block()) { if (auto containing_block_clip_rect = clip_rects.get(block->paintable()); containing_block_clip_rect.has_value()) { auto border_radii_data = block->paintable_box()->normalized_border_radii_data(ShrinkRadiiForBorders::Yes); - CornerRadii corner_radii = border_radii_data.as_corners(context); - if (corner_radii.has_any_radius()) { + if (border_radii_data.has_any_radius()) { // FIXME: Border radii of all boxes in containing block chain should be taken into account instead of just the closest one. - const_cast(paintable_box).set_corner_clip_radii(corner_radii); + const_cast(paintable_box).set_corner_clip_radii(border_radii_data); } clip_rect = *containing_block_clip_rect; break; diff --git a/Userland/Libraries/LibWeb/Painting/ViewportPaintable.h b/Userland/Libraries/LibWeb/Painting/ViewportPaintable.h index 96b0f30c28..53d10ab12f 100644 --- a/Userland/Libraries/LibWeb/Painting/ViewportPaintable.h +++ b/Userland/Libraries/LibWeb/Painting/ViewportPaintable.h @@ -25,7 +25,7 @@ public: CSSPixelPoint offset; }; void assign_scroll_frame_ids(HashMap&) const; - void assign_clip_rectangles(PaintContext const&); + void assign_clip_rectangles(); private: void build_stacking_context_tree();