Bug 1968081 - Calculate percentage basis upfront when finding intrinsic sizes of grid items r=layout-grid-reviewers,dholbert

Differential Revision: https://phabricator.services.mozilla.com/D250834
This commit is contained in:
Emily McDonough
2025-05-23 21:09:27 +00:00
committed by emcdonough@mozilla.com
parent 9b27cb817b
commit a9167bd9d5

View File

@@ -5808,7 +5808,7 @@ static LogicalMargin SubgridAccumulatedMarginBorderPadding(
static nscoord ContentContribution(
const GridItemInfo& aGridItem, const GridReflowInput& aGridRI,
gfxContext* aRC, WritingMode aCBWM, LogicalAxis aAxis,
const Maybe<LogicalSize>& aPercentageBasis, IntrinsicISizeType aConstraint,
LogicalSize aPercentageBasis, IntrinsicISizeType aConstraint,
nscoord aMinSizeClamp = NS_MAXSIZE, uint32_t aFlags = 0) {
nsIFrame* child = aGridItem.mFrame;
@@ -5862,7 +5862,7 @@ static nscoord ContentContribution(
PhysicalAxis axis(aCBWM.PhysicalAxis(aAxis));
nscoord size = nsLayoutUtils::IntrinsicForAxis(
axis, aRC, child, aConstraint, aPercentageBasis,
axis, aRC, child, aConstraint, Some(aPercentageBasis),
aFlags | nsLayoutUtils::BAIL_IF_REFLOW_NEEDED, aMinSizeClamp);
auto childWM = child->GetWritingMode();
const bool isOrthogonal = childWM.IsOrthogonalTo(aCBWM);
@@ -5965,12 +5965,19 @@ static nscoord ContentContribution(
}
struct CachedIntrinsicSizes {
CachedIntrinsicSizes() = delete;
CachedIntrinsicSizes(LogicalSize aPercentageBasis)
: mPercentageBasis(aPercentageBasis) {}
CachedIntrinsicSizes(const GridItemInfo& aGridItem,
const GridReflowInput& aGridRI, const LogicalAxis aAxis)
: mPercentageBasis(aGridRI.PercentageBasisFor(aAxis, aGridItem)) {}
Maybe<nscoord> mMinSize;
Maybe<nscoord> mMinContentContribution;
Maybe<nscoord> mMaxContentContribution;
// The item's percentage basis for intrinsic sizing purposes.
Maybe<LogicalSize> mPercentageBasis;
const LogicalSize mPercentageBasis;
// "if the grid item spans only grid tracks that have a fixed max track
// sizing function, its automatic minimum size in that dimension is
@@ -5989,10 +5996,6 @@ static nscoord MinContentContribution(const GridItemInfo& aGridItem,
if (aCache->mMinContentContribution.isSome()) {
return aCache->mMinContentContribution.value();
}
if (aCache->mPercentageBasis.isNothing()) {
aCache->mPercentageBasis.emplace(
aGridRI.PercentageBasisFor(aAxis, aGridItem));
}
nscoord s = ContentContribution(
aGridItem, aGridRI, aRC, aCBWM, aAxis, aCache->mPercentageBasis,
IntrinsicISizeType::MinISize, aCache->mMinSizeClamp);
@@ -6008,10 +6011,6 @@ static nscoord MaxContentContribution(const GridItemInfo& aGridItem,
if (aCache->mMaxContentContribution.isSome()) {
return aCache->mMaxContentContribution.value();
}
if (aCache->mPercentageBasis.isNothing()) {
aCache->mPercentageBasis.emplace(
aGridRI.PercentageBasisFor(aAxis, aGridItem));
}
nscoord s = ContentContribution(
aGridItem, aGridRI, aRC, aCBWM, aAxis, aCache->mPercentageBasis,
IntrinsicISizeType::PrefISize, aCache->mMinSizeClamp);
@@ -6049,11 +6048,6 @@ static nscoord MinContribution(const GridItemInfo& aGridItem,
return s;
}
if (aCache->mPercentageBasis.isNothing()) {
aCache->mPercentageBasis.emplace(
aGridRI.PercentageBasisFor(aAxis, aGridItem));
}
// https://drafts.csswg.org/css-grid-2/#min-size-auto
// This calculates the min-content contribution from either a definite
// min-width (or min-height depending on aAxis), or the "specified /
@@ -6086,7 +6080,7 @@ static nscoord MinContribution(const GridItemInfo& aGridItem,
(aGridItem.mState[aAxis] & ItemState::eContentBasedAutoMinSize)) {
sz += nsLayoutUtils::MinSizeContributionForAxis(
axis, aRC, child, IntrinsicISizeType::MinISize,
*aCache->mPercentageBasis);
aCache->mPercentageBasis);
if ((axisInItemWM == LogicalAxis::Inline &&
nsIFrame::ToExtremumLength(*styleMinSize)) ||
@@ -6169,7 +6163,7 @@ void nsGridContainerFrame::Tracks::ResolveIntrinsicSizeForNonSpanningItems(
const LineRange& aRange, const GridItemInfo& aGridItem) {
gfxContext* rc = &aGridRI.mRenderingContext;
WritingMode wm = aGridRI.mWM;
CachedIntrinsicSizes cache;
CachedIntrinsicSizes cache{aGridItem, aGridRI, mAxis};
TrackSize& sz = mSizes[aRange.mStart];
// min sizing
@@ -6961,7 +6955,7 @@ void nsGridContainerFrame::Tracks::ResolveIntrinsicSize(
if (state &
(TrackSize::eIntrinsicMinSizing | TrackSize::eIntrinsicMaxSizing)) {
maxSpan = std::max(maxSpan, span);
CachedIntrinsicSizes cache;
CachedIntrinsicSizes cache{gridItem, aGridRI, mAxis};
// Calculate data for "Automatic Minimum Size" clamping, if needed.
if (TrackSize::IsDefiniteMaxSizing(state) &&
@@ -7268,9 +7262,10 @@ float nsGridContainerFrame::Tracks::FindUsedFlexFraction(
for (const GridItemInfo& item : aGridItems) {
if (item.mState[mAxis] & ItemState::eIsFlexing) {
// XXX optimize: bug 1194446
auto pb = Some(aGridRI.PercentageBasisFor(mAxis, item));
nscoord spaceToFill = ContentContribution(
item, aGridRI, rc, wm, mAxis, pb, IntrinsicISizeType::PrefISize);
const auto percentageBasis = aGridRI.PercentageBasisFor(mAxis, item);
nscoord spaceToFill =
ContentContribution(item, aGridRI, rc, wm, mAxis, percentageBasis,
IntrinsicISizeType::PrefISize);
const LineRange& range =
mAxis == LogicalAxis::Inline ? item.mArea.mCols : item.mArea.mRows;
MOZ_ASSERT(range.Extent() >= 1);
@@ -8977,7 +8972,7 @@ nscoord nsGridContainerFrame::MasonryLayout(GridReflowInput& aGridRI,
: IntrinsicISizeType::MinISize;
auto sz =
::ContentContribution(*item, aGridRI, &aGridRI.mRenderingContext,
wm, masonryAxis, Some(percentBasis), type);
wm, masonryAxis, percentBasis, type);
pos = sz + masonrySizes[masonryRange.mStart].mPosition;
}
pos += gap;