diff --git a/tests/YGComputedPaddingTest.cpp b/tests/YGComputedPaddingTest.cpp new file mode 100644 index 00000000..79f8be0c --- /dev/null +++ b/tests/YGComputedPaddingTest.cpp @@ -0,0 +1,30 @@ +/** + * 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, computed_layout_padding) { + const YGNodeRef root = YGNodeNew(); + YGNodeStyleSetWidth(root, 100); + YGNodeStyleSetHeight(root, 100); + YGNodeStyleSetPaddingPercent(root, YGEdgeStart, 10); + + YGNodeCalculateLayout(root, 100, 100, YGDirectionLTR); + + ASSERT_FLOAT_EQ(10, YGNodeLayoutGetPadding(root, YGEdgeLeft)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetPadding(root, YGEdgeRight)); + + YGNodeCalculateLayout(root, 100, 100, YGDirectionRTL); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetPadding(root, YGEdgeLeft)); + ASSERT_FLOAT_EQ(10, YGNodeLayoutGetPadding(root, YGEdgeRight)); + + YGNodeFreeRecursive(root); +} diff --git a/yoga/Yoga.c b/yoga/Yoga.c index df176de0..bc73ecbc 100644 --- a/yoga/Yoga.c +++ b/yoga/Yoga.c @@ -47,6 +47,7 @@ typedef struct YGCachedMeasurement { typedef struct YGLayout { float position[4]; float dimensions[2]; + float padding[6]; YGDirection direction; uint32_t computedFlexBasisGeneration; @@ -563,6 +564,28 @@ YG_NODE_LAYOUT_PROPERTY_IMPL(float, Width, dimensions[YGDimensionWidth]); YG_NODE_LAYOUT_PROPERTY_IMPL(float, Height, dimensions[YGDimensionHeight]); YG_NODE_LAYOUT_PROPERTY_IMPL(YGDirection, Direction, direction); +float YGNodeLayoutGetPadding(const YGNodeRef node, const YGEdge edge) { + YG_ASSERT(edge <= YGEdgeEnd, "Cannot get layout paddings of multi-edge shorthands"); + + if (edge == YGEdgeLeft) { + if (node->layout.direction == YGDirectionRTL) { + return node->layout.padding[YGEdgeEnd]; + } else { + return node->layout.padding[YGEdgeStart]; + } + } + + if (edge == YGEdgeRight) { + if (node->layout.direction == YGDirectionRTL) { + return node->layout.padding[YGEdgeStart]; + } else { + return node->layout.padding[YGEdgeEnd]; + } + } + + return node->layout.padding[edge]; +} + uint32_t gCurrentGenerationCount = 0; bool YGLayoutNodeInternal(const YGNodeRef node, @@ -870,8 +893,8 @@ static float YGNodeLeadingPadding(const YGNodeRef node, } return fmaxf(YGValueResolve(YGComputedEdgeValue(node->style.padding, leading[axis], &YGValueZero), - widthSize), - 0.0f); + widthSize), + 0.0f); } static float YGNodeTrailingPadding(const YGNodeRef node, @@ -883,8 +906,8 @@ static float YGNodeTrailingPadding(const YGNodeRef node, } return fmaxf(YGValueResolve(YGComputedEdgeValue(node->style.padding, trailing[axis], &YGValueZero), - widthSize), - 0.0f); + widthSize), + 0.0f); } static float YGNodeLeadingBorder(const YGNodeRef node, const YGFlexDirection axis) { @@ -1657,6 +1680,11 @@ static void YGNodelayoutImpl(const YGNodeRef node, const YGDirection direction = YGNodeResolveDirection(node, parentDirection); node->layout.direction = direction; + node->layout.padding[YGEdgeStart] = YGNodeLeadingPadding(node, YGFlexDirectionResolve(YGFlexDirectionRow, direction), parentWidth); + node->layout.padding[YGEdgeEnd] = YGNodeTrailingPadding(node, YGFlexDirectionResolve(YGFlexDirectionRow, direction), parentWidth); + node->layout.padding[YGEdgeTop] = YGNodeLeadingPadding(node, YGFlexDirectionResolve(YGFlexDirectionColumn, direction), parentWidth); + node->layout.padding[YGEdgeBottom] = YGNodeTrailingPadding(node, YGFlexDirectionResolve(YGFlexDirectionColumn, direction), parentWidth); + if (node->measure) { YGNodeWithMeasureFuncSetMeasuredDimensions( node, availableWidth, availableHeight, widthMeasureMode, heightMeasureMode); diff --git a/yoga/Yoga.h b/yoga/Yoga.h index 083d3073..ba96b9cf 100644 --- a/yoga/Yoga.h +++ b/yoga/Yoga.h @@ -191,6 +191,12 @@ YG_NODE_LAYOUT_PROPERTY(float, Width); YG_NODE_LAYOUT_PROPERTY(float, Height); YG_NODE_LAYOUT_PROPERTY(YGDirection, Direction); +// Get the computed padding for this node after performing layout. If padding was set using +// pixel values then the returned value will be the same as YGNodeStyleGetPadding. However if +// padding was set using a percentage value then the returned value is the computed value used +// during layout. +WIN_EXPORT float YGNodeLayoutGetPadding(const YGNodeRef node, const YGEdge edge); + WIN_EXPORT void YGSetLogger(YGLogger logger); WIN_EXPORT void YGLog(YGLogLevel level, const char *message, ...);