From 4f0bf5c1cfae98c16942cbc5fe8aeafc42046d6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Nison?= Date: Thu, 26 Jan 2017 13:36:38 -0800 Subject: [PATCH] Add YGLayoutGetBorder, counterpart of YGLayoutGetPadding Summary: Followup of #335, fix #326. This commit add the `YGLayoutGetBorder(node, edge)` function, which correctly takes RTL/LTR into account when resolving `EDGE_START` & `EDGE_END`. Closes https://github.com/facebook/yoga/pull/344 Reviewed By: dshahidehpour Differential Revision: D4459950 Pulled By: emilsjolander fbshipit-source-id: b57eb7a5b1c181a364913c3200a3794a2b7b31a6 --- ReactCommon/yoga/yoga/Yoga.c | 46 +++++++++++++++++------------------- ReactCommon/yoga/yoga/Yoga.h | 14 +++++++---- 2 files changed, 31 insertions(+), 29 deletions(-) diff --git a/ReactCommon/yoga/yoga/Yoga.c b/ReactCommon/yoga/yoga/Yoga.c index 5d625047e2a886..4ceeefd7785b64 100644 --- a/ReactCommon/yoga/yoga/Yoga.c +++ b/ReactCommon/yoga/yoga/Yoga.c @@ -48,6 +48,7 @@ typedef struct YGLayout { float position[4]; float dimensions[2]; float margin[6]; + float border[6]; float padding[6]; YGDirection direction; @@ -596,6 +597,7 @@ YG_NODE_LAYOUT_PROPERTY_IMPL(float, Height, dimensions[YGDimensionHeight]); YG_NODE_LAYOUT_PROPERTY_IMPL(YGDirection, Direction, direction); YG_NODE_LAYOUT_RESOLVED_PROPERTY_IMPL(float, Margin, margin); +YG_NODE_LAYOUT_RESOLVED_PROPERTY_IMPL(float, Border, border); YG_NODE_LAYOUT_RESOLVED_PROPERTY_IMPL(float, Padding, padding); uint32_t gCurrentGenerationCount = 0; @@ -1764,39 +1766,35 @@ static void YGNodelayoutImpl(const YGNodeRef node, const YGDirection direction = YGNodeResolveDirection(node, parentDirection); node->layout.direction = direction; + const YGFlexDirection flexRowDirection = YGFlexDirectionResolve(YGFlexDirectionRow, direction); + const YGFlexDirection flexColumnDirection = YGFlexDirectionResolve(YGFlexDirectionColumn, direction); + node->layout.margin[YGEdgeStart] = - YGNodeLeadingMargin(node, - YGFlexDirectionResolve(YGFlexDirectionRow, direction), - parentWidth); + YGNodeLeadingMargin(node, flexRowDirection, parentWidth); node->layout.margin[YGEdgeEnd] = - YGNodeTrailingMargin(node, - YGFlexDirectionResolve(YGFlexDirectionRow, direction), - parentWidth); + YGNodeTrailingMargin(node, flexRowDirection, parentWidth); node->layout.margin[YGEdgeTop] = - YGNodeLeadingMargin(node, - YGFlexDirectionResolve(YGFlexDirectionColumn, direction), - parentWidth); + YGNodeLeadingMargin(node, flexColumnDirection, parentWidth); node->layout.margin[YGEdgeBottom] = - YGNodeTrailingMargin(node, - YGFlexDirectionResolve(YGFlexDirectionColumn, direction), - parentWidth); + YGNodeTrailingMargin(node, flexColumnDirection, parentWidth); + + node->layout.border[YGEdgeStart] = + YGNodeLeadingBorder(node, flexRowDirection); + node->layout.border[YGEdgeEnd] = + YGNodeTrailingBorder(node, flexRowDirection); + node->layout.border[YGEdgeTop] = + YGNodeLeadingBorder(node, flexColumnDirection); + node->layout.border[YGEdgeBottom] = + YGNodeTrailingBorder(node, flexColumnDirection); node->layout.padding[YGEdgeStart] = - YGNodeLeadingPadding(node, - YGFlexDirectionResolve(YGFlexDirectionRow, direction), - parentWidth); + YGNodeLeadingPadding(node, flexRowDirection, parentWidth); node->layout.padding[YGEdgeEnd] = - YGNodeTrailingPadding(node, - YGFlexDirectionResolve(YGFlexDirectionRow, direction), - parentWidth); + YGNodeTrailingPadding(node, flexRowDirection, parentWidth); node->layout.padding[YGEdgeTop] = - YGNodeLeadingPadding(node, - YGFlexDirectionResolve(YGFlexDirectionColumn, direction), - parentWidth); + YGNodeLeadingPadding(node, flexColumnDirection, parentWidth); node->layout.padding[YGEdgeBottom] = - YGNodeTrailingPadding(node, - YGFlexDirectionResolve(YGFlexDirectionColumn, direction), - parentWidth); + YGNodeTrailingPadding(node, flexColumnDirection, parentWidth); if (node->measure) { YGNodeWithMeasureFuncSetMeasuredDimensions( diff --git a/ReactCommon/yoga/yoga/Yoga.h b/ReactCommon/yoga/yoga/Yoga.h index 141c9ddcdb0923..e2210f29739807 100644 --- a/ReactCommon/yoga/yoga/Yoga.h +++ b/ReactCommon/yoga/yoga/Yoga.h @@ -139,6 +139,9 @@ WIN_EXPORT void YGNodeCopyStyle(const YGNodeRef dstNode, const YGNodeRef srcNode #define YG_NODE_LAYOUT_PROPERTY(type, name) \ WIN_EXPORT type YGNodeLayoutGet##name(const YGNodeRef node); +#define YG_NODE_LAYOUT_EDGE_PROPERTY(type, name) \ + WIN_EXPORT type YGNodeLayoutGet##name(const YGNodeRef node, const YGEdge edge); + YG_NODE_PROPERTY(void *, Context, context); YG_NODE_PROPERTY(YGMeasureFunc, MeasureFunc, measureFunc); YG_NODE_PROPERTY(YGBaselineFunc, BaselineFunc, baselineFunc) @@ -195,12 +198,13 @@ 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 +// Get the computed values for these nodes after performing layout. If they were set using +// pixel values then the returned value will be the same as YGNodeStyleGetXXX. However if +// they were set using a percentage value then the returned value is the computed value used // during layout. -WIN_EXPORT float YGNodeLayoutGetMargin(const YGNodeRef node, const YGEdge edge); -WIN_EXPORT float YGNodeLayoutGetPadding(const YGNodeRef node, const YGEdge edge); +YG_NODE_LAYOUT_EDGE_PROPERTY(float, Margin); +YG_NODE_LAYOUT_EDGE_PROPERTY(float, Border); +YG_NODE_LAYOUT_EDGE_PROPERTY(float, Padding); WIN_EXPORT void YGSetLogger(YGLogger logger); WIN_EXPORT void YGLog(YGLogLevel level, const char *message, ...);