diff --git a/packages/react-native-nitro-web-image/ios/Extensions/AsyncImageLoadOptions+toSDWebImageOptions.swift b/packages/react-native-nitro-web-image/ios/Extensions/AsyncImageLoadOptions+toSDWebImageOptions.swift index 0dabd96..6ef84d8 100644 --- a/packages/react-native-nitro-web-image/ios/Extensions/AsyncImageLoadOptions+toSDWebImageOptions.swift +++ b/packages/react-native-nitro-web-image/ios/Extensions/AsyncImageLoadOptions+toSDWebImageOptions.swift @@ -49,6 +49,10 @@ extension AsyncImageLoadOptions { options.insert(.avoidDecodeImage) } + if progressive == true { + options.insert(.progressiveLoad) + } + return options } diff --git a/packages/react-native-nitro-web-image/nitrogen/generated/android/c++/JAsyncImageLoadOptions.hpp b/packages/react-native-nitro-web-image/nitrogen/generated/android/c++/JAsyncImageLoadOptions.hpp index 9561618..f057306 100644 --- a/packages/react-native-nitro-web-image/nitrogen/generated/android/c++/JAsyncImageLoadOptions.hpp +++ b/packages/react-native-nitro-web-image/nitrogen/generated/android/c++/JAsyncImageLoadOptions.hpp @@ -54,6 +54,8 @@ namespace margelo::nitro::web::image { jni::local_ref decodeImage = this->getFieldValue(fieldDecodeImage); static const auto fieldAllowHardware = clazz->getField("allowHardware"); jni::local_ref allowHardware = this->getFieldValue(fieldAllowHardware); + static const auto fieldProgressive = clazz->getField("progressive"); + jni::local_ref progressive = this->getFieldValue(fieldProgressive); return AsyncImageLoadOptions( priority != nullptr ? std::make_optional(priority->toCpp()) : std::nullopt, forceRefresh != nullptr ? std::make_optional(static_cast(forceRefresh->value())) : std::nullopt, @@ -64,7 +66,8 @@ namespace margelo::nitro::web::image { queryMemoryDataSync != nullptr ? std::make_optional(static_cast(queryMemoryDataSync->value())) : std::nullopt, queryDiskDataSync != nullptr ? std::make_optional(static_cast(queryDiskDataSync->value())) : std::nullopt, decodeImage != nullptr ? std::make_optional(static_cast(decodeImage->value())) : std::nullopt, - allowHardware != nullptr ? std::make_optional(static_cast(allowHardware->value())) : std::nullopt + allowHardware != nullptr ? std::make_optional(static_cast(allowHardware->value())) : std::nullopt, + progressive != nullptr ? std::make_optional(static_cast(progressive->value())) : std::nullopt ); } @@ -74,7 +77,7 @@ namespace margelo::nitro::web::image { */ [[maybe_unused]] static jni::local_ref fromCpp(const AsyncImageLoadOptions& value) { - using JSignature = JAsyncImageLoadOptions(jni::alias_ref, jni::alias_ref, jni::alias_ref, jni::alias_ref, jni::alias_ref, jni::alias_ref, jni::alias_ref, jni::alias_ref, jni::alias_ref, jni::alias_ref); + using JSignature = JAsyncImageLoadOptions(jni::alias_ref, jni::alias_ref, jni::alias_ref, jni::alias_ref, jni::alias_ref, jni::alias_ref, jni::alias_ref, jni::alias_ref, jni::alias_ref, jni::alias_ref, jni::alias_ref); static const auto clazz = javaClassStatic(); static const auto create = clazz->getStaticMethod("fromCpp"); return create( @@ -88,7 +91,8 @@ namespace margelo::nitro::web::image { value.queryMemoryDataSync.has_value() ? jni::JBoolean::valueOf(value.queryMemoryDataSync.value()) : nullptr, value.queryDiskDataSync.has_value() ? jni::JBoolean::valueOf(value.queryDiskDataSync.value()) : nullptr, value.decodeImage.has_value() ? jni::JBoolean::valueOf(value.decodeImage.value()) : nullptr, - value.allowHardware.has_value() ? jni::JBoolean::valueOf(value.allowHardware.value()) : nullptr + value.allowHardware.has_value() ? jni::JBoolean::valueOf(value.allowHardware.value()) : nullptr, + value.progressive.has_value() ? jni::JBoolean::valueOf(value.progressive.value()) : nullptr ); } }; diff --git a/packages/react-native-nitro-web-image/nitrogen/generated/android/kotlin/com/margelo/nitro/web/image/AsyncImageLoadOptions.kt b/packages/react-native-nitro-web-image/nitrogen/generated/android/kotlin/com/margelo/nitro/web/image/AsyncImageLoadOptions.kt index 279e875..e0b2fdb 100644 --- a/packages/react-native-nitro-web-image/nitrogen/generated/android/kotlin/com/margelo/nitro/web/image/AsyncImageLoadOptions.kt +++ b/packages/react-native-nitro-web-image/nitrogen/generated/android/kotlin/com/margelo/nitro/web/image/AsyncImageLoadOptions.kt @@ -46,7 +46,10 @@ data class AsyncImageLoadOptions( val decodeImage: Boolean?, @DoNotStrip @Keep - val allowHardware: Boolean? + val allowHardware: Boolean?, + @DoNotStrip + @Keep + val progressive: Boolean? ) { /* primary constructor */ @@ -58,8 +61,8 @@ data class AsyncImageLoadOptions( @Keep @Suppress("unused") @JvmStatic - private fun fromCpp(priority: AsyncImagePriority?, forceRefresh: Boolean?, cacheKey: String?, continueInBackground: Boolean?, allowInvalidSSLCertificates: Boolean?, scaleDownLargeImages: Boolean?, queryMemoryDataSync: Boolean?, queryDiskDataSync: Boolean?, decodeImage: Boolean?, allowHardware: Boolean?): AsyncImageLoadOptions { - return AsyncImageLoadOptions(priority, forceRefresh, cacheKey, continueInBackground, allowInvalidSSLCertificates, scaleDownLargeImages, queryMemoryDataSync, queryDiskDataSync, decodeImage, allowHardware) + private fun fromCpp(priority: AsyncImagePriority?, forceRefresh: Boolean?, cacheKey: String?, continueInBackground: Boolean?, allowInvalidSSLCertificates: Boolean?, scaleDownLargeImages: Boolean?, queryMemoryDataSync: Boolean?, queryDiskDataSync: Boolean?, decodeImage: Boolean?, allowHardware: Boolean?, progressive: Boolean?): AsyncImageLoadOptions { + return AsyncImageLoadOptions(priority, forceRefresh, cacheKey, continueInBackground, allowInvalidSSLCertificates, scaleDownLargeImages, queryMemoryDataSync, queryDiskDataSync, decodeImage, allowHardware, progressive) } } } diff --git a/packages/react-native-nitro-web-image/nitrogen/generated/ios/swift/AsyncImageLoadOptions.swift b/packages/react-native-nitro-web-image/nitrogen/generated/ios/swift/AsyncImageLoadOptions.swift index 49d211b..9982e36 100644 --- a/packages/react-native-nitro-web-image/nitrogen/generated/ios/swift/AsyncImageLoadOptions.swift +++ b/packages/react-native-nitro-web-image/nitrogen/generated/ios/swift/AsyncImageLoadOptions.swift @@ -18,7 +18,7 @@ public extension AsyncImageLoadOptions { /** * Create a new instance of `AsyncImageLoadOptions`. */ - init(priority: AsyncImagePriority?, forceRefresh: Bool?, cacheKey: String?, continueInBackground: Bool?, allowInvalidSSLCertificates: Bool?, scaleDownLargeImages: Bool?, queryMemoryDataSync: Bool?, queryDiskDataSync: Bool?, decodeImage: Bool?, allowHardware: Bool?) { + init(priority: AsyncImagePriority?, forceRefresh: Bool?, cacheKey: String?, continueInBackground: Bool?, allowInvalidSSLCertificates: Bool?, scaleDownLargeImages: Bool?, queryMemoryDataSync: Bool?, queryDiskDataSync: Bool?, decodeImage: Bool?, allowHardware: Bool?, progressive: Bool?) { self.init({ () -> bridge.std__optional_AsyncImagePriority_ in if let __unwrappedValue = priority { return bridge.create_std__optional_AsyncImagePriority_(__unwrappedValue) @@ -79,6 +79,12 @@ public extension AsyncImageLoadOptions { } else { return .init() } + }(), { () -> bridge.std__optional_bool_ in + if let __unwrappedValue = progressive { + return bridge.create_std__optional_bool_(__unwrappedValue) + } else { + return .init() + } }()) } @@ -194,4 +200,16 @@ public extension AsyncImageLoadOptions { } }() } + + @inline(__always) + var progressive: Bool? { + return { () -> Bool? in + if bridge.has_value_std__optional_bool_(self.__progressive) { + let __unwrapped = bridge.get_std__optional_bool_(self.__progressive) + return __unwrapped + } else { + return nil + } + }() + } } diff --git a/packages/react-native-nitro-web-image/nitrogen/generated/shared/c++/AsyncImageLoadOptions.hpp b/packages/react-native-nitro-web-image/nitrogen/generated/shared/c++/AsyncImageLoadOptions.hpp index 96d7f63..bb55bfd 100644 --- a/packages/react-native-nitro-web-image/nitrogen/generated/shared/c++/AsyncImageLoadOptions.hpp +++ b/packages/react-native-nitro-web-image/nitrogen/generated/shared/c++/AsyncImageLoadOptions.hpp @@ -52,10 +52,11 @@ namespace margelo::nitro::web::image { std::optional queryDiskDataSync SWIFT_PRIVATE; std::optional decodeImage SWIFT_PRIVATE; std::optional allowHardware SWIFT_PRIVATE; + std::optional progressive SWIFT_PRIVATE; public: AsyncImageLoadOptions() = default; - explicit AsyncImageLoadOptions(std::optional priority, std::optional forceRefresh, std::optional cacheKey, std::optional continueInBackground, std::optional allowInvalidSSLCertificates, std::optional scaleDownLargeImages, std::optional queryMemoryDataSync, std::optional queryDiskDataSync, std::optional decodeImage, std::optional allowHardware): priority(priority), forceRefresh(forceRefresh), cacheKey(cacheKey), continueInBackground(continueInBackground), allowInvalidSSLCertificates(allowInvalidSSLCertificates), scaleDownLargeImages(scaleDownLargeImages), queryMemoryDataSync(queryMemoryDataSync), queryDiskDataSync(queryDiskDataSync), decodeImage(decodeImage), allowHardware(allowHardware) {} + explicit AsyncImageLoadOptions(std::optional priority, std::optional forceRefresh, std::optional cacheKey, std::optional continueInBackground, std::optional allowInvalidSSLCertificates, std::optional scaleDownLargeImages, std::optional queryMemoryDataSync, std::optional queryDiskDataSync, std::optional decodeImage, std::optional allowHardware, std::optional progressive): priority(priority), forceRefresh(forceRefresh), cacheKey(cacheKey), continueInBackground(continueInBackground), allowInvalidSSLCertificates(allowInvalidSSLCertificates), scaleDownLargeImages(scaleDownLargeImages), queryMemoryDataSync(queryMemoryDataSync), queryDiskDataSync(queryDiskDataSync), decodeImage(decodeImage), allowHardware(allowHardware), progressive(progressive) {} public: friend bool operator==(const AsyncImageLoadOptions& lhs, const AsyncImageLoadOptions& rhs) = default; @@ -80,7 +81,8 @@ namespace margelo::nitro { JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "queryMemoryDataSync"))), JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "queryDiskDataSync"))), JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "decodeImage"))), - JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "allowHardware"))) + JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "allowHardware"))), + JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "progressive"))) ); } static inline jsi::Value toJSI(jsi::Runtime& runtime, const margelo::nitro::web::image::AsyncImageLoadOptions& arg) { @@ -95,6 +97,7 @@ namespace margelo::nitro { obj.setProperty(runtime, PropNameIDCache::get(runtime, "queryDiskDataSync"), JSIConverter>::toJSI(runtime, arg.queryDiskDataSync)); obj.setProperty(runtime, PropNameIDCache::get(runtime, "decodeImage"), JSIConverter>::toJSI(runtime, arg.decodeImage)); obj.setProperty(runtime, PropNameIDCache::get(runtime, "allowHardware"), JSIConverter>::toJSI(runtime, arg.allowHardware)); + obj.setProperty(runtime, PropNameIDCache::get(runtime, "progressive"), JSIConverter>::toJSI(runtime, arg.progressive)); return obj; } static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { @@ -115,6 +118,7 @@ namespace margelo::nitro { if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "queryDiskDataSync")))) return false; if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "decodeImage")))) return false; if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "allowHardware")))) return false; + if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "progressive")))) return false; return true; } }; diff --git a/packages/react-native-nitro-web-image/src/specs/WebImageFactory.nitro.ts b/packages/react-native-nitro-web-image/src/specs/WebImageFactory.nitro.ts index 4254b01..7f3bd8d 100644 --- a/packages/react-native-nitro-web-image/src/specs/WebImageFactory.nitro.ts +++ b/packages/react-native-nitro-web-image/src/specs/WebImageFactory.nitro.ts @@ -71,6 +71,17 @@ export interface AsyncImageLoadOptions { * @default true */ allowHardware?: boolean + + /** + * By default, images are decoded and displayed once the entire + * image data has been fetched. + * + * To progressively display an image as it loads (web-style), + * enable {@linkcode progressive}. + * @platform iOS + * @default false + */ + progressive?: boolean } export interface WebImageFactory