From 44622912a2ec969cb6c8425cac61d1547cda55dd Mon Sep 17 00:00:00 2001 From: Yuichi ONO Date: Thu, 15 Feb 2018 07:16:59 -0800 Subject: [PATCH] Fix main size calculation from the aspect ratio Summary: When the following conditions are met, the main size become smaller by the margins in the main axis. * The aspect ratio is defined * The main size is not defined * The cross size is defined * The main margin is defined This is because the main margin size is not included when calculating the main size from the aspect ratio. Closes https://github.com/facebook/yoga/pull/715 Reviewed By: emilsjolander Differential Revision: D6998988 Pulled By: priteshrnandgaonkar fbshipit-source-id: f6f69c47ece17bd7c5e41517b96032bf0c149356 --- tests/YGAspectRatioTest.cpp | 25 +++++++++++++++++++++++++ yoga/Yoga.cpp | 5 +++-- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/tests/YGAspectRatioTest.cpp b/tests/YGAspectRatioTest.cpp index f178a20c..0794f909 100644 --- a/tests/YGAspectRatioTest.cpp +++ b/tests/YGAspectRatioTest.cpp @@ -781,6 +781,31 @@ TEST(YogaTest, aspect_ratio_defined_cross_with_margin) { YGNodeFreeRecursive(root); } +TEST(YogaTest, aspect_ratio_defined_cross_with_main_margin) { + const YGNodeRef root = YGNodeNew(); + YGNodeStyleSetAlignItems(root, YGAlignCenter); + YGNodeStyleSetJustifyContent(root, YGJustifyCenter); + YGNodeStyleSetWidth(root, 100); + YGNodeStyleSetHeight(root, 100); + + const YGNodeRef root_child0 = YGNodeNew(); + YGNodeStyleSetWidth(root_child0, 50); + YGNodeStyleSetAspectRatio(root_child0, 1); + YGNodeStyleSetMargin(root_child0, YGEdgeTop, 10); + YGNodeStyleSetMargin(root_child0, YGEdgeBottom, 10); + YGNodeInsertChild(root, root_child0, 0); + + YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR); + + ASSERT_EQ(100, YGNodeLayoutGetWidth(root)); + ASSERT_EQ(100, YGNodeLayoutGetHeight(root)); + + ASSERT_EQ(50, YGNodeLayoutGetWidth(root_child0)); + ASSERT_EQ(50, YGNodeLayoutGetHeight(root_child0)); + + YGNodeFreeRecursive(root); +} + TEST(YogaTest, aspect_ratio_should_prefer_explicit_height) { const YGConfigRef config = YGConfigNew(); YGConfigSetUseWebDefaults(config, true); diff --git a/yoga/Yoga.cpp b/yoga/Yoga.cpp index 63b00c6c..8f1f5e04 100644 --- a/yoga/Yoga.cpp +++ b/yoga/Yoga.cpp @@ -1102,10 +1102,11 @@ static void YGNodeComputeFlexBasisForChild(const YGNodeRef node, if (!YGFloatIsUndefined(child->getStyle().aspectRatio)) { if (!isMainAxisRow && childWidthMeasureMode == YGMeasureModeExactly) { - childHeight = (childWidth - marginRow) / child->getStyle().aspectRatio; + childHeight = marginColumn + + (childWidth - marginRow) / child->getStyle().aspectRatio; childHeightMeasureMode = YGMeasureModeExactly; } else if (isMainAxisRow && childHeightMeasureMode == YGMeasureModeExactly) { - childWidth = + childWidth = marginRow + (childHeight - marginColumn) * child->getStyle().aspectRatio; childWidthMeasureMode = YGMeasureModeExactly; }