1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 11:38:11 +00:00

LibWeb: Use LengthPercentage in CSS::GridSize

Using LengthPercentage instead of Length and Percentage separately
is going to allow GridSize to store calc() values. It also allows
to simplify some parts of layout code.
This commit is contained in:
Aliaksandr Kalenik 2023-05-10 22:38:44 +03:00 committed by Andreas Kling
parent 6a21bbb5b2
commit 7fee05e18c
3 changed files with 53 additions and 75 deletions

View file

@ -21,14 +21,12 @@ CSSPixels GridFormattingContext::resolve_definite_track_size(CSS::GridSize const
{
VERIFY(grid_size.is_definite());
switch (grid_size.type()) {
case CSS::GridSize::Type::Length:
if (grid_size.length().is_auto())
break;
return grid_size.length().to_px(grid_container());
case CSS::GridSize::Type::Percentage:
if (available_space.width.is_definite())
return grid_size.percentage().as_fraction() * available_space.width.to_px().value();
case CSS::GridSize::Type::LengthPercentage: {
if (!grid_size.length_percentage().is_auto()) {
return grid_size.css_size().to_px(grid_container(), available_space.width.to_px());
}
break;
}
default:
VERIFY_NOT_REACHED();
}
@ -621,14 +619,11 @@ void GridFormattingContext::initialize_track_sizes(AvailableSize const& availabl
switch (track.min_track_sizing_function.type()) {
// - A fixed sizing function
// Resolve to an absolute length and use that size as the tracks initial base size.
case CSS::GridSize::Type::Length: {
if (!track.min_track_sizing_function.length().is_auto())
track.base_size = track.min_track_sizing_function.length().to_px(grid_container());
break;
}
case CSS::GridSize::Type::Percentage: {
if (available_size.is_definite())
track.base_size = track.min_track_sizing_function.percentage().as_fraction() * available_size.to_px().value();
case CSS::GridSize::Type::LengthPercentage: {
if (!track.min_track_sizing_function.is_auto()) {
track.base_size = track.min_track_sizing_function.css_size().to_px(grid_container(), available_size.to_px());
}
break;
}
// - An intrinsic sizing function
@ -647,18 +642,12 @@ void GridFormattingContext::initialize_track_sizes(AvailableSize const& availabl
switch (track.max_track_sizing_function.type()) {
// - A fixed sizing function
// Resolve to an absolute length and use that size as the tracks initial growth limit.
case CSS::GridSize::Type::Length: {
if (!track.max_track_sizing_function.length().is_auto())
track.growth_limit = track.max_track_sizing_function.length().to_px(grid_container());
else
// - An intrinsic sizing function
// Use an initial growth limit of infinity.
case CSS::GridSize::Type::LengthPercentage: {
if (!track.max_track_sizing_function.is_auto()) {
track.growth_limit = track.max_track_sizing_function.css_size().to_px(grid_container(), available_size.to_px());
} else {
track.growth_limit = INFINITY;
break;
}
case CSS::GridSize::Type::Percentage: {
if (available_size.is_definite())
track.growth_limit = track.max_track_sizing_function.percentage().as_fraction() * available_size.to_px().value();
}
break;
}
// - A flexible sizing function
@ -766,9 +755,8 @@ void GridFormattingContext::resolve_intrinsic_track_sizes(GridDimension const di
}
track.base_size = base_size;
} break;
case CSS::GridSize::Type::Length:
case CSS::GridSize::Type::Percentage: {
if (track.min_track_sizing_function.length().is_auto() && available_size.is_intrinsic_sizing_constraint()) {
case CSS::GridSize::Type::LengthPercentage: {
if (track.min_track_sizing_function.is_auto() && available_size.is_intrinsic_sizing_constraint()) {
// If the track has an auto min track sizing function and the grid container is being sized under a
// min-/max-content constraint, set the tracks base size to the maximum of its items limited
// min-/max-content contributions (respectively), floored at zero. The limited min-/max-content
@ -823,7 +811,7 @@ void GridFormattingContext::resolve_intrinsic_track_sizes(GridDimension const di
growth_limit = max(growth_limit, calculate_item_min_content_contribution(item));
}
track.growth_limit = growth_limit;
} else if (max_track_sizing_function.is_max_content() || (max_track_sizing_function.is_length() && max_track_sizing_function.length().is_auto())) {
} else if (max_track_sizing_function.is_max_content() || max_track_sizing_function.is_auto()) {
// If the track has a max-content max track sizing function, set its growth limit to the maximum of
// the items max-content contributions. For fit-content() maximums, furthermore clamp this growth
// limit by the fit-content() argument.
@ -1142,19 +1130,19 @@ void GridFormattingContext::stretch_auto_tracks(AvailableSize const& available_s
// step instead.
CSSPixels used_space = 0;
for (auto& track : tracks) {
if (!(track.max_track_sizing_function.is_length() && track.max_track_sizing_function.length().is_auto()))
if (!track.max_track_sizing_function.is_auto())
used_space += track.base_size;
}
CSSPixels remaining_space = available_size.is_definite() ? available_size.to_px() - used_space : 0;
auto count_of_auto_max_sizing_tracks = 0;
for (auto& track : tracks) {
if (track.max_track_sizing_function.is_length() && track.max_track_sizing_function.length().is_auto())
if (track.max_track_sizing_function.is_auto())
count_of_auto_max_sizing_tracks++;
}
for (auto& track : tracks) {
if (track.max_track_sizing_function.is_length() && track.max_track_sizing_function.length().is_auto())
if (track.max_track_sizing_function.is_auto())
track.base_size = max(track.base_size, remaining_space / count_of_auto_max_sizing_tracks);
}
}