Skip to content

Commit ac1c8c2

Browse files
Refactored the flexbox step to determine available space in main and cross dim
Reviewed By: emilsjolander Differential Revision: D6693777 fbshipit-source-id: d6c87670e74bdc22b32916c2d77fe423d831b378
1 parent 5264832 commit ac1c8c2

File tree

1 file changed

+38
-13
lines changed

1 file changed

+38
-13
lines changed

ReactCommon/yoga/yoga/Yoga.cpp

+38-13
Original file line numberDiff line numberDiff line change
@@ -1557,6 +1557,39 @@ static void YGZeroOutLayoutRecursivly(const YGNodeRef node) {
15571557
}
15581558
}
15591559

1560+
static float YGNodeCalculateAvailableInnerDim(
1561+
const YGNodeRef node,
1562+
YGFlexDirection axis,
1563+
float availableDim,
1564+
float parentDim) {
1565+
YGFlexDirection direction =
1566+
YGFlexDirectionIsRow(axis) ? YGFlexDirectionRow : YGFlexDirectionColumn;
1567+
YGDimension dimension =
1568+
YGFlexDirectionIsRow(axis) ? YGDimensionWidth : YGDimensionHeight;
1569+
1570+
const float margin = YGNodeMarginForAxis(node, direction, parentDim);
1571+
const float paddingAndBorder =
1572+
YGNodePaddingAndBorderForAxis(node, direction, parentDim);
1573+
1574+
float availableInnerDim = availableDim - margin - paddingAndBorder;
1575+
// Max dimension overrides predefined dimension value; Min dimension in turn
1576+
// overrides both of the above
1577+
if (!YGFloatIsUndefined(availableInnerDim)) {
1578+
// We want to make sure our available height does not violate min and max
1579+
// constraints
1580+
const float minInnerDim =
1581+
YGResolveValue(node->getStyle().minDimensions[dimension], parentDim) -
1582+
paddingAndBorder;
1583+
const float maxInnerDim =
1584+
YGResolveValue(node->getStyle().maxDimensions[dimension], parentDim) -
1585+
paddingAndBorder;
1586+
availableInnerDim =
1587+
fmaxf(fminf(availableInnerDim, maxInnerDim), minInnerDim);
1588+
}
1589+
1590+
return availableInnerDim;
1591+
}
1592+
15601593
//
15611594
// This is the main routine that implements a subset of the flexbox layout
15621595
// algorithm
@@ -1775,7 +1808,6 @@ static void YGNodelayoutImpl(const YGNodeRef node,
17751808
const float marginAxisRow = YGNodeMarginForAxis(node, YGFlexDirectionRow, parentWidth);
17761809
const float marginAxisColumn = YGNodeMarginForAxis(node, YGFlexDirectionColumn, parentWidth);
17771810

1778-
// STEP 2: DETERMINE AVAILABLE SIZE IN MAIN AND CROSS DIRECTIONS
17791811
const float minInnerWidth =
17801812
YGResolveValue(
17811813
node->getStyle().minDimensions[YGDimensionWidth], parentWidth) -
@@ -1795,19 +1827,12 @@ static void YGNodelayoutImpl(const YGNodeRef node,
17951827
const float minInnerMainDim = isMainAxisRow ? minInnerWidth : minInnerHeight;
17961828
const float maxInnerMainDim = isMainAxisRow ? maxInnerWidth : maxInnerHeight;
17971829

1798-
// Max dimension overrides predefined dimension value; Min dimension in turn overrides both of the
1799-
// above
1800-
float availableInnerWidth = availableWidth - marginAxisRow - paddingAndBorderAxisRow;
1801-
if (!YGFloatIsUndefined(availableInnerWidth)) {
1802-
// We want to make sure our available width does not violate min and max constraints
1803-
availableInnerWidth = fmaxf(fminf(availableInnerWidth, maxInnerWidth), minInnerWidth);
1804-
}
1830+
// STEP 2: DETERMINE AVAILABLE SIZE IN MAIN AND CROSS DIRECTIONS
18051831

1806-
float availableInnerHeight = availableHeight - marginAxisColumn - paddingAndBorderAxisColumn;
1807-
if (!YGFloatIsUndefined(availableInnerHeight)) {
1808-
// We want to make sure our available height does not violate min and max constraints
1809-
availableInnerHeight = fmaxf(fminf(availableInnerHeight, maxInnerHeight), minInnerHeight);
1810-
}
1832+
float availableInnerWidth = YGNodeCalculateAvailableInnerDim(
1833+
node, YGFlexDirectionRow, availableWidth, parentWidth);
1834+
float availableInnerHeight = YGNodeCalculateAvailableInnerDim(
1835+
node, YGFlexDirectionColumn, availableHeight, parentHeight);
18111836

18121837
float availableInnerMainDim = isMainAxisRow ? availableInnerWidth : availableInnerHeight;
18131838
const float availableInnerCrossDim = isMainAxisRow ? availableInnerHeight : availableInnerWidth;

0 commit comments

Comments
 (0)