diff options
author | Andreas Kling <kling@serenityos.org> | 2022-01-20 16:19:05 +0100 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2022-01-23 01:22:41 +0100 |
commit | 251b2f49a23ebaca50b461b600cf839c04a7a609 (patch) | |
tree | 778bfd08e27b113f168f940eac37336a28ddd87c /Userland | |
parent | 78f2ddfc14be1483752a5373d34968768139a0eb (diff) | |
download | serenity-251b2f49a23ebaca50b461b600cf839c04a7a609.zip |
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.)
Diffstat (limited to 'Userland')
-rw-r--r-- | Userland/Libraries/LibWeb/Layout/LineBuilder.cpp | 14 | ||||
-rw-r--r-- | Userland/Libraries/LibWeb/Layout/LineBuilder.h | 8 |
2 files changed, 16 insertions, 6 deletions
diff --git a/Userland/Libraries/LibWeb/Layout/LineBuilder.cpp b/Userland/Libraries/LibWeb/Layout/LineBuilder.cpp index ce156711ac..1b9eed559d 100644 --- a/Userland/Libraries/LibWeb/Layout/LineBuilder.cpp +++ b/Userland/Libraries/LibWeb/Layout/LineBuilder.cpp @@ -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() diff --git a/Userland/Libraries/LibWeb/Layout/LineBuilder.h b/Userland/Libraries/LibWeb/Layout/LineBuilder.h index f32dfa5aa5..0fd2c5d180 100644 --- a/Userland/Libraries/LibWeb/Layout/LineBuilder.h +++ b/Userland/Libraries/LibWeb/Layout/LineBuilder.h @@ -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 }; |