From bcc36cc1b2a8e90a1bc2142b8615c84afc81b31c Mon Sep 17 00:00:00 2001 From: Mingwei Pan Date: Fri, 15 Sep 2017 08:22:36 -0700 Subject: [PATCH] Zero out all fields in YGZeroOutLayoutRecursivly using memset Summary: Add a new test named YGZeroOutLayoutRecursivlyTest, which verifies that padding and margin of a child node should be set to 0 when the display is set to none. Modify YGZeroOutLayoutRecursivly function, use memset to clear the layout struct of the node. Reviewed By: emilsjolander Differential Revision: D5842351 fbshipit-source-id: d2c2b6f829588a200525b7ccbdb63003cb4dcc4e --- tests/YGZeroOutLayoutRecursivlyTest.cpp | 39 +++++++++++++++++++++++++ yoga/Yoga.c | 13 +-------- 2 files changed, 40 insertions(+), 12 deletions(-) create mode 100644 tests/YGZeroOutLayoutRecursivlyTest.cpp diff --git a/tests/YGZeroOutLayoutRecursivlyTest.cpp b/tests/YGZeroOutLayoutRecursivlyTest.cpp new file mode 100644 index 00000000..9d38a3a3 --- /dev/null +++ b/tests/YGZeroOutLayoutRecursivlyTest.cpp @@ -0,0 +1,39 @@ +/** + * Copyright (c) 2014-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#include +#include + +TEST(YogaTest, zero_out_layout) { + const YGNodeRef root = YGNodeNew(); + YGNodeStyleSetFlexDirection(root, YGFlexDirectionRow); + YGNodeStyleSetWidth(root, 200); + YGNodeStyleSetHeight(root, 200); + + const YGNodeRef child = YGNodeNew(); + YGNodeInsertChild(root, child, 0); + YGNodeStyleSetWidth(child, 100); + YGNodeStyleSetHeight(child, 100); + YGNodeStyleSetMargin(child, YGEdgeTop, 10); + YGNodeStyleSetPadding(child, YGEdgeTop, 10); + + YGNodeCalculateLayout(root, 100, 100, YGDirectionLTR); + + ASSERT_FLOAT_EQ(10, YGNodeLayoutGetMargin(child, YGEdgeTop)); + ASSERT_FLOAT_EQ(10, YGNodeLayoutGetPadding(child, YGEdgeTop)); + + YGNodeStyleSetDisplay(child, YGDisplayNone); + + YGNodeCalculateLayout(root, 100, 100, YGDirectionLTR); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetMargin(child, YGEdgeTop)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetPadding(child, YGEdgeTop)); + + YGNodeFreeRecursive(root); +} diff --git a/yoga/Yoga.c b/yoga/Yoga.c index 15ac4586..84aa5a75 100644 --- a/yoga/Yoga.c +++ b/yoga/Yoga.c @@ -1865,18 +1865,7 @@ static bool YGNodeFixedSizeSetMeasuredDimensions(const YGNodeRef node, } static void YGZeroOutLayoutRecursivly(const YGNodeRef node) { - node->layout.dimensions[YGDimensionHeight] = 0; - node->layout.dimensions[YGDimensionWidth] = 0; - node->layout.position[YGEdgeTop] = 0; - node->layout.position[YGEdgeBottom] = 0; - node->layout.position[YGEdgeLeft] = 0; - node->layout.position[YGEdgeRight] = 0; - node->layout.cachedLayout.availableHeight = 0; - node->layout.cachedLayout.availableWidth = 0; - node->layout.cachedLayout.heightMeasureMode = YGMeasureModeExactly; - node->layout.cachedLayout.widthMeasureMode = YGMeasureModeExactly; - node->layout.cachedLayout.computedWidth = 0; - node->layout.cachedLayout.computedHeight = 0; + memset(&(node->layout), 0, sizeof(YGLayout)); node->hasNewLayout = true; const uint32_t childCount = YGNodeGetChildCount(node); for (uint32_t i = 0; i < childCount; i++) {