diff options
author | Andreas Kling <kling@serenityos.org> | 2022-07-09 15:17:47 +0200 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2022-07-11 18:57:45 +0200 |
commit | 64959a85047d3c253692a8afdfb6f467fdb2fa6a (patch) | |
tree | bce302f4962f56dda53f602aefa303bbadea8fe0 /Userland/Libraries/LibWeb/Layout/LineBuilder.h | |
parent | 66d08d24173de26b38e647aa70353caf2e6cb64f (diff) | |
download | serenity-64959a85047d3c253692a8afdfb6f467fdb2fa6a.zip |
LibWeb: Express intrinsic size layout via size constraints
Previously, we had three layout modes:
- Normal:
- Everything uses the computed values from CSS.
- MinContent:
- Containing blocks act as if they have 0 width.
- All line breaking opportunities are taken.
- MaxContent:
- Containing blocks act as if they have infinite width.
- Only forced line breaks are accepted.
The above was based on a set of misunderstandings of CSS sizing.
A major problem with the above was that *all* containing blocks
behaved differently during intrinsic size layout, not just the
relevant one.
With this patch there are only two layout modes:
- Normal:
- Everything uses the computed values from CSS.
- IntrinsicSizeDetermination:
- One or more boxes have size constraints applied.
There are two size constraints per layout box, set here:
- FormattingState::NodeState::width_constraint
- FormattingState::NodeState::height_constraint
They are of type SizeConstraint and can be one of None, MinContent,
or MaxContent. The default is None.
When performing an IntrinsicSizeDetermination layout, we now assign
a size constraint to the box we're trying to determine the intrinsic
size of, which is then honored by using two new helpers to query
the dimensions of containing blocks:
- FormattingContext::containing_block_width_for(Box)
- FormattingContext::containing_block_height_for(Box)
If there's a relevant constraint in effect on the Box, the size of
its containing block is adjusted accordingly.
This is essentially an implementation of the "available space"
constraints from CSS-SIZING-3. I'm sure some things will break from
this, and we'll have to deal with that separately.
Spec: https://drafts.csswg.org/css-sizing-3/#available
Diffstat (limited to 'Userland/Libraries/LibWeb/Layout/LineBuilder.h')
-rw-r--r-- | Userland/Libraries/LibWeb/Layout/LineBuilder.h | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/Userland/Libraries/LibWeb/Layout/LineBuilder.h b/Userland/Libraries/LibWeb/Layout/LineBuilder.h index 0f28cfeb81..8efdbc2e42 100644 --- a/Userland/Libraries/LibWeb/Layout/LineBuilder.h +++ b/Userland/Libraries/LibWeb/Layout/LineBuilder.h @@ -23,9 +23,9 @@ public: void append_text_chunk(TextNode const&, size_t offset_in_node, size_t length_in_node, float leading_size, float trailing_size, float leading_margin, float trailing_margin, float content_width, float content_height); // Returns whether a line break occurred. - bool break_if_needed(LayoutMode layout_mode, float next_item_width) + bool break_if_needed(float next_item_width) { - if (should_break(layout_mode, next_item_width)) { + if (should_break(next_item_width)) { break_line(); return true; } @@ -45,7 +45,7 @@ public: private: void begin_new_line(bool increment_y); - bool should_break(LayoutMode, float next_item_width); + bool should_break(float next_item_width); LineBox& ensure_last_line_box(); |