From 1cd7363beada3c5a6af8808dbaa301cbd1a9f43f Mon Sep 17 00:00:00 2001 From: Emil Sjolander Date: Tue, 28 Feb 2017 08:10:34 -0800 Subject: [PATCH] Pass the parent size to YGNodeCalculateLayout instead of the node size Summary: The size of the node is already set on the node however there was no way to set the size of the parent to the root so that the root could use percentages. This change fixes this by making the width and height passed to calculate layout be the width and height of the hypothetical parent. Reviewed By: astreet Differential Revision: D4611417 fbshipit-source-id: 2fb0eedffa17f0ec89b601722a1717a72e216b9e --- tests/YGRelayoutTest.cpp | 7 ++++--- yoga/Yoga.c | 43 ++++++++++++++++++---------------------- 2 files changed, 23 insertions(+), 27 deletions(-) diff --git a/tests/YGRelayoutTest.cpp b/tests/YGRelayoutTest.cpp index 8a55edd3..f0ea337f 100644 --- a/tests/YGRelayoutTest.cpp +++ b/tests/YGRelayoutTest.cpp @@ -14,16 +14,17 @@ TEST(YogaTest, dont_cache_computed_flex_basis_between_layouts) { YGSetExperimentalFeatureEnabled(YGExperimentalFeatureWebFlexBasis, true); const YGNodeRef root = YGNodeNew(); + YGNodeStyleSetHeightPercent(root, 100); + YGNodeStyleSetWidthPercent(root, 100); const YGNodeRef root_child0 = YGNodeNew(); - YGNodeStyleSetHeight(root_child0, 10); - YGNodeStyleSetFlexBasis(root_child0, 20); + YGNodeStyleSetFlexBasisPercent(root_child0, 100); YGNodeInsertChild(root, root_child0, 0); YGNodeCalculateLayout(root, 100, YGUndefined, YGDirectionLTR); YGNodeCalculateLayout(root, 100, 100, YGDirectionLTR); - ASSERT_FLOAT_EQ(20, YGNodeLayoutGetHeight(root_child0)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child0)); YGNodeFreeRecursive(root); diff --git a/yoga/Yoga.c b/yoga/Yoga.c index a67b33d0..9546f338 100644 --- a/yoga/Yoga.c +++ b/yoga/Yoga.c @@ -3280,8 +3280,8 @@ static void YGRoundToPixelGrid(const YGNodeRef node) { } void YGNodeCalculateLayout(const YGNodeRef node, - const float availableWidth, - const float availableHeight, + const float parentWidth, + const float parentHeight, const YGDirection parentDirection) { // Increment the generation count. This will force the recursive routine to // visit @@ -3290,33 +3290,28 @@ void YGNodeCalculateLayout(const YGNodeRef node, // parameters don't change. gCurrentGenerationCount++; - float width = availableWidth; - float height = availableHeight; - YGMeasureMode widthMeasureMode = YGMeasureModeUndefined; - YGMeasureMode heightMeasureMode = YGMeasureModeUndefined; - YGResolveDimensions(node); - if (!YGFloatIsUndefined(width)) { + float width = YGUndefined; + YGMeasureMode widthMeasureMode = YGMeasureModeUndefined; + if (YGNodeIsStyleDimDefined(node, YGFlexDirectionRow, parentWidth)) { + width = YGValueResolve(node->resolvedDimensions[dim[YGFlexDirectionRow]], parentWidth) + + YGNodeMarginForAxis(node, YGFlexDirectionRow, parentWidth); widthMeasureMode = YGMeasureModeExactly; - } else if (YGNodeIsStyleDimDefined(node, YGFlexDirectionRow, availableWidth)) { - width = YGValueResolve(node->resolvedDimensions[dim[YGFlexDirectionRow]], availableWidth) + - YGNodeMarginForAxis(node, YGFlexDirectionRow, availableWidth); - widthMeasureMode = YGMeasureModeExactly; - } else if (YGValueResolve(&node->style.maxDimensions[YGDimensionWidth], availableWidth) >= 0.0f) { - width = YGValueResolve(&node->style.maxDimensions[YGDimensionWidth], availableWidth); + } else if (YGValueResolve(&node->style.maxDimensions[YGDimensionWidth], parentWidth) >= 0.0f) { + width = YGValueResolve(&node->style.maxDimensions[YGDimensionWidth], parentWidth); widthMeasureMode = YGMeasureModeAtMost; } - if (!YGFloatIsUndefined(height)) { + float height = YGUndefined; + YGMeasureMode heightMeasureMode = YGMeasureModeUndefined; + if (YGNodeIsStyleDimDefined(node, YGFlexDirectionColumn, parentHeight)) { + height = YGValueResolve(node->resolvedDimensions[dim[YGFlexDirectionColumn]], parentHeight) + + YGNodeMarginForAxis(node, YGFlexDirectionColumn, parentWidth); heightMeasureMode = YGMeasureModeExactly; - } else if (YGNodeIsStyleDimDefined(node, YGFlexDirectionColumn, availableHeight)) { - height = YGValueResolve(node->resolvedDimensions[dim[YGFlexDirectionColumn]], availableHeight) + - YGNodeMarginForAxis(node, YGFlexDirectionColumn, availableWidth); - heightMeasureMode = YGMeasureModeExactly; - } else if (YGValueResolve(&node->style.maxDimensions[YGDimensionHeight], availableHeight) >= + } else if (YGValueResolve(&node->style.maxDimensions[YGDimensionHeight], parentHeight) >= 0.0f) { - height = YGValueResolve(&node->style.maxDimensions[YGDimensionHeight], availableHeight); + height = YGValueResolve(&node->style.maxDimensions[YGDimensionHeight], parentHeight); heightMeasureMode = YGMeasureModeAtMost; } @@ -3326,12 +3321,12 @@ void YGNodeCalculateLayout(const YGNodeRef node, parentDirection, widthMeasureMode, heightMeasureMode, - availableWidth, - availableHeight, + parentWidth, + parentHeight, true, "initia" "l")) { - YGNodeSetPosition(node, node->layout.direction, availableWidth, availableHeight, availableWidth); + YGNodeSetPosition(node, node->layout.direction, node->layout.dimensions[YGDimensionWidth], node->layout.dimensions[YGDimensionHeight], parentWidth); if (YGIsExperimentalFeatureEnabled(YGExperimentalFeatureRounding)) { YGRoundToPixelGrid(node);