1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 04:07:44 +00:00

LibWeb: Use coordinate instead of WeakPtr for box->fragment connection

Using WeakPtr to remember which LineBoxFragment owns which Box was
imposing some annoying constraints on the layout code. Importantly, it
was forcing us to heap-allocate fragments, which makes it much harder to
clone a FormattingState.

This patch replaces the WeakPtr with a coordinate system instead.
Fragments are referred to by their line box index + fragment index
within the line box.
This commit is contained in:
Andreas Kling 2022-02-27 10:26:38 +01:00
parent 726edd2d3b
commit 16a47165ee
5 changed files with 21 additions and 14 deletions

View file

@ -220,8 +220,10 @@ void Box::set_content_size(Gfx::FloatSize const& size)
Gfx::FloatPoint Box::effective_offset() const
{
if (m_containing_line_box_fragment)
return m_containing_line_box_fragment->offset();
if (m_containing_line_box_fragment.has_value()) {
auto const& fragment = containing_block()->line_boxes()[m_containing_line_box_fragment->line_box_index].fragments()[m_containing_line_box_fragment->fragment_index];
return fragment.offset();
}
return m_offset;
}
@ -234,9 +236,9 @@ const Gfx::FloatRect Box::absolute_rect() const
return rect;
}
void Box::set_containing_line_box_fragment(LineBoxFragment& fragment)
void Box::set_containing_line_box_fragment(LineBoxFragmentCoordinate fragment_coordinate)
{
m_containing_line_box_fragment = fragment.make_weak_ptr();
m_containing_line_box_fragment = fragment_coordinate;
}
StackingContext* Box::enclosing_stacking_context()