mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 08:47:34 +00:00
LibWeb: Avoid some unnecessary inside layouts during intrinsic sizing
When calculating intrinsic sizes, we don't need to recurse into *every* box and layout its insides. IIUC, we can skip any unconstrained box with definite sizes in both axes. So this patch does exactly that.
This commit is contained in:
parent
3ede8dbffb
commit
83bb16ede3
2 changed files with 16 additions and 1 deletions
|
@ -146,6 +146,20 @@ OwnPtr<FormattingContext> FormattingContext::create_independent_formatting_conte
|
||||||
|
|
||||||
OwnPtr<FormattingContext> FormattingContext::layout_inside(Box const& child_box, LayoutMode layout_mode)
|
OwnPtr<FormattingContext> FormattingContext::layout_inside(Box const& child_box, LayoutMode layout_mode)
|
||||||
{
|
{
|
||||||
|
{
|
||||||
|
// OPTIMIZATION: If we're doing intrinsic sizing and `child_box` has definite size in both axes,
|
||||||
|
// we don't need to layout its insides. The size is resolvable without learning
|
||||||
|
// the metrics of whatever's inside the box.
|
||||||
|
auto const& used_values = m_state.get(child_box);
|
||||||
|
if (layout_mode == LayoutMode::IntrinsicSizing
|
||||||
|
&& used_values.width_constraint == SizeConstraint::None
|
||||||
|
&& used_values.height_constraint == SizeConstraint::None
|
||||||
|
&& used_values.has_definite_width()
|
||||||
|
&& used_values.has_definite_height()) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!child_box.can_have_children())
|
if (!child_box.can_have_children())
|
||||||
return {};
|
return {};
|
||||||
|
|
||||||
|
|
|
@ -150,7 +150,8 @@ void InlineFormattingContext::dimension_box_on_line(Box const& box, LayoutMode l
|
||||||
box_state.set_content_height(height_value.resolved(box, container_height).to_px(inline_block));
|
box_state.set_content_height(height_value.resolved(box, container_height).to_px(inline_block));
|
||||||
}
|
}
|
||||||
|
|
||||||
independent_formatting_context->parent_context_did_dimension_child_root_box();
|
if (independent_formatting_context)
|
||||||
|
independent_formatting_context->parent_context_did_dimension_child_root_box();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue