move property storage into sub-object

Summary:
Here we introduce an abstraction over node property storage, in order to experiment with different approaches for Java/C integration.

- interface `YogaNodeProperties` as abstraction
- current JNI code factored into `YogaNodePropertiesJNI.java`
- `YogaNode` delegates all calls, no API changes

Reviewed By: astreet

Differential Revision: D8769448

fbshipit-source-id: e67327ce41fa047a51a986c652b3d59992a510e2
This commit is contained in:
David Aurelio
2018-07-30 09:30:50 -07:00
committed by Facebook Github Bot
parent 006f6460a9
commit b1821ab4cd
4 changed files with 873 additions and 343 deletions

View File

@@ -26,117 +26,35 @@ public class YogaNode implements Cloneable {
*/ */
static native int jni_YGNodeGetInstanceCount(); static native int jni_YGNodeGetInstanceCount();
private YogaNodeProperties mDelegate;
private YogaNode mOwner; private YogaNode mOwner;
@Nullable private List<YogaNode> mChildren; @Nullable private List<YogaNode> mChildren;
private YogaMeasureFunction mMeasureFunction; private YogaMeasureFunction mMeasureFunction;
private YogaBaselineFunction mBaselineFunction; private YogaBaselineFunction mBaselineFunction;
private long mNativePointer;
private Object mData; private Object mData;
/* Those flags needs be in sync with YGJNI.cpp */
private static final int MARGIN = 1;
private static final int PADDING = 2;
private static final int BORDER = 4;
@DoNotStrip
private int mEdgeSetFlag = 0;
private boolean mHasSetPosition = false;
@DoNotStrip
private float mWidth = YogaConstants.UNDEFINED;
@DoNotStrip
private float mHeight = YogaConstants.UNDEFINED;
@DoNotStrip
private float mTop = YogaConstants.UNDEFINED;
@DoNotStrip
private float mLeft = YogaConstants.UNDEFINED;
@DoNotStrip
private float mMarginLeft = 0;
@DoNotStrip
private float mMarginTop = 0;
@DoNotStrip
private float mMarginRight = 0;
@DoNotStrip
private float mMarginBottom = 0;
@DoNotStrip
private float mPaddingLeft = 0;
@DoNotStrip
private float mPaddingTop = 0;
@DoNotStrip
private float mPaddingRight = 0;
@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;
@DoNotStrip
private boolean mHasNewLayout = true;
@DoNotStrip private boolean mDoesLegacyStretchFlagAffectsLayout = false;
private native long jni_YGNodeNew();
public YogaNode() { public YogaNode() {
mNativePointer = jni_YGNodeNew(); mDelegate = new YogaNodePropertiesJNI(this);
if (mNativePointer == 0) {
throw new IllegalStateException("Failed to allocate native memory");
}
} }
private native long jni_YGNodeNewWithConfig(long configPointer);
public YogaNode(YogaConfig config) { public YogaNode(YogaConfig config) {
mNativePointer = jni_YGNodeNewWithConfig(config.mNativePointer); mDelegate = new YogaNodePropertiesJNI(this, config);
if (mNativePointer == 0) {
throw new IllegalStateException("Failed to allocate native memory");
}
} }
private native void jni_YGNodeFree(long nativePointer); public long getNativePointer() {
@Override return mDelegate.getNativePointer();
protected void finalize() throws Throwable { }
try {
jni_YGNodeFree(mNativePointer); /* frees the native underlying YGNode. Useful for testing. */
} finally { public void freeNatives() {
super.finalize(); mDelegate.freeNatives();
}
} }
private native void jni_YGNodeReset(long nativePointer);
public void reset() { public void reset() {
mEdgeSetFlag = 0;
mHasSetPosition = false;
mHasNewLayout = true;
mWidth = YogaConstants.UNDEFINED;
mHeight = YogaConstants.UNDEFINED;
mTop = YogaConstants.UNDEFINED;
mLeft = YogaConstants.UNDEFINED;
mMarginLeft = 0;
mMarginTop = 0;
mMarginRight = 0;
mMarginBottom = 0;
mPaddingLeft = 0;
mPaddingTop = 0;
mPaddingRight = 0;
mPaddingBottom = 0;
mBorderLeft = 0;
mBorderTop = 0;
mBorderRight = 0;
mBorderBottom = 0;
mLayoutDirection = 0;
mMeasureFunction = null; mMeasureFunction = null;
mBaselineFunction = null; mBaselineFunction = null;
mData = null; mData = null;
mDoesLegacyStretchFlagAffectsLayout = false; mDelegate.reset();
jni_YGNodeReset(mNativePointer);
} }
public int getChildCount() { public int getChildCount() {
@@ -161,7 +79,7 @@ public class YogaNode implements Cloneable {
} }
mChildren.add(i, child); mChildren.add(i, child);
child.mOwner = this; child.mOwner = this;
jni_YGNodeInsertChild(mNativePointer, child.mNativePointer, i); jni_YGNodeInsertChild(getNativePointer(), child.getNativePointer(), i);
} }
private native void jni_YGNodeInsertSharedChild(long nativePointer, long childPointer, int index); private native void jni_YGNodeInsertSharedChild(long nativePointer, long childPointer, int index);
@@ -172,27 +90,24 @@ public class YogaNode implements Cloneable {
} }
mChildren.add(i, child); mChildren.add(i, child);
child.mOwner = null; child.mOwner = null;
jni_YGNodeInsertSharedChild(mNativePointer, child.mNativePointer, i); jni_YGNodeInsertSharedChild(getNativePointer(), child.getNativePointer(), i);
} }
private native void jni_YGNodeSetOwner(long nativePointer, long newOwnerNativePointer); private native void jni_YGNodeSetOwner(long nativePointer, long newOwnerNativePointer);
private native long jni_YGNodeClone(long nativePointer, Object newNode);
@Override @Override
public YogaNode clone() { public YogaNode clone() {
try { try {
YogaNode clonedYogaNode = (YogaNode) super.clone(); YogaNode clonedYogaNode = (YogaNode) super.clone();
long clonedNativePointer = jni_YGNodeClone(mNativePointer, clonedYogaNode);
if (mChildren != null) { if (mChildren != null) {
for (YogaNode child : mChildren) { for (YogaNode child : mChildren) {
child.jni_YGNodeSetOwner(child.mNativePointer, 0); child.jni_YGNodeSetOwner(child.getNativePointer(), 0);
child.mOwner = null; child.mOwner = null;
} }
} }
clonedYogaNode.mNativePointer = clonedNativePointer; clonedYogaNode.mDelegate = mDelegate.clone(clonedYogaNode);
clonedYogaNode.mOwner = null; clonedYogaNode.mOwner = null;
clonedYogaNode.mChildren = clonedYogaNode.mChildren =
mChildren != null ? (List<YogaNode>) ((ArrayList) mChildren).clone() : null; mChildren != null ? (List<YogaNode>) ((ArrayList) mChildren).clone() : null;
@@ -211,9 +126,8 @@ public class YogaNode implements Cloneable {
public YogaNode cloneWithNewChildren() { public YogaNode cloneWithNewChildren() {
try { try {
YogaNode clonedYogaNode = (YogaNode) super.clone(); YogaNode clonedYogaNode = (YogaNode) super.clone();
long clonedNativePointer = jni_YGNodeClone(mNativePointer, clonedYogaNode); clonedYogaNode.mDelegate = mDelegate.clone(clonedYogaNode);
clonedYogaNode.mOwner = null; clonedYogaNode.mOwner = null;
clonedYogaNode.mNativePointer = clonedNativePointer;
clonedYogaNode.clearChildren(); clonedYogaNode.clearChildren();
return clonedYogaNode; return clonedYogaNode;
} catch (CloneNotSupportedException ex) { } catch (CloneNotSupportedException ex) {
@@ -226,7 +140,7 @@ public class YogaNode implements Cloneable {
private void clearChildren() { private void clearChildren() {
mChildren = null; mChildren = null;
jni_YGNodeClearChildren(mNativePointer); jni_YGNodeClearChildren(getNativePointer());
} }
private native void jni_YGNodeRemoveChild(long nativePointer, long childPointer); private native void jni_YGNodeRemoveChild(long nativePointer, long childPointer);
@@ -237,7 +151,7 @@ public class YogaNode implements Cloneable {
} }
final YogaNode child = mChildren.remove(i); final YogaNode child = mChildren.remove(i);
child.mOwner = null; child.mOwner = null;
jni_YGNodeRemoveChild(mNativePointer, child.mNativePointer); jni_YGNodeRemoveChild(getNativePointer(), child.getNativePointer());
return child; return child;
} }
@@ -267,453 +181,326 @@ public class YogaNode implements Cloneable {
private native void jni_YGNodeCalculateLayout(long nativePointer, float width, float height); private native void jni_YGNodeCalculateLayout(long nativePointer, float width, float height);
public void calculateLayout(float width, float height) { public void calculateLayout(float width, float height) {
jni_YGNodeCalculateLayout(mNativePointer, width, height); jni_YGNodeCalculateLayout(getNativePointer(), width, height);
mDelegate.onAfterCalculateLayout();
} }
public boolean hasNewLayout() { public boolean hasNewLayout() {
return mHasNewLayout; return mDelegate.hasNewLayout();
} }
private native void jni_YGNodeMarkDirty(long nativePointer); private native void jni_YGNodeMarkDirty(long nativePointer);
public void dirty() { public void dirty() {
jni_YGNodeMarkDirty(mNativePointer); jni_YGNodeMarkDirty(getNativePointer());
} }
private native void jni_YGNodeMarkDirtyAndPropogateToDescendants(long nativePointer); private native void jni_YGNodeMarkDirtyAndPropogateToDescendants(long nativePointer);
public void dirtyAllDescendants() { public void dirtyAllDescendants() {
jni_YGNodeMarkDirtyAndPropogateToDescendants(mNativePointer); jni_YGNodeMarkDirtyAndPropogateToDescendants(getNativePointer());
} }
private native boolean jni_YGNodeIsDirty(long nativePointer);
public boolean isDirty() { public boolean isDirty() {
return jni_YGNodeIsDirty(mNativePointer); return mDelegate.isDirty();
} }
private native void jni_YGNodeCopyStyle(long dstNativePointer, long srcNativePointer); private native void jni_YGNodeCopyStyle(long dstNativePointer, long srcNativePointer);
public void copyStyle(YogaNode srcNode) { public void copyStyle(YogaNode srcNode) {
jni_YGNodeCopyStyle(mNativePointer, srcNode.mNativePointer); jni_YGNodeCopyStyle(getNativePointer(), srcNode.getNativePointer());
} }
public void markLayoutSeen() { public void markLayoutSeen() {
mHasNewLayout = false; mDelegate.markLayoutSeen();
} }
private native int jni_YGNodeStyleGetDirection(long nativePointer);
public YogaDirection getStyleDirection() { public YogaDirection getStyleDirection() {
return YogaDirection.fromInt(jni_YGNodeStyleGetDirection(mNativePointer)); return mDelegate.getStyleDirection();
} }
private native void jni_YGNodeStyleSetDirection(long nativePointer, int direction);
public void setDirection(YogaDirection direction) { public void setDirection(YogaDirection direction) {
jni_YGNodeStyleSetDirection(mNativePointer, direction.intValue()); mDelegate.setDirection(direction);
} }
private native int jni_YGNodeStyleGetFlexDirection(long nativePointer);
public YogaFlexDirection getFlexDirection() { public YogaFlexDirection getFlexDirection() {
return YogaFlexDirection.fromInt(jni_YGNodeStyleGetFlexDirection(mNativePointer)); return mDelegate.getFlexDirection();
} }
private native void jni_YGNodeStyleSetFlexDirection(long nativePointer, int flexDirection);
public void setFlexDirection(YogaFlexDirection flexDirection) { public void setFlexDirection(YogaFlexDirection flexDirection) {
jni_YGNodeStyleSetFlexDirection(mNativePointer, flexDirection.intValue()); mDelegate.setFlexDirection(flexDirection);
} }
private native int jni_YGNodeStyleGetJustifyContent(long nativePointer);
public YogaJustify getJustifyContent() { public YogaJustify getJustifyContent() {
return YogaJustify.fromInt(jni_YGNodeStyleGetJustifyContent(mNativePointer)); return mDelegate.getJustifyContent();
} }
private native void jni_YGNodeStyleSetJustifyContent(long nativePointer, int justifyContent);
public void setJustifyContent(YogaJustify justifyContent) { public void setJustifyContent(YogaJustify justifyContent) {
jni_YGNodeStyleSetJustifyContent(mNativePointer, justifyContent.intValue()); mDelegate.setJustifyContent(justifyContent);
} }
private native int jni_YGNodeStyleGetAlignItems(long nativePointer);
public YogaAlign getAlignItems() { public YogaAlign getAlignItems() {
return YogaAlign.fromInt(jni_YGNodeStyleGetAlignItems(mNativePointer)); return mDelegate.getAlignItems();
} }
private native void jni_YGNodeStyleSetAlignItems(long nativePointer, int alignItems);
public void setAlignItems(YogaAlign alignItems) { public void setAlignItems(YogaAlign alignItems) {
jni_YGNodeStyleSetAlignItems(mNativePointer, alignItems.intValue()); mDelegate.setAlignItems(alignItems);
} }
private native int jni_YGNodeStyleGetAlignSelf(long nativePointer);
public YogaAlign getAlignSelf() { public YogaAlign getAlignSelf() {
return YogaAlign.fromInt(jni_YGNodeStyleGetAlignSelf(mNativePointer)); return mDelegate.getAlignSelf();
} }
private native void jni_YGNodeStyleSetAlignSelf(long nativePointer, int alignSelf);
public void setAlignSelf(YogaAlign alignSelf) { public void setAlignSelf(YogaAlign alignSelf) {
jni_YGNodeStyleSetAlignSelf(mNativePointer, alignSelf.intValue()); mDelegate.setAlignSelf(alignSelf);
} }
private native int jni_YGNodeStyleGetAlignContent(long nativePointer);
public YogaAlign getAlignContent() { public YogaAlign getAlignContent() {
return YogaAlign.fromInt(jni_YGNodeStyleGetAlignContent(mNativePointer)); return mDelegate.getAlignContent();
} }
private native void jni_YGNodeStyleSetAlignContent(long nativePointer, int alignContent);
public void setAlignContent(YogaAlign alignContent) { public void setAlignContent(YogaAlign alignContent) {
jni_YGNodeStyleSetAlignContent(mNativePointer, alignContent.intValue()); mDelegate.setAlignContent(alignContent);
} }
private native int jni_YGNodeStyleGetPositionType(long nativePointer);
public YogaPositionType getPositionType() { public YogaPositionType getPositionType() {
return YogaPositionType.fromInt(jni_YGNodeStyleGetPositionType(mNativePointer)); return mDelegate.getPositionType();
} }
private native void jni_YGNodeStyleSetPositionType(long nativePointer, int positionType);
public void setPositionType(YogaPositionType positionType) { public void setPositionType(YogaPositionType positionType) {
jni_YGNodeStyleSetPositionType(mNativePointer, positionType.intValue()); mDelegate.setPositionType(positionType);
} }
private native void jni_YGNodeStyleSetFlexWrap(long nativePointer, int wrapType);
public void setWrap(YogaWrap flexWrap) { public void setWrap(YogaWrap flexWrap) {
jni_YGNodeStyleSetFlexWrap(mNativePointer, flexWrap.intValue()); mDelegate.setWrap(flexWrap);
} }
private native int jni_YGNodeStyleGetOverflow(long nativePointer);
public YogaOverflow getOverflow() { public YogaOverflow getOverflow() {
return YogaOverflow.fromInt(jni_YGNodeStyleGetOverflow(mNativePointer)); return mDelegate.getOverflow();
} }
private native void jni_YGNodeStyleSetOverflow(long nativePointer, int overflow);
public void setOverflow(YogaOverflow overflow) { public void setOverflow(YogaOverflow overflow) {
jni_YGNodeStyleSetOverflow(mNativePointer, overflow.intValue()); mDelegate.setOverflow(overflow);
} }
private native int jni_YGNodeStyleGetDisplay(long nativePointer);
public YogaDisplay getDisplay() { public YogaDisplay getDisplay() {
return YogaDisplay.fromInt(jni_YGNodeStyleGetDisplay(mNativePointer)); return mDelegate.getDisplay();
} }
private native void jni_YGNodeStyleSetDisplay(long nativePointer, int display);
public void setDisplay(YogaDisplay display) { public void setDisplay(YogaDisplay display) {
jni_YGNodeStyleSetDisplay(mNativePointer, display.intValue()); mDelegate.setDisplay(display);
} }
private native void jni_YGNodeStyleSetFlex(long nativePointer, float flex);
public void setFlex(float flex) { public void setFlex(float flex) {
jni_YGNodeStyleSetFlex(mNativePointer, flex); mDelegate.setFlex(flex);
} }
private native float jni_YGNodeStyleGetFlexGrow(long nativePointer);
public float getFlexGrow() { public float getFlexGrow() {
return jni_YGNodeStyleGetFlexGrow(mNativePointer); return mDelegate.getFlexGrow();
} }
private native void jni_YGNodeStyleSetFlexGrow(long nativePointer, float flexGrow);
public void setFlexGrow(float flexGrow) { public void setFlexGrow(float flexGrow) {
jni_YGNodeStyleSetFlexGrow(mNativePointer, flexGrow); mDelegate.setFlexGrow(flexGrow);
} }
private native float jni_YGNodeStyleGetFlexShrink(long nativePointer);
public float getFlexShrink() { public float getFlexShrink() {
return jni_YGNodeStyleGetFlexShrink(mNativePointer); return mDelegate.getFlexShrink();
} }
private native void jni_YGNodeStyleSetFlexShrink(long nativePointer, float flexShrink);
public void setFlexShrink(float flexShrink) { public void setFlexShrink(float flexShrink) {
jni_YGNodeStyleSetFlexShrink(mNativePointer, flexShrink); mDelegate.setFlexShrink(flexShrink);
} }
private native Object jni_YGNodeStyleGetFlexBasis(long nativePointer);
public YogaValue getFlexBasis() { public YogaValue getFlexBasis() {
return (YogaValue) jni_YGNodeStyleGetFlexBasis(mNativePointer); return mDelegate.getFlexBasis();
} }
private native void jni_YGNodeStyleSetFlexBasis(long nativePointer, float flexBasis);
public void setFlexBasis(float flexBasis) { public void setFlexBasis(float flexBasis) {
jni_YGNodeStyleSetFlexBasis(mNativePointer, flexBasis); mDelegate.setFlexBasis(flexBasis);
} }
private native void jni_YGNodeStyleSetFlexBasisPercent(long nativePointer, float percent);
public void setFlexBasisPercent(float percent) { public void setFlexBasisPercent(float percent) {
jni_YGNodeStyleSetFlexBasisPercent(mNativePointer, percent); mDelegate.setFlexBasisPercent(percent);
} }
private native void jni_YGNodeStyleSetFlexBasisAuto(long nativePointer);
public void setFlexBasisAuto() { public void setFlexBasisAuto() {
jni_YGNodeStyleSetFlexBasisAuto(mNativePointer); mDelegate.setFlexBasisAuto();
} }
private native Object jni_YGNodeStyleGetMargin(long nativePointer, int edge);
public YogaValue getMargin(YogaEdge edge) { public YogaValue getMargin(YogaEdge edge) {
if (!((mEdgeSetFlag & MARGIN) == MARGIN)) { return mDelegate.getMargin(edge);
return YogaValue.UNDEFINED;
}
return (YogaValue) jni_YGNodeStyleGetMargin(mNativePointer, edge.intValue());
} }
private native void jni_YGNodeStyleSetMargin(long nativePointer, int edge, float margin);
public void setMargin(YogaEdge edge, float margin) { public void setMargin(YogaEdge edge, float margin) {
mEdgeSetFlag |= MARGIN; mDelegate.setMargin(edge, margin);
jni_YGNodeStyleSetMargin(mNativePointer, edge.intValue(), margin);
} }
private native void jni_YGNodeStyleSetMarginPercent(long nativePointer, int edge, float percent);
public void setMarginPercent(YogaEdge edge, float percent) { public void setMarginPercent(YogaEdge edge, float percent) {
mEdgeSetFlag |= MARGIN; mDelegate.setMarginPercent(edge, percent);
jni_YGNodeStyleSetMarginPercent(mNativePointer, edge.intValue(), percent);
} }
private native void jni_YGNodeStyleSetMarginAuto(long nativePointer, int edge);
public void setMarginAuto(YogaEdge edge) { public void setMarginAuto(YogaEdge edge) {
mEdgeSetFlag |= MARGIN; mDelegate.setMarginAuto(edge);
jni_YGNodeStyleSetMarginAuto(mNativePointer, edge.intValue());
} }
private native Object jni_YGNodeStyleGetPadding(long nativePointer, int edge);
public YogaValue getPadding(YogaEdge edge) { public YogaValue getPadding(YogaEdge edge) {
if (!((mEdgeSetFlag & PADDING) == PADDING)) { return mDelegate.getPadding(edge);
return YogaValue.UNDEFINED;
}
return (YogaValue) jni_YGNodeStyleGetPadding(mNativePointer, edge.intValue());
} }
private native void jni_YGNodeStyleSetPadding(long nativePointer, int edge, float padding);
public void setPadding(YogaEdge edge, float padding) { public void setPadding(YogaEdge edge, float padding) {
mEdgeSetFlag |= PADDING; mDelegate.setPadding(edge, padding);
jni_YGNodeStyleSetPadding(mNativePointer, edge.intValue(), padding);
} }
private native void jni_YGNodeStyleSetPaddingPercent(long nativePointer, int edge, float percent);
public void setPaddingPercent(YogaEdge edge, float percent) { public void setPaddingPercent(YogaEdge edge, float percent) {
mEdgeSetFlag |= PADDING; mDelegate.setPaddingPercent(edge, percent);
jni_YGNodeStyleSetPaddingPercent(mNativePointer, edge.intValue(), percent);
} }
private native float jni_YGNodeStyleGetBorder(long nativePointer, int edge);
public float getBorder(YogaEdge edge) { public float getBorder(YogaEdge edge) {
if (!((mEdgeSetFlag & BORDER) == BORDER)) { return mDelegate.getBorder(edge);
return YogaConstants.UNDEFINED;
}
return jni_YGNodeStyleGetBorder(mNativePointer, edge.intValue());
} }
private native void jni_YGNodeStyleSetBorder(long nativePointer, int edge, float border);
public void setBorder(YogaEdge edge, float border) { public void setBorder(YogaEdge edge, float border) {
mEdgeSetFlag |= BORDER; mDelegate.setBorder(edge, border);
jni_YGNodeStyleSetBorder(mNativePointer, edge.intValue(), border);
} }
private native Object jni_YGNodeStyleGetPosition(long nativePointer, int edge);
public YogaValue getPosition(YogaEdge edge) { public YogaValue getPosition(YogaEdge edge) {
if (!mHasSetPosition) { return mDelegate.getPosition(edge);
return YogaValue.UNDEFINED;
}
return (YogaValue) jni_YGNodeStyleGetPosition(mNativePointer, edge.intValue());
} }
private native void jni_YGNodeStyleSetPosition(long nativePointer, int edge, float position);
public void setPosition(YogaEdge edge, float position) { public void setPosition(YogaEdge edge, float position) {
mHasSetPosition = true; mDelegate.setPosition(edge, position);
jni_YGNodeStyleSetPosition(mNativePointer, edge.intValue(), position);
} }
private native void jni_YGNodeStyleSetPositionPercent(long nativePointer, int edge, float percent);
public void setPositionPercent(YogaEdge edge, float percent) { public void setPositionPercent(YogaEdge edge, float percent) {
mHasSetPosition = true; mDelegate.setPositionPercent(edge, percent);
jni_YGNodeStyleSetPositionPercent(mNativePointer, edge.intValue(), percent);
} }
private native Object jni_YGNodeStyleGetWidth(long nativePointer);
public YogaValue getWidth() { public YogaValue getWidth() {
return (YogaValue) jni_YGNodeStyleGetWidth(mNativePointer); return mDelegate.getWidth();
} }
private native void jni_YGNodeStyleSetWidth(long nativePointer, float width);
public void setWidth(float width) { public void setWidth(float width) {
jni_YGNodeStyleSetWidth(mNativePointer, width); mDelegate.setWidth(width);
} }
private native void jni_YGNodeStyleSetWidthPercent(long nativePointer, float percent);
public void setWidthPercent(float percent) { public void setWidthPercent(float percent) {
jni_YGNodeStyleSetWidthPercent(mNativePointer, percent); mDelegate.setWidthPercent(percent);
} }
private native void jni_YGNodeStyleSetWidthAuto(long nativePointer);
public void setWidthAuto() { public void setWidthAuto() {
jni_YGNodeStyleSetWidthAuto(mNativePointer); mDelegate.setWidthAuto();
} }
private native Object jni_YGNodeStyleGetHeight(long nativePointer);
public YogaValue getHeight() { public YogaValue getHeight() {
return (YogaValue) jni_YGNodeStyleGetHeight(mNativePointer); return mDelegate.getHeight();
} }
private native void jni_YGNodeStyleSetHeight(long nativePointer, float height);
public void setHeight(float height) { public void setHeight(float height) {
jni_YGNodeStyleSetHeight(mNativePointer, height); mDelegate.setHeight(height);
} }
private native void jni_YGNodeStyleSetHeightPercent(long nativePointer, float percent);
public void setHeightPercent(float percent) { public void setHeightPercent(float percent) {
jni_YGNodeStyleSetHeightPercent(mNativePointer, percent); mDelegate.setHeightPercent(percent);
} }
private native void jni_YGNodeStyleSetHeightAuto(long nativePointer);
public void setHeightAuto() { public void setHeightAuto() {
jni_YGNodeStyleSetHeightAuto(mNativePointer); mDelegate.setHeightAuto();
} }
private native Object jni_YGNodeStyleGetMinWidth(long nativePointer);
public YogaValue getMinWidth() { public YogaValue getMinWidth() {
return (YogaValue) jni_YGNodeStyleGetMinWidth(mNativePointer); return mDelegate.getMinWidth();
} }
private native void jni_YGNodeStyleSetMinWidth(long nativePointer, float minWidth);
public void setMinWidth(float minWidth) { public void setMinWidth(float minWidth) {
jni_YGNodeStyleSetMinWidth(mNativePointer, minWidth); mDelegate.setMinWidth(minWidth);
} }
private native void jni_YGNodeStyleSetMinWidthPercent(long nativePointer, float percent);
public void setMinWidthPercent(float percent) { public void setMinWidthPercent(float percent) {
jni_YGNodeStyleSetMinWidthPercent(mNativePointer, percent); mDelegate.setMinWidthPercent(percent);
} }
private native Object jni_YGNodeStyleGetMinHeight(long nativePointer);
public YogaValue getMinHeight() { public YogaValue getMinHeight() {
return (YogaValue) jni_YGNodeStyleGetMinHeight(mNativePointer); return mDelegate.getMinHeight();
} }
private native void jni_YGNodeStyleSetMinHeight(long nativePointer, float minHeight);
public void setMinHeight(float minHeight) { public void setMinHeight(float minHeight) {
jni_YGNodeStyleSetMinHeight(mNativePointer, minHeight); mDelegate.setMinHeight(minHeight);
} }
private native void jni_YGNodeStyleSetMinHeightPercent(long nativePointer, float percent);
public void setMinHeightPercent(float percent) { public void setMinHeightPercent(float percent) {
jni_YGNodeStyleSetMinHeightPercent(mNativePointer, percent); mDelegate.setMinHeightPercent(percent);
} }
private native Object jni_YGNodeStyleGetMaxWidth(long nativePointer);
public YogaValue getMaxWidth() { public YogaValue getMaxWidth() {
return (YogaValue) jni_YGNodeStyleGetMaxWidth(mNativePointer); return mDelegate.getMaxWidth();
} }
private native void jni_YGNodeStyleSetMaxWidth(long nativePointer, float maxWidth);
public void setMaxWidth(float maxWidth) { public void setMaxWidth(float maxWidth) {
jni_YGNodeStyleSetMaxWidth(mNativePointer, maxWidth); mDelegate.setMaxWidth(maxWidth);
} }
private native void jni_YGNodeStyleSetMaxWidthPercent(long nativePointer, float percent);
public void setMaxWidthPercent(float percent) { public void setMaxWidthPercent(float percent) {
jni_YGNodeStyleSetMaxWidthPercent(mNativePointer, percent); mDelegate.setMaxWidthPercent(percent);
} }
private native Object jni_YGNodeStyleGetMaxHeight(long nativePointer);
public YogaValue getMaxHeight() { public YogaValue getMaxHeight() {
return (YogaValue) jni_YGNodeStyleGetMaxHeight(mNativePointer); return mDelegate.getMaxHeight();
} }
private native void jni_YGNodeStyleSetMaxHeight(long nativePointer, float maxheight);
public void setMaxHeight(float maxheight) { public void setMaxHeight(float maxheight) {
jni_YGNodeStyleSetMaxHeight(mNativePointer, maxheight); mDelegate.setMaxHeight(maxheight);
} }
private native void jni_YGNodeStyleSetMaxHeightPercent(long nativePointer, float percent);
public void setMaxHeightPercent(float percent) { public void setMaxHeightPercent(float percent) {
jni_YGNodeStyleSetMaxHeightPercent(mNativePointer, percent); mDelegate.setMaxHeightPercent(percent);
} }
private native float jni_YGNodeStyleGetAspectRatio(long nativePointer);
public float getAspectRatio() { public float getAspectRatio() {
return jni_YGNodeStyleGetAspectRatio(mNativePointer); return mDelegate.getAspectRatio();
} }
private native void jni_YGNodeStyleSetAspectRatio(long nativePointer, float aspectRatio);
public void setAspectRatio(float aspectRatio) { public void setAspectRatio(float aspectRatio) {
jni_YGNodeStyleSetAspectRatio(mNativePointer, aspectRatio); mDelegate.setAspectRatio(aspectRatio);
} }
public float getLayoutX() { public float getLayoutX() {
return mLeft; return mDelegate.getLayoutX();
} }
public float getLayoutY() { public float getLayoutY() {
return mTop; return mDelegate.getLayoutY();
} }
public float getLayoutWidth() { public float getLayoutWidth() {
return mWidth; return mDelegate.getLayoutWidth();
} }
public float getLayoutHeight() { public float getLayoutHeight() {
return mHeight; return mDelegate.getLayoutHeight();
} }
public boolean getDoesLegacyStretchFlagAffectsLayout() { public boolean getDoesLegacyStretchFlagAffectsLayout() {
return mDoesLegacyStretchFlagAffectsLayout; return mDelegate.getDoesLegacyStretchFlagAffectsLayout();
} }
public float getLayoutMargin(YogaEdge edge) { public float getLayoutMargin(YogaEdge edge) {
switch (edge) { return mDelegate.getLayoutMargin(edge);
case LEFT:
return mMarginLeft;
case TOP:
return mMarginTop;
case RIGHT:
return mMarginRight;
case BOTTOM:
return mMarginBottom;
case START:
return getLayoutDirection() == YogaDirection.RTL ? mMarginRight : mMarginLeft;
case END:
return getLayoutDirection() == YogaDirection.RTL ? mMarginLeft : mMarginRight;
default:
throw new IllegalArgumentException("Cannot get layout margins of multi-edge shorthands");
}
} }
public float getLayoutPadding(YogaEdge edge) { public float getLayoutPadding(YogaEdge edge) {
switch (edge) { return mDelegate.getLayoutPadding(edge);
case LEFT:
return mPaddingLeft;
case TOP:
return mPaddingTop;
case RIGHT:
return mPaddingRight;
case BOTTOM:
return mPaddingBottom;
case START:
return getLayoutDirection() == YogaDirection.RTL ? mPaddingRight : mPaddingLeft;
case END:
return getLayoutDirection() == YogaDirection.RTL ? mPaddingLeft : mPaddingRight;
default:
throw new IllegalArgumentException("Cannot get layout paddings of multi-edge shorthands");
}
} }
public float getLayoutBorder(YogaEdge edge) { public float getLayoutBorder(YogaEdge edge) {
switch (edge) { return mDelegate.getLayoutBorder(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");
}
} }
public YogaDirection getLayoutDirection() { public YogaDirection getLayoutDirection() {
return YogaDirection.fromInt(mLayoutDirection); return mDelegate.getLayoutDirection();
} }
private native void jni_YGNodeSetHasMeasureFunc(long nativePointer, boolean hasMeasureFunc); private native void jni_YGNodeSetHasMeasureFunc(long nativePointer, boolean hasMeasureFunc);
public void setMeasureFunction(YogaMeasureFunction measureFunction) { public void setMeasureFunction(YogaMeasureFunction measureFunction) {
mMeasureFunction = measureFunction; mMeasureFunction = measureFunction;
jni_YGNodeSetHasMeasureFunc(mNativePointer, measureFunction != null); jni_YGNodeSetHasMeasureFunc(getNativePointer(), measureFunction != null);
} }
// Implementation Note: Why this method needs to stay final // Implementation Note: Why this method needs to stay final
@@ -738,7 +525,7 @@ public class YogaNode implements Cloneable {
private native void jni_YGNodeSetHasBaselineFunc(long nativePointer, boolean hasMeasureFunc); private native void jni_YGNodeSetHasBaselineFunc(long nativePointer, boolean hasMeasureFunc);
public void setBaselineFunction(YogaBaselineFunction baselineFunction) { public void setBaselineFunction(YogaBaselineFunction baselineFunction) {
mBaselineFunction = baselineFunction; mBaselineFunction = baselineFunction;
jni_YGNodeSetHasBaselineFunc(mNativePointer, baselineFunction != null); jni_YGNodeSetHasBaselineFunc(getNativePointer(), baselineFunction != null);
} }
@DoNotStrip @DoNotStrip
@@ -765,7 +552,7 @@ public class YogaNode implements Cloneable {
* layout of the tree rooted at this node. * layout of the tree rooted at this node.
*/ */
public void print() { public void print() {
jni_YGNodePrint(mNativePointer); jni_YGNodePrint(getNativePointer());
} }
/** /**
@@ -783,6 +570,6 @@ public class YogaNode implements Cloneable {
mChildren.remove(childIndex); mChildren.remove(childIndex);
mChildren.add(childIndex, newNode); mChildren.add(childIndex, newNode);
newNode.mOwner = this; newNode.mOwner = this;
return newNode.mNativePointer; return newNode.getNativePointer();
} }
} }

View File

@@ -164,4 +164,6 @@ public interface YogaNodeProperties {
float getLayoutBorder(YogaEdge edge); float getLayoutBorder(YogaEdge edge);
YogaDirection getLayoutDirection(); YogaDirection getLayoutDirection();
void freeNatives();
} }

View File

@@ -0,0 +1,702 @@
/*
* Copyright (c) 2018-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the LICENSE
* file in the root directory of this source tree.
*
*/
package com.facebook.yoga;
import com.facebook.proguard.annotations.DoNotStrip;
import com.facebook.soloader.SoLoader;
public class YogaNodePropertiesJNI implements Cloneable, YogaNodeProperties {
static {
SoLoader.loadLibrary("yoga");
}
private long mNativePointer;
/* Those flags needs be in sync with YGJNI.cpp */
private static final int MARGIN = 1;
private static final int PADDING = 2;
private static final int BORDER = 4;
@DoNotStrip private int mEdgeSetFlag = 0;
private boolean mHasSetPosition = false;
@DoNotStrip private float mWidth = YogaConstants.UNDEFINED;
@DoNotStrip private float mHeight = YogaConstants.UNDEFINED;
@DoNotStrip private float mTop = YogaConstants.UNDEFINED;
@DoNotStrip private float mLeft = YogaConstants.UNDEFINED;
@DoNotStrip private float mMarginLeft = 0;
@DoNotStrip private float mMarginTop = 0;
@DoNotStrip private float mMarginRight = 0;
@DoNotStrip private float mMarginBottom = 0;
@DoNotStrip private float mPaddingLeft = 0;
@DoNotStrip private float mPaddingTop = 0;
@DoNotStrip private float mPaddingRight = 0;
@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;
@DoNotStrip private boolean mHasNewLayout = true;
@DoNotStrip private boolean mDoesLegacyStretchFlagAffectsLayout = false;
private native long jni_YGNodeNew(YogaNode node);
public YogaNodePropertiesJNI(YogaNode node) {
mNativePointer = jni_YGNodeNew(node);
if (mNativePointer == 0) {
throw new IllegalStateException("Failed to allocate native memory");
}
}
private native long jni_YGNodeNewWithConfig(YogaNode node, long configPointer);
public YogaNodePropertiesJNI(YogaNode node, YogaConfig config) {
mNativePointer = jni_YGNodeNewWithConfig(node, config.mNativePointer);
if (mNativePointer == 0) {
throw new IllegalStateException("Failed to allocate native memory");
}
}
private native void jni_YGNodeFree(long nativePointer);
@Override
public void freeNatives() {
jni_YGNodeFree(mNativePointer);
mNativePointer = 0;
}
@Override
protected void finalize() throws Throwable {
try {
freeNatives();
} finally {
super.finalize();
}
}
private static native long jni_YGNodeClone(
long nativePointer, YogaNode newNode, YogaNodePropertiesJNI newProps);
@Override
public YogaNodeProperties clone(YogaNode node) {
try {
YogaNodePropertiesJNI clonedProperties = (YogaNodePropertiesJNI) clone();
clonedProperties.mNativePointer = jni_YGNodeClone(getNativePointer(), node, clonedProperties);
return clonedProperties;
} catch (CloneNotSupportedException ex) {
// This class implements Cloneable, this should not happen
throw new RuntimeException(ex);
}
}
@Override
public long getNativePointer() {
return mNativePointer;
}
private static native void jni_YGTransferLayoutOutputsRecursive(long nativePointer);
@Override
public void onAfterCalculateLayout() {
jni_YGTransferLayoutOutputsRecursive(mNativePointer);
}
private native void jni_YGNodeReset(long nativePointer);
@Override
public void reset() {
mHasSetPosition = false;
mEdgeSetFlag = 0;
mHasNewLayout = true;
mDoesLegacyStretchFlagAffectsLayout = false;
mWidth = YogaConstants.UNDEFINED;
mHeight = YogaConstants.UNDEFINED;
mTop = YogaConstants.UNDEFINED;
mLeft = YogaConstants.UNDEFINED;
mMarginLeft = 0;
mMarginTop = 0;
mMarginRight = 0;
mMarginBottom = 0;
mPaddingLeft = 0;
mPaddingTop = 0;
mPaddingRight = 0;
mPaddingBottom = 0;
mBorderLeft = 0;
mBorderTop = 0;
mBorderRight = 0;
mBorderBottom = 0;
mLayoutDirection = 0;
jni_YGNodeReset(getNativePointer());
}
@Override
public boolean hasNewLayout() {
return mHasNewLayout;
}
private native boolean jni_YGNodeIsDirty(long nativePointer);
@Override
public boolean isDirty() {
return jni_YGNodeIsDirty(mNativePointer);
}
@Override
public void markLayoutSeen() {
mHasNewLayout = false;
}
private native int jni_YGNodeStyleGetDirection(long nativePointer);
@Override
public YogaDirection getStyleDirection() {
return YogaDirection.fromInt(jni_YGNodeStyleGetDirection(mNativePointer));
}
private native void jni_YGNodeStyleSetDirection(long nativePointer, int direction);
@Override
public void setDirection(YogaDirection direction) {
jni_YGNodeStyleSetDirection(mNativePointer, direction.intValue());
}
private native int jni_YGNodeStyleGetFlexDirection(long nativePointer);
@Override
public YogaFlexDirection getFlexDirection() {
return YogaFlexDirection.fromInt(jni_YGNodeStyleGetFlexDirection(mNativePointer));
}
private native void jni_YGNodeStyleSetFlexDirection(long nativePointer, int flexDirection);
@Override
public void setFlexDirection(YogaFlexDirection flexDirection) {
jni_YGNodeStyleSetFlexDirection(mNativePointer, flexDirection.intValue());
}
private native int jni_YGNodeStyleGetJustifyContent(long nativePointer);
@Override
public YogaJustify getJustifyContent() {
return YogaJustify.fromInt(jni_YGNodeStyleGetJustifyContent(mNativePointer));
}
private native void jni_YGNodeStyleSetJustifyContent(long nativePointer, int justifyContent);
@Override
public void setJustifyContent(YogaJustify justifyContent) {
jni_YGNodeStyleSetJustifyContent(mNativePointer, justifyContent.intValue());
}
private native int jni_YGNodeStyleGetAlignItems(long nativePointer);
@Override
public YogaAlign getAlignItems() {
return YogaAlign.fromInt(jni_YGNodeStyleGetAlignItems(mNativePointer));
}
private native void jni_YGNodeStyleSetAlignItems(long nativePointer, int alignItems);
@Override
public void setAlignItems(YogaAlign alignItems) {
jni_YGNodeStyleSetAlignItems(mNativePointer, alignItems.intValue());
}
private native int jni_YGNodeStyleGetAlignSelf(long nativePointer);
@Override
public YogaAlign getAlignSelf() {
return YogaAlign.fromInt(jni_YGNodeStyleGetAlignSelf(mNativePointer));
}
private native void jni_YGNodeStyleSetAlignSelf(long nativePointer, int alignSelf);
@Override
public void setAlignSelf(YogaAlign alignSelf) {
jni_YGNodeStyleSetAlignSelf(mNativePointer, alignSelf.intValue());
}
private native int jni_YGNodeStyleGetAlignContent(long nativePointer);
@Override
public YogaAlign getAlignContent() {
return YogaAlign.fromInt(jni_YGNodeStyleGetAlignContent(mNativePointer));
}
private native void jni_YGNodeStyleSetAlignContent(long nativePointer, int alignContent);
@Override
public void setAlignContent(YogaAlign alignContent) {
jni_YGNodeStyleSetAlignContent(mNativePointer, alignContent.intValue());
}
private native int jni_YGNodeStyleGetPositionType(long nativePointer);
@Override
public YogaPositionType getPositionType() {
return YogaPositionType.fromInt(jni_YGNodeStyleGetPositionType(mNativePointer));
}
private native void jni_YGNodeStyleSetPositionType(long nativePointer, int positionType);
@Override
public void setPositionType(YogaPositionType positionType) {
jni_YGNodeStyleSetPositionType(mNativePointer, positionType.intValue());
}
private native void jni_YGNodeStyleSetFlexWrap(long nativePointer, int wrapType);
@Override
public void setWrap(YogaWrap flexWrap) {
jni_YGNodeStyleSetFlexWrap(mNativePointer, flexWrap.intValue());
}
private native int jni_YGNodeStyleGetOverflow(long nativePointer);
@Override
public YogaOverflow getOverflow() {
return YogaOverflow.fromInt(jni_YGNodeStyleGetOverflow(mNativePointer));
}
private native void jni_YGNodeStyleSetOverflow(long nativePointer, int overflow);
@Override
public void setOverflow(YogaOverflow overflow) {
jni_YGNodeStyleSetOverflow(mNativePointer, overflow.intValue());
}
private native int jni_YGNodeStyleGetDisplay(long nativePointer);
@Override
public YogaDisplay getDisplay() {
return YogaDisplay.fromInt(jni_YGNodeStyleGetDisplay(mNativePointer));
}
private native void jni_YGNodeStyleSetDisplay(long nativePointer, int display);
@Override
public void setDisplay(YogaDisplay display) {
jni_YGNodeStyleSetDisplay(mNativePointer, display.intValue());
}
private native void jni_YGNodeStyleSetFlex(long nativePointer, float flex);
@Override
public void setFlex(float flex) {
jni_YGNodeStyleSetFlex(mNativePointer, flex);
}
private native float jni_YGNodeStyleGetFlexGrow(long nativePointer);
@Override
public float getFlexGrow() {
return jni_YGNodeStyleGetFlexGrow(mNativePointer);
}
private native void jni_YGNodeStyleSetFlexGrow(long nativePointer, float flexGrow);
@Override
public void setFlexGrow(float flexGrow) {
jni_YGNodeStyleSetFlexGrow(mNativePointer, flexGrow);
}
private native float jni_YGNodeStyleGetFlexShrink(long nativePointer);
@Override
public float getFlexShrink() {
return jni_YGNodeStyleGetFlexShrink(mNativePointer);
}
private native void jni_YGNodeStyleSetFlexShrink(long nativePointer, float flexShrink);
@Override
public void setFlexShrink(float flexShrink) {
jni_YGNodeStyleSetFlexShrink(mNativePointer, flexShrink);
}
private native Object jni_YGNodeStyleGetFlexBasis(long nativePointer);
@Override
public YogaValue getFlexBasis() {
return (YogaValue) jni_YGNodeStyleGetFlexBasis(mNativePointer);
}
private native void jni_YGNodeStyleSetFlexBasis(long nativePointer, float flexBasis);
@Override
public void setFlexBasis(float flexBasis) {
jni_YGNodeStyleSetFlexBasis(mNativePointer, flexBasis);
}
private native void jni_YGNodeStyleSetFlexBasisPercent(long nativePointer, float percent);
@Override
public void setFlexBasisPercent(float percent) {
jni_YGNodeStyleSetFlexBasisPercent(mNativePointer, percent);
}
private native void jni_YGNodeStyleSetFlexBasisAuto(long nativePointer);
@Override
public void setFlexBasisAuto() {
jni_YGNodeStyleSetFlexBasisAuto(mNativePointer);
}
private native Object jni_YGNodeStyleGetMargin(long nativePointer, int edge);
@Override
public YogaValue getMargin(YogaEdge edge) {
if (!((mEdgeSetFlag & MARGIN) == MARGIN)) {
return YogaValue.UNDEFINED;
}
return (YogaValue) jni_YGNodeStyleGetMargin(mNativePointer, edge.intValue());
}
private native void jni_YGNodeStyleSetMargin(long nativePointer, int edge, float margin);
@Override
public void setMargin(YogaEdge edge, float margin) {
mEdgeSetFlag |= MARGIN;
jni_YGNodeStyleSetMargin(mNativePointer, edge.intValue(), margin);
}
private native void jni_YGNodeStyleSetMarginPercent(long nativePointer, int edge, float percent);
@Override
public void setMarginPercent(YogaEdge edge, float percent) {
mEdgeSetFlag |= MARGIN;
jni_YGNodeStyleSetMarginPercent(mNativePointer, edge.intValue(), percent);
}
private native void jni_YGNodeStyleSetMarginAuto(long nativePointer, int edge);
@Override
public void setMarginAuto(YogaEdge edge) {
mEdgeSetFlag |= MARGIN;
jni_YGNodeStyleSetMarginAuto(mNativePointer, edge.intValue());
}
private native Object jni_YGNodeStyleGetPadding(long nativePointer, int edge);
@Override
public YogaValue getPadding(YogaEdge edge) {
if (!((mEdgeSetFlag & PADDING) == PADDING)) {
return YogaValue.UNDEFINED;
}
return (YogaValue) jni_YGNodeStyleGetPadding(mNativePointer, edge.intValue());
}
private native void jni_YGNodeStyleSetPadding(long nativePointer, int edge, float padding);
@Override
public void setPadding(YogaEdge edge, float padding) {
mEdgeSetFlag |= PADDING;
jni_YGNodeStyleSetPadding(mNativePointer, edge.intValue(), padding);
}
private native void jni_YGNodeStyleSetPaddingPercent(long nativePointer, int edge, float percent);
@Override
public void setPaddingPercent(YogaEdge edge, float percent) {
mEdgeSetFlag |= PADDING;
jni_YGNodeStyleSetPaddingPercent(mNativePointer, edge.intValue(), percent);
}
private native float jni_YGNodeStyleGetBorder(long nativePointer, int edge);
@Override
public float getBorder(YogaEdge edge) {
if (!((mEdgeSetFlag & BORDER) == BORDER)) {
return YogaConstants.UNDEFINED;
}
return jni_YGNodeStyleGetBorder(mNativePointer, edge.intValue());
}
private native void jni_YGNodeStyleSetBorder(long nativePointer, int edge, float border);
@Override
public void setBorder(YogaEdge edge, float border) {
mEdgeSetFlag |= BORDER;
jni_YGNodeStyleSetBorder(mNativePointer, edge.intValue(), border);
}
private native Object jni_YGNodeStyleGetPosition(long nativePointer, int edge);
@Override
public YogaValue getPosition(YogaEdge edge) {
if (!mHasSetPosition) {
return YogaValue.UNDEFINED;
}
return (YogaValue) jni_YGNodeStyleGetPosition(mNativePointer, edge.intValue());
}
private native void jni_YGNodeStyleSetPosition(long nativePointer, int edge, float position);
@Override
public void setPosition(YogaEdge edge, float position) {
mHasSetPosition = true;
jni_YGNodeStyleSetPosition(mNativePointer, edge.intValue(), position);
}
private native void jni_YGNodeStyleSetPositionPercent(
long nativePointer, int edge, float percent);
@Override
public void setPositionPercent(YogaEdge edge, float percent) {
mHasSetPosition = true;
jni_YGNodeStyleSetPositionPercent(mNativePointer, edge.intValue(), percent);
}
private native Object jni_YGNodeStyleGetWidth(long nativePointer);
@Override
public YogaValue getWidth() {
return (YogaValue) jni_YGNodeStyleGetWidth(mNativePointer);
}
private native void jni_YGNodeStyleSetWidth(long nativePointer, float width);
@Override
public void setWidth(float width) {
jni_YGNodeStyleSetWidth(mNativePointer, width);
}
private native void jni_YGNodeStyleSetWidthPercent(long nativePointer, float percent);
@Override
public void setWidthPercent(float percent) {
jni_YGNodeStyleSetWidthPercent(mNativePointer, percent);
}
private native void jni_YGNodeStyleSetWidthAuto(long nativePointer);
@Override
public void setWidthAuto() {
jni_YGNodeStyleSetWidthAuto(mNativePointer);
}
private native Object jni_YGNodeStyleGetHeight(long nativePointer);
@Override
public YogaValue getHeight() {
return (YogaValue) jni_YGNodeStyleGetHeight(mNativePointer);
}
private native void jni_YGNodeStyleSetHeight(long nativePointer, float height);
@Override
public void setHeight(float height) {
jni_YGNodeStyleSetHeight(mNativePointer, height);
}
private native void jni_YGNodeStyleSetHeightPercent(long nativePointer, float percent);
@Override
public void setHeightPercent(float percent) {
jni_YGNodeStyleSetHeightPercent(mNativePointer, percent);
}
private native void jni_YGNodeStyleSetHeightAuto(long nativePointer);
@Override
public void setHeightAuto() {
jni_YGNodeStyleSetHeightAuto(mNativePointer);
}
private native Object jni_YGNodeStyleGetMinWidth(long nativePointer);
@Override
public YogaValue getMinWidth() {
return (YogaValue) jni_YGNodeStyleGetMinWidth(mNativePointer);
}
private native void jni_YGNodeStyleSetMinWidth(long nativePointer, float minWidth);
@Override
public void setMinWidth(float minWidth) {
jni_YGNodeStyleSetMinWidth(mNativePointer, minWidth);
}
private native void jni_YGNodeStyleSetMinWidthPercent(long nativePointer, float percent);
@Override
public void setMinWidthPercent(float percent) {
jni_YGNodeStyleSetMinWidthPercent(mNativePointer, percent);
}
private native Object jni_YGNodeStyleGetMinHeight(long nativePointer);
@Override
public YogaValue getMinHeight() {
return (YogaValue) jni_YGNodeStyleGetMinHeight(mNativePointer);
}
private native void jni_YGNodeStyleSetMinHeight(long nativePointer, float minHeight);
@Override
public void setMinHeight(float minHeight) {
jni_YGNodeStyleSetMinHeight(mNativePointer, minHeight);
}
private native void jni_YGNodeStyleSetMinHeightPercent(long nativePointer, float percent);
@Override
public void setMinHeightPercent(float percent) {
jni_YGNodeStyleSetMinHeightPercent(mNativePointer, percent);
}
private native Object jni_YGNodeStyleGetMaxWidth(long nativePointer);
@Override
public YogaValue getMaxWidth() {
return (YogaValue) jni_YGNodeStyleGetMaxWidth(mNativePointer);
}
private native void jni_YGNodeStyleSetMaxWidth(long nativePointer, float maxWidth);
@Override
public void setMaxWidth(float maxWidth) {
jni_YGNodeStyleSetMaxWidth(mNativePointer, maxWidth);
}
private native void jni_YGNodeStyleSetMaxWidthPercent(long nativePointer, float percent);
@Override
public void setMaxWidthPercent(float percent) {
jni_YGNodeStyleSetMaxWidthPercent(mNativePointer, percent);
}
private native Object jni_YGNodeStyleGetMaxHeight(long nativePointer);
@Override
public YogaValue getMaxHeight() {
return (YogaValue) jni_YGNodeStyleGetMaxHeight(mNativePointer);
}
private native void jni_YGNodeStyleSetMaxHeight(long nativePointer, float maxheight);
@Override
public void setMaxHeight(float maxheight) {
jni_YGNodeStyleSetMaxHeight(mNativePointer, maxheight);
}
private native void jni_YGNodeStyleSetMaxHeightPercent(long nativePointer, float percent);
@Override
public void setMaxHeightPercent(float percent) {
jni_YGNodeStyleSetMaxHeightPercent(mNativePointer, percent);
}
private native float jni_YGNodeStyleGetAspectRatio(long nativePointer);
@Override
public float getAspectRatio() {
return jni_YGNodeStyleGetAspectRatio(mNativePointer);
}
private native void jni_YGNodeStyleSetAspectRatio(long nativePointer, float aspectRatio);
@Override
public void setAspectRatio(float aspectRatio) {
jni_YGNodeStyleSetAspectRatio(mNativePointer, aspectRatio);
}
@Override
public float getLayoutX() {
return mLeft;
}
@Override
public float getLayoutY() {
return mTop;
}
@Override
public float getLayoutWidth() {
return mWidth;
}
@Override
public float getLayoutHeight() {
return mHeight;
}
@Override
public boolean getDoesLegacyStretchFlagAffectsLayout() {
return mDoesLegacyStretchFlagAffectsLayout;
}
@Override
public float getLayoutMargin(YogaEdge edge) {
switch (edge) {
case LEFT:
return mMarginLeft;
case TOP:
return mMarginTop;
case RIGHT:
return mMarginRight;
case BOTTOM:
return mMarginBottom;
case START:
return getLayoutDirection() == YogaDirection.RTL ? mMarginRight : mMarginLeft;
case END:
return getLayoutDirection() == YogaDirection.RTL ? mMarginLeft : mMarginRight;
default:
throw new IllegalArgumentException("Cannot get layout margins of multi-edge shorthands");
}
}
@Override
public float getLayoutPadding(YogaEdge edge) {
switch (edge) {
case LEFT:
return mPaddingLeft;
case TOP:
return mPaddingTop;
case RIGHT:
return mPaddingRight;
case BOTTOM:
return mPaddingBottom;
case START:
return getLayoutDirection() == YogaDirection.RTL ? mPaddingRight : mPaddingLeft;
case END:
return getLayoutDirection() == YogaDirection.RTL ? mPaddingLeft : mPaddingRight;
default:
throw new IllegalArgumentException("Cannot get layout paddings of multi-edge shorthands");
}
}
@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);
}
}

View File

@@ -21,6 +21,11 @@ struct JYogaConfig : public JavaClass<JYogaConfig> {
static constexpr auto kJavaDescriptor = "Lcom/facebook/yoga/YogaConfig;"; static constexpr auto kJavaDescriptor = "Lcom/facebook/yoga/YogaConfig;";
}; };
struct JYogaNodePropertiesJNI : public JavaClass<JYogaNodePropertiesJNI> {
static constexpr auto kJavaDescriptor =
"Lcom/facebook/yoga/YogaNodePropertiesJNI;";
};
struct YGConfigContext { struct YGConfigContext {
global_ref<jobject>* logger; global_ref<jobject>* logger;
global_ref<jobject>* config; global_ref<jobject>* config;
@@ -33,16 +38,34 @@ struct YGConfigContext {
} }
}; };
struct JNINodeContext {
weak_ref<JYogaNode> node;
weak_ref<JYogaNodePropertiesJNI> props;
};
static inline weak_ref<JYogaNode>* YGNodeJobject(YGNodeRef node) { static inline weak_ref<JYogaNode>* YGNodeJobject(YGNodeRef node) {
return reinterpret_cast<weak_ref<JYogaNode>*>(node->getContext()); return &reinterpret_cast<JNINodeContext*>(node->getContext())->node;
}
static inline weak_ref<JYogaNodePropertiesJNI>* YGNodePropsJObject(
YGNodeRef node) {
return &reinterpret_cast<JNINodeContext*>(node->getContext())->props;
}
static inline void setNodeContext(
YGNodeRef node,
alias_ref<JYogaNode> javaNode,
alias_ref<JYogaNodePropertiesJNI> javaNodeProps) {
node->setContext(
new JNINodeContext{make_weak(javaNode), make_weak(javaNodeProps)});
} }
static void YGTransferLayoutDirection( static void YGTransferLayoutDirection(
YGNodeRef node, YGNodeRef node,
alias_ref<jobject> javaNode) { alias_ref<JYogaNodePropertiesJNI> javaProps) {
static auto layoutDirectionField = static auto layoutDirectionField =
javaNode->getClass()->getField<jint>("mLayoutDirection"); javaProps->getClass()->getField<jint>("mLayoutDirection");
javaNode->setFieldValue( javaProps->setFieldValue(
layoutDirectionField, static_cast<jint>(YGNodeLayoutGetDirection(node))); layoutDirectionField, static_cast<jint>(YGNodeLayoutGetDirection(node)));
} }
@@ -50,7 +73,7 @@ static void YGTransferLayoutOutputsRecursive(YGNodeRef root) {
if (!root->getHasNewLayout()) { if (!root->getHasNewLayout()) {
return; return;
} }
auto obj = YGNodeJobject(root)->lockLocal(); auto obj = YGNodePropsJObject(root)->lockLocal();
if (!obj) { if (!obj) {
YGLog( YGLog(
root, root,
@@ -223,7 +246,9 @@ static YGSize YGJNIMeasureFunc(
findClassStatic("com/facebook/yoga/YogaNode") findClassStatic("com/facebook/yoga/YogaNode")
->getMethod<jlong(jfloat, jint, jfloat, jint)>("measure"); ->getMethod<jlong(jfloat, jint, jfloat, jint)>("measure");
YGTransferLayoutDirection(node, obj); if (auto jProps = YGNodePropsJObject(node)->lockLocal()) {
YGTransferLayoutDirection(node, jProps);
}
const auto measureResult = const auto measureResult =
measureFunc(obj, width, widthMode, height, heightMode); measureFunc(obj, width, widthMode, height, heightMode);
@@ -287,18 +312,21 @@ static int YGJNILogFunc(
return result; return result;
} }
jlong jni_YGNodeNew(alias_ref<jobject> thiz) { jlong jni_YGNodeNew(
alias_ref<JYogaNodePropertiesJNI> javaProps,
alias_ref<JYogaNode> javaNode) {
const YGNodeRef node = YGNodeNew(); const YGNodeRef node = YGNodeNew();
node->setContext(new weak_ref<jobject>(make_weak(thiz))); setNodeContext(node, javaNode, javaProps);
// YGNodeSetContext(node, new weak_ref<jobject>(make_weak(thiz)));
node->setPrintFunc(YGPrint); node->setPrintFunc(YGPrint);
// YGNodeSetPrintFunc(node, YGPrint);
return reinterpret_cast<jlong>(node); return reinterpret_cast<jlong>(node);
} }
jlong jni_YGNodeNewWithConfig(alias_ref<jobject> thiz, jlong configPointer) { jlong jni_YGNodeNewWithConfig(
alias_ref<JYogaNodePropertiesJNI> javaProps,
alias_ref<JYogaNode> javaNode,
jlong configPointer) {
const YGNodeRef node = YGNodeNewWithConfig(_jlong2YGConfigRef(configPointer)); const YGNodeRef node = YGNodeNewWithConfig(_jlong2YGConfigRef(configPointer));
node->setContext(new weak_ref<jobject>(make_weak(thiz))); setNodeContext(node, javaNode, javaProps);
node->setPrintFunc(YGPrint); node->setPrintFunc(YGPrint);
return reinterpret_cast<jlong>(node); return reinterpret_cast<jlong>(node);
} }
@@ -314,18 +342,18 @@ void jni_YGNodeSetOwner(
} }
jlong jni_YGNodeClone( jlong jni_YGNodeClone(
alias_ref<jobject> thiz, alias_ref<jclass>,
jlong nativePointer, jlong nativePointer,
alias_ref<jobject> clonedJavaObject) { alias_ref<JYogaNode> clonedJavaObject,
alias_ref<JYogaNodePropertiesJNI> clonedJavaProps) {
const YGNodeRef clonedYogaNode = YGNodeClone(_jlong2YGNodeRef(nativePointer)); const YGNodeRef clonedYogaNode = YGNodeClone(_jlong2YGNodeRef(nativePointer));
clonedYogaNode->setContext( setNodeContext(clonedYogaNode, clonedJavaObject, clonedJavaProps);
new weak_ref<jobject>(make_weak(clonedJavaObject)));
return reinterpret_cast<jlong>(clonedYogaNode); return reinterpret_cast<jlong>(clonedYogaNode);
} }
void jni_YGNodeFree(alias_ref<jobject> thiz, jlong nativePointer) { void jni_YGNodeFree(alias_ref<jobject> thiz, jlong nativePointer) {
const YGNodeRef node = _jlong2YGNodeRef(nativePointer); const YGNodeRef node = _jlong2YGNodeRef(nativePointer);
delete YGNodeJobject(node); delete reinterpret_cast<JNINodeContext*>(node->getContext());
YGNodeFree(node); YGNodeFree(node);
} }
@@ -387,6 +415,12 @@ void jni_YGNodeCalculateLayout(
static_cast<float>(width), static_cast<float>(width),
static_cast<float>(height), static_cast<float>(height),
YGNodeStyleGetDirection(_jlong2YGNodeRef(nativePointer))); YGNodeStyleGetDirection(_jlong2YGNodeRef(nativePointer)));
}
static void jni_YGTransferLayoutOutputsRecursive(
alias_ref<jclass>,
jlong nativePointer) {
const YGNodeRef root = _jlong2YGNodeRef(nativePointer);
YGTransferLayoutOutputsRecursive(root); YGTransferLayoutOutputsRecursive(root);
} }
@@ -666,23 +700,14 @@ jint jni_YGNodeGetInstanceCount(alias_ref<jclass> clazz) {
jint JNI_OnLoad(JavaVM* vm, void*) { jint JNI_OnLoad(JavaVM* vm, void*) {
return initialize(vm, [] { return initialize(vm, [] {
registerNatives( registerNatives(
"com/facebook/yoga/YogaNode", "com/facebook/yoga/YogaNodePropertiesJNI",
{ {
YGMakeNativeMethod(jni_YGNodeClone),
YGMakeNativeMethod(jni_YGNodeNew), YGMakeNativeMethod(jni_YGNodeNew),
YGMakeNativeMethod(jni_YGNodeNewWithConfig), YGMakeNativeMethod(jni_YGNodeNewWithConfig),
YGMakeNativeMethod(jni_YGNodeFree), YGMakeNativeMethod(jni_YGNodeFree),
YGMakeNativeMethod(jni_YGNodeReset), YGMakeNativeMethod(jni_YGNodeReset),
YGMakeNativeMethod(jni_YGNodeClearChildren),
YGMakeNativeMethod(jni_YGNodeInsertChild),
YGMakeNativeMethod(jni_YGNodeInsertSharedChild),
YGMakeNativeMethod(jni_YGNodeRemoveChild),
YGMakeNativeMethod(jni_YGNodeCalculateLayout),
YGMakeNativeMethod(jni_YGNodeMarkDirty),
YGMakeNativeMethod(jni_YGNodeMarkDirtyAndPropogateToDescendants),
YGMakeNativeMethod(jni_YGNodeIsDirty), YGMakeNativeMethod(jni_YGNodeIsDirty),
YGMakeNativeMethod(jni_YGNodeSetHasMeasureFunc),
YGMakeNativeMethod(jni_YGNodeSetHasBaselineFunc),
YGMakeNativeMethod(jni_YGNodeCopyStyle),
YGMakeNativeMethod(jni_YGNodeStyleGetDirection), YGMakeNativeMethod(jni_YGNodeStyleGetDirection),
YGMakeNativeMethod(jni_YGNodeStyleSetDirection), YGMakeNativeMethod(jni_YGNodeStyleSetDirection),
YGMakeNativeMethod(jni_YGNodeStyleGetFlexDirection), YGMakeNativeMethod(jni_YGNodeStyleGetFlexDirection),
@@ -745,9 +770,23 @@ jint JNI_OnLoad(JavaVM* vm, void*) {
YGMakeNativeMethod(jni_YGNodeStyleSetMaxHeightPercent), YGMakeNativeMethod(jni_YGNodeStyleSetMaxHeightPercent),
YGMakeNativeMethod(jni_YGNodeStyleGetAspectRatio), YGMakeNativeMethod(jni_YGNodeStyleGetAspectRatio),
YGMakeNativeMethod(jni_YGNodeStyleSetAspectRatio), YGMakeNativeMethod(jni_YGNodeStyleSetAspectRatio),
YGMakeNativeMethod(jni_YGTransferLayoutOutputsRecursive),
});
registerNatives(
"com/facebook/yoga/YogaNode",
{
YGMakeNativeMethod(jni_YGNodeClearChildren),
YGMakeNativeMethod(jni_YGNodeInsertChild),
YGMakeNativeMethod(jni_YGNodeInsertSharedChild),
YGMakeNativeMethod(jni_YGNodeRemoveChild),
YGMakeNativeMethod(jni_YGNodeCalculateLayout),
YGMakeNativeMethod(jni_YGNodeMarkDirty),
YGMakeNativeMethod(jni_YGNodeMarkDirtyAndPropogateToDescendants),
YGMakeNativeMethod(jni_YGNodeSetHasMeasureFunc),
YGMakeNativeMethod(jni_YGNodeSetHasBaselineFunc),
YGMakeNativeMethod(jni_YGNodeCopyStyle),
YGMakeNativeMethod(jni_YGNodeGetInstanceCount), YGMakeNativeMethod(jni_YGNodeGetInstanceCount),
YGMakeNativeMethod(jni_YGNodePrint), YGMakeNativeMethod(jni_YGNodePrint),
YGMakeNativeMethod(jni_YGNodeClone),
YGMakeNativeMethod(jni_YGNodeSetOwner), YGMakeNativeMethod(jni_YGNodeSetOwner),
}); });
registerNatives( registerNatives(