From e30f34eda689994cab8cd62aa38175238da8638b Mon Sep 17 00:00:00 2001 From: Christoph Purrer Date: Fri, 29 Aug 2025 22:33:49 -0700 Subject: [PATCH] Android: Image Prefetching send ImageResizeMode as enum value (#53516) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/53516 Changelog: [General][Breaking] Android: Image Prefetching send ImageResizeMode as enum value Idea: Reduce JNI payload by sending int values instead of strings Reviewed By: lenaic Differential Revision: D81252246 fbshipit-source-id: 7ba128725900422f8654b3019014fd49ec8152b6 --- .../ReactAndroid/api/ReactAndroid.api | 7 ++++++ .../react/views/image/ImageResizeMethod.kt | 23 ++++++++++++++++++- .../react/views/image/ImageResizeMode.kt | 13 +++++++++++ .../react/views/image/ReactImageManager.kt | 12 +--------- .../react/renderer/imagemanager/conversions.h | 23 +++---------------- .../react/renderer/imagemanager/primitives.h | 14 +++++------ 6 files changed, 53 insertions(+), 39 deletions(-) diff --git a/packages/react-native/ReactAndroid/api/ReactAndroid.api b/packages/react-native/ReactAndroid/api/ReactAndroid.api index f3c762ae70f..8436cf85407 100644 --- a/packages/react-native/ReactAndroid/api/ReactAndroid.api +++ b/packages/react-native/ReactAndroid/api/ReactAndroid.api @@ -5353,18 +5353,25 @@ public final class com/facebook/react/views/image/ImageLoadEvent$Companion { public final class com/facebook/react/views/image/ImageResizeMethod : java/lang/Enum { public static final field AUTO Lcom/facebook/react/views/image/ImageResizeMethod; + public static final field Companion Lcom/facebook/react/views/image/ImageResizeMethod$Companion; public static final field NONE Lcom/facebook/react/views/image/ImageResizeMethod; public static final field RESIZE Lcom/facebook/react/views/image/ImageResizeMethod; public static final field SCALE Lcom/facebook/react/views/image/ImageResizeMethod; public static fun getEntries ()Lkotlin/enums/EnumEntries; + public static final fun parse (Ljava/lang/String;)Lcom/facebook/react/views/image/ImageResizeMethod; public static fun valueOf (Ljava/lang/String;)Lcom/facebook/react/views/image/ImageResizeMethod; public static fun values ()[Lcom/facebook/react/views/image/ImageResizeMethod; } +public final class com/facebook/react/views/image/ImageResizeMethod$Companion { + public final fun parse (Ljava/lang/String;)Lcom/facebook/react/views/image/ImageResizeMethod; +} + public final class com/facebook/react/views/image/ImageResizeMode { public static final field INSTANCE Lcom/facebook/react/views/image/ImageResizeMode; public static final fun defaultTileMode ()Landroid/graphics/Shader$TileMode; public static final fun defaultValue ()Lcom/facebook/drawee/drawable/ScalingUtils$ScaleType; + public final synthetic fun fromInt (I)Ljava/lang/String; public static final fun toScaleType (Ljava/lang/String;)Lcom/facebook/drawee/drawable/ScalingUtils$ScaleType; public static final fun toTileMode (Ljava/lang/String;)Landroid/graphics/Shader$TileMode; } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/image/ImageResizeMethod.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/image/ImageResizeMethod.kt index 63a382ff391..8ce43857d3d 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/image/ImageResizeMethod.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/image/ImageResizeMethod.kt @@ -7,9 +7,30 @@ package com.facebook.react.views.image +import com.facebook.common.logging.FLog +import com.facebook.react.common.ReactConstants + public enum class ImageResizeMethod { AUTO, RESIZE, SCALE, - NONE, + NONE; + + public companion object { + @JvmStatic + public fun parse(resizeMethod: String?): ImageResizeMethod { + return when (resizeMethod) { + null, + "", + "auto" -> ImageResizeMethod.AUTO + "resize" -> ImageResizeMethod.RESIZE + "scale" -> ImageResizeMethod.SCALE + "none" -> ImageResizeMethod.NONE + else -> { + FLog.w(ReactConstants.TAG, "Invalid resize method: '$resizeMethod'") + ImageResizeMethod.AUTO + } + } + } + } } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/image/ImageResizeMode.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/image/ImageResizeMode.kt index 3d40fbf95d7..d190200a2ef 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/image/ImageResizeMode.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/image/ImageResizeMode.kt @@ -21,6 +21,19 @@ public object ImageResizeMode { private const val RESIZE_MODE_REPEAT = "repeat" private const val RESIZE_MODE_NONE = "none" + @JvmSynthetic + public fun fromInt(resizeMode: Int): String { + return when (resizeMode) { + 0 -> RESIZE_MODE_COVER + 1 -> RESIZE_MODE_CONTAIN + 2 -> RESIZE_MODE_STRETCH + 3 -> RESIZE_MODE_CENTER + 4 -> RESIZE_MODE_REPEAT + 5 -> RESIZE_MODE_NONE + else -> RESIZE_MODE_NONE + } + } + /** Converts JS resize modes into `ScalingUtils.ScaleType`. See `ImageResizeMode.js`. */ @JvmStatic public fun toScaleType(resizeModeValue: String?): ScalingUtils.ScaleType { diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/image/ReactImageManager.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/image/ReactImageManager.kt index 9105b610374..ec04d15097f 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/image/ReactImageManager.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/image/ReactImageManager.kt @@ -188,17 +188,7 @@ public constructor( @ReactProp(name = ViewProps.RESIZE_METHOD) public fun setResizeMethod(view: ReactImageView, resizeMethod: String?) { - when (resizeMethod) { - null, - "auto" -> view.setResizeMethod(ImageResizeMethod.AUTO) - "resize" -> view.setResizeMethod(ImageResizeMethod.RESIZE) - "scale" -> view.setResizeMethod(ImageResizeMethod.SCALE) - "none" -> view.setResizeMethod(ImageResizeMethod.NONE) - else -> { - view.setResizeMethod(ImageResizeMethod.AUTO) - FLog.w(ReactConstants.TAG, "Invalid resize method: '$resizeMethod'") - } - } + view.setResizeMethod(ImageResizeMethod.parse(resizeMethod)) } @ReactProp(name = "resizeMultiplier") diff --git a/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/android/react/renderer/imagemanager/conversions.h b/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/android/react/renderer/imagemanager/conversions.h index 4680be96516..b0cc007cef5 100644 --- a/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/android/react/renderer/imagemanager/conversions.h +++ b/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/android/react/renderer/imagemanager/conversions.h @@ -12,30 +12,13 @@ #include #include #include -#include +#include #include namespace facebook::react { namespace { -inline std::string toString(const ImageResizeMode& value) { - switch (value) { - case ImageResizeMode::Cover: - return "cover"; - case ImageResizeMode::Contain: - return "contain"; - case ImageResizeMode::Stretch: - return "stretch"; - case ImageResizeMode::Center: - return "center"; - case ImageResizeMode::Repeat: - return "repeat"; - case ImageResizeMode::None: - return "none"; - } -} - constexpr MapBuffer::Key IS_KEY_URI = 0; constexpr MapBuffer::Key IS_KEY_DEFAULT_SRC = 1; constexpr MapBuffer::Key IS_KEY_RESIZE_MODE = 2; @@ -68,8 +51,8 @@ inline void serializeImageRequestParams( MapBufferBuilder& builder, const ImageRequestParams& imageRequestParams) { builder.putString(IS_KEY_DEFAULT_SRC, imageRequestParams.defaultSource.uri); - builder.putString( - IS_KEY_RESIZE_MODE, toString(imageRequestParams.resizeMode)); + builder.putInt( + IS_KEY_RESIZE_MODE, to_underlying(imageRequestParams.resizeMode)); builder.putString(IS_KEY_RESIZE_METHOD, imageRequestParams.resizeMethod); builder.putInt( IS_KEY_BLUR_RADIUS, static_cast(imageRequestParams.blurRadius)); diff --git a/packages/react-native/ReactCommon/react/renderer/imagemanager/primitives.h b/packages/react-native/ReactCommon/react/renderer/imagemanager/primitives.h index aaf5955f9d2..ea836431500 100644 --- a/packages/react-native/ReactCommon/react/renderer/imagemanager/primitives.h +++ b/packages/react-native/ReactCommon/react/renderer/imagemanager/primitives.h @@ -162,13 +162,13 @@ inline folly::dynamic toDynamic(const ImageSource& imageSource) { using ImageSources = std::vector; -enum class ImageResizeMode { - Cover, - Contain, - Stretch, - Center, - Repeat, - None, +enum class ImageResizeMode : int8_t { + Cover = 0, + Contain = 1, + Stretch = 2, + Center = 3, + Repeat = 4, + None = 5, }; class ImageErrorInfo {