From 4b4959a21cb1e9e356eab51bfba0f16b76e8ec7f Mon Sep 17 00:00:00 2001 From: Pritesh Nandgaonkar Date: Thu, 11 Jan 2018 04:47:48 -0800 Subject: [PATCH] Moved setPosition as a method on YGNode Reviewed By: emilsjolander Differential Revision: D6683387 fbshipit-source-id: 83f64101faa700933771c69b222056ec2a6b8d1e --- ReactCommon/yoga/yoga/YGNode.cpp | 40 ++++++++++++++++++++++ ReactCommon/yoga/yoga/YGNode.h | 8 +++++ ReactCommon/yoga/yoga/Yoga.cpp | 57 ++++---------------------------- 3 files changed, 55 insertions(+), 50 deletions(-) diff --git a/ReactCommon/yoga/yoga/YGNode.cpp b/ReactCommon/yoga/yoga/YGNode.cpp index 0058453ac7..caee38443c 100644 --- a/ReactCommon/yoga/yoga/YGNode.cpp +++ b/ReactCommon/yoga/yoga/YGNode.cpp @@ -326,6 +326,46 @@ void YGNode::setLayoutDimension(float dimension, int index) { layout_.dimensions[index] = dimension; } +// If both left and right are defined, then use left. Otherwise return +// +left or -right depending on which is defined. +float YGNode::relativePosition( + const YGFlexDirection axis, + const float axisSize) { + return isLeadingPositionDefined(axis) ? getLeadingPosition(axis, axisSize) + : -getTrailingPosition(axis, axisSize); +} + +void YGNode::setPosition( + const YGDirection direction, + const float mainSize, + const float crossSize, + const float parentWidth) { + /* Root nodes should be always layouted as LTR, so we don't return negative + * values. */ + const YGDirection directionRespectingRoot = + parent_ != nullptr ? direction : YGDirectionLTR; + const YGFlexDirection mainAxis = + YGResolveFlexDirection(style_.flexDirection, directionRespectingRoot); + const YGFlexDirection crossAxis = + YGFlexDirectionCross(mainAxis, directionRespectingRoot); + + const float relativePositionMain = relativePosition(mainAxis, mainSize); + const float relativePositionCross = relativePosition(crossAxis, crossSize); + + setLayoutPosition( + getLeadingMargin(mainAxis, parentWidth) + relativePositionMain, + leading[mainAxis]); + setLayoutPosition( + getTrailingMargin(mainAxis, parentWidth) + relativePositionMain, + trailing[mainAxis]); + setLayoutPosition( + getLeadingMargin(crossAxis, parentWidth) + relativePositionCross, + leading[crossAxis]); + setLayoutPosition( + getTrailingMargin(crossAxis, parentWidth) + relativePositionCross, + trailing[crossAxis]); +} + YGNode::YGNode() : context_(nullptr), print_(nullptr), diff --git a/ReactCommon/yoga/yoga/YGNode.h b/ReactCommon/yoga/yoga/YGNode.h index ba93f8598b..ac81b3bb72 100644 --- a/ReactCommon/yoga/yoga/YGNode.h +++ b/ReactCommon/yoga/yoga/YGNode.h @@ -31,6 +31,8 @@ struct YGNode { bool isDirty_; std::array resolvedDimensions_; + float relativePosition(const YGFlexDirection axis, const float axisSize); + public: YGNode(); ~YGNode(); @@ -110,6 +112,12 @@ struct YGNode { void setLayoutHadOverflow(bool hadOverflow); void setLayoutDimension(float dimension, int index); + void setPosition( + const YGDirection direction, + const float mainSize, + const float crossSize, + const float parentWidth); + // Other methods YGValue marginLeadingValue(const YGFlexDirection axis) const; YGValue marginTrailingValue(const YGFlexDirection axis) const; diff --git a/ReactCommon/yoga/yoga/Yoga.cpp b/ReactCommon/yoga/yoga/Yoga.cpp index f3a837b968..a25936c4a5 100644 --- a/ReactCommon/yoga/yoga/Yoga.cpp +++ b/ReactCommon/yoga/yoga/Yoga.cpp @@ -1020,16 +1020,6 @@ static void YGNodeSetChildTrailingPosition(const YGNodeRef node, trailing[axis]); } -// If both left and right are defined, then use left. Otherwise return -// +left or -right depending on which is defined. -static float YGNodeRelativePosition(const YGNodeRef node, - const YGFlexDirection axis, - const float axisSize) { - return node->isLeadingPositionDefined(axis) - ? node->getLeadingPosition(axis, axisSize) - : -node->getTrailingPosition(axis, axisSize); -} - static void YGConstrainMaxSizeForMode(const YGNodeRef node, const enum YGFlexDirection axis, const float parentAxisSize, @@ -1054,35 +1044,6 @@ static void YGConstrainMaxSizeForMode(const YGNodeRef node, } } -static void YGNodeSetPosition(const YGNodeRef node, - const YGDirection direction, - const float mainSize, - const float crossSize, - const float parentWidth) { - /* Root nodes should be always layouted as LTR, so we don't return negative values. */ - const YGDirection directionRespectingRoot = - node->getParent() != nullptr ? direction : YGDirectionLTR; - const YGFlexDirection mainAxis = YGResolveFlexDirection( - node->getStyle().flexDirection, directionRespectingRoot); - const YGFlexDirection crossAxis = YGFlexDirectionCross(mainAxis, directionRespectingRoot); - - const float relativePositionMain = YGNodeRelativePosition(node, mainAxis, mainSize); - const float relativePositionCross = YGNodeRelativePosition(node, crossAxis, crossSize); - - node->setLayoutPosition( - node->getLeadingMargin(mainAxis, parentWidth) + relativePositionMain, - leading[mainAxis]); - node->setLayoutPosition( - node->getTrailingMargin(mainAxis, parentWidth) + relativePositionMain, - trailing[mainAxis]); - node->setLayoutPosition( - node->getLeadingMargin(crossAxis, parentWidth) + relativePositionCross, - leading[crossAxis]); - node->setLayoutPosition( - node->getTrailingMargin(crossAxis, parentWidth) + relativePositionCross, - trailing[crossAxis]); -} - static void YGNodeComputeFlexBasisForChild(const YGNodeRef node, const YGNodeRef child, const float width, @@ -1887,11 +1848,11 @@ static void YGNodelayoutImpl(const YGNodeRef node, if (performLayout) { // Set the initial position (relative to the parent). const YGDirection childDirection = YGNodeResolveDirection(child, direction); - YGNodeSetPosition(child, - childDirection, - availableInnerMainDim, - availableInnerCrossDim, - availableInnerWidth); + child->setPosition( + childDirection, + availableInnerMainDim, + availableInnerCrossDim, + availableInnerWidth); } // Absolute-positioned children don't participate in flex layout. Add them @@ -3477,12 +3438,8 @@ void YGNodeCalculateLayout(const YGNodeRef node, true, "initial", node->getConfig())) { - YGNodeSetPosition( - node, - node->getLayout().direction, - parentWidth, - parentHeight, - parentWidth); + node->setPosition( + node->getLayout().direction, parentWidth, parentHeight, parentWidth); YGRoundToPixelGrid(node, node->getConfig()->pointScaleFactor, 0.0f, 0.0f); if (gPrintTree) {