summaryrefslogtreecommitdiff
path: root/Userland
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2022-01-20 16:19:05 +0100
committerAndreas Kling <kling@serenityos.org>2022-01-23 01:22:41 +0100
commit251b2f49a23ebaca50b461b600cf839c04a7a609 (patch)
tree778bfd08e27b113f168f940eac37336a28ddd87c /Userland
parent78f2ddfc14be1483752a5373d34968768139a0eb (diff)
downloadserenity-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.cpp14
-rw-r--r--Userland/Libraries/LibWeb/Layout/LineBuilder.h8
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 };