Bug 1174574 part 1 - [css-grid] Move the guts of nsGridContainerFrame::CalculateTrackSizes into a Tracks method. r=dholbert

This commit is contained in:
Mats Palmgren 2015-09-04 22:06:57 +02:00
parent 60bf6b5654
commit f91e1d63d8

View File

@ -231,7 +231,8 @@ struct MOZ_STACK_CLASS nsGridContainerFrame::Tracks
explicit Tracks(Dimension aDimension) : mDimension(aDimension) {} explicit Tracks(Dimension aDimension) : mDimension(aDimension) {}
void Initialize(const TrackSizingFunctions& aFunctions, void Initialize(const TrackSizingFunctions& aFunctions,
nscoord aPercentageBasis); uint32_t aNumTracks,
nscoord aContentBoxSize);
/** /**
* Return true if aRange spans at least one track with an intrinsic sizing * Return true if aRange spans at least one track with an intrinsic sizing
@ -574,6 +575,18 @@ struct MOZ_STACK_CLASS nsGridContainerFrame::Tracks
nsTArray<GridItemInfo>& aGridItems, nsTArray<GridItemInfo>& aGridItems,
const TrackSizingFunctions& aFunctions, const TrackSizingFunctions& aFunctions,
nscoord aAvailableSize); nscoord aAvailableSize);
/**
* Implements "12.3. Track Sizing Algorithm"
* http://dev.w3.org/csswg/css-grid/#algo-track-sizing
*/
void CalculateSizes(GridReflowState& aState,
nsTArray<GridItemInfo>& aGridItems,
const TrackSizingFunctions& aFunctions,
nscoord aContentSize,
LineRange GridArea::* aRange,
IntrinsicISizeType aConstraint);
#ifdef DEBUG #ifdef DEBUG
void Dump() const void Dump() const
{ {
@ -1598,9 +1611,18 @@ nsGridContainerFrame::TrackSize::Initialize(nscoord aPercentageBasis,
} }
void void
nsGridContainerFrame::Tracks::Initialize(const TrackSizingFunctions& aFunctions, nsGridContainerFrame::Tracks::Initialize(
nscoord aPercentageBasis) const TrackSizingFunctions& aFunctions,
uint32_t aNumTracks,
nscoord aContentBoxSize)
{ {
mSizes.SetLength(aNumTracks);
PodZero(mSizes.Elements(), mSizes.Length());
nscoord percentageBasis = aContentBoxSize;
if (percentageBasis == NS_UNCONSTRAINEDSIZE) {
percentageBasis = 0;
}
const uint32_t explicitGridOffset = aFunctions.mExplicitGridOffset; const uint32_t explicitGridOffset = aFunctions.mExplicitGridOffset;
MOZ_ASSERT(mSizes.Length() >= MOZ_ASSERT(mSizes.Length() >=
explicitGridOffset + aFunctions.mMinSizingFunctions.Length()); explicitGridOffset + aFunctions.mMinSizingFunctions.Length());
@ -1608,19 +1630,19 @@ nsGridContainerFrame::Tracks::Initialize(const TrackSizingFunctions& aFunctions,
aFunctions.mMaxSizingFunctions.Length()); aFunctions.mMaxSizingFunctions.Length());
uint32_t i = 0; uint32_t i = 0;
for (; i < explicitGridOffset; ++i) { for (; i < explicitGridOffset; ++i) {
mSizes[i].Initialize(aPercentageBasis, mSizes[i].Initialize(percentageBasis,
aFunctions.mAutoMinSizing, aFunctions.mAutoMinSizing,
aFunctions.mAutoMaxSizing); aFunctions.mAutoMaxSizing);
} }
uint32_t j = 0; uint32_t j = 0;
for (uint32_t len = aFunctions.mMinSizingFunctions.Length(); j < len; ++j) { for (uint32_t len = aFunctions.mMinSizingFunctions.Length(); j < len; ++j) {
mSizes[i + j].Initialize(aPercentageBasis, mSizes[i + j].Initialize(percentageBasis,
aFunctions.mMinSizingFunctions[j], aFunctions.mMinSizingFunctions[j],
aFunctions.mMaxSizingFunctions[j]); aFunctions.mMaxSizingFunctions[j]);
} }
i += j; i += j;
for (; i < mSizes.Length(); ++i) { for (; i < mSizes.Length(); ++i) {
mSizes[i].Initialize(aPercentageBasis, mSizes[i].Initialize(percentageBasis,
aFunctions.mAutoMinSizing, aFunctions.mAutoMinSizing,
aFunctions.mAutoMaxSizing); aFunctions.mAutoMaxSizing);
} }
@ -1716,43 +1738,46 @@ MaxContentContribution(nsIFrame* aChild,
nsLayoutUtils::PREF_ISIZE); nsLayoutUtils::PREF_ISIZE);
} }
void
nsGridContainerFrame::Tracks::CalculateSizes(
GridReflowState& aState,
nsTArray<GridItemInfo>& aGridItems,
const TrackSizingFunctions& aFunctions,
nscoord aContentBoxSize,
LineRange GridArea::* aRange,
IntrinsicISizeType aConstraint)
{
nscoord percentageBasis = aContentBoxSize;
if (percentageBasis == NS_UNCONSTRAINEDSIZE) {
percentageBasis = 0;
}
ResolveIntrinsicSize(aState, aGridItems, aFunctions, aRange, percentageBasis,
aConstraint);
if (aConstraint != nsLayoutUtils::MIN_ISIZE) {
DistributeFreeSpace(aContentBoxSize);
StretchFlexibleTracks(aState, aGridItems, aFunctions, aContentBoxSize);
}
}
void void
nsGridContainerFrame::CalculateTrackSizes(GridReflowState& aState, nsGridContainerFrame::CalculateTrackSizes(GridReflowState& aState,
const LogicalSize& aContentBox, const LogicalSize& aContentBox,
IntrinsicISizeType aConstraint) IntrinsicISizeType aConstraint)
{ {
aState.mCols.mSizes.SetLength(mGridColEnd);
PodZero(aState.mCols.mSizes.Elements(), aState.mCols.mSizes.Length());
const WritingMode& wm = aState.mWM; const WritingMode& wm = aState.mWM;
nscoord colPercentageBasis = aContentBox.ISize(wm); aState.mCols.Initialize(aState.mColFunctions, mGridColEnd,
auto& colFunctions = aState.mColFunctions; aContentBox.ISize(wm));
aState.mCols.Initialize(colFunctions, colPercentageBasis); aState.mRows.Initialize(aState.mRowFunctions, mGridRowEnd,
aState.mCols.ResolveIntrinsicSize(aState, mGridItems, colFunctions, aContentBox.BSize(wm));
&GridArea::mCols, colPercentageBasis,
aConstraint); aState.mCols.CalculateSizes(aState, mGridItems, aState.mColFunctions,
if (aConstraint != nsLayoutUtils::MIN_ISIZE) { aContentBox.ISize(wm), &GridArea::mCols,
nscoord size = aContentBox.ISize(wm); aConstraint);
aState.mCols.DistributeFreeSpace(size);
aState.mCols.StretchFlexibleTracks(aState, mGridItems, colFunctions, size);
}
aState.mRows.mSizes.SetLength(mGridRowEnd);
PodZero(aState.mRows.mSizes.Elements(), aState.mRows.mSizes.Length());
nscoord rowPercentageBasis = aContentBox.BSize(wm);
if (rowPercentageBasis == NS_AUTOHEIGHT) {
rowPercentageBasis = 0;
}
auto& rowFunctions = aState.mRowFunctions;
aState.mRows.Initialize(rowFunctions, rowPercentageBasis);
aState.mIter.Reset(); // XXX cleanup this Reset mess! aState.mIter.Reset(); // XXX cleanup this Reset mess!
aState.mRows.ResolveIntrinsicSize(aState, mGridItems, rowFunctions, aState.mRows.CalculateSizes(aState, mGridItems, aState.mRowFunctions,
&GridArea::mRows, rowPercentageBasis, aContentBox.BSize(wm), &GridArea::mRows,
aConstraint); aConstraint);
if (aConstraint != nsLayoutUtils::MIN_ISIZE) {
nscoord size = aContentBox.BSize(wm);
aState.mRows.DistributeFreeSpace(size);
aState.mRows.StretchFlexibleTracks(aState, mGridItems, rowFunctions, size);
}
} }
bool bool