diff --git a/ReactAndroid/src/main/java/com/facebook/yoga/YogaBaselineFunction.java b/ReactAndroid/src/main/java/com/facebook/yoga/YogaBaselineFunction.java new file mode 100644 index 00000000000..1bfb52a7187 --- /dev/null +++ b/ReactAndroid/src/main/java/com/facebook/yoga/YogaBaselineFunction.java @@ -0,0 +1,22 @@ +/** + * 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. + */ + +package com.facebook.yoga; + +import com.facebook.proguard.annotations.DoNotStrip; + +@DoNotStrip +public interface YogaBaselineFunction { + /** + * Return the baseline of the node in pixels. When no baseline function is set the baseline + * default to the computed height of the node. + */ + @DoNotStrip + float baseline(YogaNodeAPI node, float width, float height); +} diff --git a/ReactAndroid/src/main/java/com/facebook/yoga/YogaNode.java b/ReactAndroid/src/main/java/com/facebook/yoga/YogaNode.java index 87b22985c9c..432c204017d 100644 --- a/ReactAndroid/src/main/java/com/facebook/yoga/YogaNode.java +++ b/ReactAndroid/src/main/java/com/facebook/yoga/YogaNode.java @@ -52,6 +52,7 @@ public class YogaNode implements YogaNodeAPI { private YogaNode mParent; private List mChildren; private YogaMeasureFunction mMeasureFunction; + private YogaBaselineFunction mBaselineFunction; private long mNativePointer; private Object mData; @@ -623,6 +624,18 @@ public class YogaNode implements YogaNodeAPI { YogaMeasureMode.values()[heightMode]); } + private native void jni_YGNodeSetHasBaselineFunc(long nativePointer, boolean hasMeasureFunc); + @Override + public void setBaselineFunction(YogaBaselineFunction baselineFunction) { + mBaselineFunction = baselineFunction; + jni_YGNodeSetHasBaselineFunc(mNativePointer, baselineFunction != null); + } + + @DoNotStrip + public final float baseline(float width, float height) { + return mBaselineFunction.baseline(this, width, height); + } + @Override public boolean isMeasureDefined() { return mMeasureFunction != null; diff --git a/ReactAndroid/src/main/java/com/facebook/yoga/YogaNodeAPI.java b/ReactAndroid/src/main/java/com/facebook/yoga/YogaNodeAPI.java index 98742d340b7..6d782c4525c 100644 --- a/ReactAndroid/src/main/java/com/facebook/yoga/YogaNodeAPI.java +++ b/ReactAndroid/src/main/java/com/facebook/yoga/YogaNodeAPI.java @@ -18,6 +18,7 @@ public interface YogaNodeAPI { YogaNodeType getParent(); int indexOf(YogaNodeType child); void setMeasureFunction(YogaMeasureFunction measureFunction); + void setBaselineFunction(YogaBaselineFunction measureFunction); boolean isMeasureDefined(); void calculateLayout(); boolean isDirty(); 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 46aaecfbd3f..54610dbada4 100644 --- a/ReactAndroid/src/main/jni/first-party/yogajni/jni/YGJNI.cpp +++ b/ReactAndroid/src/main/jni/first-party/yogajni/jni/YGJNI.cpp @@ -63,6 +63,14 @@ static void YGPrint(YGNodeRef node) { } } +static float YGJNIBaselineFunc(YGNodeRef node, float width, float height) { + if (auto obj = YGNodeJobject(node)->lockLocal()) { + return findClassLocal("com/facebook/yoga/YogaNode")->getMethod("baseline")(obj, width, height); + } else { + return height; + } +} + static YGSize YGJNIMeasureFunc(YGNodeRef node, float width, YGMeasureMode widthMode, @@ -203,6 +211,10 @@ void jni_YGNodeSetHasMeasureFunc(alias_ref, jlong nativePointer, jboole YGNodeSetMeasureFunc(_jlong2YGNodeRef(nativePointer), hasMeasureFunc ? YGJNIMeasureFunc : NULL); } +void jni_YGNodeSetHasBaselineFunc(alias_ref, jlong nativePointer, jboolean hasBaselineFunc) { + YGNodeSetBaselineFunc(_jlong2YGNodeRef(nativePointer), hasBaselineFunc ? YGJNIBaselineFunc : NULL); +} + jboolean jni_YGNodeHasNewLayout(alias_ref, jlong nativePointer) { return (jboolean) YGNodeGetHasNewLayout(_jlong2YGNodeRef(nativePointer)); } @@ -332,6 +344,7 @@ jint JNI_OnLoad(JavaVM *vm, void *) { YGMakeNativeMethod(jni_YGNodeIsDirty), YGMakeNativeMethod(jni_YGNodeMarkLayoutSeen), YGMakeNativeMethod(jni_YGNodeSetHasMeasureFunc), + YGMakeNativeMethod(jni_YGNodeSetHasBaselineFunc), YGMakeNativeMethod(jni_YGNodeCopyStyle), YGMakeNativeMethod(jni_YGNodeStyleGetDirection), YGMakeNativeMethod(jni_YGNodeStyleSetDirection),