dynamsoft-capture-vision-react-native 3.0.5201 → 3.2.5000

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/README.md +5 -2
  2. package/android/build.gradle +4 -6
  3. package/android/gradle.properties +3 -3
  4. package/android/src/main/cpp/JsiCore.cpp +1 -1
  5. package/android/src/main/cpp/JsiDbr.cpp +208 -23
  6. package/android/src/main/cpp/JsiDcp.cpp +1 -1
  7. package/android/src/main/cpp/JsiDlr.cpp +10 -1
  8. package/android/src/main/cpp/JsiUtility.cpp +470 -62
  9. package/android/src/main/cpp/JsiUtility.h +13 -3
  10. package/android/src/main/dysJniLibs/debug/arm64-v8a/librn_dys.so +0 -0
  11. package/android/src/main/dysJniLibs/debug/armeabi-v7a/librn_dys.so +0 -0
  12. package/android/src/main/dysJniLibs/debug/x86/librn_dys.so +0 -0
  13. package/android/src/main/dysJniLibs/debug/x86_64/librn_dys.so +0 -0
  14. package/android/src/main/dysJniLibs/release/arm64-v8a/librn_dys.so +0 -0
  15. package/android/src/main/dysJniLibs/release/armeabi-v7a/librn_dys.so +0 -0
  16. package/android/src/main/dysJniLibs/release/x86/librn_dys.so +0 -0
  17. package/android/src/main/dysJniLibs/release/x86_64/librn_dys.so +0 -0
  18. package/android/src/main/dysJniLibsFor81/debug/arm64-v8a/librn_dys.so +0 -0
  19. package/android/src/main/dysJniLibsFor81/debug/armeabi-v7a/librn_dys.so +0 -0
  20. package/android/src/main/dysJniLibsFor81/debug/x86/librn_dys.so +0 -0
  21. package/android/src/main/dysJniLibsFor81/debug/x86_64/librn_dys.so +0 -0
  22. package/android/src/main/dysJniLibsFor81/release/arm64-v8a/librn_dys.so +0 -0
  23. package/android/src/main/dysJniLibsFor81/release/armeabi-v7a/librn_dys.so +0 -0
  24. package/android/src/main/dysJniLibsFor81/release/x86/librn_dys.so +0 -0
  25. package/android/src/main/dysJniLibsFor81/release/x86_64/librn_dys.so +0 -0
  26. package/android/src/main/dysJniLibsFor82/debug/arm64-v8a/librn_dys.so +0 -0
  27. package/android/src/main/dysJniLibsFor82/debug/armeabi-v7a/librn_dys.so +0 -0
  28. package/android/src/main/dysJniLibsFor82/debug/x86/librn_dys.so +0 -0
  29. package/android/src/main/dysJniLibsFor82/debug/x86_64/librn_dys.so +0 -0
  30. package/android/src/main/dysJniLibsFor82/release/arm64-v8a/librn_dys.so +0 -0
  31. package/android/src/main/dysJniLibsFor82/release/armeabi-v7a/librn_dys.so +0 -0
  32. package/android/src/main/dysJniLibsFor82/release/x86/librn_dys.so +0 -0
  33. package/android/src/main/dysJniLibsFor82/release/x86_64/librn_dys.so +0 -0
  34. package/android/src/main/java/com/dynamsoft/reactnativelib/CVRModule.kt +17 -2
  35. package/android/src/main/java/com/dynamsoft/reactnativelib/CameraViewManager.kt +13 -1
  36. package/android/src/main/java/com/dynamsoft/reactnativelib/ImageEditorViewManager.kt +1 -1
  37. package/android/src/main/java/com/dynamsoft/reactnativelib/{utils → basicutils}/Basic.kt +1 -1
  38. package/android/src/main/java/com/dynamsoft/reactnativelib/{utils → basicutils}/ForCore.kt +1 -2
  39. package/android/src/main/java/com/dynamsoft/reactnativelib/{utils → basicutils}/ForCvr.kt +1 -5
  40. package/android/src/main/java/com/dynamsoft/reactnativelib/{utils → basicutils}/ForDBR.kt +74 -3
  41. package/android/src/main/java/com/dynamsoft/reactnativelib/{utils → basicutils}/ForDCE.kt +33 -13
  42. package/android/src/main/java/com/dynamsoft/reactnativelib/{utils → basicutils}/ForDCP.kt +1 -1
  43. package/android/src/main/java/com/dynamsoft/reactnativelib/{utils → basicutils}/ForDDN.kt +1 -3
  44. package/android/src/main/java/com/dynamsoft/reactnativelib/{utils → basicutils}/ForDLR.kt +6 -3
  45. package/android/src/main/java/com/dynamsoft/reactnativelib/{utils → basicutils}/ImageUtil.kt +2 -2
  46. package/android/src/main/java/com/dynamsoft/reactnativelib/cvr/CaptureVisionRouterModuleImpl.kt +25 -5
  47. package/android/src/main/java/com/dynamsoft/reactnativelib/dce/CameraEnhancerModuleImpl.kt +6 -3
  48. package/android/src/main/java/com/dynamsoft/reactnativelib/dce/CameraViewManagerImpl.kt +15 -3
  49. package/android/src/main/java/com/dynamsoft/reactnativelib/dce/ImageEditorViewManagerImpl.kt +1 -5
  50. package/android/src/main/java/com/dynamsoft/reactnativelib/dce/ImageEditorViewModuleImpl.kt +2 -4
  51. package/android/src/main/java/com/dynamsoft/reactnativelib/dce/RNCameraView.kt +1 -2
  52. package/android/src/main/java/com/dynamsoft/reactnativelib/utility/ImageManagerModuleImpl.kt +75 -3
  53. package/android/src/main/java/com/dynamsoft/reactnativelib/utility/MultiCrossFilterModuleImpl.kt +2 -2
  54. package/dynamsoft-capture-vision-react-native.podspec +1 -1
  55. package/ios/CPP/ImageDataHostObject.cpp +1 -1
  56. package/ios/CPP/ImageDataHostObject.hpp +1 -1
  57. package/ios/CPP/RNDynamsoft+JSI.h +3 -0
  58. package/ios/CPP/RNDynamsoft+JSI.mm +119 -2
  59. package/ios/CPP/RNDynamsoft+Json.m +114 -14
  60. package/ios/CPP/YeetJSIUtils.h +2 -0
  61. package/ios/CPP/YeetJSIUtils.mm +15 -0
  62. package/ios/RNDynamsoftCameraView.h +4 -0
  63. package/ios/RNDynamsoftCameraView.m +25 -0
  64. package/ios/RNDynamsoftCameraViewManager.m +8 -2
  65. package/ios/RNDynamsoftCaptureVisionRouter.mm +149 -92
  66. package/ios/RNDynamsoftImageEditorViewManager.mm +71 -40
  67. package/ios/RNDynamsoftImageManager.mm +295 -81
  68. package/ios/RNDynamsoftImageSourceAdapter.mm +100 -65
  69. package/package.json +1 -1
  70. package/src/core/EnumGrayscaleEnhancementMode.tsx +1 -0
  71. package/src/core/EnumGrayscaleTransformationMode.tsx +1 -0
  72. package/src/core/EnumImageFileFormat.tsx +6 -0
  73. package/src/core/index.tsx +1 -0
  74. package/src/cvr/CaptureVisionRouter.tsx +33 -5
  75. package/src/dbr/BarcodeDetails.tsx +51 -0
  76. package/src/dbr/BarcodeResultItem.tsx +11 -0
  77. package/src/dbr/EnumBarcodeFormat.tsx +2 -0
  78. package/src/dbr/EnumDeblurMode.tsx +1 -0
  79. package/src/dbr/EnumLocalizationMode.tsx +1 -0
  80. package/src/dbr/EnumQRCodeErrorCorrectionLevel.tsx +6 -0
  81. package/src/dbr/index.tsx +2 -0
  82. package/src/dce/CameraEnhancer.tsx +14 -6
  83. package/src/dce/CameraView.tsx +10 -2
  84. package/src/dce/DynamsoftCameraViewNativeComponent.ts +25 -0
  85. package/src/dce/EnumCameraPosition.tsx +13 -1
  86. package/src/dce/EnumEnhancedFeatures.tsx +3 -4
  87. package/src/dce/ImageEditorView.tsx +1 -1
  88. package/src/dlr/CharacterResult.tsx +4 -1
  89. package/src/dlr/SimplifiedLabelRecognizerSettings.tsx +2 -0
  90. package/src/dlr/TextLineResultItem.tsx +5 -0
  91. package/src/utility/EnumFilterType.tsx +5 -0
  92. package/src/utility/ImageManager.tsx +227 -9
  93. package/src/utility/index.tsx +1 -0
@@ -40,7 +40,8 @@ using namespace std;
40
40
 
41
41
  RCT_EXPORT_MODULE(DynamsoftImageManagerModule)
42
42
 
43
- #pragma mark - Global
43
+ #pragma mark - Global JSI
44
+ // --- RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(install) ---
44
45
  RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(install)
45
46
  {
46
47
  RCTBridge* bridge = [RCTBridge currentBridge];
@@ -57,93 +58,306 @@ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(install)
57
58
  return @true;
58
59
  }
59
60
 
61
+ // --- Helper Functions and Lambdas ---
62
+ static void installHostFunction(
63
+ jsi::Runtime &jsiRuntime,
64
+ const char* name,
65
+ size_t argCount,
66
+ HostFunctionType hostFunction) {
67
+
68
+ auto func = Function::createFromHostFunction(
69
+ jsiRuntime,
70
+ PropNameID::forAscii(jsiRuntime, name),
71
+ argCount,
72
+ std::move(hostFunction)
73
+ );
74
+ jsiRuntime.global().setProperty(jsiRuntime, name, std::move(func));
75
+ }
76
+
77
+ // --- JSI Installation Logic ---
60
78
  static void install(jsi::Runtime &jsiRuntime, RNDynamsoftImageManager *rnManager) {
61
- const char* saveToFileName = "imageManager_saveToFile";
62
- auto saveToFileFunc = Function::createFromHostFunction(jsiRuntime,
63
- PropNameID::forAscii(jsiRuntime,
64
- saveToFileName),
65
- 3,
66
- [rnManager](Runtime &runtime,
67
- const Value& /*thisValue*/,
68
- const Value* arguments,
69
- size_t count) -> Value {
70
- Object obj = arguments[0].getObject(runtime);
71
- if (obj.isHostObject<ImageDataHostObject>(runtime)) {
72
- ImageDataHostObject hostObject = ImageDataHostObject::getHOFromObject(runtime, std::move(obj));
73
- DSImageData *data = [DSImageData imageDataFromHostObject:hostObject];
74
- NSString *path = convertJSIStringToNSString(runtime, arguments[1].getString(runtime));
75
- bool overWrite = arguments[2].getBool();
76
- NSError *error;
77
- BOOL isSuccess = [rnManager.manager saveToFile:data path:path overWrite:overWrite error:&error];
78
- if (isSuccess && !error) {
79
- return Value(true);
80
- }
79
+ using namespace jsi;
80
+
81
+ // 1. Helper Lambda: Extract ImageDataHostObject from JSI Value
82
+ auto getHostImageData = [&](Runtime &runtime, const Value &value) -> std::optional<ImageDataHostObject> {
83
+ // Optimization: isObject() check does not require runtime
84
+ if (!value.isObject()) return std::nullopt;
85
+ auto obj = value.getObject(runtime);
86
+ // isHostObject<> requires runtime
87
+ if (!obj.isHostObject<ImageDataHostObject>(runtime)) return std::nullopt;
88
+ return ImageDataHostObject::getHOFromObject(runtime, obj);
89
+ };
90
+
91
+ // 2. Helper Lambda: Create JSI Host Object from DSImageData and return
92
+ auto createJsiHostObject = [&](Runtime &runtime, DSImageData *imageData) -> Value {
93
+ if (!imageData) return Value::null();
94
+ auto host = [imageData hostObject];
95
+ return Object::createFromHostObject(runtime, std::make_shared<ImageDataHostObject>(host));
96
+ };
97
+
98
+ // imageIO_readFromFile(path)
99
+ installHostFunction(jsiRuntime, "imageIO_readFromFile", 1,
100
+ [rnManager, createJsiHostObject](Runtime &runtime, const Value &, const Value *args, size_t count) -> Value {
101
+ // Check count and type (isString() does not need runtime)
102
+ if (count < 1 || !args[0].isString()) return Value::null();
103
+
104
+ NSString *path = convertJSIStringToNSString(runtime, args[0].getString(runtime));
105
+ NSError *error = nil;
106
+ DSImageData *imageData = [rnManager.manager readFromFile:path error:&error];
107
+
108
+ return createJsiHostObject(runtime, imageData);
81
109
  }
82
- return Value(false);
83
- });
84
- jsiRuntime.global().setProperty(jsiRuntime, saveToFileName, std::move(saveToFileFunc));
110
+ );
111
+
112
+ // imageIO_saveToFile(imageData, path, overwrite)
113
+ installHostFunction(jsiRuntime, "imageIO_saveToFile", 3,
114
+ [rnManager, getHostImageData](Runtime &runtime, const Value &, const Value *args, size_t count) -> Value {
115
+ // Check count, data object (isObject() does not need runtime) and path (isString() does not need runtime)
116
+ if (count < 3 || !args[1].isString() || !args[2].isBool()) return Value(false);
117
+
118
+ auto hostOpt = getHostImageData(runtime, args[0]);
119
+ if (!hostOpt) return Value(false);
120
+
121
+ DSImageData *data = [DSImageData imageDataFromHostObject:*hostOpt];
122
+ NSString *path = convertJSIStringToNSString(runtime, args[1].getString(runtime));
123
+ bool overwrite = args[2].getBool();
124
+
125
+ NSError *error = nil;
126
+ BOOL success = [rnManager.manager saveToFile:data path:path overWrite:overwrite error:&error];
127
+ return Value(success && !error);
128
+ }
129
+ );
85
130
 
86
- const char* drawOnImageName = "imageManager_drawOnImage";
87
- auto drawOnImageFunc = Function::createFromHostFunction(jsiRuntime,
88
- PropNameID::forAscii(jsiRuntime,
89
- drawOnImageName),
90
- 4,
91
- [rnManager](Runtime &runtime,
92
- const Value& /*thisValue*/,
93
- const Value* arguments,
94
- size_t count) -> Value {
95
- Object obj = arguments[0].getObject(runtime);
96
- if (obj.isHostObject<ImageDataHostObject>(runtime)) {
97
- ImageDataHostObject hostObject = ImageDataHostObject::getHOFromObject(runtime, std::move(obj));
98
- DSImageData *data = [DSImageData imageDataFromHostObject:hostObject];
99
- Array array = arguments[1].getObject(runtime).getArray(runtime);
100
- size_t size = array.size(runtime);
101
- NSMutableArray<DSQuadrilateral *> *mutableArray = [NSMutableArray array];
102
- for (size_t i = 0; i < size; i++) {
103
- if (array.getValueAtIndex(runtime, i).isObject()) {
104
- DSQuadrilateral *quad = convertJSIValueToDSQuadrilateral(runtime, array.getValueAtIndex(runtime, i).getObject(runtime));
105
- [mutableArray addObject:quad];
131
+ // imageIO_readFromMemory(arrayBuffer)
132
+ installHostFunction(jsiRuntime, "imageIO_readFromMemory", 1,
133
+ [rnManager, createJsiHostObject](Runtime &runtime, const Value &, const Value *args, size_t count) -> Value {
134
+ // Check count and type (isObject() does not need runtime)
135
+ if (count < 1 || !args[0].isObject()) return Value::null();
136
+
137
+ jsi::Object jsObj = args[0].getObject(runtime);
138
+ // isArrayBuffer() requires runtime
139
+ if (!jsObj.isArrayBuffer(runtime)) return Value::null();
140
+
141
+ jsi::ArrayBuffer buffer = jsObj.getArrayBuffer(runtime);
142
+ NSData *data = convertArrayBufferToNSData(runtime, buffer);
143
+ if (!data || data.length == 0) return Value::null();
144
+
145
+ NSError *error = nil;
146
+ DSImageData *imageData = [rnManager.manager readFromMemory:data error:&error];
147
+
148
+ return createJsiHostObject(runtime, imageData);
149
+ }
150
+ );
151
+
152
+ // imageIO_saveToMemory(imageData, format)
153
+ installHostFunction(jsiRuntime, "imageIO_saveToMemory", 2,
154
+ [rnManager, getHostImageData](Runtime &runtime, const Value &, const Value *args, size_t count) -> Value {
155
+ // Check count and format type (isNumber() does not need runtime)
156
+ if (count < 2 || !args[1].isNumber()) return Value::null();
157
+
158
+ auto hostOpt = getHostImageData(runtime, args[0]);
159
+ if (!hostOpt) return Value::null();
160
+
161
+ DSImageData *imageData = [DSImageData imageDataFromHostObject:*hostOpt];
162
+ NSInteger format = args[1].asNumber(); // Enum is passed as number
163
+ NSError *error = nil;
164
+
165
+ NSData *data = [rnManager.manager saveToMemory:imageData imageFormat:(DSImageFileFormat)format error:&error];
166
+ if (!data || error) return Value::null();
167
+
168
+ // Note: converNSDataToArrayBuffer is assumed to be defined elsewhere and is correct
169
+ return Value(converNSDataToArrayBuffer(runtime, data));
170
+ }
171
+ );
172
+
173
+ // Helper lambda for simple image processing functions (2 arguments: data, value)
174
+ auto processImageTwoArg =
175
+ [rnManager, getHostImageData, createJsiHostObject](
176
+ Runtime &runtime,
177
+ const Value *args,
178
+ size_t count,
179
+ std::function<DSImageData*(DSImageData*, NSInteger)> processorBlock
180
+ ) -> Value {
181
+ if (count < 2 || !args[1].isNumber()) return Value::null();
182
+ auto hostOpt = getHostImageData(runtime, args[0]);
183
+ if (!hostOpt) return Value::null();
184
+
185
+ NSInteger arg2 = args[1].asNumber();
186
+ DSImageData *data = [DSImageData imageDataFromHostObject:*hostOpt];
187
+ DSImageData *outData = processorBlock(data, arg2);
188
+
189
+ return createJsiHostObject(runtime, outData);
190
+ };
191
+
192
+ // imageProcessor_adjustBrightness(imageData, brightness)
193
+ installHostFunction(jsiRuntime, "imageProcessor_adjustBrightness", 2,
194
+ [rnManager, processImageTwoArg](Runtime &runtime, const Value &, const Value *args, size_t count) -> Value {
195
+ return processImageTwoArg(runtime, args, count,
196
+ [rnManager](DSImageData* data, NSInteger brightness) {
197
+ return [rnManager.processor adjust:data brightness:brightness];
106
198
  }
107
- }
108
- NSInteger hexColor = arguments[2].getNumber();
109
- int thickness = arguments[3].getNumber();
110
- UIColor *color = [UIColor colorWithRed:((hexColor >> 16) & 0xFF) / 255.0
111
- green:((hexColor >> 8) & 0xFF) / 255.0
112
- blue:(hexColor & 0xFF) / 255.0
113
- alpha:((hexColor >> 24) & 0xFF) / 255.0];
114
- DSImageData *imageData = [rnManager.drawer drawOnImage:data quads:[mutableArray copy] colour:color thickness:thickness];
115
- ImageDataHostObject outImageData = [imageData hostObject];
116
- Object outObj = Object::createFromHostObject(runtime, std::make_shared<ImageDataHostObject>(outImageData));
117
- return outObj;
199
+ );
200
+ }
201
+ );
202
+
203
+ // imageProcessor_adjustContrast(imageData, contrast)
204
+ installHostFunction(jsiRuntime, "imageProcessor_adjustContrast", 2,
205
+ [rnManager, processImageTwoArg](Runtime &runtime, const Value &, const Value *args, size_t count) -> Value {
206
+ return processImageTwoArg(runtime, args, count,
207
+ [rnManager](DSImageData* data, NSInteger contrast) {
208
+ return [rnManager.processor adjust:data contrast:contrast];
209
+ }
210
+ );
118
211
  }
119
- return Value(false);
120
- });
121
- jsiRuntime.global().setProperty(jsiRuntime, drawOnImageName, std::move(drawOnImageFunc));
212
+ );
213
+
214
+ // imageProcessor_filterImage(imageData, filterType)
215
+ installHostFunction(jsiRuntime, "imageProcessor_filterImage", 2,
216
+ [rnManager, processImageTwoArg](Runtime &runtime, const Value &, const Value *args, size_t count) -> Value {
217
+ return processImageTwoArg(runtime, args, count,
218
+ [rnManager](DSImageData* data, NSInteger filterType) {
219
+ return [rnManager.processor filterImage:data filterType:(DSFilterType)filterType];
220
+ }
221
+ );
222
+ }
223
+ );
224
+
225
+ // imageProcessor_cropImage(imageData, rect)
226
+ installHostFunction(jsiRuntime, "imageProcessor_cropImage", 2,
227
+ [rnManager, getHostImageData, createJsiHostObject](Runtime &runtime, const Value &, const Value *args, size_t count) -> Value {
228
+ // Check count and rect object (isObject() does not need runtime)
229
+ if (count < 2 || !args[1].isObject()) return Value::null();
230
+ auto hostOpt = getHostImageData(runtime, args[0]);
231
+ if (!hostOpt) return Value::null();
232
+
233
+ DSImageData *data = [DSImageData imageDataFromHostObject:*hostOpt];
234
+ DSRect *rect = convertJSIValueToDSRect(runtime, args[1].getObject(runtime));
235
+
236
+ NSError *error = nil;
237
+ DSImageData *outData = [rnManager.processor cropImage:data rect:rect error:&error];
238
+
239
+ return createJsiHostObject(runtime, outData);
240
+ }
241
+ );
242
+
243
+ // imageProcessor_cropAndDeskewImage(data, quad, dstWidth, dstHeight, padding)
244
+ installHostFunction(jsiRuntime, "imageProcessor_cropAndDeskewImage", 5,
245
+ [rnManager, getHostImageData, createJsiHostObject](Runtime &runtime, const Value &, const Value *args, size_t count) -> Value {
246
+ // Check count, quad object, and number types (isObject()/isNumber() do not need runtime)
247
+ if (count < 5 || !args[1].isObject() || !args[2].isNumber() || !args[3].isNumber() || !args[4].isNumber()) return Value::null();
248
+ auto hostOpt = getHostImageData(runtime, args[0]);
249
+ if (!hostOpt) return Value::null();
250
+
251
+ DSImageData *data = [DSImageData imageDataFromHostObject:*hostOpt];
252
+ DSQuadrilateral *quad = convertJSIValueToDSQuadrilateral(runtime, args[1].getObject(runtime));
253
+ NSInteger dstWidth = args[2].asNumber();
254
+ NSInteger dstHeight = args[3].asNumber();
255
+ NSInteger padding = args[4].asNumber();
256
+
257
+ NSError *error = nil;
258
+ DSImageData *outData = [rnManager.processor cropAndDeskewImage:data quad:quad dstWidth:dstWidth dstHeight:dstHeight padding:padding error:&error];
259
+
260
+ return createJsiHostObject(runtime, outData);
261
+ }
262
+ );
122
263
 
123
- const char* cropImageName = "imageManager_cropImage";
124
- auto cropImageFunc = Function::createFromHostFunction(jsiRuntime,
125
- PropNameID::forAscii(jsiRuntime,
126
- cropImageName),
127
- 2,
128
- [rnManager](Runtime &runtime,
129
- const Value& /*thisValue*/,
130
- const Value* arguments,
131
- size_t count) -> Value {
132
- Object obj = arguments[0].getObject(runtime);
133
- if (obj.isHostObject<ImageDataHostObject>(runtime)) {
134
- ImageDataHostObject hostObject = ImageDataHostObject::getHOFromObject(runtime, std::move(obj));
135
- DSImageData *data = [DSImageData imageDataFromHostObject:hostObject];
136
- Object obj = arguments[1].getObject(runtime);
137
- DSQuadrilateral *quad = convertJSIValueToDSQuadrilateral(runtime, obj);
138
- NSError *error;
139
- DSImageData *imageData = [rnManager.processor cropAndDeskewImage:data quad:quad error:&error];
140
- ImageDataHostObject outImageData = [imageData hostObject];
141
- Object outObj = Object::createFromHostObject(runtime, std::make_shared<ImageDataHostObject>(outImageData));
142
- return outObj;
264
+ // imageProcessor_convertToGray(imageData, r, g, b)
265
+ installHostFunction(jsiRuntime, "imageProcessor_convertToGray", 4,
266
+ [rnManager, getHostImageData, createJsiHostObject](Runtime &runtime, const Value &, const Value *args, size_t count) -> Value {
267
+ // Check count and float types
268
+ if (count < 4 || !args[1].isNumber() || !args[2].isNumber() || !args[3].isNumber()) return Value::null();
269
+ auto hostOpt = getHostImageData(runtime, args[0]);
270
+ if (!hostOpt) return Value::null();
271
+
272
+ CGFloat r = args[1].asNumber();
273
+ CGFloat g = args[2].asNumber();
274
+ CGFloat b = args[3].asNumber();
275
+
276
+ DSImageData *data = [DSImageData imageDataFromHostObject:*hostOpt];
277
+ DSImageData *outData = [rnManager.processor convertToGray:data r:r g:g b:b];
278
+
279
+ return createJsiHostObject(runtime, outData);
280
+ }
281
+ );
282
+
283
+ // imageProcessor_convertToBinaryGlobal(imageData, threshold, invert)
284
+ installHostFunction(jsiRuntime, "imageProcessor_convertToBinaryGlobal", 3,
285
+ [rnManager, getHostImageData, createJsiHostObject](Runtime &runtime, const Value &, const Value *args, size_t count) -> Value {
286
+ // Check count, number, and bool types
287
+ if (count < 3 || !args[1].isNumber() || !args[2].isBool()) return Value::null();
288
+ auto hostOpt = getHostImageData(runtime, args[0]);
289
+ if (!hostOpt) return Value::null();
290
+
291
+ NSInteger threshold = args[1].asNumber();
292
+ BOOL invert = args[2].getBool();
293
+
294
+ DSImageData *data = [DSImageData imageDataFromHostObject:*hostOpt];
295
+ DSImageData *outData = [rnManager.processor convertToBinaryGlobal:data threshold:threshold invert:invert];
296
+
297
+ return createJsiHostObject(runtime, outData);
298
+ }
299
+ );
300
+
301
+ // imageProcessor_convertToBinaryLocal(imageData, blockSize, compensation, invert)
302
+ installHostFunction(jsiRuntime, "imageProcessor_convertToBinaryLocal", 4,
303
+ [rnManager, getHostImageData, createJsiHostObject](Runtime &runtime, const Value &, const Value *args, size_t count) -> Value {
304
+ // Check count, number, number, and bool types
305
+ if (count < 4 || !args[1].isNumber() || !args[2].isNumber() || !args[3].isBool()) return Value::null();
306
+ auto hostOpt = getHostImageData(runtime, args[0]);
307
+ if (!hostOpt) return Value::null();
308
+
309
+ NSInteger blockSize = args[1].asNumber();
310
+ NSInteger compensation = args[2].asNumber();
311
+ BOOL invert = args[3].getBool();
312
+
313
+ DSImageData *data = [DSImageData imageDataFromHostObject:*hostOpt];
314
+ DSImageData *outData = [rnManager.processor convertToBinaryLocal:data blockSize:blockSize compensation:compensation invert:invert];
315
+
316
+ return createJsiHostObject(runtime, outData);
317
+ }
318
+ );
319
+
320
+ // imageDrawer_drawOnImage(data, quads, hexColor, thickness)
321
+ installHostFunction(jsiRuntime, "imageDrawer_drawOnImage", 4,
322
+ [rnManager, getHostImageData, createJsiHostObject](Runtime &runtime, const Value &, const Value *args, size_t count) -> Value {
323
+ // Check count, quads array object, color number, and thickness number
324
+ if (count < 4 || !args[1].isObject() || !args[2].isNumber() || !args[3].isNumber()) return Value::null();
325
+ auto hostOpt = getHostImageData(runtime, args[0]);
326
+ if (!hostOpt) return Value::null();
327
+
328
+ DSImageData *data = [DSImageData imageDataFromHostObject:*hostOpt];
329
+
330
+ // Validate and extract array
331
+ Object jsArrayObj = args[1].getObject(runtime);
332
+ if (!jsArrayObj.isArray(runtime)) return Value::null();
333
+ Array jsArray = jsArrayObj.getArray(runtime);
334
+ size_t size = jsArray.size(runtime);
335
+
336
+ NSMutableArray<DSQuadrilateral *> *quads = [NSMutableArray arrayWithCapacity:size];
337
+ for (size_t i = 0; i < size; i++) {
338
+ auto val = jsArray.getValueAtIndex(runtime, i);
339
+ // Check if element is an object before conversion
340
+ if (val.isObject()) {
341
+ DSQuadrilateral *quad = convertJSIValueToDSQuadrilateral(runtime, val.getObject(runtime));
342
+ [quads addObject:quad];
343
+ }
344
+ }
345
+
346
+ // Extract colour and thickness
347
+ NSInteger hex = args[2].asNumber();
348
+ int thickness = args[3].asNumber();
349
+
350
+ // Original logic for color conversion is correct
351
+ UIColor *color = [UIColor colorWithRed:((hex >> 16) & 0xFF) / 255.0
352
+ green:((hex >> 8) & 0xFF) / 255.0
353
+ blue:(hex & 0xFF) / 255.0
354
+ alpha:((hex >> 24) & 0xFF) / 255.0];
355
+
356
+ DSImageData *outData = [rnManager.drawer drawOnImage:data quads:[quads copy] colour:color thickness:thickness];
357
+
358
+ return createJsiHostObject(runtime, outData);
143
359
  }
144
- return Value(false);
145
- });
146
- jsiRuntime.global().setProperty(jsiRuntime, cropImageName, std::move(cropImageFunc));
360
+ );
147
361
  }
148
362
 
149
363
  @end
@@ -114,7 +114,24 @@ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(hasImage:(NSString *)key imageId:(NSInteg
114
114
  return @([[self.isaDictionary valueForKey:key] hasImage:imageId]);
115
115
  }
116
116
 
117
- #pragma mark - Global
117
+ #pragma mark - Private
118
+ - (NSMutableDictionary<NSString *,DSImageSourceAdapter *> *)isaDictionary {
119
+ if (!_isaDictionary) {
120
+ _isaDictionary = [[NSMutableDictionary alloc] init];
121
+ }
122
+ return _isaDictionary;
123
+ }
124
+
125
+ - (void)addImage:(DSImageData *)data toISA:(NSString *)key {
126
+ [[self.isaDictionary valueForKey:key] addImageToBuffer:data];
127
+ }
128
+
129
+ - (DSImageData *)imageDataFromISA:(NSString *)key {
130
+ return [[self.isaDictionary valueForKey:key] getImage];
131
+ }
132
+
133
+ #pragma mark - Global JSI
134
+ // --- RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(install) ---
118
135
  RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(install)
119
136
  {
120
137
  RCTBridge* bridge = [RCTBridge currentBridge];
@@ -131,84 +148,102 @@ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(install)
131
148
  return @true;
132
149
  }
133
150
 
151
+ // --- Helper Functions and Lambdas ---
152
+ static void installHostFunction(
153
+ jsi::Runtime &jsiRuntime,
154
+ const char* name,
155
+ size_t argCount,
156
+ HostFunctionType hostFunction) {
157
+
158
+ auto func = Function::createFromHostFunction(
159
+ jsiRuntime,
160
+ PropNameID::forAscii(jsiRuntime, name),
161
+ argCount,
162
+ std::move(hostFunction)
163
+ );
164
+ jsiRuntime.global().setProperty(jsiRuntime, name, std::move(func));
165
+ }
166
+
167
+ // --- JSI Installation Logic ---
134
168
  static void install(jsi::Runtime &jsiRuntime, RNDynamsoftImageSourceAdapter *rnAdapter) {
135
- const char* getImageDataName = "isaGetImageData";
136
- auto getImageDataFunc = Function::createFromHostFunction(jsiRuntime,
137
- PropNameID::forAscii(jsiRuntime,
138
- getImageDataName),
139
- 1,
140
- [rnAdapter](Runtime &runtime,
141
- const Value &thisValue,
142
- const Value *arguments,
143
- size_t count) -> Value {
144
- NSString *key = convertJSIStringToNSString(runtime, arguments[0].getString(runtime));
145
- ImageDataHostObject hostObject = [[rnAdapter imageDataFromISA:key] hostObject];
146
- Object obj = Object::createFromHostObject(runtime, std::make_shared<ImageDataHostObject>(hostObject));
147
- return obj;
148
- });
149
- jsiRuntime.global().setProperty(jsiRuntime, getImageDataName, std::move(getImageDataFunc));
169
+ using namespace jsi;
170
+
171
+ // Helper Lambda: Extract ImageDataHostObject from JSI Value
172
+ auto getHostImageData = [&](Runtime &runtime, const Value &value) -> std::optional<ImageDataHostObject> {
173
+ // Optimization: isObject() check does not require runtime
174
+ if (!value.isObject()) return std::nullopt;
175
+ auto obj = value.getObject(runtime);
176
+ // isHostObject<> requires runtime
177
+ if (!obj.isHostObject<ImageDataHostObject>(runtime)) return std::nullopt;
178
+ return ImageDataHostObject::getHOFromObject(runtime, obj);
179
+ };
180
+
181
+ // Helper Lambda: Create JSI Host Object from DSImageData and return
182
+ auto createJsiHostObject = [&](Runtime &runtime, DSImageData *imageData) -> Value {
183
+ if (!imageData) return Value::null();
184
+ auto host = [imageData hostObject];
185
+ return Object::createFromHostObject(runtime, std::make_shared<ImageDataHostObject>(host));
186
+ };
150
187
 
151
- const char* addImageToBufferName = "isaAddImageToBuffer";
152
- auto addImageToBufferFunc = Function::createFromHostFunction(jsiRuntime,
153
- PropNameID::forAscii(jsiRuntime,
154
- addImageToBufferName),
155
- 2,
156
- [rnAdapter](Runtime &runtime,
157
- const Value &thisValue,
158
- const Value *arguments,
159
- size_t count) -> Value {
160
- NSString *key = convertJSIStringToNSString(runtime, arguments[0].getString(runtime));
161
- Object obj = arguments[1].getObject(runtime);
162
- if (obj.isHostObject<ImageDataHostObject>(runtime)) {
163
- ImageDataHostObject hostObject = ImageDataHostObject::getHOFromObject(runtime, std::move(obj));
164
- DSImageData *data = [DSImageData imageDataFromHostObject:hostObject];
188
+ // ---------------------- isaGetImageData ----------------------
189
+ // isaGetImageData(key)
190
+ installHostFunction(jsiRuntime, "isaGetImageData", 1,
191
+ [rnAdapter, createJsiHostObject](Runtime &runtime, const Value &, const Value *arguments, size_t count) -> Value {
192
+ // 🔍 Argument Validation: Check count and key type (isString() no runtime)
193
+ if (count != 1 || !arguments[0].isString()) return Value::null();
194
+
195
+ NSString *key = convertJSIStringToNSString(runtime, arguments[0].getString(runtime));
196
+ DSImageData *imageData = [rnAdapter imageDataFromISA:key];
197
+
198
+ return createJsiHostObject(runtime, imageData);
199
+ }
200
+ );
201
+
202
+ // ---------------------- isaAddImageToBuffer ----------------------
203
+ // isaAddImageToBuffer(key, imageData)
204
+ installHostFunction(jsiRuntime, "isaAddImageToBuffer", 2,
205
+ [rnAdapter, getHostImageData](Runtime &runtime, const Value &, const Value *arguments, size_t count) -> Value {
206
+ // 🔍 Argument Validation: Check count and key type (isString() no runtime)
207
+ if (count != 2 || !arguments[0].isString() || !arguments[1].isObject()) return Value(false);
208
+
209
+ auto hostOpt = getHostImageData(runtime, arguments[1]);
210
+ if (!hostOpt) return Value(false);
211
+
212
+ NSString *key = convertJSIStringToNSString(runtime, arguments[0].getString(runtime));
213
+ DSImageData *data = [DSImageData imageDataFromHostObject:*hostOpt];
214
+
165
215
  [rnAdapter addImage:data toISA:key];
166
216
  return Value(true);
167
217
  }
168
- return Value(false);
169
- });
170
- jsiRuntime.global().setProperty(jsiRuntime, addImageToBufferName, std::move(addImageToBufferFunc));
218
+ );
171
219
 
172
- const char* imageDataToBase64Name = "imageDataToBase64";
173
- auto imageDataToBase64Func = Function::createFromHostFunction(jsiRuntime,
174
- PropNameID::forAscii(jsiRuntime,
175
- imageDataToBase64Name),
176
- 1,
177
- [rnAdapter](Runtime &runtime,
178
- const Value &thisValue,
179
- const Value *arguments,
180
- size_t count) -> Value {
181
- Object obj = arguments[0].getObject(runtime);
182
- if (obj.isHostObject<ImageDataHostObject>(runtime)) {
183
- ImageDataHostObject hostObject = ImageDataHostObject::getHOFromObject(runtime, std::move(obj));
184
- DSImageData *imageData = [DSImageData imageDataFromHostObject:hostObject];
220
+ // ---------------------- imageDataToBase64 ----------------------
221
+ // imageDataToBase64(imageData)
222
+ installHostFunction(jsiRuntime, "imageDataToBase64", 1,
223
+ [getHostImageData](Runtime &runtime, const Value &, const Value *arguments, size_t count) -> Value {
224
+ // 🔍 Argument Validation: Check count and image object type (isObject() no runtime)
225
+ if (count != 1 || !arguments[0].isObject()) return Value(false);
226
+
227
+ auto hostOpt = getHostImageData(runtime, arguments[0]);
228
+ if (!hostOpt) return Value(false);
229
+
230
+ DSImageData *imageData = [DSImageData imageDataFromHostObject:*hostOpt];
231
+
185
232
  NSError *error;
233
+ // Native code to convert DSImageData to Base64 (using JPEG representation)
186
234
  UIImage *image = [imageData toUIImage:&error];
187
235
  if (!error && image) {
236
+ // Compression quality set to 1.0 (highest quality)
188
237
  NSData *data = UIImageJPEGRepresentation(image, 1.0);
189
238
  NSString *base64String = [data base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
239
+
240
+ // convertNSStringToJSIString is assumed to be defined elsewhere
190
241
  return convertNSStringToJSIString(runtime, base64String);
191
242
  }
243
+
244
+ return Value(false);
192
245
  }
193
- return Value(false);
194
- });
195
- jsiRuntime.global().setProperty(jsiRuntime, imageDataToBase64Name, std::move(imageDataToBase64Func));
196
- }
197
-
198
- #pragma mark - Private
199
- - (NSMutableDictionary<NSString *,DSImageSourceAdapter *> *)isaDictionary {
200
- if (!_isaDictionary) {
201
- _isaDictionary = [[NSMutableDictionary alloc] init];
202
- }
203
- return _isaDictionary;
204
- }
205
-
206
- - (void)addImage:(DSImageData *)data toISA:(NSString *)key {
207
- [[self.isaDictionary valueForKey:key] addImageToBuffer:data];
208
- }
209
-
210
- - (DSImageData *)imageDataFromISA:(NSString *)key {
211
- return [[self.isaDictionary valueForKey:key] getImage];
246
+ );
212
247
  }
213
248
 
214
249
  @end
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "dynamsoft-capture-vision-react-native",
3
3
  "title": "Dynamsoft Capture Vision React Native",
4
- "version": "3.0.5201",
4
+ "version": "3.2.5000",
5
5
  "description": "The Dynamsoft Capture Vision React Native SDK provides a wrapper for building barcode scanning, document scanning and MRZ scanning applications with React Native.",
6
6
  "homepage": "https://github.com/Dynamsoft/capture-vision-react-native-samples",
7
7
  "main": "src/index.tsx",
@@ -7,6 +7,7 @@ import type {SimplifiedLabelRecognizerSettings} from "../dlr";
7
7
  * @see {@link SimplifiedLabelRecognizerSettings.grayscaleEnhancementModes}
8
8
  */
9
9
  export enum EnumGrayscaleEnhancementMode {
10
+ GEM_END = -1,
10
11
  /**
11
12
  * Disables any grayscale image preprocessing. Selecting this mode skips the preprocessing step,
12
13
  * passing the image through to subsequent operations without modification.
@@ -7,6 +7,7 @@ import type {SimplifiedLabelRecognizerSettings} from "../dlr";
7
7
  * @see {@link SimplifiedLabelRecognizerSettings.grayscaleEnhancementModes}
8
8
  * */
9
9
  export enum EnumGrayscaleTransformationMode {
10
+ GTM_END = -1,
10
11
  /**
11
12
  * Bypasses grayscale transformation, leaving the image in its current state without any modification to its grayscale values.
12
13
  * This mode is selected when no alteration of the grayscale data is desired, passing the image through to subsequent operations without modification.
@@ -0,0 +1,6 @@
1
+ export enum EnumImageFileFormat {
2
+ IFF_JPEG = 0,
3
+ IFF_PNG = 1,
4
+ IFF_BMP = 2,
5
+ IFF_PDF = 3
6
+ }
@@ -13,5 +13,6 @@ export * from "./ImageData"
13
13
  export * from "./ImageSourceAdapter"
14
14
  export * from "./Point"
15
15
  export * from "./Quadrilateral"
16
+ export * from "./EnumImageFileFormat"
16
17
 
17
18