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

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.
This commit is contained in:
Aliaksandr Kalenik 2024-01-30 09:45:10 +01:00 committed by Andreas Kling
parent 41f57a5477
commit d27b376699
5 changed files with 13 additions and 10 deletions

View file

@ -2085,7 +2085,7 @@ void Navigable::paint(Painting::RecordingPainter& recording_painter, PaintConfig
HashMap<Painting::PaintableBox const*, Painting::ViewportPaintable::ScrollFrame> 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);

View file

@ -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<int>(), 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<int>(), 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<int>());
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<int>());
m_corner_clipper_id = {};
}
context.recording_painter().restore();

View file

@ -196,7 +196,7 @@ public:
void set_clip_rect(Optional<CSSPixelRect> 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<CSSPixelRect> m_clip_rect;
Optional<int> m_scroll_frame_id;
Optional<CSSPixelPoint> m_enclosing_scroll_frame_offset;
Optional<CornerRadii> m_corner_clip_radii;
Optional<BorderRadiiData> m_corner_clip_radii;
Optional<BordersDataWithElementKind> m_override_borders_data;
Optional<TableCellCoordinates> m_table_cell_coordinates;

View file

@ -95,7 +95,7 @@ void ViewportPaintable::assign_scroll_frame_ids(HashMap<Painting::PaintableBox c
});
}
void ViewportPaintable::assign_clip_rectangles(PaintContext const& context)
void ViewportPaintable::assign_clip_rectangles()
{
HashMap<Paintable const*, CSSPixelRect> 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<PaintableBox&>(paintable_box).set_corner_clip_radii(corner_radii);
const_cast<PaintableBox&>(paintable_box).set_corner_clip_radii(border_radii_data);
}
clip_rect = *containing_block_clip_rect;
break;

View file

@ -25,7 +25,7 @@ public:
CSSPixelPoint offset;
};
void assign_scroll_frame_ids(HashMap<Painting::PaintableBox const*, ScrollFrame>&) const;
void assign_clip_rectangles(PaintContext const&);
void assign_clip_rectangles();
private:
void build_stacking_context_tree();