Set layout outputs on java object from C
Summary: Set layout outputs on CSSNode from C after layout calculation finishes instead of relying on calling jni gettings from java code. This should be much more efficient as it avoids a lot of jni overhead and also allows for calling getLayoutWidth() etc multiple times without incurring a penalty. Reviewed By: lexs Differential Revision: D4077968 fbshipit-source-id: bce86ba610cd5ae36cfb45d78b2609c63a14cfa3
This commit is contained in:
committed by
Facebook Github Bot
parent
46823878a5
commit
2cac77eaa1
@@ -45,6 +45,17 @@ public class CSSNode implements CSSNodeAPI<CSSNode> {
|
|||||||
private boolean mHasSetBorder = false;
|
private boolean mHasSetBorder = false;
|
||||||
private boolean mHasSetPosition = false;
|
private boolean mHasSetPosition = false;
|
||||||
|
|
||||||
|
@DoNotStrip
|
||||||
|
private float mWidth = CSSConstants.UNDEFINED;
|
||||||
|
@DoNotStrip
|
||||||
|
private float mHeight = CSSConstants.UNDEFINED;
|
||||||
|
@DoNotStrip
|
||||||
|
private float mTop = CSSConstants.UNDEFINED;
|
||||||
|
@DoNotStrip
|
||||||
|
private float mLeft = CSSConstants.UNDEFINED;
|
||||||
|
@DoNotStrip
|
||||||
|
private int mLayoutDirection = 0;
|
||||||
|
|
||||||
private native long jni_CSSNodeNew();
|
private native long jni_CSSNodeNew();
|
||||||
public CSSNode() {
|
public CSSNode() {
|
||||||
mNativePointer = jni_CSSNodeNew();
|
mNativePointer = jni_CSSNodeNew();
|
||||||
@@ -73,6 +84,12 @@ public class CSSNode implements CSSNodeAPI<CSSNode> {
|
|||||||
mHasSetBorder = false;
|
mHasSetBorder = false;
|
||||||
mHasSetPosition = false;
|
mHasSetPosition = false;
|
||||||
|
|
||||||
|
mWidth = CSSConstants.UNDEFINED;
|
||||||
|
mHeight = CSSConstants.UNDEFINED;
|
||||||
|
mTop = CSSConstants.UNDEFINED;
|
||||||
|
mLeft = CSSConstants.UNDEFINED;
|
||||||
|
mLayoutDirection = 0;
|
||||||
|
|
||||||
mMeasureFunction = null;
|
mMeasureFunction = null;
|
||||||
mData = null;
|
mData = null;
|
||||||
|
|
||||||
@@ -176,12 +193,6 @@ public class CSSNode implements CSSNodeAPI<CSSNode> {
|
|||||||
jni_CSSNodeStyleSetDirection(mNativePointer, direction.ordinal());
|
jni_CSSNodeStyleSetDirection(mNativePointer, direction.ordinal());
|
||||||
}
|
}
|
||||||
|
|
||||||
private native int jni_CSSNodeLayoutGetDirection(long nativePointer);
|
|
||||||
@Override
|
|
||||||
public CSSDirection getLayoutDirection() {
|
|
||||||
return CSSDirection.values()[jni_CSSNodeLayoutGetDirection(mNativePointer)];
|
|
||||||
}
|
|
||||||
|
|
||||||
private native int jni_CSSNodeStyleGetFlexDirection(long nativePointer);
|
private native int jni_CSSNodeStyleGetFlexDirection(long nativePointer);
|
||||||
@Override
|
@Override
|
||||||
public CSSFlexDirection getFlexDirection() {
|
public CSSFlexDirection getFlexDirection() {
|
||||||
@@ -450,28 +461,29 @@ public class CSSNode implements CSSNodeAPI<CSSNode> {
|
|||||||
jni_CSSNodeStyleSetMaxHeight(mNativePointer, maxheight);
|
jni_CSSNodeStyleSetMaxHeight(mNativePointer, maxheight);
|
||||||
}
|
}
|
||||||
|
|
||||||
private native float jni_CSSNodeLayoutGetLeft(long nativePointer);
|
|
||||||
@Override
|
@Override
|
||||||
public float getLayoutX() {
|
public float getLayoutX() {
|
||||||
return jni_CSSNodeLayoutGetLeft(mNativePointer);
|
return mLeft;
|
||||||
}
|
}
|
||||||
|
|
||||||
private native float jni_CSSNodeLayoutGetTop(long nativePointer);
|
|
||||||
@Override
|
@Override
|
||||||
public float getLayoutY() {
|
public float getLayoutY() {
|
||||||
return jni_CSSNodeLayoutGetTop(mNativePointer);
|
return mTop;
|
||||||
}
|
}
|
||||||
|
|
||||||
private native float jni_CSSNodeLayoutGetWidth(long nativePointer);
|
|
||||||
@Override
|
@Override
|
||||||
public float getLayoutWidth() {
|
public float getLayoutWidth() {
|
||||||
return jni_CSSNodeLayoutGetWidth(mNativePointer);
|
return mWidth;
|
||||||
}
|
}
|
||||||
|
|
||||||
private native float jni_CSSNodeLayoutGetHeight(long nativePointer);
|
|
||||||
@Override
|
@Override
|
||||||
public float getLayoutHeight() {
|
public float getLayoutHeight() {
|
||||||
return jni_CSSNodeLayoutGetHeight(mNativePointer);
|
return mHeight;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CSSDirection getLayoutDirection() {
|
||||||
|
return CSSDirection.values()[mLayoutDirection];
|
||||||
}
|
}
|
||||||
|
|
||||||
private native void jni_CSSNodeSetHasMeasureFunc(long nativePointer, boolean hasMeasureFunc);
|
private native void jni_CSSNodeSetHasMeasureFunc(long nativePointer, boolean hasMeasureFunc);
|
||||||
|
@@ -14,6 +14,31 @@
|
|||||||
using namespace facebook::jni;
|
using namespace facebook::jni;
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
|
static void _jniTransferLayoutDirection(CSSNodeRef node, alias_ref<jobject> javaNode) {
|
||||||
|
static auto layoutDirectionField = javaNode->getClass()->getField<jint>("mLayoutDirection");
|
||||||
|
javaNode->setFieldValue(layoutDirectionField, static_cast<jint>(CSSNodeLayoutGetDirection(node)));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void _jniTransferLayoutOutputsRecursive(CSSNodeRef root) {
|
||||||
|
auto javaNode = adopt_local(
|
||||||
|
Environment::current()->NewLocalRef(reinterpret_cast<jweak>(CSSNodeGetContext(root))));
|
||||||
|
|
||||||
|
static auto widthField = javaNode->getClass()->getField<jfloat>("mWidth");
|
||||||
|
static auto heightField = javaNode->getClass()->getField<jfloat>("mHeight");
|
||||||
|
static auto leftField = javaNode->getClass()->getField<jfloat>("mLeft");
|
||||||
|
static auto topField = javaNode->getClass()->getField<jfloat>("mTop");
|
||||||
|
|
||||||
|
javaNode->setFieldValue(widthField, CSSNodeLayoutGetWidth(root));
|
||||||
|
javaNode->setFieldValue(heightField, CSSNodeLayoutGetHeight(root));
|
||||||
|
javaNode->setFieldValue(leftField, CSSNodeLayoutGetLeft(root));
|
||||||
|
javaNode->setFieldValue(topField, CSSNodeLayoutGetTop(root));
|
||||||
|
_jniTransferLayoutDirection(root, javaNode);
|
||||||
|
|
||||||
|
for (uint32_t i = 0; i < CSSNodeChildCount(root); i++) {
|
||||||
|
_jniTransferLayoutOutputsRecursive(CSSNodeGetChild(root, i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void _jniPrint(CSSNodeRef node) {
|
static void _jniPrint(CSSNodeRef node) {
|
||||||
auto obj = adopt_local(Environment::current()->NewLocalRef(reinterpret_cast<jweak>(CSSNodeGetContext(node))));
|
auto obj = adopt_local(Environment::current()->NewLocalRef(reinterpret_cast<jweak>(CSSNodeGetContext(node))));
|
||||||
cout << obj->toString() << endl;
|
cout << obj->toString() << endl;
|
||||||
@@ -25,8 +50,11 @@ static CSSSize _jniMeasureFunc(CSSNodeRef node,
|
|||||||
float height,
|
float height,
|
||||||
CSSMeasureMode heightMode) {
|
CSSMeasureMode heightMode) {
|
||||||
auto obj = adopt_local(Environment::current()->NewLocalRef(reinterpret_cast<jweak>(CSSNodeGetContext(node))));
|
auto obj = adopt_local(Environment::current()->NewLocalRef(reinterpret_cast<jweak>(CSSNodeGetContext(node))));
|
||||||
|
|
||||||
static auto measureFunc =
|
static auto measureFunc =
|
||||||
obj->getClass()->getMethod<jlong(jfloat, jint, jfloat, jint)>("measure");
|
obj->getClass()->getMethod<jlong(jfloat, jint, jfloat, jint)>("measure");
|
||||||
|
|
||||||
|
_jniTransferLayoutDirection(node, obj);
|
||||||
const auto measureResult = measureFunc(obj, width, widthMode, height, heightMode);
|
const auto measureResult = measureFunc(obj, width, widthMode, height, heightMode);
|
||||||
|
|
||||||
static_assert(sizeof(measureResult) == 8,
|
static_assert(sizeof(measureResult) == 8,
|
||||||
@@ -79,10 +107,12 @@ void jni_CSSNodeRemoveChild(alias_ref<jobject>, jlong nativePointer, jlong child
|
|||||||
}
|
}
|
||||||
|
|
||||||
void jni_CSSNodeCalculateLayout(alias_ref<jobject>, jlong nativePointer) {
|
void jni_CSSNodeCalculateLayout(alias_ref<jobject>, jlong nativePointer) {
|
||||||
CSSNodeCalculateLayout(_jlong2CSSNodeRef(nativePointer),
|
const CSSNodeRef root = _jlong2CSSNodeRef(nativePointer);
|
||||||
|
CSSNodeCalculateLayout(root,
|
||||||
CSSUndefined,
|
CSSUndefined,
|
||||||
CSSUndefined,
|
CSSUndefined,
|
||||||
CSSNodeStyleGetDirection(_jlong2CSSNodeRef(nativePointer)));
|
CSSNodeStyleGetDirection(_jlong2CSSNodeRef(nativePointer)));
|
||||||
|
_jniTransferLayoutOutputsRecursive(root);
|
||||||
}
|
}
|
||||||
|
|
||||||
void jni_CSSNodeMarkDirty(alias_ref<jobject>, jlong nativePointer) {
|
void jni_CSSNodeMarkDirty(alias_ref<jobject>, jlong nativePointer) {
|
||||||
@@ -139,11 +169,6 @@ void jni_CSSNodeMarkLayoutSeen(alias_ref<jobject>, jlong nativePointer) {
|
|||||||
static_cast<type>(value)); \
|
static_cast<type>(value)); \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define CSS_NODE_JNI_LAYOUT_PROP(javatype, type, name) \
|
|
||||||
javatype jni_CSSNodeLayoutGet##name(alias_ref<jobject>, jlong nativePointer) { \
|
|
||||||
return (javatype) CSSNodeLayoutGet##name(_jlong2CSSNodeRef(nativePointer)); \
|
|
||||||
}
|
|
||||||
|
|
||||||
CSS_NODE_JNI_STYLE_PROP(jint, CSSDirection, Direction);
|
CSS_NODE_JNI_STYLE_PROP(jint, CSSDirection, Direction);
|
||||||
CSS_NODE_JNI_STYLE_PROP(jint, CSSFlexDirection, FlexDirection);
|
CSS_NODE_JNI_STYLE_PROP(jint, CSSFlexDirection, FlexDirection);
|
||||||
CSS_NODE_JNI_STYLE_PROP(jint, CSSJustify, JustifyContent);
|
CSS_NODE_JNI_STYLE_PROP(jint, CSSJustify, JustifyContent);
|
||||||
@@ -173,12 +198,6 @@ CSS_NODE_JNI_STYLE_PROP(jfloat, float, Height);
|
|||||||
CSS_NODE_JNI_STYLE_PROP(jfloat, float, MinHeight);
|
CSS_NODE_JNI_STYLE_PROP(jfloat, float, MinHeight);
|
||||||
CSS_NODE_JNI_STYLE_PROP(jfloat, float, MaxHeight);
|
CSS_NODE_JNI_STYLE_PROP(jfloat, float, MaxHeight);
|
||||||
|
|
||||||
CSS_NODE_JNI_LAYOUT_PROP(jfloat, float, Width);
|
|
||||||
CSS_NODE_JNI_LAYOUT_PROP(jfloat, float, Height);
|
|
||||||
CSS_NODE_JNI_LAYOUT_PROP(jfloat, float, Left);
|
|
||||||
CSS_NODE_JNI_LAYOUT_PROP(jfloat, float, Top);
|
|
||||||
CSS_NODE_JNI_LAYOUT_PROP(jint, CSSDirection, Direction);
|
|
||||||
|
|
||||||
#define CSSMakeNativeMethod(name) makeNativeMethod(#name, name)
|
#define CSSMakeNativeMethod(name) makeNativeMethod(#name, name)
|
||||||
|
|
||||||
jint JNI_OnLoad(JavaVM *vm, void *) {
|
jint JNI_OnLoad(JavaVM *vm, void *) {
|
||||||
@@ -244,12 +263,6 @@ jint JNI_OnLoad(JavaVM *vm, void *) {
|
|||||||
CSSMakeNativeMethod(jni_CSSNodeStyleGetMaxHeight),
|
CSSMakeNativeMethod(jni_CSSNodeStyleGetMaxHeight),
|
||||||
CSSMakeNativeMethod(jni_CSSNodeStyleSetMaxHeight),
|
CSSMakeNativeMethod(jni_CSSNodeStyleSetMaxHeight),
|
||||||
|
|
||||||
CSSMakeNativeMethod(jni_CSSNodeLayoutGetLeft),
|
|
||||||
CSSMakeNativeMethod(jni_CSSNodeLayoutGetTop),
|
|
||||||
CSSMakeNativeMethod(jni_CSSNodeLayoutGetWidth),
|
|
||||||
CSSMakeNativeMethod(jni_CSSNodeLayoutGetHeight),
|
|
||||||
CSSMakeNativeMethod(jni_CSSNodeLayoutGetDirection),
|
|
||||||
|
|
||||||
CSSMakeNativeMethod(jni_CSSNodeGetInstanceCount),
|
CSSMakeNativeMethod(jni_CSSNodeGetInstanceCount),
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
Reference in New Issue
Block a user