From d9c35e8952e851cc63b7afd5fed72f3bb16848f5 Mon Sep 17 00:00:00 2001 From: Emil Sjolander Date: Thu, 5 Jan 2017 12:48:07 -0800 Subject: [PATCH] Add api for retrieving computed padding Differential Revision: D4376572 fbshipit-source-id: 3ffb66e77090fc1257511bec5c933f9b0c304b9f --- ReactCommon/yoga/yoga/Yoga.c | 42 ++++++++++++++++++++++++++++++------ ReactCommon/yoga/yoga/Yoga.h | 6 ++++++ 2 files changed, 42 insertions(+), 6 deletions(-) diff --git a/ReactCommon/yoga/yoga/Yoga.c b/ReactCommon/yoga/yoga/Yoga.c index d42854443..bc73ecbc3 100644 --- a/ReactCommon/yoga/yoga/Yoga.c +++ b/ReactCommon/yoga/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; @@ -94,16 +95,18 @@ typedef struct YGNode { YGStyle style; YGLayout layout; uint32_t lineIndex; - bool hasNewLayout; + YGNodeRef parent; YGNodeListRef children; - bool isDirty; struct YGNode *nextChild; YGMeasureFunc measure; YGPrintFunc print; void *context; + + bool isDirty; + bool hasNewLayout; } YGNode; #define YG_UNDEFINED_VALUES \ @@ -561,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, @@ -868,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, @@ -881,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) { @@ -1655,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/ReactCommon/yoga/yoga/Yoga.h b/ReactCommon/yoga/yoga/Yoga.h index 083d30739..ba96b9cf1 100644 --- a/ReactCommon/yoga/yoga/Yoga.h +++ b/ReactCommon/yoga/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, ...);