dynamsoft-capture-vision-react-native 3.0.5201 → 3.2.3000
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.
- package/README.md +5 -2
- package/android/build.gradle +4 -6
- package/android/gradle.properties +3 -3
- package/android/src/main/cpp/JsiCore.cpp +1 -1
- package/android/src/main/cpp/JsiDbr.cpp +208 -23
- package/android/src/main/cpp/JsiDcp.cpp +1 -1
- package/android/src/main/cpp/JsiDlr.cpp +10 -1
- package/android/src/main/cpp/JsiUtility.cpp +470 -62
- package/android/src/main/cpp/JsiUtility.h +13 -3
- package/android/src/main/dysJniLibs/debug/arm64-v8a/librn_dys.so +0 -0
- package/android/src/main/dysJniLibs/debug/armeabi-v7a/librn_dys.so +0 -0
- package/android/src/main/dysJniLibs/debug/x86/librn_dys.so +0 -0
- package/android/src/main/dysJniLibs/debug/x86_64/librn_dys.so +0 -0
- package/android/src/main/dysJniLibs/release/arm64-v8a/librn_dys.so +0 -0
- package/android/src/main/dysJniLibs/release/armeabi-v7a/librn_dys.so +0 -0
- package/android/src/main/dysJniLibs/release/x86/librn_dys.so +0 -0
- package/android/src/main/dysJniLibs/release/x86_64/librn_dys.so +0 -0
- package/android/src/main/dysJniLibsFor81/debug/arm64-v8a/librn_dys.so +0 -0
- package/android/src/main/dysJniLibsFor81/debug/armeabi-v7a/librn_dys.so +0 -0
- package/android/src/main/dysJniLibsFor81/debug/x86/librn_dys.so +0 -0
- package/android/src/main/dysJniLibsFor81/debug/x86_64/librn_dys.so +0 -0
- package/android/src/main/dysJniLibsFor81/release/arm64-v8a/librn_dys.so +0 -0
- package/android/src/main/dysJniLibsFor81/release/armeabi-v7a/librn_dys.so +0 -0
- package/android/src/main/dysJniLibsFor81/release/x86/librn_dys.so +0 -0
- package/android/src/main/dysJniLibsFor81/release/x86_64/librn_dys.so +0 -0
- package/android/src/main/dysJniLibsFor82/debug/arm64-v8a/librn_dys.so +0 -0
- package/android/src/main/dysJniLibsFor82/debug/armeabi-v7a/librn_dys.so +0 -0
- package/android/src/main/dysJniLibsFor82/debug/x86/librn_dys.so +0 -0
- package/android/src/main/dysJniLibsFor82/debug/x86_64/librn_dys.so +0 -0
- package/android/src/main/dysJniLibsFor82/release/arm64-v8a/librn_dys.so +0 -0
- package/android/src/main/dysJniLibsFor82/release/armeabi-v7a/librn_dys.so +0 -0
- package/android/src/main/dysJniLibsFor82/release/x86/librn_dys.so +0 -0
- package/android/src/main/dysJniLibsFor82/release/x86_64/librn_dys.so +0 -0
- package/android/src/main/java/com/dynamsoft/reactnativelib/CVRModule.kt +17 -2
- package/android/src/main/java/com/dynamsoft/reactnativelib/CameraViewManager.kt +13 -1
- package/android/src/main/java/com/dynamsoft/reactnativelib/ImageEditorViewManager.kt +1 -1
- package/android/src/main/java/com/dynamsoft/reactnativelib/{utils → basicutils}/Basic.kt +1 -1
- package/android/src/main/java/com/dynamsoft/reactnativelib/{utils → basicutils}/ForCore.kt +1 -2
- package/android/src/main/java/com/dynamsoft/reactnativelib/{utils → basicutils}/ForCvr.kt +1 -5
- package/android/src/main/java/com/dynamsoft/reactnativelib/{utils → basicutils}/ForDBR.kt +74 -3
- package/android/src/main/java/com/dynamsoft/reactnativelib/{utils → basicutils}/ForDCE.kt +33 -13
- package/android/src/main/java/com/dynamsoft/reactnativelib/{utils → basicutils}/ForDCP.kt +1 -1
- package/android/src/main/java/com/dynamsoft/reactnativelib/{utils → basicutils}/ForDDN.kt +1 -3
- package/android/src/main/java/com/dynamsoft/reactnativelib/{utils → basicutils}/ForDLR.kt +6 -3
- package/android/src/main/java/com/dynamsoft/reactnativelib/{utils → basicutils}/ImageUtil.kt +2 -2
- package/android/src/main/java/com/dynamsoft/reactnativelib/cvr/CaptureVisionRouterModuleImpl.kt +25 -5
- package/android/src/main/java/com/dynamsoft/reactnativelib/dce/CameraEnhancerModuleImpl.kt +6 -3
- package/android/src/main/java/com/dynamsoft/reactnativelib/dce/CameraViewManagerImpl.kt +15 -3
- package/android/src/main/java/com/dynamsoft/reactnativelib/dce/ImageEditorViewManagerImpl.kt +1 -5
- package/android/src/main/java/com/dynamsoft/reactnativelib/dce/ImageEditorViewModuleImpl.kt +2 -4
- package/android/src/main/java/com/dynamsoft/reactnativelib/dce/RNCameraView.kt +1 -2
- package/android/src/main/java/com/dynamsoft/reactnativelib/utility/ImageManagerModuleImpl.kt +75 -3
- package/android/src/main/java/com/dynamsoft/reactnativelib/utility/MultiCrossFilterModuleImpl.kt +2 -2
- package/dynamsoft-capture-vision-react-native.podspec +1 -1
- package/ios/CPP/ImageDataHostObject.cpp +1 -1
- package/ios/CPP/ImageDataHostObject.hpp +1 -1
- package/ios/CPP/RNDynamsoft+JSI.h +3 -0
- package/ios/CPP/RNDynamsoft+JSI.mm +119 -2
- package/ios/CPP/RNDynamsoft+Json.m +114 -14
- package/ios/CPP/YeetJSIUtils.h +2 -0
- package/ios/CPP/YeetJSIUtils.mm +15 -0
- package/ios/RNDynamsoftCameraView.h +4 -0
- package/ios/RNDynamsoftCameraView.m +25 -0
- package/ios/RNDynamsoftCameraViewManager.m +8 -2
- package/ios/RNDynamsoftCaptureVisionRouter.mm +149 -92
- package/ios/RNDynamsoftImageEditorViewManager.mm +71 -40
- package/ios/RNDynamsoftImageManager.mm +295 -81
- package/ios/RNDynamsoftImageSourceAdapter.mm +100 -65
- package/package.json +1 -1
- package/src/core/EnumGrayscaleEnhancementMode.tsx +1 -0
- package/src/core/EnumGrayscaleTransformationMode.tsx +1 -0
- package/src/core/EnumImageFileFormat.tsx +6 -0
- package/src/core/index.tsx +1 -0
- package/src/cvr/CaptureVisionRouter.tsx +33 -5
- package/src/dbr/BarcodeDetails.tsx +51 -0
- package/src/dbr/BarcodeResultItem.tsx +11 -0
- package/src/dbr/EnumBarcodeFormat.tsx +2 -0
- package/src/dbr/EnumDeblurMode.tsx +1 -0
- package/src/dbr/EnumLocalizationMode.tsx +1 -0
- package/src/dbr/EnumQRCodeErrorCorrectionLevel.tsx +6 -0
- package/src/dbr/index.tsx +2 -0
- package/src/dce/CameraEnhancer.tsx +14 -6
- package/src/dce/CameraView.tsx +10 -2
- package/src/dce/DynamsoftCameraViewNativeComponent.ts +25 -0
- package/src/dce/EnumCameraPosition.tsx +13 -1
- package/src/dce/EnumEnhancedFeatures.tsx +3 -4
- package/src/dce/ImageEditorView.tsx +1 -1
- package/src/dlr/CharacterResult.tsx +4 -1
- package/src/dlr/SimplifiedLabelRecognizerSettings.tsx +2 -0
- package/src/dlr/TextLineResultItem.tsx +5 -0
- package/src/utility/EnumFilterType.tsx +5 -0
- package/src/utility/ImageManager.tsx +227 -9
- 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
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
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
|
-
|
|
83
|
-
|
|
84
|
-
|
|
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
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
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
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
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
|
-
|
|
120
|
-
|
|
121
|
-
|
|
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
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
DSImageData *data = [DSImageData imageDataFromHostObject
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
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
|
-
|
|
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 -
|
|
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
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
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
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
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
|
-
|
|
169
|
-
});
|
|
170
|
-
jsiRuntime.global().setProperty(jsiRuntime, addImageToBufferName, std::move(addImageToBufferFunc));
|
|
218
|
+
);
|
|
171
219
|
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
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
|
-
|
|
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.
|
|
4
|
+
"version": "3.2.3000",
|
|
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.
|