From c7c24dce84f195222310010f7b5f2e7ca8673657 Mon Sep 17 00:00:00 2001 From: Emil Sjolander Date: Thu, 29 Dec 2016 04:52:20 -0800 Subject: [PATCH] Allow decimal measurements on java Differential Revision: D4366605 fbshipit-source-id: 0b94ee87a03a6ed918360dd9998930e780fc865d --- .../java/com/facebook/yoga/YogaMeasureOutput.java | 14 ++++++++------ .../src/main/jni/first-party/yogajni/jni/YGJNI.cpp | 9 ++++++--- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/yoga/YogaMeasureOutput.java b/ReactAndroid/src/main/java/com/facebook/yoga/YogaMeasureOutput.java index 7bb845a0d..d276fbacb 100644 --- a/ReactAndroid/src/main/java/com/facebook/yoga/YogaMeasureOutput.java +++ b/ReactAndroid/src/main/java/com/facebook/yoga/YogaMeasureOutput.java @@ -15,18 +15,20 @@ package com.facebook.yoga; public class YogaMeasureOutput { 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) { - return ((long) width) << 32 | ((long) height); + return make((float) width, (float) height); } - public static int getWidth(long measureOutput) { - return (int) (0xFFFFFFFF & (measureOutput >> 32)); + public static float getWidth(long measureOutput) { + return Float.intBitsToFloat((int) (0xFFFFFFFF & (measureOutput >> 32))); } - public static int getHeight(long measureOutput) { - return (int) (0xFFFFFFFF & measureOutput); + public static float getHeight(long measureOutput) { + return Float.intBitsToFloat((int) (0xFFFFFFFF & measureOutput)); } } 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 09236b886..d0c2a8049 100644 --- a/ReactAndroid/src/main/jni/first-party/yogajni/jni/YGJNI.cpp +++ b/ReactAndroid/src/main/jni/first-party/yogajni/jni/YGJNI.cpp @@ -67,10 +67,13 @@ static YGSize YGJNIMeasureFunc(YGNodeRef node, static_assert(sizeof(measureResult) == 8, "Expected measureResult to be 8 bytes, or two 32 bit ints"); - const float measuredWidth = static_cast(0xFFFFFFFF & (measureResult >> 32)); - const float measuredHeight = static_cast(0xFFFFFFFF & measureResult); + int32_t wBits = 0xFFFFFFFF & (measureResult >> 32); + int32_t hBits = 0xFFFFFFFF & measureResult; - return YGSize{measuredWidth, measuredHeight}; + const float *measuredWidth = reinterpret_cast(&wBits); + const float *measuredHeight = reinterpret_cast(&hBits); + + return YGSize{*measuredWidth, *measuredHeight}; } else { YGLog(YGLogLevelError, "Java YGNode was GCed during layout calculation\n"); return YGSize{