LibWeb: Ignore some collapsible whitespace when building lines

When collapsing whitespace, we can skip over all-whitespace chunks at
the start of each line, and immediately following fragments that
themselves end in whitespace.
This commit is contained in:
Andreas Kling 2022-01-21 14:15:10 +01:00
parent 766d816db3
commit 9f39ad8929
Notes: sideshowbarker 2024-07-17 20:25:45 +09:00
3 changed files with 6 additions and 0 deletions

View file

@ -168,6 +168,10 @@ void InlineFormattingContext::generate_line_boxes(LayoutMode layout_mode)
break;
auto& item = item_opt.value();
// Ignore collapsible whitespace chunks at the start of line, and if the last fragment already ends in whitespace.
if (item.is_collapsible_whitespace && containing_block().line_boxes().last().is_empty_or_ends_in_whitespace())
continue;
switch (item.type) {
case InlineLevelIterator::Item::Type::ForcedBreak:
line_builder.break_line();

View file

@ -64,6 +64,7 @@ Optional<InlineLevelIterator::Item> InlineLevelIterator::next(float available_wi
.length_in_node = chunk.length,
.width = chunk_width,
.should_force_break = m_text_node_context->do_respect_linebreaks && chunk.has_breaking_newline,
.is_collapsible_whitespace = m_text_node_context->do_collapse && chunk.is_all_whitespace,
};
return item;

View file

@ -32,6 +32,7 @@ public:
size_t length_in_node { 0 };
float width { 0.0f };
bool should_force_break { false };
bool is_collapsible_whitespace { false };
};
explicit InlineLevelIterator(Layout::Box& container, LayoutMode layout_mode)