diff --git a/ReactAndroid/src/main/java/com/facebook/yoga/YogaNode.java b/ReactAndroid/src/main/java/com/facebook/yoga/YogaNode.java index 282931dc8..efbfc89be 100644 --- a/ReactAndroid/src/main/java/com/facebook/yoga/YogaNode.java +++ b/ReactAndroid/src/main/java/com/facebook/yoga/YogaNode.java @@ -159,6 +159,7 @@ public class YogaNode implements Cloneable { } private static native void jni_YGNodeInsertChild(long nativePointer, long childPointer, int index); + public void addChildAt(YogaNode child, int i) { if (child.mOwner != null) { throw new IllegalStateException("Child already has a parent, it must be removed first."); @@ -183,6 +184,18 @@ public class YogaNode implements Cloneable { jni_YGNodeInsertSharedChild(mNativePointer, child.mNativePointer, i); } + private static native void jni_YGNodeSetIsReferenceBaseline(long nativePointer, boolean isReferenceBaseline); + + public void setIsReferenceBaseline(boolean isReferenceBaseline) { + jni_YGNodeSetIsReferenceBaseline(mNativePointer, isReferenceBaseline); + } + + private static native boolean jni_YGNodeIsReferenceBaseline(long nativePointer); + + public boolean isReferenceBaseline() { + return jni_YGNodeIsReferenceBaseline(mNativePointer); + } + private static native void jni_YGNodeSetOwner(long nativePointer, long newOwnerNativePointer); private native long jni_YGNodeClone(long nativePointer, Object newNode); diff --git a/ReactAndroid/src/main/jni/first-party/yogajni/jni/YGJNI.cpp b/ReactAndroid/src/main/jni/first-party/yogajni/jni/YGJNI.cpp index d78546569..5d80a3d23 100644 --- a/ReactAndroid/src/main/jni/first-party/yogajni/jni/YGJNI.cpp +++ b/ReactAndroid/src/main/jni/first-party/yogajni/jni/YGJNI.cpp @@ -371,6 +371,17 @@ void jni_YGNodeRemoveChild(jlong nativePointer, jlong childPointer) { _jlong2YGNodeRef(nativePointer), _jlong2YGNodeRef(childPointer)); } +void jni_YGNodeSetIsReferenceBaseline( + jlong nativePointer, + jboolean isReferenceBaseline) { + YGNodeSetIsReferenceBaseline( + _jlong2YGNodeRef(nativePointer), isReferenceBaseline); +} + +jboolean jni_YGNodeIsReferenceBaseline(jlong nativePointer) { + return YGNodeIsReferenceBaseline(_jlong2YGNodeRef(nativePointer)); +} + void jni_YGNodeCalculateLayout( alias_ref, jlong nativePointer, @@ -666,6 +677,8 @@ jint jni_YGNodeGetInstanceCount() { YGMakeCriticalNativeMethod(jni_YGNodeInsertChild), \ YGMakeCriticalNativeMethod(jni_YGNodeInsertSharedChild), \ YGMakeCriticalNativeMethod(jni_YGNodeRemoveChild), \ + YGMakeCriticalNativeMethod(jni_YGNodeSetIsReferenceBaseline), \ + YGMakeCriticalNativeMethod(jni_YGNodeIsReferenceBaseline), \ YGMakeNativeMethod(jni_YGNodeCalculateLayout), \ YGMakeCriticalNativeMethod(jni_YGNodeMarkDirty), \ YGMakeCriticalNativeMethod( \ diff --git a/ReactCommon/yoga/yoga/YGNode.h b/ReactCommon/yoga/yoga/YGNode.h index d771aad24..103b50760 100644 --- a/ReactCommon/yoga/yoga/YGNode.h +++ b/ReactCommon/yoga/yoga/YGNode.h @@ -17,6 +17,7 @@ struct YGNode { void* context_ = nullptr; YGPrintFunc print_ = nullptr; bool hasNewLayout_ = true; + bool isReferenceBaseline_ = false; YGNodeType nodeType_ = YGNodeTypeDefault; YGMeasureFunc measure_ = nullptr; YGBaselineFunc baseline_ = nullptr; @@ -93,6 +94,10 @@ struct YGNode { return lineIndex_; } + bool isReferenceBaseline() { + return isReferenceBaseline_; + } + // returns the YGNodeRef that owns this YGNode. An owner is used to identify // the YogaTree that a YGNode belongs to. // This method will return the parent of the YGNode when a YGNode only belongs @@ -211,6 +216,10 @@ struct YGNode { lineIndex_ = lineIndex; } + void setIsReferenceBaseline(bool isReferenceBaseline) { + isReferenceBaseline_ = isReferenceBaseline; + } + void setOwner(YGNodeRef owner) { owner_ = owner; } diff --git a/ReactCommon/yoga/yoga/Yoga.cpp b/ReactCommon/yoga/yoga/Yoga.cpp index 6e42d51ae..8afe45ffb 100644 --- a/ReactCommon/yoga/yoga/Yoga.cpp +++ b/ReactCommon/yoga/yoga/Yoga.cpp @@ -380,6 +380,14 @@ void YGConfigCopy(const YGConfigRef dest, const YGConfigRef src) { memcpy(dest, src, sizeof(YGConfig)); } +void YGNodeSetIsReferenceBaseline(YGNodeRef node, bool isReferenceBaseline) { + node->setIsReferenceBaseline(isReferenceBaseline); +} + +bool YGNodeIsReferenceBaseline(YGNodeRef node) { + return node->isReferenceBaseline(); +} + void YGNodeInsertChild( const YGNodeRef node, const YGNodeRef child, @@ -1138,7 +1146,8 @@ static float YGBaseline(const YGNodeRef node) { if (child->getStyle().positionType == YGPositionTypeAbsolute) { continue; } - if (YGNodeAlignItem(node, child) == YGAlignBaseline) { + if (YGNodeAlignItem(node, child) == YGAlignBaseline || + child->isReferenceBaseline()) { baselineChild = child; break; } diff --git a/ReactCommon/yoga/yoga/Yoga.h b/ReactCommon/yoga/yoga/Yoga.h index d5da362de..dddab8bb3 100644 --- a/ReactCommon/yoga/yoga/Yoga.h +++ b/ReactCommon/yoga/yoga/Yoga.h @@ -114,6 +114,12 @@ WIN_EXPORT void YGNodeSetChildren( const YGNodeRef children[], const uint32_t count); +WIN_EXPORT void YGNodeSetIsReferenceBaseline( + YGNodeRef node, + bool isReferenceBaseline); + +WIN_EXPORT bool YGNodeIsReferenceBaseline(YGNodeRef node); + WIN_EXPORT void YGNodeCalculateLayout( const YGNodeRef node, const float availableWidth,