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:
parent
41f57a5477
commit
d27b376699
5 changed files with 13 additions and 10 deletions
|
@ -2085,7 +2085,7 @@ void Navigable::paint(Painting::RecordingPainter& recording_painter, PaintConfig
|
||||||
HashMap<Painting::PaintableBox const*, Painting::ViewportPaintable::ScrollFrame> scroll_frames;
|
HashMap<Painting::PaintableBox const*, Painting::ViewportPaintable::ScrollFrame> scroll_frames;
|
||||||
if (is_traversable()) {
|
if (is_traversable()) {
|
||||||
document->paintable()->assign_scroll_frame_ids(scroll_frames);
|
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);
|
document->paintable()->paint_all_phases(context);
|
||||||
|
|
|
@ -412,7 +412,9 @@ void PaintableBox::apply_clip_overflow_rect(PaintContext& context, PaintPhase ph
|
||||||
if (m_corner_clip_radii.has_value()) {
|
if (m_corner_clip_radii.has_value()) {
|
||||||
VERIFY(!m_corner_clipper_id.has_value());
|
VERIFY(!m_corner_clipper_id.has_value());
|
||||||
m_corner_clipper_id = context.allocate_corner_clipper_id();
|
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;
|
m_clipping_overflow = false;
|
||||||
if (m_corner_clip_radii.has_value()) {
|
if (m_corner_clip_radii.has_value()) {
|
||||||
VERIFY(m_corner_clipper_id.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 = {};
|
m_corner_clipper_id = {};
|
||||||
}
|
}
|
||||||
context.recording_painter().restore();
|
context.recording_painter().restore();
|
||||||
|
|
|
@ -196,7 +196,7 @@ public:
|
||||||
void set_clip_rect(Optional<CSSPixelRect> rect) { m_clip_rect = rect; }
|
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_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_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:
|
protected:
|
||||||
explicit PaintableBox(Layout::Box const&);
|
explicit PaintableBox(Layout::Box const&);
|
||||||
|
@ -228,7 +228,7 @@ private:
|
||||||
Optional<CSSPixelRect> m_clip_rect;
|
Optional<CSSPixelRect> m_clip_rect;
|
||||||
Optional<int> m_scroll_frame_id;
|
Optional<int> m_scroll_frame_id;
|
||||||
Optional<CSSPixelPoint> m_enclosing_scroll_frame_offset;
|
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<BordersDataWithElementKind> m_override_borders_data;
|
||||||
Optional<TableCellCoordinates> m_table_cell_coordinates;
|
Optional<TableCellCoordinates> m_table_cell_coordinates;
|
||||||
|
|
|
@ -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;
|
HashMap<Paintable const*, CSSPixelRect> clip_rects;
|
||||||
// Calculate clip rects for all boxes that either have hidden overflow or a CSS clip property.
|
// 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()) {
|
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()) {
|
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);
|
auto border_radii_data = block->paintable_box()->normalized_border_radii_data(ShrinkRadiiForBorders::Yes);
|
||||||
CornerRadii corner_radii = border_radii_data.as_corners(context);
|
if (border_radii_data.has_any_radius()) {
|
||||||
if (corner_radii.has_any_radius()) {
|
|
||||||
// FIXME: Border radii of all boxes in containing block chain should be taken into account instead of just the closest one.
|
// 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;
|
clip_rect = *containing_block_clip_rect;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -25,7 +25,7 @@ public:
|
||||||
CSSPixelPoint offset;
|
CSSPixelPoint offset;
|
||||||
};
|
};
|
||||||
void assign_scroll_frame_ids(HashMap<Painting::PaintableBox const*, ScrollFrame>&) const;
|
void assign_scroll_frame_ids(HashMap<Painting::PaintableBox const*, ScrollFrame>&) const;
|
||||||
void assign_clip_rectangles(PaintContext const&);
|
void assign_clip_rectangles();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void build_stacking_context_tree();
|
void build_stacking_context_tree();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue