move setStyleInputs to vanilla jni (YogaStyleProperties Part 5)

Summary: Move Yoga style properties to vanilla JNI under a flag.

Reviewed By: amir-shalem

Differential Revision: D17686117

fbshipit-source-id: e79bee1188c24e301b23416486b10f613434eebc
This commit is contained in:
Sidharth Guglani 2019-10-08 14:23:57 -07:00 коммит произвёл Facebook Github Bot
Родитель e3919b5ebd
Коммит 67a3ad38e3
4 изменённых файлов: 229 добавлений и 212 удалений

Просмотреть файл

@ -664,7 +664,10 @@ public abstract class YogaNodeJNIBase extends YogaNode implements Cloneable {
}
public void setStyleInputs(float[] styleInputsArray, int size) {
YogaNative.jni_YGNodeSetStyleInputs(mNativePointer, styleInputsArray, size);
if (useVanillaJNI)
YogaNative.jni_YGNodeSetStyleInputsJNI(mNativePointer, styleInputsArray, size);
else
YogaNative.jni_YGNodeSetStyleInputs(mNativePointer, styleInputsArray, size);
}
/**

Просмотреть файл

@ -22,49 +22,6 @@ using namespace facebook::jni;
using namespace std;
using facebook::yoga::detail::Log;
enum YGStyleInput {
LayoutDirection,
FlexDirection,
Flex,
FlexGrow,
FlexShrink,
FlexBasis,
FlexBasisPercent,
FlexBasisAuto,
FlexWrap,
Width,
WidthPercent,
WidthAuto,
MinWidth,
MinWidthPercent,
MaxWidth,
MaxWidthPercent,
Height,
HeightPercent,
HeightAuto,
MinHeight,
MinHeightPercent,
MaxHeight,
MaxHeightPercent,
JustifyContent,
AlignItems,
AlignSelf,
AlignContent,
PositionType,
AspectRatio,
Overflow,
Display,
Margin,
MarginPercent,
MarginAuto,
Padding,
PaddingPercent,
Border,
Position,
PositionPercent,
IsReferenceBaseline,
};
const short int LAYOUT_EDGE_SET_FLAG_INDEX = 0;
const short int LAYOUT_WIDTH_INDEX = 1;
const short int LAYOUT_HEIGHT_INDEX = 2;
@ -589,174 +546,6 @@ void jni_YGConfigSetLogger(
}
}
static void YGNodeSetStyleInputs(
const YGNodeRef node,
float* styleInputs,
int size) {
const auto end = styleInputs + size;
auto edgesSet = YGNodeEdges{node};
while (styleInputs < end) {
auto styleInputKey = static_cast<YGStyleInput>((int) *styleInputs++);
switch (styleInputKey) {
case LayoutDirection:
YGNodeStyleSetDirection(node, static_cast<YGDirection>(*styleInputs++));
break;
case FlexDirection:
YGNodeStyleSetFlexDirection(
node, static_cast<YGFlexDirection>(*styleInputs++));
break;
case Flex:
YGNodeStyleSetFlex(node, *styleInputs++);
break;
case FlexGrow:
YGNodeStyleSetFlexGrow(node, *styleInputs++);
break;
case FlexShrink:
YGNodeStyleSetFlexShrink(node, *styleInputs++);
break;
case FlexBasis:
YGNodeStyleSetFlexBasis(node, *styleInputs++);
break;
case FlexBasisPercent:
YGNodeStyleSetFlexBasisPercent(node, *styleInputs++);
break;
case FlexBasisAuto:
YGNodeStyleSetFlexBasisAuto(node);
break;
case FlexWrap:
YGNodeStyleSetFlexWrap(node, static_cast<YGWrap>(*styleInputs++));
break;
case Width:
YGNodeStyleSetWidth(node, *styleInputs++);
break;
case WidthPercent:
YGNodeStyleSetWidthPercent(node, *styleInputs++);
break;
case WidthAuto:
YGNodeStyleSetWidthAuto(node);
break;
case MinWidth:
YGNodeStyleSetMinWidth(node, *styleInputs++);
break;
case MinWidthPercent:
YGNodeStyleSetMinWidthPercent(node, *styleInputs++);
break;
case MaxWidth:
YGNodeStyleSetMaxWidth(node, *styleInputs++);
break;
case MaxWidthPercent:
YGNodeStyleSetMaxWidthPercent(node, *styleInputs++);
break;
case Height:
YGNodeStyleSetHeight(node, *styleInputs++);
break;
case HeightPercent:
YGNodeStyleSetHeightPercent(node, *styleInputs++);
break;
case HeightAuto:
YGNodeStyleSetHeightAuto(node);
break;
case MinHeight:
YGNodeStyleSetMinHeight(node, *styleInputs++);
break;
case MinHeightPercent:
YGNodeStyleSetMinHeightPercent(node, *styleInputs++);
break;
case MaxHeight:
YGNodeStyleSetMaxHeight(node, *styleInputs++);
break;
case MaxHeightPercent:
YGNodeStyleSetMaxHeightPercent(node, *styleInputs++);
break;
case JustifyContent:
YGNodeStyleSetJustifyContent(
node, static_cast<YGJustify>(*styleInputs++));
break;
case AlignItems:
YGNodeStyleSetAlignItems(node, static_cast<YGAlign>(*styleInputs++));
break;
case AlignSelf:
YGNodeStyleSetAlignSelf(node, static_cast<YGAlign>(*styleInputs++));
break;
case AlignContent:
YGNodeStyleSetAlignContent(node, static_cast<YGAlign>(*styleInputs++));
break;
case PositionType:
YGNodeStyleSetPositionType(
node, static_cast<YGPositionType>(*styleInputs++));
break;
case AspectRatio:
YGNodeStyleSetAspectRatio(node, *styleInputs++);
break;
case Overflow:
YGNodeStyleSetOverflow(node, static_cast<YGOverflow>(*styleInputs++));
break;
case Display:
YGNodeStyleSetDisplay(node, static_cast<YGDisplay>(*styleInputs++));
break;
case Margin: {
auto edge = static_cast<YGEdge>(*styleInputs++);
float marginValue = *styleInputs++;
edgesSet.add(YGNodeEdges::MARGIN);
YGNodeStyleSetMargin(node, edge, marginValue);
break;
}
case MarginPercent: {
auto edge = static_cast<YGEdge>(*styleInputs++);
float marginPercent = *styleInputs++;
edgesSet.add(YGNodeEdges::MARGIN);
YGNodeStyleSetMarginPercent(node, edge, marginPercent);
break;
}
case MarginAuto: {
edgesSet.add(YGNodeEdges::MARGIN);
YGNodeStyleSetMarginAuto(node, static_cast<YGEdge>(*styleInputs++));
break;
}
case Padding: {
auto edge = static_cast<YGEdge>(*styleInputs++);
float paddingValue = *styleInputs++;
edgesSet.add(YGNodeEdges::PADDING);
YGNodeStyleSetPadding(node, edge, paddingValue);
break;
}
case PaddingPercent: {
auto edge = static_cast<YGEdge>(*styleInputs++);
float paddingPercent = *styleInputs++;
edgesSet.add(YGNodeEdges::PADDING);
YGNodeStyleSetPaddingPercent(node, edge, paddingPercent);
break;
}
case Border: {
auto edge = static_cast<YGEdge>(*styleInputs++);
float borderValue = *styleInputs++;
edgesSet.add(YGNodeEdges::BORDER);
YGNodeStyleSetBorder(node, edge, borderValue);
break;
}
case Position: {
auto edge = static_cast<YGEdge>(*styleInputs++);
float positionValue = *styleInputs++;
YGNodeStyleSetPosition(node, edge, positionValue);
break;
}
case PositionPercent: {
auto edge = static_cast<YGEdge>(*styleInputs++);
float positionPercent = *styleInputs++;
YGNodeStyleSetPositionPercent(node, edge, positionPercent);
break;
}
case IsReferenceBaseline: {
YGNodeSetIsReferenceBaseline(node, *styleInputs++ == 1 ? true : false);
break;
}
default:
break;
}
}
edgesSet.setOn(node);
}
void jni_YGNodeSetStyleInputs(
alias_ref<jclass>,
jlong nativePointer,

Просмотреть файл

@ -4,6 +4,49 @@
* This source code is licensed under the MIT license found in the LICENSE
* file in the root directory of this source tree.
*/
enum YGStyleInput {
LayoutDirection,
FlexDirection,
Flex,
FlexGrow,
FlexShrink,
FlexBasis,
FlexBasisPercent,
FlexBasisAuto,
FlexWrap,
Width,
WidthPercent,
WidthAuto,
MinWidth,
MinWidthPercent,
MaxWidth,
MaxWidthPercent,
Height,
HeightPercent,
HeightAuto,
MinHeight,
MinHeightPercent,
MaxHeight,
MaxHeightPercent,
JustifyContent,
AlignItems,
AlignSelf,
AlignContent,
PositionType,
AspectRatio,
Overflow,
Display,
Margin,
MarginPercent,
MarginAuto,
Padding,
PaddingPercent,
Border,
Position,
PositionPercent,
IsReferenceBaseline,
};
namespace {
union YGNodeContext {
@ -56,3 +99,171 @@ struct YogaValue {
}
};
} // namespace
static void YGNodeSetStyleInputs(
const YGNodeRef node,
float* styleInputs,
int size) {
const auto end = styleInputs + size;
auto edgesSet = YGNodeEdges{node};
while (styleInputs < end) {
auto styleInputKey = static_cast<YGStyleInput>((int) *styleInputs++);
switch (styleInputKey) {
case LayoutDirection:
YGNodeStyleSetDirection(node, static_cast<YGDirection>(*styleInputs++));
break;
case FlexDirection:
YGNodeStyleSetFlexDirection(
node, static_cast<YGFlexDirection>(*styleInputs++));
break;
case Flex:
YGNodeStyleSetFlex(node, *styleInputs++);
break;
case FlexGrow:
YGNodeStyleSetFlexGrow(node, *styleInputs++);
break;
case FlexShrink:
YGNodeStyleSetFlexShrink(node, *styleInputs++);
break;
case FlexBasis:
YGNodeStyleSetFlexBasis(node, *styleInputs++);
break;
case FlexBasisPercent:
YGNodeStyleSetFlexBasisPercent(node, *styleInputs++);
break;
case FlexBasisAuto:
YGNodeStyleSetFlexBasisAuto(node);
break;
case FlexWrap:
YGNodeStyleSetFlexWrap(node, static_cast<YGWrap>(*styleInputs++));
break;
case Width:
YGNodeStyleSetWidth(node, *styleInputs++);
break;
case WidthPercent:
YGNodeStyleSetWidthPercent(node, *styleInputs++);
break;
case WidthAuto:
YGNodeStyleSetWidthAuto(node);
break;
case MinWidth:
YGNodeStyleSetMinWidth(node, *styleInputs++);
break;
case MinWidthPercent:
YGNodeStyleSetMinWidthPercent(node, *styleInputs++);
break;
case MaxWidth:
YGNodeStyleSetMaxWidth(node, *styleInputs++);
break;
case MaxWidthPercent:
YGNodeStyleSetMaxWidthPercent(node, *styleInputs++);
break;
case Height:
YGNodeStyleSetHeight(node, *styleInputs++);
break;
case HeightPercent:
YGNodeStyleSetHeightPercent(node, *styleInputs++);
break;
case HeightAuto:
YGNodeStyleSetHeightAuto(node);
break;
case MinHeight:
YGNodeStyleSetMinHeight(node, *styleInputs++);
break;
case MinHeightPercent:
YGNodeStyleSetMinHeightPercent(node, *styleInputs++);
break;
case MaxHeight:
YGNodeStyleSetMaxHeight(node, *styleInputs++);
break;
case MaxHeightPercent:
YGNodeStyleSetMaxHeightPercent(node, *styleInputs++);
break;
case JustifyContent:
YGNodeStyleSetJustifyContent(
node, static_cast<YGJustify>(*styleInputs++));
break;
case AlignItems:
YGNodeStyleSetAlignItems(node, static_cast<YGAlign>(*styleInputs++));
break;
case AlignSelf:
YGNodeStyleSetAlignSelf(node, static_cast<YGAlign>(*styleInputs++));
break;
case AlignContent:
YGNodeStyleSetAlignContent(node, static_cast<YGAlign>(*styleInputs++));
break;
case PositionType:
YGNodeStyleSetPositionType(
node, static_cast<YGPositionType>(*styleInputs++));
break;
case AspectRatio:
YGNodeStyleSetAspectRatio(node, *styleInputs++);
break;
case Overflow:
YGNodeStyleSetOverflow(node, static_cast<YGOverflow>(*styleInputs++));
break;
case Display:
YGNodeStyleSetDisplay(node, static_cast<YGDisplay>(*styleInputs++));
break;
case Margin: {
auto edge = static_cast<YGEdge>(*styleInputs++);
float marginValue = *styleInputs++;
edgesSet.add(YGNodeEdges::MARGIN);
YGNodeStyleSetMargin(node, edge, marginValue);
break;
}
case MarginPercent: {
auto edge = static_cast<YGEdge>(*styleInputs++);
float marginPercent = *styleInputs++;
edgesSet.add(YGNodeEdges::MARGIN);
YGNodeStyleSetMarginPercent(node, edge, marginPercent);
break;
}
case MarginAuto: {
edgesSet.add(YGNodeEdges::MARGIN);
YGNodeStyleSetMarginAuto(node, static_cast<YGEdge>(*styleInputs++));
break;
}
case Padding: {
auto edge = static_cast<YGEdge>(*styleInputs++);
float paddingValue = *styleInputs++;
edgesSet.add(YGNodeEdges::PADDING);
YGNodeStyleSetPadding(node, edge, paddingValue);
break;
}
case PaddingPercent: {
auto edge = static_cast<YGEdge>(*styleInputs++);
float paddingPercent = *styleInputs++;
edgesSet.add(YGNodeEdges::PADDING);
YGNodeStyleSetPaddingPercent(node, edge, paddingPercent);
break;
}
case Border: {
auto edge = static_cast<YGEdge>(*styleInputs++);
float borderValue = *styleInputs++;
edgesSet.add(YGNodeEdges::BORDER);
YGNodeStyleSetBorder(node, edge, borderValue);
break;
}
case Position: {
auto edge = static_cast<YGEdge>(*styleInputs++);
float positionValue = *styleInputs++;
YGNodeStyleSetPosition(node, edge, positionValue);
break;
}
case PositionPercent: {
auto edge = static_cast<YGEdge>(*styleInputs++);
float positionPercent = *styleInputs++;
YGNodeStyleSetPositionPercent(node, edge, positionPercent);
break;
}
case IsReferenceBaseline: {
YGNodeSetIsReferenceBaseline(node, *styleInputs++ == 1 ? true : false);
break;
}
default:
break;
}
}
edgesSet.setOn(node);
}

Просмотреть файл

@ -396,6 +396,17 @@ static jlong jni_YGNodeCloneJNI(JNIEnv* env, jobject obj, jlong nativePointer) {
// Yoga specific properties, not compatible with flexbox specification
YG_NODE_JNI_STYLE_PROP(jfloat, float, AspectRatio);
static void jni_YGNodeSetStyleInputsJNI(
JNIEnv* env,
jobject obj,
jlong nativePointer,
jfloatArray styleInputs,
jint size) {
float result[size];
env->GetFloatArrayRegion(styleInputs, 0, size, result);
YGNodeSetStyleInputs(_jlong2YGNodeRef(nativePointer), result, size);
}
void assertNoPendingJniException(JNIEnv* env) {
// This method cannot call any other method of the library, since other
// methods of the library use it to check for exceptions too
@ -642,6 +653,9 @@ static JNINativeMethod methods[] = {
"(JF)V",
(void*) jni_YGNodeStyleSetAspectRatioJNI},
{"jni_YGNodePrintJNI", "(J)V", (void*) jni_YGNodePrintJNI},
{"jni_YGNodeSetStyleInputsJNI",
"(J[FI)V",
(void*) jni_YGNodeSetStyleInputsJNI},
{"jni_YGNodeCloneJNI", "(J)J", (void*) jni_YGNodeCloneJNI},
};