mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 18:57:34 +00:00
LibWeb: Move FFC layout algorithm step 4 to a separate function
This commit is contained in:
parent
3375953918
commit
fa7bbc602d
2 changed files with 43 additions and 35 deletions
|
@ -127,41 +127,7 @@ void FlexFormattingContext::run(Box& flex_container, LayoutMode)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 4. Determine the main size of the flex container
|
// 4. Determine the main size of the flex container
|
||||||
if ((!main_is_constrained && main_size_is_infinite) || main_available_size == 0) {
|
determine_main_size_of_flex_container(flex_container, flex_items, main_is_constrained, main_size_is_infinite, main_available_size, main_min_size, main_max_size);
|
||||||
// Uses https://www.w3.org/TR/css-flexbox-1/#intrinsic-main-sizes
|
|
||||||
// 9.9.1
|
|
||||||
// 1.
|
|
||||||
float largest_max_content_flex_fraction = 0;
|
|
||||||
for (auto& flex_item : flex_items) {
|
|
||||||
// FIXME: This needs some serious work.
|
|
||||||
float max_content_contribution = calculated_main_size(flex_item.box);
|
|
||||||
float max_content_flex_fraction = max_content_contribution - flex_item.flex_base_size;
|
|
||||||
if (max_content_flex_fraction > 0) {
|
|
||||||
max_content_flex_fraction /= max(flex_item.box.computed_values().flex_grow_factor().value_or(1), 1.0f);
|
|
||||||
} else {
|
|
||||||
max_content_flex_fraction /= max(flex_item.box.computed_values().flex_shrink_factor().value_or(1), 1.0f) * flex_item.flex_base_size;
|
|
||||||
}
|
|
||||||
flex_item.max_content_flex_fraction = max_content_flex_fraction;
|
|
||||||
|
|
||||||
if (max_content_flex_fraction > largest_max_content_flex_fraction)
|
|
||||||
largest_max_content_flex_fraction = max_content_flex_fraction;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 2. Omitted
|
|
||||||
// 3.
|
|
||||||
float result = 0;
|
|
||||||
for (auto& flex_item : flex_items) {
|
|
||||||
auto product = 0;
|
|
||||||
if (flex_item.max_content_flex_fraction > 0) {
|
|
||||||
product = largest_max_content_flex_fraction * flex_item.box.computed_values().flex_grow_factor().value_or(1);
|
|
||||||
} else {
|
|
||||||
product = largest_max_content_flex_fraction * max(flex_item.box.computed_values().flex_shrink_factor().value_or(1), 1.0f) * flex_item.flex_base_size;
|
|
||||||
}
|
|
||||||
result += flex_item.flex_base_size + product;
|
|
||||||
}
|
|
||||||
main_available_size = clamp(result, main_min_size, main_max_size);
|
|
||||||
}
|
|
||||||
set_main_size(flex_container, main_available_size);
|
|
||||||
|
|
||||||
// 5. Collect flex items into flex lines:
|
// 5. Collect flex items into flex lines:
|
||||||
// After this step no additional items are to be added to flex_lines or any of its items!
|
// After this step no additional items are to be added to flex_lines or any of its items!
|
||||||
|
@ -915,4 +881,44 @@ void FlexFormattingContext::determine_flex_base_size_and_hypothetical_main_size(
|
||||||
flex_item.hypothetical_main_size = clamp(flex_item.flex_base_size, clamp_min, clamp_max);
|
flex_item.hypothetical_main_size = clamp(flex_item.flex_base_size, clamp_min, clamp_max);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// https://www.w3.org/TR/css-flexbox-1/#algo-main-container
|
||||||
|
void FlexFormattingContext::determine_main_size_of_flex_container(Box& flex_container, Vector<FlexItem>& flex_items, bool const main_is_constrained, bool const main_size_is_infinite, float& main_available_size, float const main_min_size, float const main_max_size)
|
||||||
|
{
|
||||||
|
if ((!main_is_constrained && main_size_is_infinite) || main_available_size == 0) {
|
||||||
|
// Uses https://www.w3.org/TR/css-flexbox-1/#intrinsic-main-sizes
|
||||||
|
// 9.9.1
|
||||||
|
// 1.
|
||||||
|
float largest_max_content_flex_fraction = 0;
|
||||||
|
for (auto& flex_item : flex_items) {
|
||||||
|
// FIXME: This needs some serious work.
|
||||||
|
float max_content_contribution = calculated_main_size(flex_item.box);
|
||||||
|
float max_content_flex_fraction = max_content_contribution - flex_item.flex_base_size;
|
||||||
|
if (max_content_flex_fraction > 0) {
|
||||||
|
max_content_flex_fraction /= max(flex_item.box.computed_values().flex_grow_factor().value_or(1), 1.0f);
|
||||||
|
} else {
|
||||||
|
max_content_flex_fraction /= max(flex_item.box.computed_values().flex_shrink_factor().value_or(1), 1.0f) * flex_item.flex_base_size;
|
||||||
|
}
|
||||||
|
flex_item.max_content_flex_fraction = max_content_flex_fraction;
|
||||||
|
|
||||||
|
if (max_content_flex_fraction > largest_max_content_flex_fraction)
|
||||||
|
largest_max_content_flex_fraction = max_content_flex_fraction;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. Omitted
|
||||||
|
// 3.
|
||||||
|
float result = 0;
|
||||||
|
for (auto& flex_item : flex_items) {
|
||||||
|
auto product = 0;
|
||||||
|
if (flex_item.max_content_flex_fraction > 0) {
|
||||||
|
product = largest_max_content_flex_fraction * flex_item.box.computed_values().flex_grow_factor().value_or(1);
|
||||||
|
} else {
|
||||||
|
product = largest_max_content_flex_fraction * max(flex_item.box.computed_values().flex_shrink_factor().value_or(1), 1.0f) * flex_item.flex_base_size;
|
||||||
|
}
|
||||||
|
result += flex_item.flex_base_size + product;
|
||||||
|
}
|
||||||
|
main_available_size = clamp(result, main_min_size, main_max_size);
|
||||||
|
}
|
||||||
|
set_main_size(flex_container, main_available_size);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -59,6 +59,8 @@ private:
|
||||||
float layout_for_maximum_main_size(Box&);
|
float layout_for_maximum_main_size(Box&);
|
||||||
void determine_flex_base_size_and_hypothetical_main_size(Box const& flex_container, FlexItem&);
|
void determine_flex_base_size_and_hypothetical_main_size(Box const& flex_container, FlexItem&);
|
||||||
|
|
||||||
|
void determine_main_size_of_flex_container(Box& flex_container, Vector<FlexItem>&, bool main_is_constrained, bool main_size_is_infinite, float& main_available_size, float main_min_size, float main_max_size);
|
||||||
|
|
||||||
bool is_row_layout() const { return m_flex_direction == CSS::FlexDirection::Row || m_flex_direction == CSS::FlexDirection::RowReverse; }
|
bool is_row_layout() const { return m_flex_direction == CSS::FlexDirection::Row || m_flex_direction == CSS::FlexDirection::RowReverse; }
|
||||||
|
|
||||||
CSS::FlexDirection m_flex_direction {};
|
CSS::FlexDirection m_flex_direction {};
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue