Skip to content

Commit 7a51319

Browse files
improve code docs and use width for margin calculation
1 parent 69cf662 commit 7a51319

File tree

3 files changed

+35
-32
lines changed

3 files changed

+35
-32
lines changed

yoga/algorithm/grid/AutoPlacement.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ struct AutoPlacement {
232232
rowEnd,
233233
child
234234
};
235-
235+
// TODO: Optimise overlap check with a hash based alternative if necessary
236236
for (const auto& placedItem: gridItemAreas) {
237237
if (gridItemArea.overlaps(placedItem)) {
238238
columnStart++;

yoga/algorithm/grid/GridLayout.cpp

Lines changed: 31 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ void calculateGridLayoutInternal(Node* node,
117117
node,
118118
columnTracks,
119119
rowTracks,
120-
containerInnerWidth,
120+
containerInnerWidth,
121121
containerInnerHeight,
122122
itemAreas,
123123
widthSizingMode,
@@ -154,7 +154,8 @@ void calculateGridLayoutInternal(Node* node,
154154
Dimension::Height);
155155

156156

157-
// Final position
157+
// Layout grid items
158+
// Step 4: Lay out the grid items into their respective containing blocks. Each grid area’s width and height are considered definite for this purpose.
158159
if (performLayout) {
159160
auto gridWidth = trackSizing.getTotalBaseSize(Dimension::Width);
160161
auto gridHeight = trackSizing.getTotalBaseSize(Dimension::Height);
@@ -169,32 +170,32 @@ void calculateGridLayoutInternal(Node* node,
169170

170171
float gridInlineOffset = 0.0f;
171172
float betweenInlineOffset = 0.0f;
172-
if (gridWidth < containerInnerWidth) {
173-
float freeSpace = containerInnerWidth - gridWidth;
173+
float freeSpaceInlineAxis = containerInnerWidth - gridWidth;
174+
if (freeSpaceInlineAxis > 0.0f && !yoga::inexactEquals(freeSpaceInlineAxis, 0.0f)) {
174175
auto justifyContent = node->style().justifyContent();
175176
size_t numColumnTracks = columnTracks.size();
176177

177178
switch (justifyContent) {
178179
case Justify::Center:
179-
gridInlineOffset = freeSpace / 2.0f;
180+
gridInlineOffset = freeSpaceInlineAxis / 2.0f;
180181
break;
181182
case Justify::End:
182-
gridInlineOffset = freeSpace;
183+
gridInlineOffset = freeSpaceInlineAxis;
183184
break;
184185
case Justify::SpaceBetween:
185186
if (numColumnTracks > 1) {
186-
betweenInlineOffset = freeSpace / (numColumnTracks - 1);
187+
betweenInlineOffset = freeSpaceInlineAxis / (numColumnTracks - 1);
187188
}
188189
break;
189190
case Justify::SpaceAround:
190191
if (numColumnTracks > 0) {
191-
betweenInlineOffset = freeSpace / numColumnTracks;
192+
betweenInlineOffset = freeSpaceInlineAxis / numColumnTracks;
192193
gridInlineOffset = betweenInlineOffset / 2.0f;
193194
}
194195
break;
195196
case Justify::SpaceEvenly:
196197
if (numColumnTracks > 0) {
197-
betweenInlineOffset = freeSpace / (numColumnTracks + 1);
198+
betweenInlineOffset = freeSpaceInlineAxis / (numColumnTracks + 1);
198199
gridInlineOffset = betweenInlineOffset;
199200
}
200201
break;
@@ -210,32 +211,32 @@ void calculateGridLayoutInternal(Node* node,
210211

211212
float gridBlockOffset = 0.0f;
212213
float betweenBlockOffset = 0.0f;
213-
if (gridHeight < containerInnerHeight) {
214-
float freeSpace = containerInnerHeight - gridHeight;
214+
float freeSpaceBlockAxis = containerInnerHeight - gridHeight;
215+
if (freeSpaceBlockAxis > 0.0f && !yoga::inexactEquals(freeSpaceBlockAxis, 0.0f)) {
215216
auto alignContent = node->style().alignContent();
216217
size_t numRowTracks = rowTracks.size();
217218

218219
switch (alignContent) {
219220
case Align::Center:
220-
gridBlockOffset = freeSpace / 2.0f;
221+
gridBlockOffset = freeSpaceBlockAxis / 2.0f;
221222
break;
222223
case Align::End:
223-
gridBlockOffset = freeSpace;
224+
gridBlockOffset = freeSpaceBlockAxis;
224225
break;
225226
case Align::SpaceBetween:
226227
if (numRowTracks > 1) {
227-
betweenBlockOffset = freeSpace / (numRowTracks - 1);
228+
betweenBlockOffset = freeSpaceBlockAxis / (numRowTracks - 1);
228229
}
229230
break;
230231
case Align::SpaceAround:
231232
if (numRowTracks > 0) {
232-
betweenBlockOffset = freeSpace / numRowTracks;
233+
betweenBlockOffset = freeSpaceBlockAxis / numRowTracks;
233234
gridBlockOffset = betweenBlockOffset / 2.0f;
234235
}
235236
break;
236237
case Align::SpaceEvenly:
237238
if (numRowTracks > 0) {
238-
betweenBlockOffset = freeSpace / (numRowTracks + 1);
239+
betweenBlockOffset = freeSpaceBlockAxis / (numRowTracks + 1);
239240
gridBlockOffset = betweenBlockOffset;
240241
}
241242
break;
@@ -270,10 +271,10 @@ void calculateGridLayoutInternal(Node* node,
270271
}
271272
}
272273

273-
auto marginInlineStart = item.node->style().computeInlineStartMargin(FlexDirection::Row, direction, containingBlockWidth);
274-
auto marginInlineEnd = item.node->style().computeInlineEndMargin(FlexDirection::Row, direction, containingBlockWidth);
275-
auto marginBlockStart = item.node->style().computeInlineStartMargin(FlexDirection::Column, direction, containingBlockHeight);
276-
auto marginBlockEnd = item.node->style().computeInlineEndMargin(FlexDirection::Column, direction, containingBlockHeight);
274+
const auto marginInlineStart = item.node->style().computeInlineStartMargin(FlexDirection::Row, direction, containingBlockWidth);
275+
const auto marginInlineEnd = item.node->style().computeInlineEndMargin(FlexDirection::Row, direction, containingBlockWidth);
276+
const auto marginBlockStart = item.node->style().computeInlineStartMargin(FlexDirection::Column, direction, containingBlockWidth);
277+
const auto marginBlockEnd = item.node->style().computeInlineEndMargin(FlexDirection::Column, direction, containingBlockWidth);
277278

278279
auto justifySelf = item.node->style().justifySelf();
279280
if (justifySelf == Justify::Auto) {
@@ -290,14 +291,17 @@ void calculateGridLayoutInternal(Node* node,
290291
float childWidth = containingBlockWidth;
291292
float childHeight = containingBlockHeight;
292293

294+
// https://www.w3.org/TR/css-grid-1/#alignment
293295
// if justify-self or align-self compute to a value other than stretch or margins are auto,
294296
// grid items will auto-size to fit their content.
295-
bool hasMarginInlineAuto = item.node->style().flexStartMarginIsAuto(FlexDirection::Row, direction) || item.node->style().flexEndMarginIsAuto(FlexDirection::Row, direction);
297+
bool hasMarginInlineAuto = item.node->style().flexStartMarginIsAuto(FlexDirection::Row, direction)
298+
|| item.node->style().flexEndMarginIsAuto(FlexDirection::Row, direction);
296299
if (justifySelf != Justify::Stretch || hasMarginInlineAuto) {
297300
childWidthSizingMode = SizingMode::FitContent;
298301
}
299302

300-
bool hasMarginBlockAuto = item.node->style().flexStartMarginIsAuto(FlexDirection::Column, direction) || item.node->style().flexEndMarginIsAuto(FlexDirection::Column, direction);
303+
bool hasMarginBlockAuto = item.node->style().flexStartMarginIsAuto(FlexDirection::Column, direction)
304+
|| item.node->style().flexEndMarginIsAuto(FlexDirection::Column, direction);
301305
if (alignSelf != Align::Stretch || hasMarginBlockAuto) {
302306
childHeightSizingMode = SizingMode::FitContent;
303307
}
@@ -307,8 +311,7 @@ void calculateGridLayoutInternal(Node* node,
307311
direction,
308312
dimension(FlexDirection::Row),
309313
containingBlockWidth,
310-
containingBlockWidth
311-
).unwrap() + item.node->style().computeMarginForAxis(FlexDirection::Row, containingBlockWidth);
314+
containingBlockWidth).unwrap() + marginInlineStart + marginInlineEnd;
312315
childWidthSizingMode = SizingMode::StretchFit;
313316
}
314317

@@ -317,8 +320,7 @@ void calculateGridLayoutInternal(Node* node,
317320
direction,
318321
dimension(FlexDirection::Column),
319322
containingBlockHeight,
320-
containingBlockWidth
321-
).unwrap() + item.node->style().computeMarginForAxis(FlexDirection::Column, containingBlockWidth);
323+
containingBlockWidth).unwrap() + marginBlockStart + marginBlockEnd;
322324
childHeightSizingMode = SizingMode::StretchFit;
323325
}
324326

@@ -358,11 +360,13 @@ void calculateGridLayoutInternal(Node* node,
358360

359361
// since we know the item width and grid width, we can do the alignment here.
360362
// alignment of grid items happen in the grid area
361-
// TODO: confirm that measured dimension includes padding and border
363+
// measured dimension includes padding and border
362364
float actualItemWidth = item.node->getLayout().measuredDimension(Dimension::Width);
363365
auto freeSpaceInlineAxis = containingBlockWidth - actualItemWidth - marginInlineStart - marginInlineEnd;
364366
float leftAutoMarginOffset = 0.0f;
365367
float rightAutoMarginOffset = 0.0f;
368+
// https://www.w3.org/TR/css-grid-1/#auto-margins
369+
// auto margins in either axis absorb positive free space prior to alignment via the box alignment properties, thereby disabling the effects of any self-alignment properties in that axis.
366370
if (item.node->style().flexStartMarginIsAuto(FlexDirection::Row, direction)
367371
&& item.node->style().flexEndMarginIsAuto(FlexDirection::Row, direction)) {
368372
leftAutoMarginOffset = freeSpaceInlineAxis / 2;
@@ -376,7 +380,6 @@ void calculateGridLayoutInternal(Node* node,
376380
freeSpaceInlineAxis = 0.0f;
377381
}
378382

379-
// Justify self alignment
380383
float justifySelfOffset = 0.0f;
381384
if (justifySelf == Justify::End) {
382385
justifySelfOffset = freeSpaceInlineAxis;

yoga/algorithm/grid/TrackSizing.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -874,7 +874,7 @@ struct TrackSizing {
874874

875875
auto marginForAxis = item.node->style().computeMarginForAxis(
876876
dimension == Dimension::Width ? FlexDirection::Row : FlexDirection::Column,
877-
containingBlockSize);
877+
containingBlockWidth);
878878

879879
return minContentSize + marginForAxis;
880880
};
@@ -1150,13 +1150,13 @@ struct TrackSizing {
11501150
auto newMinimumSize = autoMinimumSize(item, dimension);
11511151
auto marginForAxis = item.node->style().computeMarginForAxis(
11521152
dimension == Dimension::Width ? FlexDirection::Row : FlexDirection::Column,
1153-
containingBlockSize);
1153+
containingBlockWidth);
11541154
return newMinimumSize + marginForAxis;
11551155
} else {
11561156
auto resolvedMinSize = minSize.resolve(containingBlockSize);
11571157
auto marginForAxis = item.node->style().computeMarginForAxis(
11581158
dimension == Dimension::Width ? FlexDirection::Row : FlexDirection::Column,
1159-
containingBlockSize);
1159+
containingBlockWidth);
11601160
return resolvedMinSize.unwrap() + marginForAxis;
11611161
}
11621162
} else {

0 commit comments

Comments
 (0)