From cb3529800ab903f72e380cfcb9348d16a6fab243 Mon Sep 17 00:00:00 2001 From: Georgiy Kassabli Date: Tue, 28 Feb 2017 16:27:18 -0800 Subject: [PATCH] Yoga test failure for flexing with min stack dimension Reviewed By: emilsjolander Differential Revision: D4558653 fbshipit-source-id: 06b38d7ed43aee063cc881f38b84558641f043f3 --- .../com/facebook/yoga/YogaExperimentalFeature.java | 4 +++- ReactCommon/yoga/yoga/YGEnums.h | 3 ++- ReactCommon/yoga/yoga/Yoga.c | 13 +++++++++---- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/yoga/YogaExperimentalFeature.java b/ReactAndroid/src/main/java/com/facebook/yoga/YogaExperimentalFeature.java index 3ac45e79deb007..1ac1f9b3588c1f 100644 --- a/ReactAndroid/src/main/java/com/facebook/yoga/YogaExperimentalFeature.java +++ b/ReactAndroid/src/main/java/com/facebook/yoga/YogaExperimentalFeature.java @@ -14,7 +14,8 @@ @DoNotStrip public enum YogaExperimentalFeature { ROUNDING(0), - WEB_FLEX_BASIS(1); + WEB_FLEX_BASIS(1), + MIN_FLEX_FIX(2); private int mIntValue; @@ -30,6 +31,7 @@ public static YogaExperimentalFeature fromInt(int value) { switch (value) { case 0: return ROUNDING; case 1: return WEB_FLEX_BASIS; + case 2: return MIN_FLEX_FIX; default: throw new IllegalArgumentException("Unknown enum value: " + value); } } diff --git a/ReactCommon/yoga/yoga/YGEnums.h b/ReactCommon/yoga/yoga/YGEnums.h index e466ad7b77fd30..6022f5587dbb17 100644 --- a/ReactCommon/yoga/yoga/YGEnums.h +++ b/ReactCommon/yoga/yoga/YGEnums.h @@ -57,10 +57,11 @@ typedef YG_ENUM_BEGIN(YGEdge) { YGEdgeAll, } YG_ENUM_END(YGEdge); -#define YGExperimentalFeatureCount 2 +#define YGExperimentalFeatureCount 3 typedef YG_ENUM_BEGIN(YGExperimentalFeature) { YGExperimentalFeatureRounding, YGExperimentalFeatureWebFlexBasis, + YGExperimentalFeatureMinFlexFix, } YG_ENUM_END(YGExperimentalFeature); #define YGFlexDirectionCount 4 diff --git a/ReactCommon/yoga/yoga/Yoga.c b/ReactCommon/yoga/yoga/Yoga.c index 4dfa8682394aa9..f4de9b95c94e32 100644 --- a/ReactCommon/yoga/yoga/Yoga.c +++ b/ReactCommon/yoga/yoga/Yoga.c @@ -1960,11 +1960,13 @@ static void YGNodelayoutImpl(const YGNodeRef node, // above float availableInnerWidth = availableWidth - marginAxisRow - paddingAndBorderAxisRow; if (!YGFloatIsUndefined(availableInnerWidth)) { + // We want to make sure our available width does not violate min and max constraints availableInnerWidth = fmaxf(fminf(availableInnerWidth, maxInnerWidth), minInnerWidth); } float availableInnerHeight = availableHeight - marginAxisColumn - paddingAndBorderAxisColumn; if (!YGFloatIsUndefined(availableInnerHeight)) { + // We want to make sure our available height does not violate min and max constraints availableInnerHeight = fmaxf(fminf(availableInnerHeight, maxInnerHeight), minInnerHeight); } @@ -2149,13 +2151,16 @@ static void YGNodelayoutImpl(const YGNodeRef node, // If the main dimension size isn't known, it is computed based on // the line length, so there's no more space left to distribute. - // We resolve main dimension to fit minimum and maximum values - if (YGFloatIsUndefined(availableInnerMainDim)) { + // If we don't measure with exact main dimension we want to ensure we don't violate min and max + if (measureModeMainDim != YGMeasureModeExactly) { if (!YGFloatIsUndefined(minInnerMainDim) && sizeConsumedOnCurrentLine < minInnerMainDim) { availableInnerMainDim = minInnerMainDim; - } else if (!YGFloatIsUndefined(maxInnerMainDim) && - sizeConsumedOnCurrentLine > maxInnerMainDim) { + } else if (!YGFloatIsUndefined(maxInnerMainDim) && sizeConsumedOnCurrentLine > maxInnerMainDim) { availableInnerMainDim = maxInnerMainDim; + } else if (YGIsExperimentalFeatureEnabled(YGExperimentalFeatureMinFlexFix)) { + // TODO: this needs to be moved out of experimental feature, as this is legitimate fix + // If the measurement isn't exact, we want to use as little space as possible + availableInnerMainDim = sizeConsumedOnCurrentLine; } }