diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewManager.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewManager.java index f73493257..3142119a2 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewManager.java @@ -213,7 +213,7 @@ public abstract class ViewManager return null; } - public float[] measure( + public long measure( ReactContext context, T view, ReadableNativeMap localData, @@ -222,6 +222,6 @@ public abstract class ViewManager YogaMeasureMode widthMode, float height, YogaMeasureMode heightMode) { - return null; + return 0; } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextViewManager.java b/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextViewManager.java index 39cedcf70..61a38aafc 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextViewManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextViewManager.java @@ -103,7 +103,7 @@ public class ReactTextViewManager return MapBuilder.of("topTextLayout", MapBuilder.of("registrationName", "onTextLayout")); } - public float[] measure( + public long measure( ReactContext context, ReactTextView view, ReadableNativeMap localData, diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManager.java b/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManager.java index 27b865279..56a34910d 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManager.java @@ -32,6 +32,7 @@ import com.facebook.react.uimanager.ReactStylesDiffMap; import com.facebook.react.uimanager.ViewDefaults; import com.facebook.yoga.YogaConstants; import com.facebook.yoga.YogaMeasureMode; +import com.facebook.yoga.YogaMeasureOutput; import java.awt.font.TextAttribute; import java.util.ArrayList; import java.util.List; @@ -189,7 +190,7 @@ public class TextLayoutManager { return sb; } - public static float[] measureText( + public static long measureText( ReactContext context, ReactTextView view, ReadableNativeMap attributedString, @@ -296,7 +297,7 @@ public class TextLayoutManager { height = layout.getHeight(); } - return new float[] { PixelUtil.toSPFromPixel(width), PixelUtil.toSPFromPixel(height) }; + return YogaMeasureOutput.make(PixelUtil.toSPFromPixel(width), PixelUtil.toSPFromPixel(height)); } private static class SetSpanOperation { diff --git a/ReactCommon/fabric/core/conversions.h b/ReactCommon/fabric/core/conversions.h index d8ea97279..d9066d8a5 100644 --- a/ReactCommon/fabric/core/conversions.h +++ b/ReactCommon/fabric/core/conversions.h @@ -34,5 +34,19 @@ inline std::string toString(const DisplayType &displayType) { } } +inline Size yogaMeassureToSize(int64_t value) { + static_assert( + sizeof(value) == 8, + "Expected measureResult to be 8 bytes, or two 32 bit ints"); + + int32_t wBits = 0xFFFFFFFF & (value >> 32); + int32_t hBits = 0xFFFFFFFF & value; + + float *measuredWidth = reinterpret_cast(&wBits); + float *measuredHeight = reinterpret_cast(&hBits); + + return {*measuredWidth, *measuredHeight}; +} + } // namespace react } // namespace facebook diff --git a/ReactCommon/fabric/textlayoutmanager/platform/android/TextLayoutManager.cpp b/ReactCommon/fabric/textlayoutmanager/platform/android/TextLayoutManager.cpp index 251b81314..2ca5709c0 100644 --- a/ReactCommon/fabric/textlayoutmanager/platform/android/TextLayoutManager.cpp +++ b/ReactCommon/fabric/textlayoutmanager/platform/android/TextLayoutManager.cpp @@ -8,6 +8,7 @@ #include "TextLayoutManager.h" #include +#include #include using namespace facebook::jni; @@ -32,7 +33,7 @@ Size TextLayoutManager::measure( auto clazz = jni::findClassStatic("com/facebook/fbreact/fabric/FabricUIManager"); - static auto measure = clazz->getMethodgetMethod componentName = make_jstring("RCTText"); - auto values = measure( + return yogaMeassureToSize(measure( fabricUIManager, reactTag, componentName.get(), @@ -58,13 +59,7 @@ Size TextLayoutManager::measure( minWidth, maxWidth, minHeight, - maxHeight); - - std::vector indices; - indices.resize(values->size()); - values->getRegion(0, values->size(), indices.data()); - - return {indices[0], indices[1]}; + maxHeight)); } } // namespace react