LibWeb: Make LineBuilder respect LayoutMode::OnlyRequiredLineBreaks

In this layout mode, we should only break when forced (e.g by an
explicit <br> tag.) This is used when determining intrinsic sizes.)
This commit is contained in:
Andreas Kling 2022-01-20 16:19:05 +01:00
parent 78f2ddfc14
commit 251b2f49a2
2 changed files with 16 additions and 6 deletions

View file

@ -46,12 +46,16 @@ void LineBuilder::append_text_chunk(TextNode& text_node, size_t offset_in_node,
m_max_height_on_current_line = max(m_max_height_on_current_line, height);
}
void LineBuilder::break_if_needed(LayoutMode layout_mode, float next_item_width, bool should_force_break)
bool LineBuilder::should_break(LayoutMode layout_mode, float next_item_width, bool should_force_break)
{
if (layout_mode == LayoutMode::AllPossibleLineBreaks
|| should_force_break
|| (m_context.containing_block().line_boxes().last().width() + next_item_width) > m_available_width_for_current_line)
break_line();
if (layout_mode == LayoutMode::AllPossibleLineBreaks)
return true;
if (should_force_break)
return true;
if (layout_mode == LayoutMode::OnlyRequiredLineBreaks)
return false;
auto current_line_width = m_context.containing_block().line_boxes().last().width();
return (current_line_width + next_item_width) > m_available_width_for_current_line;
}
void LineBuilder::update_last_line()

View file

@ -23,13 +23,19 @@ public:
void append_box(Box&);
void append_text_chunk(TextNode&, size_t offset_in_node, size_t length_in_node, float width, float height);
void break_if_needed(LayoutMode, float next_item_width, bool should_force_break);
void break_if_needed(LayoutMode layout_mode, float next_item_width, bool should_force_break)
{
if (should_break(layout_mode, next_item_width, should_force_break))
break_line();
}
float available_width_for_current_line() const { return m_available_width_for_current_line; }
void update_last_line();
private:
bool should_break(LayoutMode, float next_item_width, bool should_force_break);
InlineFormattingContext& m_context;
float m_available_width_for_current_line { 0 };
float m_current_y { 0 };