Allow decimal measurements on java
Summary: Preserve floating point values when passing them across the JNI bridge. Differential Revision: D4366605 fbshipit-source-id: 0b94ee87a03a6ed918360dd9998930e780fc865d
This commit is contained in:
committed by
Facebook Github Bot
parent
f2080e520f
commit
23e62f2840
@@ -15,18 +15,20 @@ package com.facebook.yoga;
|
|||||||
public class YogaMeasureOutput {
|
public class YogaMeasureOutput {
|
||||||
|
|
||||||
public static long make(float width, float height) {
|
public static long make(float width, float height) {
|
||||||
return make((int) width, (int) height);
|
final int wBits = Float.floatToRawIntBits(width);
|
||||||
|
final int hBits = Float.floatToRawIntBits(height);
|
||||||
|
return ((long) wBits) << 32 | ((long) hBits);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static long make(int width, int height) {
|
public static long make(int width, int height) {
|
||||||
return ((long) width) << 32 | ((long) height);
|
return make((float) width, (float) height);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int getWidth(long measureOutput) {
|
public static float getWidth(long measureOutput) {
|
||||||
return (int) (0xFFFFFFFF & (measureOutput >> 32));
|
return Float.intBitsToFloat((int) (0xFFFFFFFF & (measureOutput >> 32)));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int getHeight(long measureOutput) {
|
public static float getHeight(long measureOutput) {
|
||||||
return (int) (0xFFFFFFFF & measureOutput);
|
return Float.intBitsToFloat((int) (0xFFFFFFFF & measureOutput));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -67,10 +67,13 @@ static YGSize YGJNIMeasureFunc(YGNodeRef node,
|
|||||||
static_assert(sizeof(measureResult) == 8,
|
static_assert(sizeof(measureResult) == 8,
|
||||||
"Expected measureResult to be 8 bytes, or two 32 bit ints");
|
"Expected measureResult to be 8 bytes, or two 32 bit ints");
|
||||||
|
|
||||||
const float measuredWidth = static_cast<float>(0xFFFFFFFF & (measureResult >> 32));
|
int32_t wBits = 0xFFFFFFFF & (measureResult >> 32);
|
||||||
const float measuredHeight = static_cast<float>(0xFFFFFFFF & measureResult);
|
int32_t hBits = 0xFFFFFFFF & measureResult;
|
||||||
|
|
||||||
return YGSize{measuredWidth, measuredHeight};
|
const float *measuredWidth = reinterpret_cast<float*>(&wBits);
|
||||||
|
const float *measuredHeight = reinterpret_cast<float*>(&hBits);
|
||||||
|
|
||||||
|
return YGSize{*measuredWidth, *measuredHeight};
|
||||||
} else {
|
} else {
|
||||||
YGLog(YGLogLevelError, "Java YGNode was GCed during layout calculation\n");
|
YGLog(YGLogLevelError, "Java YGNode was GCed during layout calculation\n");
|
||||||
return YGSize{
|
return YGSize{
|
||||||
|
@@ -41,6 +41,60 @@ public class YogaNodeTest {
|
|||||||
assertEquals(100, (int) node.getLayoutHeight());
|
assertEquals(100, (int) node.getLayoutHeight());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testMeasureFloat() {
|
||||||
|
final YogaNode node = new YogaNode();
|
||||||
|
node.setMeasureFunction(new YogaMeasureFunction() {
|
||||||
|
public long measure(
|
||||||
|
YogaNodeAPI node,
|
||||||
|
float width,
|
||||||
|
YogaMeasureMode widthMode,
|
||||||
|
float height,
|
||||||
|
YogaMeasureMode heightMode) {
|
||||||
|
return YogaMeasureOutput.make(100.5f, 100.5f);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
node.calculateLayout();
|
||||||
|
assertEquals(100.5f, node.getLayoutWidth(), 0.0f);
|
||||||
|
assertEquals(100.5f, node.getLayoutHeight(), 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testMeasureFloatMin() {
|
||||||
|
final YogaNode node = new YogaNode();
|
||||||
|
node.setMeasureFunction(new YogaMeasureFunction() {
|
||||||
|
public long measure(
|
||||||
|
YogaNodeAPI node,
|
||||||
|
float width,
|
||||||
|
YogaMeasureMode widthMode,
|
||||||
|
float height,
|
||||||
|
YogaMeasureMode heightMode) {
|
||||||
|
return YogaMeasureOutput.make(Float.MIN_VALUE, Float.MIN_VALUE);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
node.calculateLayout();
|
||||||
|
assertEquals(Float.MIN_VALUE, node.getLayoutWidth(), 0.0f);
|
||||||
|
assertEquals(Float.MIN_VALUE, node.getLayoutHeight(), 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testMeasureFloatMax() {
|
||||||
|
final YogaNode node = new YogaNode();
|
||||||
|
node.setMeasureFunction(new YogaMeasureFunction() {
|
||||||
|
public long measure(
|
||||||
|
YogaNodeAPI node,
|
||||||
|
float width,
|
||||||
|
YogaMeasureMode widthMode,
|
||||||
|
float height,
|
||||||
|
YogaMeasureMode heightMode) {
|
||||||
|
return YogaMeasureOutput.make(Float.MAX_VALUE, Float.MAX_VALUE);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
node.calculateLayout();
|
||||||
|
assertEquals(Float.MAX_VALUE, node.getLayoutWidth(), 0.0f);
|
||||||
|
assertEquals(Float.MAX_VALUE, node.getLayoutHeight(), 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
private YogaLogLevel mLogLevel;
|
private YogaLogLevel mLogLevel;
|
||||||
private String mLogMessage;
|
private String mLogMessage;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user