diff --git a/java/com/facebook/yoga/YogaNode.java b/java/com/facebook/yoga/YogaNode.java index 1bca0372..c53aecc6 100644 --- a/java/com/facebook/yoga/YogaNode.java +++ b/java/com/facebook/yoga/YogaNode.java @@ -86,6 +86,14 @@ public class YogaNode implements YogaNodeAPI { @DoNotStrip private float mPaddingBottom = 0; @DoNotStrip + private float mBorderLeft = 0; + @DoNotStrip + private float mBorderTop = 0; + @DoNotStrip + private float mBorderRight = 0; + @DoNotStrip + private float mBorderBottom = 0; + @DoNotStrip private int mLayoutDirection = 0; private native long jni_YGNodeNew(); @@ -633,6 +641,26 @@ public class YogaNode implements YogaNodeAPI { } } + @Override + public float getLayoutBorder(YogaEdge edge) { + switch (edge) { + case LEFT: + return mBorderLeft; + case TOP: + return mBorderTop; + case RIGHT: + return mBorderRight; + case BOTTOM: + return mBorderBottom; + case START: + return getLayoutDirection() == YogaDirection.RTL ? mBorderRight : mBorderLeft; + case END: + return getLayoutDirection() == YogaDirection.RTL ? mBorderLeft : mBorderRight; + default: + throw new IllegalArgumentException("Cannot get layout border of multi-edge shorthands"); + } + } + @Override public YogaDirection getLayoutDirection() { return YogaDirection.fromInt(mLayoutDirection); diff --git a/java/com/facebook/yoga/YogaNodeAPI.java b/java/com/facebook/yoga/YogaNodeAPI.java index a2ca3200..406ec587 100644 --- a/java/com/facebook/yoga/YogaNodeAPI.java +++ b/java/com/facebook/yoga/YogaNodeAPI.java @@ -84,6 +84,7 @@ public interface YogaNodeAPI { float getLayoutHeight(); float getLayoutMargin(YogaEdge edge); float getLayoutPadding(YogaEdge edge); + float getLayoutBorder(YogaEdge edge); YogaDirection getLayoutDirection(); YogaOverflow getOverflow(); void setOverflow(YogaOverflow overflow); diff --git a/java/jni/YGJNI.cpp b/java/jni/YGJNI.cpp index 8476bc1b..92923543 100644 --- a/java/jni/YGJNI.cpp +++ b/java/jni/YGJNI.cpp @@ -40,6 +40,11 @@ static void YGTransferLayoutOutputsRecursive(YGNodeRef root) { static auto paddingRightField = obj->getClass()->getField("mPaddingRight"); static auto paddingBottomField = obj->getClass()->getField("mPaddingBottom"); + static auto borderLeftField = obj->getClass()->getField("mBorderLeft"); + static auto borderTopField = obj->getClass()->getField("mBorderTop"); + static auto borderRightField = obj->getClass()->getField("mBorderRight"); + static auto borderBottomField = obj->getClass()->getField("mBorderBottom"); + obj->setFieldValue(widthField, YGNodeLayoutGetWidth(root)); obj->setFieldValue(heightField, YGNodeLayoutGetHeight(root)); obj->setFieldValue(leftField, YGNodeLayoutGetLeft(root)); @@ -55,6 +60,11 @@ static void YGTransferLayoutOutputsRecursive(YGNodeRef root) { obj->setFieldValue(paddingRightField, YGNodeLayoutGetPadding(root, YGEdgeRight)); obj->setFieldValue(paddingBottomField, YGNodeLayoutGetPadding(root, YGEdgeBottom)); + obj->setFieldValue(borderLeftField, YGNodeLayoutGetBorder(root, YGEdgeLeft)); + obj->setFieldValue(borderTopField, YGNodeLayoutGetBorder(root, YGEdgeTop)); + obj->setFieldValue(borderRightField, YGNodeLayoutGetBorder(root, YGEdgeRight)); + obj->setFieldValue(borderBottomField, YGNodeLayoutGetBorder(root, YGEdgeBottom)); + YGTransferLayoutDirection(root, obj); for (uint32_t i = 0; i < YGNodeGetChildCount(root); i++) { diff --git a/java/tests/com/facebook/yoga/YogaNodeTest.java b/java/tests/com/facebook/yoga/YogaNodeTest.java index 60953f2e..e5575d46 100644 --- a/java/tests/com/facebook/yoga/YogaNodeTest.java +++ b/java/tests/com/facebook/yoga/YogaNodeTest.java @@ -202,6 +202,23 @@ public class YogaNodeTest { assertEquals(4, (int) node.getLayoutPadding(YogaEdge.BOTTOM)); } + @Test + public void testLayoutBorder() { + final YogaNode node = new YogaNode(); + node.setWidth(100); + node.setHeight(100); + node.setBorder(YogaEdge.START, 1); + node.setBorder(YogaEdge.END, 2); + node.setBorder(YogaEdge.TOP, 3); + node.setBorder(YogaEdge.BOTTOM, 4); + node.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED); + + assertEquals(1, (int) node.getLayoutBorder(YogaEdge.LEFT)); + assertEquals(2, (int) node.getLayoutBorder(YogaEdge.RIGHT)); + assertEquals(3, (int) node.getLayoutBorder(YogaEdge.TOP)); + assertEquals(4, (int) node.getLayoutBorder(YogaEdge.BOTTOM)); + } + @Test public void testPercentPaddingOnRoot() { final YogaNode node = new YogaNode();