Add feature to use percentage as value unit #258
47
yoga/Yoga.c
47
yoga/Yoga.c
@@ -1141,7 +1141,7 @@ static void YGNodeComputeFlexBasisForChild(const YGNodeRef node,
|
|||||||
(YGIsExperimentalFeatureEnabled(YGExperimentalFeatureWebFlexBasis) &&
|
(YGIsExperimentalFeatureEnabled(YGExperimentalFeatureWebFlexBasis) &&
|
||||||
child->layout.computedFlexBasisGeneration != gCurrentGenerationCount)) {
|
child->layout.computedFlexBasisGeneration != gCurrentGenerationCount)) {
|
||||||
child->layout.computedFlexBasis =
|
child->layout.computedFlexBasis =
|
||||||
fmaxf(YGValueToFloat(YGNodeStyleGetFlexBasisWithUnit(child), mainAxisParentSize), YGNodePaddingAndBorderForAxis(child, mainAxis, mainAxisParentSize));
|
fmaxf(YGValueToFloat(YGNodeStyleGetFlexBasisWithUnit(child), mainAxisParentSize), YGNodePaddingAndBorderForAxis(child, mainAxis, parentWidth));
|
||||||
}
|
}
|
||||||
} else if (isMainAxisRow && isRowStyleDimDefined) {
|
} else if (isMainAxisRow && isRowStyleDimDefined) {
|
||||||
// The width is definite, so use that as the flex basis.
|
// The width is definite, so use that as the flex basis.
|
||||||
@@ -1152,7 +1152,7 @@ static void YGNodeComputeFlexBasisForChild(const YGNodeRef node,
|
|||||||
// The height is definite, so use that as the flex basis.
|
// The height is definite, so use that as the flex basis.
|
||||||
child->layout.computedFlexBasis =
|
child->layout.computedFlexBasis =
|
||||||
fmaxf(YGValueToFloat(child->style.dimensions[YGDimensionHeight], parentHeight),
|
fmaxf(YGValueToFloat(child->style.dimensions[YGDimensionHeight], parentHeight),
|
||||||
YGNodePaddingAndBorderForAxis(child, YGFlexDirectionColumn, parentHeight));
|
YGNodePaddingAndBorderForAxis(child, YGFlexDirectionColumn, parentWidth));
|
||||||
} else {
|
} else {
|
||||||
// Compute the flex basis and hypothetical main size (i.e. the clamped
|
// Compute the flex basis and hypothetical main size (i.e. the clamped
|
||||||
// flex basis).
|
// flex basis).
|
||||||
@@ -1213,7 +1213,7 @@ static void YGNodeComputeFlexBasisForChild(const YGNodeRef node,
|
|||||||
} else if (isMainAxisRow && childHeightMeasureMode == YGMeasureModeExactly) {
|
} else if (isMainAxisRow && childHeightMeasureMode == YGMeasureModeExactly) {
|
||||||
child->layout.computedFlexBasis =
|
child->layout.computedFlexBasis =
|
||||||
fmaxf(childHeight * child->style.aspectRatio,
|
fmaxf(childHeight * child->style.aspectRatio,
|
||||||
YGNodePaddingAndBorderForAxis(child, YGFlexDirectionRow, parentHeight));
|
YGNodePaddingAndBorderForAxis(child, YGFlexDirectionRow, parentWidth));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1240,7 +1240,7 @@ static void YGNodeComputeFlexBasisForChild(const YGNodeRef node,
|
|||||||
child->layout.computedFlexBasis =
|
child->layout.computedFlexBasis =
|
||||||
fmaxf(isMainAxisRow ? child->layout.measuredDimensions[YGDimensionWidth]
|
fmaxf(isMainAxisRow ? child->layout.measuredDimensions[YGDimensionWidth]
|
||||||
: child->layout.measuredDimensions[YGDimensionHeight],
|
: child->layout.measuredDimensions[YGDimensionHeight],
|
||||||
YGNodePaddingAndBorderForAxis(child, mainAxis, mainAxisParentSize));
|
YGNodePaddingAndBorderForAxis(child, mainAxis, parentWidth));
|
||||||
}
|
}
|
||||||
|
|
||||||
child->layout.computedFlexBasisGeneration = gCurrentGenerationCount;
|
child->layout.computedFlexBasisGeneration = gCurrentGenerationCount;
|
||||||
@@ -1380,7 +1380,7 @@ static void YGNodeWithMeasureFuncSetMeasuredDimensions(const YGNodeRef node,
|
|||||||
|
|
||||||
const float paddingAndBorderAxisRow = YGNodePaddingAndBorderForAxis(node, YGFlexDirectionRow, availableWidth);
|
const float paddingAndBorderAxisRow = YGNodePaddingAndBorderForAxis(node, YGFlexDirectionRow, availableWidth);
|
||||||
const float paddingAndBorderAxisColumn =
|
const float paddingAndBorderAxisColumn =
|
||||||
YGNodePaddingAndBorderForAxis(node, YGFlexDirectionColumn, availableHeight);
|
YGNodePaddingAndBorderForAxis(node, YGFlexDirectionColumn, availableWidth);
|
||||||
const float marginAxisRow = YGNodeMarginForAxis(node, YGFlexDirectionRow, availableWidth);
|
const float marginAxisRow = YGNodeMarginForAxis(node, YGFlexDirectionRow, availableWidth);
|
||||||
const float marginAxisColumn = YGNodeMarginForAxis(node, YGFlexDirectionColumn, availableWidth);
|
const float marginAxisColumn = YGNodeMarginForAxis(node, YGFlexDirectionColumn, availableWidth);
|
||||||
|
|
||||||
@@ -1433,7 +1433,7 @@ static void YGNodeEmptyContainerSetMeasuredDimensions(const YGNodeRef node,
|
|||||||
const float parentHeight) {
|
const float parentHeight) {
|
||||||
const float paddingAndBorderAxisRow = YGNodePaddingAndBorderForAxis(node, YGFlexDirectionRow, parentWidth);
|
const float paddingAndBorderAxisRow = YGNodePaddingAndBorderForAxis(node, YGFlexDirectionRow, parentWidth);
|
||||||
const float paddingAndBorderAxisColumn =
|
const float paddingAndBorderAxisColumn =
|
||||||
YGNodePaddingAndBorderForAxis(node, YGFlexDirectionColumn, parentHeight);
|
YGNodePaddingAndBorderForAxis(node, YGFlexDirectionColumn, parentWidth);
|
||||||
const float marginAxisRow = YGNodeMarginForAxis(node, YGFlexDirectionRow, parentWidth);
|
const float marginAxisRow = YGNodeMarginForAxis(node, YGFlexDirectionRow, parentWidth);
|
||||||
const float marginAxisColumn = YGNodeMarginForAxis(node, YGFlexDirectionColumn, parentWidth);
|
const float marginAxisColumn = YGNodeMarginForAxis(node, YGFlexDirectionColumn, parentWidth);
|
||||||
|
|
||||||
@@ -1463,7 +1463,7 @@ static bool YGNodeFixedSizeSetMeasuredDimensions(const YGNodeRef node,
|
|||||||
if ((widthMeasureMode == YGMeasureModeAtMost && availableWidth <= 0) ||
|
if ((widthMeasureMode == YGMeasureModeAtMost && availableWidth <= 0) ||
|
||||||
(heightMeasureMode == YGMeasureModeAtMost && availableHeight <= 0) ||
|
(heightMeasureMode == YGMeasureModeAtMost && availableHeight <= 0) ||
|
||||||
(widthMeasureMode == YGMeasureModeExactly && heightMeasureMode == YGMeasureModeExactly)) {
|
(widthMeasureMode == YGMeasureModeExactly && heightMeasureMode == YGMeasureModeExactly)) {
|
||||||
const float marginAxisColumn = YGNodeMarginForAxis(node, YGFlexDirectionColumn, parentHeight);
|
const float marginAxisColumn = YGNodeMarginForAxis(node, YGFlexDirectionColumn, parentWidth);
|
||||||
const float marginAxisRow = YGNodeMarginForAxis(node, YGFlexDirectionRow, parentWidth);
|
const float marginAxisRow = YGNodeMarginForAxis(node, YGFlexDirectionRow, parentWidth);
|
||||||
|
|
||||||
node->layout.measuredDimensions[YGDimensionWidth] =
|
node->layout.measuredDimensions[YGDimensionWidth] =
|
||||||
@@ -1478,7 +1478,7 @@ static bool YGNodeFixedSizeSetMeasuredDimensions(const YGNodeRef node,
|
|||||||
YGFlexDirectionColumn,
|
YGFlexDirectionColumn,
|
||||||
YGValueIsUndefinedf(availableHeight) || (heightMeasureMode == YGMeasureModeAtMost && availableHeight < 0)
|
YGValueIsUndefinedf(availableHeight) || (heightMeasureMode == YGMeasureModeAtMost && availableHeight < 0)
|
||||||
? 0
|
? 0
|
||||||
: availableHeight - marginAxisColumn, parentHeight, parentHeight);
|
: availableHeight - marginAxisColumn, parentHeight, parentWidth);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -1653,19 +1653,18 @@ static void YGNodelayoutImpl(const YGNodeRef node,
|
|||||||
YGNodeRef firstAbsoluteChild = NULL;
|
YGNodeRef firstAbsoluteChild = NULL;
|
||||||
YGNodeRef currentAbsoluteChild = NULL;
|
YGNodeRef currentAbsoluteChild = NULL;
|
||||||
|
|
||||||
const float leadingPaddingAndBorderMain = YGNodeLeadingPaddingAndBorder(node, mainAxis, mainAxisParentSize);
|
const float leadingPaddingAndBorderMain = YGNodeLeadingPaddingAndBorder(node, mainAxis, parentWidth);
|
||||||
const float trailingPaddingAndBorderMain = YGNodeTrailingPaddingAndBorder(node, mainAxis, mainAxisParentSize);
|
const float trailingPaddingAndBorderMain = YGNodeTrailingPaddingAndBorder(node, mainAxis, parentWidth);
|
||||||
const float leadingPaddingAndBorderCross = YGNodeLeadingPaddingAndBorder(node, crossAxis, crossAxisParentSize);
|
const float leadingPaddingAndBorderCross = YGNodeLeadingPaddingAndBorder(node, crossAxis, parentWidth);
|
||||||
const float paddingAndBorderAxisMain = YGNodePaddingAndBorderForAxis(node, mainAxis, mainAxisParentSize);
|
const float paddingAndBorderAxisMain = YGNodePaddingAndBorderForAxis(node, mainAxis, parentWidth);
|
||||||
const float paddingAndBorderAxisCross = YGNodePaddingAndBorderForAxis(node, crossAxis, crossAxisParentSize);
|
const float paddingAndBorderAxisCross = YGNodePaddingAndBorderForAxis(node, crossAxis, parentWidth);
|
||||||
|
|
||||||
const YGMeasureMode measureModeMainDim = isMainAxisRow ? widthMeasureMode : heightMeasureMode;
|
const YGMeasureMode measureModeMainDim = isMainAxisRow ? widthMeasureMode : heightMeasureMode;
|
||||||
const YGMeasureMode measureModeCrossDim = isMainAxisRow ? heightMeasureMode : widthMeasureMode;
|
const YGMeasureMode measureModeCrossDim = isMainAxisRow ? heightMeasureMode : widthMeasureMode;
|
||||||
|
|
||||||
const float paddingAndBorderAxisRow = YGNodePaddingAndBorderForAxis(node, YGFlexDirectionRow, parentHeight);
|
const float paddingAndBorderAxisRow = YGNodePaddingAndBorderForAxis(node, YGFlexDirectionRow, parentWidth);
|
||||||
const float paddingAndBorderAxisColumn =
|
const float paddingAndBorderAxisColumn = YGNodePaddingAndBorderForAxis(node, YGFlexDirectionColumn, parentWidth);
|
||||||
YGNodePaddingAndBorderForAxis(node, YGFlexDirectionColumn, parentHeight);
|
const float marginAxisRow = YGNodeMarginForAxis(node, YGFlexDirectionRow, parentWidth);
|
||||||
const float marginAxisRow = YGNodeMarginForAxis(node, YGFlexDirectionRow, parentHeight);
|
|
||||||
const float marginAxisColumn = YGNodeMarginForAxis(node, YGFlexDirectionColumn, parentWidth);
|
const float marginAxisColumn = YGNodeMarginForAxis(node, YGFlexDirectionColumn, parentWidth);
|
||||||
|
|
||||||
// STEP 2: DETERMINE AVAILABLE SIZE IN MAIN AND CROSS DIRECTIONS
|
// STEP 2: DETERMINE AVAILABLE SIZE IN MAIN AND CROSS DIRECTIONS
|
||||||
@@ -2022,7 +2021,7 @@ static void YGNodelayoutImpl(const YGNodeRef node,
|
|||||||
if (isMainAxisRow && childHeightMeasureMode != YGMeasureModeExactly) {
|
if (isMainAxisRow && childHeightMeasureMode != YGMeasureModeExactly) {
|
||||||
childHeight =
|
childHeight =
|
||||||
fmaxf(childWidth * currentRelativeChild->style.aspectRatio,
|
fmaxf(childWidth * currentRelativeChild->style.aspectRatio,
|
||||||
YGNodePaddingAndBorderForAxis(currentRelativeChild, YGFlexDirectionColumn, possibleNodeHeight));
|
YGNodePaddingAndBorderForAxis(currentRelativeChild, YGFlexDirectionColumn, possibleNodeWidth));
|
||||||
childHeightMeasureMode = YGMeasureModeExactly;
|
childHeightMeasureMode = YGMeasureModeExactly;
|
||||||
} else if (!isMainAxisRow && childWidthMeasureMode != YGMeasureModeExactly) {
|
} else if (!isMainAxisRow && childWidthMeasureMode != YGMeasureModeExactly) {
|
||||||
childWidth =
|
childWidth =
|
||||||
@@ -2144,12 +2143,12 @@ static void YGNodelayoutImpl(const YGNodeRef node,
|
|||||||
} else {
|
} else {
|
||||||
// The main dimension is the sum of all the elements dimension plus
|
// The main dimension is the sum of all the elements dimension plus
|
||||||
// the spacing.
|
// the spacing.
|
||||||
mainDim += betweenMainDim + YGNodeDimWithMargin(child, mainAxis, possibleNodeMainDim);
|
mainDim += betweenMainDim + YGNodeDimWithMargin(child, mainAxis, possibleNodeWidth);
|
||||||
|
|
||||||
// The cross dimension is the max of the elements dimension since
|
// The cross dimension is the max of the elements dimension since
|
||||||
// there
|
// there
|
||||||
// can only be one element in that cross dimension.
|
// can only be one element in that cross dimension.
|
||||||
crossDim = fmaxf(crossDim, YGNodeDimWithMargin(child, crossAxis, possibleNodeCrossDim));
|
crossDim = fmaxf(crossDim, YGNodeDimWithMargin(child, crossAxis, possibleNodeWidth));
|
||||||
}
|
}
|
||||||
} else if (performLayout) {
|
} else if (performLayout) {
|
||||||
child->layout.position[pos[mainAxis]] +=
|
child->layout.position[pos[mainAxis]] +=
|
||||||
@@ -2195,10 +2194,10 @@ static void YGNodelayoutImpl(const YGNodeRef node,
|
|||||||
if (YGNodeIsLeadingPosDefined(child, crossAxis)) {
|
if (YGNodeIsLeadingPosDefined(child, crossAxis)) {
|
||||||
child->layout.position[pos[crossAxis]] = YGNodeLeadingPosition(child, crossAxis, possibleNodeCrossDim) +
|
child->layout.position[pos[crossAxis]] = YGNodeLeadingPosition(child, crossAxis, possibleNodeCrossDim) +
|
||||||
YGNodeLeadingBorder(node, crossAxis) +
|
YGNodeLeadingBorder(node, crossAxis) +
|
||||||
YGNodeLeadingMargin(child, crossAxis, possibleNodeCrossDim);
|
YGNodeLeadingMargin(child, crossAxis, possibleNodeWidth);
|
||||||
} else {
|
} else {
|
||||||
child->layout.position[pos[crossAxis]] =
|
child->layout.position[pos[crossAxis]] =
|
||||||
YGNodeLeadingBorder(node, crossAxis) + YGNodeLeadingMargin(child, crossAxis, possibleNodeCrossDim);
|
YGNodeLeadingBorder(node, crossAxis) + YGNodeLeadingMargin(child, crossAxis, possibleNodeWidth);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
float leadingCrossDim = leadingPaddingAndBorderCross;
|
float leadingCrossDim = leadingPaddingAndBorderCross;
|
||||||
@@ -2260,7 +2259,7 @@ static void YGNodelayoutImpl(const YGNodeRef node,
|
|||||||
}
|
}
|
||||||
} else if (alignItem != YGAlignFlexStart) {
|
} else if (alignItem != YGAlignFlexStart) {
|
||||||
const float remainingCrossDim =
|
const float remainingCrossDim =
|
||||||
containerCrossAxis - YGNodeDimWithMargin(child, crossAxis, possibleNodeCrossDim);
|
containerCrossAxis - YGNodeDimWithMargin(child, crossAxis, possibleNodeWidth);
|
||||||
|
|
||||||
if (alignItem == YGAlignCenter) {
|
if (alignItem == YGAlignCenter) {
|
||||||
leadingCrossDim += remainingCrossDim / 2;
|
leadingCrossDim += remainingCrossDim / 2;
|
||||||
@@ -2354,7 +2353,7 @@ static void YGNodelayoutImpl(const YGNodeRef node,
|
|||||||
}
|
}
|
||||||
case YGAlignStretch: {
|
case YGAlignStretch: {
|
||||||
child->layout.position[pos[crossAxis]] =
|
child->layout.position[pos[crossAxis]] =
|
||||||
currentLead + YGNodeLeadingMargin(child, crossAxis, possibleNodeCrossDim);
|
currentLead + YGNodeLeadingMargin(child, crossAxis, possibleNodeWidth);
|
||||||
// TODO(prenaux): Correctly set the height of items with indefinite
|
// TODO(prenaux): Correctly set the height of items with indefinite
|
||||||
// (auto) crossAxis dimension.
|
// (auto) crossAxis dimension.
|
||||||
break;
|
break;
|
||||||
|
Reference in New Issue
Block a user