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
This commit is contained in:
committed by
Facebook Github Bot
parent
7c09244c39
commit
db732ce9fa
File diff suppressed because one or more lines are too long
@@ -459,6 +459,11 @@ double Node::getComputedMargin(int edge) const
|
|||||||
return YGNodeLayoutGetMargin(m_node, static_cast<YGEdge>(edge));
|
return YGNodeLayoutGetMargin(m_node, static_cast<YGEdge>(edge));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double Node::getComputedBorder(int edge) const
|
||||||
|
{
|
||||||
|
return YGNodeLayoutGetBorder(m_node, static_cast<YGEdge>(edge));
|
||||||
|
}
|
||||||
|
|
||||||
double Node::getComputedPadding(int edge) const
|
double Node::getComputedPadding(int edge) const
|
||||||
{
|
{
|
||||||
return YGNodeLayoutGetPadding(m_node, static_cast<YGEdge>(edge));
|
return YGNodeLayoutGetPadding(m_node, static_cast<YGEdge>(edge));
|
||||||
|
@@ -177,6 +177,7 @@ class Node {
|
|||||||
Layout getComputedLayout(void) const;
|
Layout getComputedLayout(void) const;
|
||||||
|
|
||||||
double getComputedMargin(int edge) const;
|
double getComputedMargin(int edge) const;
|
||||||
|
double getComputedBorder(int edge) const;
|
||||||
double getComputedPadding(int edge) const;
|
double getComputedPadding(int edge) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@@ -155,5 +155,6 @@ NBIND_CLASS(Node)
|
|||||||
method(getComputedLayout);
|
method(getComputedLayout);
|
||||||
|
|
||||||
method(getComputedMargin);
|
method(getComputedMargin);
|
||||||
|
method(getComputedBorder);
|
||||||
method(getComputedPadding);
|
method(getComputedPadding);
|
||||||
}
|
}
|
||||||
|
33
javascript/tests/Facebook.Yoga/YGComputedBorderTest.js
Normal file
33
javascript/tests/Facebook.Yoga/YGComputedBorderTest.js
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
/**
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
var Yoga = Yoga || require("../../sources/entry-" + process.env.TEST_ENTRY);
|
||||||
|
|
||||||
|
it("border_start", function () {
|
||||||
|
var root = Yoga.Node.create();
|
||||||
|
root.setWidth(100);
|
||||||
|
root.setHeight(100);
|
||||||
|
root.setBorder(Yoga.EDGE_START, 10);
|
||||||
|
|
||||||
|
root.calculateLayout(100, 100, Yoga.DIRECTION_LTR);
|
||||||
|
|
||||||
|
console.assert(10 === root.getComputedBorder(Yoga.EDGE_LEFT), "10 === root.getComputedBorder(Yoga.EDGE_LEFT)");
|
||||||
|
console.assert(0 === root.getComputedBorder(Yoga.EDGE_RIGHT), "0 === root.getComputedBorder(Yoga.EDGE_RIGHT)");
|
||||||
|
|
||||||
|
root.calculateLayout(100, 100, Yoga.DIRECTION_RTL);
|
||||||
|
|
||||||
|
console.assert(0 === root.getComputedBorder(Yoga.EDGE_LEFT), "0 === root.getComputedBorder(Yoga.EDGE_LEFT)");
|
||||||
|
console.assert(10 === root.getComputedBorder(Yoga.EDGE_RIGHT), "10 === root.getComputedBorder(Yoga.EDGE_RIGHT)");
|
||||||
|
|
||||||
|
if (typeof root !== "undefined")
|
||||||
|
root.freeRecursive();
|
||||||
|
|
||||||
|
(typeof gc !== "undefined") && gc();
|
||||||
|
console.assert(0 === Yoga.getInstanceCount(), "0 === Yoga.getInstanceCount() (" + Yoga.getInstanceCount() + ")");
|
||||||
|
});
|
46
yoga/Yoga.c
46
yoga/Yoga.c
@@ -48,6 +48,7 @@ typedef struct YGLayout {
|
|||||||
float position[4];
|
float position[4];
|
||||||
float dimensions[2];
|
float dimensions[2];
|
||||||
float margin[6];
|
float margin[6];
|
||||||
|
float border[6];
|
||||||
float padding[6];
|
float padding[6];
|
||||||
YGDirection direction;
|
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_PROPERTY_IMPL(YGDirection, Direction, direction);
|
||||||
|
|
||||||
YG_NODE_LAYOUT_RESOLVED_PROPERTY_IMPL(float, Margin, margin);
|
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);
|
YG_NODE_LAYOUT_RESOLVED_PROPERTY_IMPL(float, Padding, padding);
|
||||||
|
|
||||||
uint32_t gCurrentGenerationCount = 0;
|
uint32_t gCurrentGenerationCount = 0;
|
||||||
@@ -1764,39 +1766,35 @@ static void YGNodelayoutImpl(const YGNodeRef node,
|
|||||||
const YGDirection direction = YGNodeResolveDirection(node, parentDirection);
|
const YGDirection direction = YGNodeResolveDirection(node, parentDirection);
|
||||||
node->layout.direction = direction;
|
node->layout.direction = direction;
|
||||||
|
|
||||||
|
const YGFlexDirection flexRowDirection = YGFlexDirectionResolve(YGFlexDirectionRow, direction);
|
||||||
|
const YGFlexDirection flexColumnDirection = YGFlexDirectionResolve(YGFlexDirectionColumn, direction);
|
||||||
|
|
||||||
node->layout.margin[YGEdgeStart] =
|
node->layout.margin[YGEdgeStart] =
|
||||||
YGNodeLeadingMargin(node,
|
YGNodeLeadingMargin(node, flexRowDirection, parentWidth);
|
||||||
YGFlexDirectionResolve(YGFlexDirectionRow, direction),
|
|
||||||
parentWidth);
|
|
||||||
node->layout.margin[YGEdgeEnd] =
|
node->layout.margin[YGEdgeEnd] =
|
||||||
YGNodeTrailingMargin(node,
|
YGNodeTrailingMargin(node, flexRowDirection, parentWidth);
|
||||||
YGFlexDirectionResolve(YGFlexDirectionRow, direction),
|
|
||||||
parentWidth);
|
|
||||||
node->layout.margin[YGEdgeTop] =
|
node->layout.margin[YGEdgeTop] =
|
||||||
YGNodeLeadingMargin(node,
|
YGNodeLeadingMargin(node, flexColumnDirection, parentWidth);
|
||||||
YGFlexDirectionResolve(YGFlexDirectionColumn, direction),
|
|
||||||
parentWidth);
|
|
||||||
node->layout.margin[YGEdgeBottom] =
|
node->layout.margin[YGEdgeBottom] =
|
||||||
YGNodeTrailingMargin(node,
|
YGNodeTrailingMargin(node, flexColumnDirection, parentWidth);
|
||||||
YGFlexDirectionResolve(YGFlexDirectionColumn, direction),
|
|
||||||
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] =
|
node->layout.padding[YGEdgeStart] =
|
||||||
YGNodeLeadingPadding(node,
|
YGNodeLeadingPadding(node, flexRowDirection, parentWidth);
|
||||||
YGFlexDirectionResolve(YGFlexDirectionRow, direction),
|
|
||||||
parentWidth);
|
|
||||||
node->layout.padding[YGEdgeEnd] =
|
node->layout.padding[YGEdgeEnd] =
|
||||||
YGNodeTrailingPadding(node,
|
YGNodeTrailingPadding(node, flexRowDirection, parentWidth);
|
||||||
YGFlexDirectionResolve(YGFlexDirectionRow, direction),
|
|
||||||
parentWidth);
|
|
||||||
node->layout.padding[YGEdgeTop] =
|
node->layout.padding[YGEdgeTop] =
|
||||||
YGNodeLeadingPadding(node,
|
YGNodeLeadingPadding(node, flexColumnDirection, parentWidth);
|
||||||
YGFlexDirectionResolve(YGFlexDirectionColumn, direction),
|
|
||||||
parentWidth);
|
|
||||||
node->layout.padding[YGEdgeBottom] =
|
node->layout.padding[YGEdgeBottom] =
|
||||||
YGNodeTrailingPadding(node,
|
YGNodeTrailingPadding(node, flexColumnDirection, parentWidth);
|
||||||
YGFlexDirectionResolve(YGFlexDirectionColumn, direction),
|
|
||||||
parentWidth);
|
|
||||||
|
|
||||||
if (node->measure) {
|
if (node->measure) {
|
||||||
YGNodeWithMeasureFuncSetMeasuredDimensions(
|
YGNodeWithMeasureFuncSetMeasuredDimensions(
|
||||||
|
14
yoga/Yoga.h
14
yoga/Yoga.h
@@ -139,6 +139,9 @@ WIN_EXPORT void YGNodeCopyStyle(const YGNodeRef dstNode, const YGNodeRef srcNode
|
|||||||
#define YG_NODE_LAYOUT_PROPERTY(type, name) \
|
#define YG_NODE_LAYOUT_PROPERTY(type, name) \
|
||||||
WIN_EXPORT type YGNodeLayoutGet##name(const YGNodeRef node);
|
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(void *, Context, context);
|
||||||
YG_NODE_PROPERTY(YGMeasureFunc, MeasureFunc, measureFunc);
|
YG_NODE_PROPERTY(YGMeasureFunc, MeasureFunc, measureFunc);
|
||||||
YG_NODE_PROPERTY(YGBaselineFunc, BaselineFunc, baselineFunc)
|
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(float, Height);
|
||||||
YG_NODE_LAYOUT_PROPERTY(YGDirection, Direction);
|
YG_NODE_LAYOUT_PROPERTY(YGDirection, Direction);
|
||||||
|
|
||||||
// Get the computed padding for this node after performing layout. If padding was set using
|
// 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 YGNodeStyleGetPadding. However if
|
// pixel values then the returned value will be the same as YGNodeStyleGetXXX. However if
|
||||||
// padding was set using a percentage value then the returned value is the computed value used
|
// they were set using a percentage value then the returned value is the computed value used
|
||||||
// during layout.
|
// during layout.
|
||||||
WIN_EXPORT float YGNodeLayoutGetMargin(const YGNodeRef node, const YGEdge edge);
|
YG_NODE_LAYOUT_EDGE_PROPERTY(float, Margin);
|
||||||
WIN_EXPORT float YGNodeLayoutGetPadding(const YGNodeRef node, const YGEdge edge);
|
YG_NODE_LAYOUT_EDGE_PROPERTY(float, Border);
|
||||||
|
YG_NODE_LAYOUT_EDGE_PROPERTY(float, Padding);
|
||||||
|
|
||||||
WIN_EXPORT void YGSetLogger(YGLogger logger);
|
WIN_EXPORT void YGSetLogger(YGLogger logger);
|
||||||
WIN_EXPORT void YGLog(YGLogLevel level, const char *message, ...);
|
WIN_EXPORT void YGLog(YGLogLevel level, const char *message, ...);
|
||||||
|
Reference in New Issue
Block a user