Skip to content

Commit 96d938f

Browse files
fast path for span 1 items
1 parent c9840a0 commit 96d938f

1 file changed

Lines changed: 33 additions & 1 deletion

File tree

yoga/algorithm/grid/TrackSizing.h

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -421,7 +421,39 @@ struct TrackSizing {
421421
auto endIndex = item.*endIndexKey;
422422
size_t span = endIndex - startIndex;
423423

424-
// span changed, start distributing space to intrinsic sizing tracks
424+
// 2. Size tracks to fit non-spanning items
425+
// https://www.w3.org/TR/css-grid-1/#algo-single-span-items
426+
if (span == 1) {
427+
auto& track = tracks[startIndex];
428+
auto itemConstraints = calculateItemConstraints(item, dimension);
429+
// For auto minimums:
430+
if (isAutoSizingFunction(track.minSizingFunction, containerSize)) {
431+
float contribution = sizingMode == SizingMode::MaxContent
432+
? getLimitedMinimumContentContribution(item, dimension, itemConstraints)
433+
: getMinimumContribution(item, dimension, itemConstraints);
434+
track.baseSize = std::max(track.baseSize, contribution);
435+
}
436+
437+
// For max-content maximums:
438+
if (isAutoSizingFunction(track.maxSizingFunction, containerSize)) {
439+
float contribution = getMaxContentContribution(item, dimension, itemConstraints);
440+
if (track.growthLimit == INFINITY) {
441+
track.growthLimit = contribution;
442+
} else {
443+
track.growthLimit = std::max(track.growthLimit, contribution);
444+
}
445+
}
446+
// In all cases, if a track’s growth limit is now less than its base size, increase the growth limit to match the base size.
447+
if (track.growthLimit < track.baseSize) {
448+
track.growthLimit = track.baseSize;
449+
}
450+
previousSpan = span;
451+
452+
continue;
453+
}
454+
455+
// 3. Increase sizes to accommodate spanning items crossing content-sized tracks:
456+
// https://www.w3.org/TR/css-grid-1/#algo-spanning-items
425457
if (span > previousSpan) {
426458
distributeSpaceToTracksForItemsWithTheSameSpan();
427459
previousSpan = span;

0 commit comments

Comments
 (0)