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

LibWeb: Entirely and exactly distribute grids' extra space to tracks

Previously, the code assumed that in dividing up the space in the
affected tracks there would never be an overshoot. Instead, we can
check for each track how much extra space is left and never consume any
extra.

In the same way, we can ensure that all extra space is consumed by
distributing all remaining extra space starting from the first track.
Thus, if there is no growth limit, the space distribution should always
consume all the extra space.
This commit is contained in:
Zaggy1024 2023-09-04 08:21:15 -05:00 committed by Alexander Kalenik
parent eb7c2ee307
commit bd85e1b30b
4 changed files with 36 additions and 30 deletions

View file

@ -841,7 +841,7 @@ void GridFormattingContext::distribute_extra_space_across_spanned_tracks_base_si
auto extra_space = max(CSSPixels(0), item_size_contribution - spanned_tracks_sizes_sum);
// 2. Distribute space up to limits:
while (true) {
while (extra_space > 0) {
auto all_frozen = all_of(affected_tracks, [](auto const& track) { return track.base_size_frozen; });
if (all_frozen)
break;
@ -849,24 +849,22 @@ void GridFormattingContext::distribute_extra_space_across_spanned_tracks_base_si
// Find the item-incurred increase for each spanned track with an affected size by: distributing the space
// equally among such tracks, freezing a tracks item-incurred increase as its affected size + item-incurred
// increase reaches its limit
CSSPixels increase_per_track = extra_space / affected_tracks.size();
if (increase_per_track == 0)
break;
CSSPixels increase_per_track = max(extra_space / affected_tracks.size(), CSSPixels::smallest_positive_value());
for (auto& track : affected_tracks) {
if (track.base_size_frozen)
continue;
auto increase = min(increase_per_track, extra_space);
if (track.growth_limit.has_value()) {
auto maximum_increase = track.growth_limit.value() - track.base_size;
if (track.item_incurred_increase + increase_per_track >= maximum_increase) {
if (track.item_incurred_increase + increase >= maximum_increase) {
track.base_size_frozen = true;
track.item_incurred_increase = maximum_increase;
extra_space -= maximum_increase - track.item_incurred_increase;
continue;
increase = maximum_increase - track.item_incurred_increase;
}
}
track.item_incurred_increase += increase_per_track;
extra_space -= increase_per_track;
track.item_incurred_increase += increase;
extra_space -= increase;
}
}
@ -892,8 +890,11 @@ void GridFormattingContext::distribute_extra_space_across_spanned_tracks_base_si
// max-content max track sizing function; if there are no such tracks, then all affected tracks.
CSSPixels increase_per_track = extra_space / affected_tracks.size();
for (auto& track : affected_tracks)
track.item_incurred_increase += increase_per_track;
for (auto& track : affected_tracks) {
auto increase = min(increase_per_track, extra_space);
track.item_incurred_increase += increase;
extra_space -= increase;
}
}
// 4. For each affected track, if the tracks item-incurred increase is larger than the tracks planned increase