mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-09-20 17:58:18 +03:00
LibWeb: Move FFC layout algorithm step 8 to a separate function
This commit is contained in:
parent
3402584646
commit
8f027b4792
Notes:
sideshowbarker
2024-07-18 02:46:31 +09:00
Author: https://github.com/awesomekling Commit: https://github.com/SerenityOS/serenity/commit/8f027b47920
@ -109,33 +109,7 @@ void FlexFormattingContext::run(Box& flex_container, LayoutMode)
|
||||
}
|
||||
|
||||
// 8. Calculate the cross size of each flex line.
|
||||
if (flex_lines.size() == 1 && has_definite_cross_size(flex_container)) {
|
||||
flex_lines[0].cross_size = specified_cross_size(flex_container);
|
||||
} else {
|
||||
for (auto& flex_line : flex_lines) {
|
||||
// FIXME: Implement 8.1
|
||||
|
||||
// FIXME: This isn't spec but makes sense here
|
||||
if (has_definite_cross_size(flex_container) && flex_container.computed_values().align_items() == CSS::AlignItems::Stretch) {
|
||||
flex_line.cross_size = specified_cross_size(flex_container) / flex_lines.size();
|
||||
continue;
|
||||
}
|
||||
|
||||
// 8.2
|
||||
float largest_hypothetical_cross_size = 0;
|
||||
for (auto& flex_item : flex_line.items) {
|
||||
if (largest_hypothetical_cross_size < flex_item->hypothetical_cross_size_with_margins())
|
||||
largest_hypothetical_cross_size = flex_item->hypothetical_cross_size_with_margins();
|
||||
}
|
||||
|
||||
// 8.3
|
||||
flex_line.cross_size = max(0.0f, largest_hypothetical_cross_size);
|
||||
}
|
||||
|
||||
if (flex_lines.size() == 1) {
|
||||
clamp(flex_lines[0].cross_size, cross_min_size, cross_max_size);
|
||||
}
|
||||
}
|
||||
calculate_cross_size_of_each_flex_line(flex_container, flex_lines, cross_min_size, cross_max_size);
|
||||
|
||||
// 9. Handle 'align-content: stretch'.
|
||||
// FIXME: This
|
||||
@ -930,6 +904,38 @@ float FlexFormattingContext::determine_hypothetical_cross_size_of_item(Box& box)
|
||||
BlockFormattingContext context(verify_cast<BlockContainer>(box), this);
|
||||
context.compute_width(box);
|
||||
return box.width();
|
||||
};
|
||||
}
|
||||
|
||||
// https://www.w3.org/TR/css-flexbox-1/#algo-cross-line
|
||||
void FlexFormattingContext::calculate_cross_size_of_each_flex_line(const Box& flex_container, Vector<FlexLine>& flex_lines, float cross_min_size, float cross_max_size)
|
||||
{
|
||||
if (flex_lines.size() == 1 && has_definite_cross_size(flex_container)) {
|
||||
flex_lines[0].cross_size = specified_cross_size(flex_container);
|
||||
} else {
|
||||
for (auto& flex_line : flex_lines) {
|
||||
// FIXME: Implement 8.1
|
||||
|
||||
// FIXME: This isn't spec but makes sense here
|
||||
if (has_definite_cross_size(flex_container) && flex_container.computed_values().align_items() == CSS::AlignItems::Stretch) {
|
||||
flex_line.cross_size = specified_cross_size(flex_container) / flex_lines.size();
|
||||
continue;
|
||||
}
|
||||
|
||||
// 8.2
|
||||
float largest_hypothetical_cross_size = 0;
|
||||
for (auto& flex_item : flex_line.items) {
|
||||
if (largest_hypothetical_cross_size < flex_item->hypothetical_cross_size_with_margins())
|
||||
largest_hypothetical_cross_size = flex_item->hypothetical_cross_size_with_margins();
|
||||
}
|
||||
|
||||
// 8.3
|
||||
flex_line.cross_size = max(0.0f, largest_hypothetical_cross_size);
|
||||
}
|
||||
|
||||
if (flex_lines.size() == 1) {
|
||||
clamp(flex_lines[0].cross_size, cross_min_size, cross_max_size);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -68,6 +68,8 @@ private:
|
||||
|
||||
float determine_hypothetical_cross_size_of_item(Box&);
|
||||
|
||||
void calculate_cross_size_of_each_flex_line(Box const& flex_container, Vector<FlexLine>&, float cross_min_size, float cross_max_size);
|
||||
|
||||
bool is_row_layout() const { return m_flex_direction == CSS::FlexDirection::Row || m_flex_direction == CSS::FlexDirection::RowReverse; }
|
||||
|
||||
CSS::FlexDirection m_flex_direction {};
|
||||
|
Loading…
Reference in New Issue
Block a user