From aac7b19a7cfe9cb74c5aea824357cce99f7070db Mon Sep 17 00:00:00 2001 From: Emil Sjolander Date: Sat, 11 Feb 2017 05:26:55 -0800 Subject: [PATCH] Fix min/max not overriding width/height Differential Revision: D4537576 fbshipit-source-id: c003f723f424afbca63170d41e54fd5ff837926d --- ReactCommon/yoga/yoga/YGEnums.h | 111 +++++++++++++++++++------------- ReactCommon/yoga/yoga/Yoga.c | 48 +++++++------- 2 files changed, 90 insertions(+), 69 deletions(-) diff --git a/ReactCommon/yoga/yoga/YGEnums.h b/ReactCommon/yoga/yoga/YGEnums.h index b4efc9cc5..3e65e1035 100644 --- a/ReactCommon/yoga/yoga/YGEnums.h +++ b/ReactCommon/yoga/yoga/YGEnums.h @@ -15,21 +15,26 @@ YG_EXTERN_C_BEGIN #define YGAlignCount 6 typedef YG_ENUM_BEGIN(YGAlign) { - YGAlignAuto, YGAlignFlexStart, YGAlignCenter, YGAlignFlexEnd, YGAlignStretch, YGAlignBaseline, -} -YG_ENUM_END(YGAlign); + YGAlignAuto, + YGAlignFlexStart, + YGAlignCenter, + YGAlignFlexEnd, + YGAlignStretch, + YGAlignBaseline, +} YG_ENUM_END(YGAlign); #define YGDimensionCount 2 typedef YG_ENUM_BEGIN(YGDimension) { - YGDimensionWidth, YGDimensionHeight, -} -YG_ENUM_END(YGDimension); + YGDimensionWidth, + YGDimensionHeight, +} YG_ENUM_END(YGDimension); #define YGDirectionCount 3 typedef YG_ENUM_BEGIN(YGDirection) { - YGDirectionInherit, YGDirectionLTR, YGDirectionRTL, -} -YG_ENUM_END(YGDirection); + YGDirectionInherit, + YGDirectionLTR, + YGDirectionRTL, +} YG_ENUM_END(YGDirection); #define YGDisplayCount 2 typedef YG_ENUM_BEGIN(YGDisplay) { @@ -39,71 +44,87 @@ typedef YG_ENUM_BEGIN(YGDisplay) { #define YGEdgeCount 9 typedef YG_ENUM_BEGIN(YGEdge) { - YGEdgeLeft, YGEdgeTop, YGEdgeRight, YGEdgeBottom, YGEdgeStart, YGEdgeEnd, YGEdgeHorizontal, - YGEdgeVertical, YGEdgeAll, -} -YG_ENUM_END(YGEdge); + YGEdgeLeft, + YGEdgeTop, + YGEdgeRight, + YGEdgeBottom, + YGEdgeStart, + YGEdgeEnd, + YGEdgeHorizontal, + YGEdgeVertical, + YGEdgeAll, +} YG_ENUM_END(YGEdge); #define YGExperimentalFeatureCount 2 typedef YG_ENUM_BEGIN(YGExperimentalFeature) { - YGExperimentalFeatureRounding, YGExperimentalFeatureWebFlexBasis, -} -YG_ENUM_END(YGExperimentalFeature); + YGExperimentalFeatureRounding, + YGExperimentalFeatureWebFlexBasis, +} YG_ENUM_END(YGExperimentalFeature); #define YGFlexDirectionCount 4 typedef YG_ENUM_BEGIN(YGFlexDirection) { - YGFlexDirectionColumn, YGFlexDirectionColumnReverse, YGFlexDirectionRow, - YGFlexDirectionRowReverse, -} -YG_ENUM_END(YGFlexDirection); + YGFlexDirectionColumn, + YGFlexDirectionColumnReverse, + YGFlexDirectionRow, + YGFlexDirectionRowReverse, +} YG_ENUM_END(YGFlexDirection); #define YGJustifyCount 5 typedef YG_ENUM_BEGIN(YGJustify) { - YGJustifyFlexStart, YGJustifyCenter, YGJustifyFlexEnd, YGJustifySpaceBetween, - YGJustifySpaceAround, -} -YG_ENUM_END(YGJustify); + YGJustifyFlexStart, + YGJustifyCenter, + YGJustifyFlexEnd, + YGJustifySpaceBetween, + YGJustifySpaceAround, +} YG_ENUM_END(YGJustify); #define YGLogLevelCount 5 typedef YG_ENUM_BEGIN(YGLogLevel) { - YGLogLevelError, YGLogLevelWarn, YGLogLevelInfo, YGLogLevelDebug, YGLogLevelVerbose, -} -YG_ENUM_END(YGLogLevel); + YGLogLevelError, + YGLogLevelWarn, + YGLogLevelInfo, + YGLogLevelDebug, + YGLogLevelVerbose, +} YG_ENUM_END(YGLogLevel); #define YGMeasureModeCount 3 typedef YG_ENUM_BEGIN(YGMeasureMode) { - YGMeasureModeUndefined, YGMeasureModeExactly, YGMeasureModeAtMost, -} -YG_ENUM_END(YGMeasureMode); + YGMeasureModeUndefined, + YGMeasureModeExactly, + YGMeasureModeAtMost, +} YG_ENUM_END(YGMeasureMode); #define YGOverflowCount 3 typedef YG_ENUM_BEGIN(YGOverflow) { - YGOverflowVisible, YGOverflowHidden, YGOverflowScroll, -} -YG_ENUM_END(YGOverflow); + YGOverflowVisible, + YGOverflowHidden, + YGOverflowScroll, +} YG_ENUM_END(YGOverflow); #define YGPositionTypeCount 2 typedef YG_ENUM_BEGIN(YGPositionType) { - YGPositionTypeRelative, YGPositionTypeAbsolute, -} -YG_ENUM_END(YGPositionType); + YGPositionTypeRelative, + YGPositionTypeAbsolute, +} YG_ENUM_END(YGPositionType); #define YGPrintOptionsCount 3 typedef YG_ENUM_BEGIN(YGPrintOptions) { - YGPrintOptionsLayout = 1, YGPrintOptionsStyle = 2, YGPrintOptionsChildren = 4, -} -YG_ENUM_END(YGPrintOptions); + YGPrintOptionsLayout = 1, + YGPrintOptionsStyle = 2, + YGPrintOptionsChildren = 4, +} YG_ENUM_END(YGPrintOptions); #define YGUnitCount 3 typedef YG_ENUM_BEGIN(YGUnit) { - YGUnitUndefined, YGUnitPixel, YGUnitPercent, -} -YG_ENUM_END(YGUnit); + YGUnitUndefined, + YGUnitPixel, + YGUnitPercent, +} YG_ENUM_END(YGUnit); #define YGWrapCount 2 typedef YG_ENUM_BEGIN(YGWrap) { - YGWrapNoWrap, YGWrapWrap, -} -YG_ENUM_END(YGWrap); + YGWrapNoWrap, + YGWrapWrap, +} YG_ENUM_END(YGWrap); YG_EXTERN_C_END diff --git a/ReactCommon/yoga/yoga/Yoga.c b/ReactCommon/yoga/yoga/Yoga.c index 3bd71471c..a6dde07d5 100644 --- a/ReactCommon/yoga/yoga/Yoga.c +++ b/ReactCommon/yoga/yoga/Yoga.c @@ -641,13 +641,11 @@ static inline bool YGValueEqual(const YGValue a, const YGValue b) { static inline void YGResolveDimensions(YGNodeRef node) { for (YGDimension dim = YGDimensionWidth; dim <= YGDimensionHeight; dim++) { - if (node->style.dimensions[dim].unit != YGUnitUndefined) { - node->resolvedDimensions[dim] = node->style.dimensions[dim]; + if (node->style.maxDimensions[dim].unit != YGUnitUndefined && + YGValueEqual(node->style.maxDimensions[dim], node->style.minDimensions[dim])) { + node->resolvedDimensions[dim] = node->style.maxDimensions[dim]; } else { - if (node->style.maxDimensions[dim].unit != YGUnitUndefined && - YGValueEqual(node->style.maxDimensions[dim], node->style.minDimensions[dim])) { - node->resolvedDimensions[dim] = node->style.maxDimensions[dim]; - } + node->resolvedDimensions[dim] = node->style.dimensions[dim]; } } } @@ -1167,14 +1165,13 @@ static float YGNodeBoundAxisWithinMinAndMax(const YGNodeRef node, const float axisSize) { float min = YGUndefined; float max = YGUndefined; - if (!YGNodeIsStyleDimDefined(node, axis, axisSize)) { - if (YGFlexDirectionIsColumn(axis)) { - min = YGValueResolve(&node->style.minDimensions[YGDimensionHeight], axisSize); - max = YGValueResolve(&node->style.maxDimensions[YGDimensionHeight], axisSize); - } else if (YGFlexDirectionIsRow(axis)) { - min = YGValueResolve(&node->style.minDimensions[YGDimensionWidth], axisSize); - max = YGValueResolve(&node->style.maxDimensions[YGDimensionWidth], axisSize); - } + + if (YGFlexDirectionIsColumn(axis)) { + min = YGValueResolve(&node->style.minDimensions[YGDimensionHeight], axisSize); + max = YGValueResolve(&node->style.maxDimensions[YGDimensionHeight], axisSize); + } else if (YGFlexDirectionIsRow(axis)) { + min = YGValueResolve(&node->style.minDimensions[YGDimensionWidth], axisSize); + max = YGValueResolve(&node->style.maxDimensions[YGDimensionWidth], axisSize); } float boundValue = value; @@ -1545,7 +1542,9 @@ static void YGNodeWithMeasureFuncSetMeasuredDimensions(const YGNodeRef node, const float availableWidth, const float availableHeight, const YGMeasureMode widthMeasureMode, - const YGMeasureMode heightMeasureMode) { + const YGMeasureMode heightMeasureMode, + const float parentWidth, + const float parentHeight) { YG_ASSERT(node->measure, "Expected node to have custom measure function"); const float paddingAndBorderAxisRow = @@ -1561,13 +1560,9 @@ static void YGNodeWithMeasureFuncSetMeasuredDimensions(const YGNodeRef node, if (widthMeasureMode == YGMeasureModeExactly && heightMeasureMode == YGMeasureModeExactly) { // Don't bother sizing the text if both dimensions are already defined. node->layout.measuredDimensions[YGDimensionWidth] = YGNodeBoundAxis( - node, YGFlexDirectionRow, availableWidth - marginAxisRow, availableWidth, availableWidth); - node->layout.measuredDimensions[YGDimensionHeight] = - YGNodeBoundAxis(node, - YGFlexDirectionColumn, - availableHeight - marginAxisColumn, - availableHeight, - availableWidth); + node, YGFlexDirectionRow, availableWidth - marginAxisRow, parentWidth, parentWidth); + node->layout.measuredDimensions[YGDimensionHeight] = YGNodeBoundAxis( + node, YGFlexDirectionColumn, availableHeight - marginAxisColumn, parentHeight, parentWidth); } else if (innerWidth <= 0.0f || innerHeight <= 0.0f) { // Don't bother sizing the text if there's no horizontal or vertical // space. @@ -1841,8 +1836,13 @@ static void YGNodelayoutImpl(const YGNodeRef node, YGNodeTrailingPadding(node, flexColumnDirection, parentWidth); if (node->measure) { - YGNodeWithMeasureFuncSetMeasuredDimensions( - node, availableWidth, availableHeight, widthMeasureMode, heightMeasureMode); + YGNodeWithMeasureFuncSetMeasuredDimensions(node, + availableWidth, + availableHeight, + widthMeasureMode, + heightMeasureMode, + parentWidth, + parentHeight); return; }