Skip to content

Commit

Permalink
Bug 1218178 part 3 - [css-grid][css-align] Implement ratio-preserving…
Browse files Browse the repository at this point in the history
… 'stretch' alignment for grid items with an intrinsic ratio. r=dholbert

w3c/csswg-drafts#523

UltraBlame original commit: 4e9d3d21f20db22985bf61346d03b40097bd47e3
  • Loading branch information
marco-c committed Sep 30, 2019
1 parent a2f77da commit c30cb5d
Showing 1 changed file with 53 additions and 6 deletions.
59 changes: 53 additions & 6 deletions layout/base/nsLayoutUtils.cpp
Expand Up @@ -5501,7 +5501,7 @@ nsLayoutUtils::ComputeSizeWithIntrinsicDimensions(WritingMode aWM,


const bool isAutoISize = inlineStyleCoord->GetUnit() == eStyleUnit_Auto;
bool isAutoBSize = IsAutoBSize(*blockStyleCoord, aCBSize.BSize(aWM));
const bool isAutoBSize = IsAutoBSize(*blockStyleCoord, aCBSize.BSize(aWM));

LogicalSize boxSizingAdjust(aWM);
if (stylePos->mBoxSizing == StyleBoxSizing::Border) {
Expand All @@ -5512,11 +5512,34 @@ nsLayoutUtils::ComputeSizeWithIntrinsicDimensions(WritingMode aWM,
boxSizingAdjust.ISize(aWM);

nscoord iSize, minISize, maxISize, bSize, minBSize, maxBSize;

bool stretchI = false;

bool stretchB = false;

if (!isAutoISize) {
iSize = nsLayoutUtils::ComputeISizeValue(aRenderingContext,
aFrame, aCBSize.ISize(aWM), boxSizingAdjust.ISize(aWM),
boxSizingToMarginEdgeISize, *inlineStyleCoord);
} else if (MOZ_UNLIKELY(isGridItem)) {
MOZ_ASSERT(!IS_TRUE_OVERFLOW_CONTAINER(aFrame));

auto cbSize = aCBSize.ISize(aWM);
if (cbSize != NS_UNCONSTRAINEDSIZE &&
!aFrame->StyleMargin()->HasInlineAxisAuto(aWM)) {
auto inlineAxisAlignment =
aWM.IsOrthogonalTo(aFrame->GetParent()->GetWritingMode()) ?
stylePos->UsedAlignSelf(aFrame->GetParent()->StyleContext()) :
stylePos->UsedJustifySelf(aFrame->GetParent()->StyleContext());
stretchI = inlineAxisAlignment == NS_STYLE_ALIGN_NORMAL ||
inlineAxisAlignment == NS_STYLE_ALIGN_STRETCH;
if (stretchI) {
iSize = std::max(nscoord(0), cbSize -
aPadding.ISize(aWM) -
aBorder.ISize(aWM) -
aMargin.ISize(aWM));
}
}
}

const nsStyleCoord& maxISizeCoord = stylePos->MaxISize(aWM);
Expand Down Expand Up @@ -5562,15 +5585,15 @@ nsLayoutUtils::ComputeSizeWithIntrinsicDimensions(WritingMode aWM,
!aFrame->StyleMargin()->HasBlockAxisAuto(aWM)) {
auto blockAxisAlignment =
!aWM.IsOrthogonalTo(aFrame->GetParent()->GetWritingMode()) ?
stylePos->UsedAlignSelf(aFrame->StyleContext()->GetParent()) :
stylePos->UsedJustifySelf(aFrame->StyleContext()->GetParent());
if (blockAxisAlignment == NS_STYLE_ALIGN_NORMAL ||
blockAxisAlignment == NS_STYLE_ALIGN_STRETCH) {
stylePos->UsedAlignSelf(aFrame->GetParent()->StyleContext()) :
stylePos->UsedJustifySelf(aFrame->GetParent()->StyleContext());
stretchB = blockAxisAlignment == NS_STYLE_ALIGN_NORMAL ||
blockAxisAlignment == NS_STYLE_ALIGN_STRETCH;
if (stretchB) {
bSize = std::max(nscoord(0), cbSize -
aPadding.BSize(aWM) -
aBorder.BSize(aWM) -
aMargin.BSize(aWM));
isAutoBSize = false;
}
}
}
Expand Down Expand Up @@ -5668,6 +5691,30 @@ nsLayoutUtils::ComputeSizeWithIntrinsicDimensions(WritingMode aWM,
}

if (aIntrinsicRatio != nsSize(0, 0)) {
if (stretchI || stretchB) {

if (stretchI && tentISize != iSize) {
tentISize = iSize;
if (logicalRatio.ISize(aWM) > 0) {
tentBSize = NSCoordMulDiv(iSize, logicalRatio.BSize(aWM), logicalRatio.ISize(aWM));
if (tentBSize > bSize && stretchB) {



tentBSize = bSize;
if (logicalRatio.BSize(aWM) > 0) {
tentISize = NSCoordMulDiv(bSize, logicalRatio.ISize(aWM), logicalRatio.BSize(aWM));
}
}
}
} else if (stretchB && tentBSize != bSize) {
tentBSize = bSize;
if (logicalRatio.BSize(aWM) > 0) {
tentISize = NSCoordMulDiv(bSize, logicalRatio.ISize(aWM), logicalRatio.BSize(aWM));
}
}
}

nsSize autoSize =
ComputeAutoSizeWithIntrinsicDimensions(minISize, minBSize,
maxISize, maxBSize,
Expand Down

0 comments on commit c30cb5d

Please sign in to comment.