dynamsoft-capture-vision-react-native 3.4.1200 → 3.4.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/LICENSE +5 -5
- package/README.md +62 -66
- package/android/README.md +14 -14
- package/android/build.gradle +167 -163
- package/android/gradle.properties +20 -20
- package/android/settings.gradle +5 -5
- package/android/src/main/AndroidManifest.xml +6 -6
- package/android/src/main/AndroidManifest_noPackage.xml +5 -5
- package/android/src/main/cpp/CMakeLists.txt +21 -21
- package/android/src/main/cpp/ImgHO.cpp +94 -94
- package/android/src/main/cpp/ImgHO.h +34 -34
- package/android/src/main/cpp/JsiCore.cpp +296 -296
- package/android/src/main/cpp/JsiCore.h +51 -51
- package/android/src/main/cpp/JsiCvr.cpp +332 -332
- package/android/src/main/cpp/JsiCvr.h +54 -54
- package/android/src/main/cpp/JsiDbr.cpp +283 -283
- package/android/src/main/cpp/JsiDbr.h +26 -26
- package/android/src/main/cpp/JsiDce.cpp +59 -59
- package/android/src/main/cpp/JsiDce.h +17 -17
- package/android/src/main/cpp/JsiDcp.cpp +51 -51
- package/android/src/main/cpp/JsiDcp.h +31 -31
- package/android/src/main/cpp/JsiDdn.cpp +50 -50
- package/android/src/main/cpp/JsiDdn.h +28 -28
- package/android/src/main/cpp/JsiDlr.cpp +60 -60
- package/android/src/main/cpp/JsiDlr.h +26 -26
- package/android/src/main/cpp/JsiUtility.cpp +604 -604
- package/android/src/main/cpp/JsiUtility.h +26 -26
- package/android/src/main/cpp/RawBuffer.cpp +23 -23
- package/android/src/main/cpp/RawBuffer.h +24 -24
- package/android/src/main/cpp/android_log.h +14 -14
- 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/dysJniLibsFor86/debug/arm64-v8a/librn_dys.so +3 -0
- package/android/src/main/dysJniLibsFor86/debug/armeabi-v7a/librn_dys.so +3 -0
- package/android/src/main/dysJniLibsFor86/debug/x86/librn_dys.so +3 -0
- package/android/src/main/dysJniLibsFor86/debug/x86_64/librn_dys.so +3 -0
- package/android/src/main/dysJniLibsFor86/release/arm64-v8a/librn_dys.so +3 -0
- package/android/src/main/dysJniLibsFor86/release/armeabi-v7a/librn_dys.so +3 -0
- package/android/src/main/dysJniLibsFor86/release/x86/librn_dys.so +3 -0
- package/android/src/main/dysJniLibsFor86/release/x86_64/librn_dys.so +3 -0
- package/android/src/main/java/com/dynamsoft/reactnativelib/CVRModule.kt +137 -137
- package/android/src/main/java/com/dynamsoft/reactnativelib/CameraViewManager.kt +62 -62
- package/android/src/main/java/com/dynamsoft/reactnativelib/DCEModule.kt +125 -125
- package/android/src/main/java/com/dynamsoft/reactnativelib/DynamsoftBaseModule.kt +8 -8
- package/android/src/main/java/com/dynamsoft/reactnativelib/ISAModule.kt +73 -73
- package/android/src/main/java/com/dynamsoft/reactnativelib/ImageEditorViewManager.kt +14 -14
- package/android/src/main/java/com/dynamsoft/reactnativelib/ImageEditorViewModule.kt +35 -35
- package/android/src/main/java/com/dynamsoft/reactnativelib/ImageManagerModule.kt +15 -15
- package/android/src/main/java/com/dynamsoft/reactnativelib/LicenseModule.kt +29 -29
- package/android/src/main/java/com/dynamsoft/reactnativelib/MultiCrossFilterModule.kt +83 -83
- package/android/src/main/java/com/dynamsoft/reactnativelib/ReactNativeDcvPackage.kt +32 -32
- package/android/src/main/java/com/dynamsoft/reactnativelib/VersionsModule.kt +41 -41
- package/android/src/main/java/com/dynamsoft/reactnativelib/basicutils/Basic.kt +44 -44
- package/android/src/main/java/com/dynamsoft/reactnativelib/basicutils/ForCore.kt +50 -50
- package/android/src/main/java/com/dynamsoft/reactnativelib/basicutils/ForCvr.kt +129 -129
- package/android/src/main/java/com/dynamsoft/reactnativelib/basicutils/ForDBR.kt +157 -157
- package/android/src/main/java/com/dynamsoft/reactnativelib/basicutils/ForDCE.kt +110 -110
- package/android/src/main/java/com/dynamsoft/reactnativelib/basicutils/ForDCP.kt +49 -49
- package/android/src/main/java/com/dynamsoft/reactnativelib/basicutils/ForDDN.kt +85 -85
- package/android/src/main/java/com/dynamsoft/reactnativelib/basicutils/ForDLR.kt +72 -72
- package/android/src/main/java/com/dynamsoft/reactnativelib/basicutils/ImageUtil.kt +58 -58
- package/android/src/main/java/com/dynamsoft/reactnativelib/core/ImageSourceAdapterModuleImpl.kt +120 -120
- package/android/src/main/java/com/dynamsoft/reactnativelib/cvr/CaptureVisionRouterModuleImpl.kt +306 -306
- package/android/src/main/java/com/dynamsoft/reactnativelib/dce/CameraEnhancerModuleImpl.kt +247 -247
- package/android/src/main/java/com/dynamsoft/reactnativelib/dce/CameraLifeCycleOwner.java +14 -14
- package/android/src/main/java/com/dynamsoft/reactnativelib/dce/CameraViewManagerImpl.kt +77 -77
- package/android/src/main/java/com/dynamsoft/reactnativelib/dce/ImageEditorViewManagerImpl.kt +15 -15
- package/android/src/main/java/com/dynamsoft/reactnativelib/dce/ImageEditorViewModuleImpl.kt +110 -110
- package/android/src/main/java/com/dynamsoft/reactnativelib/dce/RNCameraView.kt +20 -20
- package/android/src/main/java/com/dynamsoft/reactnativelib/dce/RNImageEditorView.kt +19 -19
- package/android/src/main/java/com/dynamsoft/reactnativelib/license/LicenseModuleImpl.kt +39 -39
- package/android/src/main/java/com/dynamsoft/reactnativelib/utility/ImageManagerModuleImpl.kt +120 -120
- package/android/src/main/java/com/dynamsoft/reactnativelib/utility/MultiCrossFilterModuleImpl.kt +111 -111
- package/app.plugin.js +21 -21
- package/dynamsoft-capture-vision-react-native.podspec +24 -24
- package/ios/CPP/DSImageData+HostObject.h +18 -18
- package/ios/CPP/DSImageData+HostObject.mm +38 -38
- package/ios/CPP/ImageDataHostObject.cpp +87 -87
- package/ios/CPP/ImageDataHostObject.hpp +35 -35
- package/ios/CPP/MutableRawBuffer.cpp +23 -23
- package/ios/CPP/MutableRawBuffer.hpp +23 -23
- package/ios/CPP/RNDynamsoft+JSI.h +22 -22
- package/ios/CPP/RNDynamsoft+JSI.mm +303 -303
- package/ios/CPP/RNDynamsoft+Json.h +93 -93
- package/ios/CPP/RNDynamsoft+Json.m +733 -733
- package/ios/CPP/YeetJSIUtils.h +56 -56
- package/ios/CPP/YeetJSIUtils.mm +208 -208
- package/ios/RNDynamsoftCameraView.h +31 -31
- package/ios/RNDynamsoftCameraView.m +108 -108
- package/ios/RNDynamsoftCameraViewManager.h +14 -14
- package/ios/RNDynamsoftCameraViewManager.m +195 -195
- package/ios/RNDynamsoftCaptureVisionRouter.h +18 -18
- package/ios/RNDynamsoftCaptureVisionRouter.mm +532 -532
- package/ios/RNDynamsoftImageEditorView.h +17 -17
- package/ios/RNDynamsoftImageEditorView.m +25 -25
- package/ios/RNDynamsoftImageEditorViewManager.h +14 -14
- package/ios/RNDynamsoftImageEditorViewManager.mm +183 -183
- package/ios/RNDynamsoftImageManager.h +14 -14
- package/ios/RNDynamsoftImageManager.mm +369 -369
- package/ios/RNDynamsoftImageSourceAdapter.h +19 -19
- package/ios/RNDynamsoftImageSourceAdapter.mm +255 -255
- package/ios/RNDynamsoftLicense.h +14 -14
- package/ios/RNDynamsoftLicense.m +62 -62
- package/ios/RNDynamsoftMultiCrossFilter.h +14 -14
- package/ios/RNDynamsoftMultiCrossFilter.m +145 -145
- package/ios/RNDynamsoftVersions.h +13 -13
- package/ios/RNDynamsoftVersions.m +27 -27
- package/package.json +48 -48
- package/src/NativeDynamsoftVersionsModule.tsx +20 -20
- package/src/VersionsModule.tsx +7 -7
- package/src/core/CapturedResultBase.tsx +18 -18
- package/src/core/CapturedResultItem.tsx +23 -23
- package/src/core/CoreModule.tsx +9 -9
- package/src/core/DSRect.tsx +29 -29
- package/src/core/EnumCaptureResultItemType.tsx +52 -52
- package/src/core/EnumColourChannelUsageType.tsx +26 -26
- package/src/core/EnumCrossVerificationStatus.tsx +46 -46
- package/src/core/EnumGrayscaleEnhancementMode.tsx +46 -46
- package/src/core/EnumGrayscaleTransformationMode.tsx +35 -35
- package/src/core/EnumImageFileFormat.tsx +6 -6
- package/src/core/EnumPixelFormat.tsx +53 -53
- package/src/core/ImageData.tsx +87 -87
- package/src/core/ImageSourceAdapter.tsx +160 -160
- package/src/core/NativeDynamsoftImageSourceAdapterModule.tsx +29 -29
- package/src/core/Point.tsx +13 -13
- package/src/core/Quadrilateral.tsx +12 -12
- package/src/core/index.tsx +18 -18
- package/src/cvr/CaptureVisionRouter.tsx +683 -683
- package/src/cvr/CaptureVisionRouterModule.tsx +9 -9
- package/src/cvr/CapturedResult.tsx +123 -123
- package/src/cvr/CapturedResultFilter.tsx +13 -13
- package/src/cvr/CapturedResultReceiver.tsx +71 -71
- package/src/cvr/EnumPresetTemplate.tsx +81 -81
- package/src/cvr/NativeDynamsoftCaptureVisionRouterModule.tsx +25 -25
- package/src/cvr/SimplifiedCaptureVisionSettings.tsx +61 -61
- package/src/cvr/index.tsx +11 -11
- package/src/dbr/BarcodeDetails.tsx +51 -51
- package/src/dbr/BarcodeReaderModule.tsx +9 -9
- package/src/dbr/BarcodeResultItem.tsx +65 -65
- package/src/dbr/DecodedBarcodesResult.tsx +14 -14
- package/src/dbr/ECISegment.tsx +23 -23
- package/src/dbr/EnumBarcodeFormat.tsx +112 -112
- package/src/dbr/EnumDeblurMode.tsx +29 -29
- package/src/dbr/EnumLocalizationMode.tsx +27 -27
- package/src/dbr/EnumQRCodeErrorCorrectionLevel.tsx +6 -6
- package/src/dbr/SimplifiedBarcodeReaderSettings.tsx +80 -80
- package/src/dbr/index.tsx +9 -9
- package/src/dce/CameraEnhancer.tsx +254 -254
- package/src/dce/CameraEnhancerModule.tsx +9 -9
- package/src/dce/CameraView.tsx +100 -100
- package/src/dce/DynamsoftCameraViewNativeComponent.ts +96 -96
- package/src/dce/DynamsoftImageEditorViewNativeComponent.ts +9 -9
- package/src/dce/EnumCameraPosition.tsx +25 -25
- package/src/dce/EnumDrawingLayerId.tsx +17 -17
- package/src/dce/EnumEnhancedFeatures.tsx +24 -24
- package/src/dce/EnumFocusMode.tsx +6 -6
- package/src/dce/EnumResolution.tsx +8 -8
- package/src/dce/EnumTorchState.tsx +10 -10
- package/src/dce/FeedBack.tsx +28 -28
- package/src/dce/ImageEditorView.tsx +131 -131
- package/src/dce/NativeDynamsoftCameraViewModule.tsx +47 -47
- package/src/dce/NativeDynamsoftImageEditorViewModule.ts +9 -9
- package/src/dce/index.tsx +13 -13
- package/src/dcp/CodeParserDedicatorModule.tsx +9 -9
- package/src/dcp/CodeParserModule.tsx +9 -9
- package/src/dcp/EnumMappingStatus.tsx +14 -14
- package/src/dcp/EnumValidationStatus.tsx +14 -14
- package/src/dcp/ParsedResult.tsx +14 -14
- package/src/dcp/ParsedResultItem.tsx +50 -50
- package/src/dcp/index.tsx +8 -8
- package/src/ddn/DeskewedImageResultItem.tsx +40 -40
- package/src/ddn/DetectedQuadResultItem.tsx +31 -31
- package/src/ddn/DocumentNormalizerModule.tsx +9 -9
- package/src/ddn/EnhancedImageResultItem.tsx +20 -20
- package/src/ddn/EnumImageColourMode.tsx +14 -14
- package/src/ddn/ProcessedDocumentResult.tsx +27 -27
- package/src/ddn/SimplifiedDocumentNormalizerSettings.tsx +65 -65
- package/src/ddn/index.tsx +11 -11
- package/src/dip/ImageProcessingModule.tsx +9 -9
- package/src/dip/index.tsx +1 -1
- package/src/dlr/CharacterResult.tsx +28 -28
- package/src/dlr/LabelRecognizerModule.tsx +9 -9
- package/src/dlr/RecognizedTextLinesResult.tsx +19 -19
- package/src/dlr/SimplifiedLabelRecognizerSettings.tsx +33 -33
- package/src/dlr/TextLineResultItem.tsx +41 -41
- package/src/dlr/index.tsx +8 -8
- package/src/index.tsx +13 -13
- package/src/license/LicenseManager.tsx +49 -49
- package/src/license/LicenseModule.tsx +9 -9
- package/src/license/NativeDynamsoftLicenseModule.tsx +7 -7
- package/src/license/index.tsx +7 -7
- package/src/utility/CrossVerificationCriteria.tsx +11 -11
- package/src/utility/EnumFilterType.tsx +5 -5
- package/src/utility/ImageManager.tsx +348 -348
- package/src/utility/MultiFrameResultCrossFilter.tsx +183 -183
- package/src/utility/NativeDynamsoftImageManagerModule.tsx +7 -7
- package/src/utility/NativeDynamsoftMultiCrossFilterModule.tsx +18 -18
- package/src/utility/UtilityModule.tsx +9 -9
- package/src/utility/index.tsx +4 -4
- package/android/.gitignore +0 -4
|
@@ -1,532 +1,532 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright © Dynamsoft Corporation. All rights reserved.
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
#import "RNDynamsoftCaptureVisionRouter.h"
|
|
6
|
-
#import <DynamsoftCaptureVisionBundle/DynamsoftCaptureVisionBundle.h>
|
|
7
|
-
#import <React/RCTUIManager.h>
|
|
8
|
-
#import "RNDynamsoftImageSourceAdapter.h"
|
|
9
|
-
#import "RNDynamsoft+Json.h"
|
|
10
|
-
#import "RNDynamsoft+JSI.h"
|
|
11
|
-
#import <jsi/jsi.h>
|
|
12
|
-
#import <React/RCTBridge+Private.h>
|
|
13
|
-
#import "DSImageData+HostObject.h"
|
|
14
|
-
#import "YeetJSIUtils.h"
|
|
15
|
-
|
|
16
|
-
using namespace facebook::jsi;
|
|
17
|
-
using namespace facebook;
|
|
18
|
-
using namespace std;
|
|
19
|
-
|
|
20
|
-
@interface RNDynamsoftCaptureVisionRouter () <DSCapturedResultReceiver>
|
|
21
|
-
|
|
22
|
-
@property (nonatomic, strong) DSCaptureVisionRouter *cvr;
|
|
23
|
-
|
|
24
|
-
@property (nonatomic, strong) NSMutableArray<DSImageData *> *deskewedImageDataArray;
|
|
25
|
-
|
|
26
|
-
@property (nonatomic, strong) NSMutableArray<DSImageData *> *enhancedImageDataArray;
|
|
27
|
-
|
|
28
|
-
@property (nonatomic, strong) NSMutableDictionary<NSString *, NSNumber *> *receiveDictionary;
|
|
29
|
-
|
|
30
|
-
@end
|
|
31
|
-
|
|
32
|
-
@implementation RNDynamsoftCaptureVisionRouter {
|
|
33
|
-
BOOL hasListeners;
|
|
34
|
-
dispatch_semaphore_t semaphore;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
RCT_EXPORT_MODULE(DynamsoftCaptureVisionRouterModule)
|
|
38
|
-
|
|
39
|
-
- (instancetype)init
|
|
40
|
-
{
|
|
41
|
-
self = [super init];
|
|
42
|
-
if (self) {
|
|
43
|
-
semaphore = dispatch_semaphore_create(0);
|
|
44
|
-
}
|
|
45
|
-
return self;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
- (void)dealloc
|
|
49
|
-
{
|
|
50
|
-
_cvr = nil;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(createInstance) {
|
|
54
|
-
self.cvr = [[DSCaptureVisionRouter alloc] init];
|
|
55
|
-
return @true;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(destroyInstance) {
|
|
59
|
-
self.cvr = nil;
|
|
60
|
-
return @true;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
RCT_EXPORT_METHOD(setGlobalIntraOpNumThreads:(NSInteger)intraOpNumThreads) {
|
|
64
|
-
[DSCaptureVisionRouter setGlobalIntraOpNumThreads:intraOpNumThreads];
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
RCT_EXPORT_METHOD(clearDLModelBuffers) {
|
|
68
|
-
[DSCaptureVisionRouter clearDLModelBuffers];
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
RCT_EXPORT_METHOD(switchCapturingTemplate:(NSString *)templateName
|
|
72
|
-
resolve:(RCTPromiseResolveBlock)resolve
|
|
73
|
-
rejecter: (RCTPromiseRejectBlock)reject)
|
|
74
|
-
{
|
|
75
|
-
NSError *error = nil;
|
|
76
|
-
[self.cvr switchCapturingTemplate:templateName error:&error];
|
|
77
|
-
if (error) {
|
|
78
|
-
NSString *code = [NSString stringWithFormat:@"%ld",(long)error.code];
|
|
79
|
-
reject(code, error.localizedDescription, error);
|
|
80
|
-
} else {
|
|
81
|
-
resolve(@(true));
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
RCT_EXPORT_METHOD(startCapturing:(NSString *)templateName
|
|
86
|
-
resolve:(RCTPromiseResolveBlock)resolve
|
|
87
|
-
rejecter: (RCTPromiseRejectBlock)reject)
|
|
88
|
-
{
|
|
89
|
-
[self.cvr startCapturing:templateName completionHandler:^(BOOL isSuccess, NSError * _Nullable error) {
|
|
90
|
-
if (!isSuccess && error) {
|
|
91
|
-
NSString *code = [NSString stringWithFormat:@"%ld",(long)error.code];
|
|
92
|
-
reject(code, error.localizedDescription, error);
|
|
93
|
-
} else {
|
|
94
|
-
self->semaphore = dispatch_semaphore_create(0);
|
|
95
|
-
resolve(@(true));
|
|
96
|
-
}
|
|
97
|
-
}];
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
RCT_EXPORT_METHOD(stopCapturing:(RCTPromiseResolveBlock)resolve
|
|
101
|
-
rejecter:(RCTPromiseRejectBlock)reject)
|
|
102
|
-
{
|
|
103
|
-
[self continueCRR];
|
|
104
|
-
[self.cvr stopCapturing];
|
|
105
|
-
resolve(@(true));
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
RCT_EXPORT_METHOD(setInput:(NSString *)key) {
|
|
109
|
-
RNDynamsoftImageSourceAdapter *rnAdapter = [self.bridge moduleForClass:[RNDynamsoftImageSourceAdapter class]];
|
|
110
|
-
DSImageSourceAdapter *isa = [rnAdapter.isaDictionary valueForKey:key];
|
|
111
|
-
NSError *error;
|
|
112
|
-
BOOL isSuccess = [self.cvr setInput:isa error:&error];
|
|
113
|
-
if (!isSuccess && error) {
|
|
114
|
-
__unused NSString *code = [NSString stringWithFormat:@"%ld",(long)error.code];
|
|
115
|
-
} else {
|
|
116
|
-
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
RCT_EXPORT_METHOD(getSimplifiedSettings:(NSString *)name
|
|
121
|
-
resolve:(RCTPromiseResolveBlock)resolve
|
|
122
|
-
rejecter: (RCTPromiseRejectBlock)reject)
|
|
123
|
-
{
|
|
124
|
-
NSError *error;
|
|
125
|
-
DSSimplifiedCaptureVisionSettings *settings = [self.cvr getSimplifiedSettings:name error:&error];
|
|
126
|
-
if (error) {
|
|
127
|
-
NSString *code = [NSString stringWithFormat:@"%ld",(long)error.code];
|
|
128
|
-
reject(code, error.localizedDescription, error);
|
|
129
|
-
} else {
|
|
130
|
-
resolve([settings toJson]);
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
RCT_EXPORT_METHOD(updateSettings:(NSDictionary *)dictionary
|
|
135
|
-
templateName:(NSString *)templateName
|
|
136
|
-
resolve:(RCTPromiseResolveBlock)resolve
|
|
137
|
-
rejecter: (RCTPromiseRejectBlock)reject)
|
|
138
|
-
{
|
|
139
|
-
NSError *error;
|
|
140
|
-
DSSimplifiedCaptureVisionSettings *settings = [self.cvr getSimplifiedSettings:templateName error:nil];
|
|
141
|
-
[settings updateWithDicitionary:dictionary];
|
|
142
|
-
BOOL isSuccess = [self.cvr updateSettings:templateName settings:settings error:&error];
|
|
143
|
-
if (!isSuccess && error) {
|
|
144
|
-
NSString *code = [NSString stringWithFormat:@"%ld",(long)error.code];
|
|
145
|
-
reject(code, error.localizedDescription, error);
|
|
146
|
-
} else {
|
|
147
|
-
resolve(@(true));
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
RCT_EXPORT_METHOD(resetSettings:(RCTPromiseResolveBlock)resolve
|
|
152
|
-
rejecter: (RCTPromiseRejectBlock)reject)
|
|
153
|
-
{
|
|
154
|
-
NSError *error;
|
|
155
|
-
BOOL isSuccess = [self.cvr resetSettings:&error];
|
|
156
|
-
if (!isSuccess && error) {
|
|
157
|
-
NSString *code = [NSString stringWithFormat:@"%ld",(long)error.code];
|
|
158
|
-
reject(code, error.localizedDescription, error);
|
|
159
|
-
} else {
|
|
160
|
-
resolve(@(true));
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
RCT_EXPORT_METHOD(initSettings:(NSString *)content
|
|
165
|
-
resolve:(RCTPromiseResolveBlock)resolve
|
|
166
|
-
rejecter: (RCTPromiseRejectBlock)reject) {
|
|
167
|
-
NSError *error;
|
|
168
|
-
BOOL isSuccess = [self.cvr initSettings:content error:&error];
|
|
169
|
-
if (!isSuccess && error) {
|
|
170
|
-
NSString *code = [NSString stringWithFormat:@"%ld",(long)error.code];
|
|
171
|
-
reject(code, error.localizedDescription, error);
|
|
172
|
-
} else {
|
|
173
|
-
resolve(@(true));
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
RCT_EXPORT_METHOD(initSettingsFromFile:(NSString *)path
|
|
178
|
-
resolve:(RCTPromiseResolveBlock)resolve
|
|
179
|
-
rejecter: (RCTPromiseRejectBlock)reject) {
|
|
180
|
-
NSError *error;
|
|
181
|
-
BOOL isSuccess = [self.cvr initSettingsFromFile:path error:&error];
|
|
182
|
-
if (!isSuccess && error) {
|
|
183
|
-
NSString *code = [NSString stringWithFormat:@"%ld",(long)error.code];
|
|
184
|
-
reject(code, error.localizedDescription, error);
|
|
185
|
-
} else {
|
|
186
|
-
resolve(@(true));
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
RCT_EXPORT_METHOD(outputSettings:(NSString *)name
|
|
191
|
-
includeDefaultValues:(BOOL)includeDefaultValues
|
|
192
|
-
resolve:(RCTPromiseResolveBlock)resolve
|
|
193
|
-
rejecter: (RCTPromiseRejectBlock)reject)
|
|
194
|
-
{
|
|
195
|
-
NSError *error;
|
|
196
|
-
NSString *setting = [self.cvr outputSettings:name includeDefaultValues:includeDefaultValues error:&error];
|
|
197
|
-
if (error) {
|
|
198
|
-
NSString *code = [NSString stringWithFormat:@"%ld",(long)error.code];
|
|
199
|
-
reject(code, error.localizedDescription, error);
|
|
200
|
-
} else {
|
|
201
|
-
resolve(setting);
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
RCT_EXPORT_METHOD(outputSettingsToFile:(NSString *)name
|
|
206
|
-
file:(NSString *)path
|
|
207
|
-
includeDefaultValues:(BOOL)includeDefaultValues
|
|
208
|
-
resolve:(RCTPromiseResolveBlock)resolve
|
|
209
|
-
rejecter: (RCTPromiseRejectBlock)reject)
|
|
210
|
-
{
|
|
211
|
-
NSError *error;
|
|
212
|
-
BOOL isSuccess = [self.cvr outputSettingsToFile:name filePath:path includeDefaultValues:includeDefaultValues error:&error];
|
|
213
|
-
if (!isSuccess && error) {
|
|
214
|
-
NSString *code = [NSString stringWithFormat:@"%ld",(long)error.code];
|
|
215
|
-
reject(code, error.localizedDescription, error);
|
|
216
|
-
} else {
|
|
217
|
-
resolve(@(true));
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
#pragma mark - Listener
|
|
222
|
-
RCT_EXPORT_METHOD(continueCRR) {
|
|
223
|
-
dispatch_semaphore_signal(semaphore);
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
RCT_EXPORT_METHOD(addResultReceiver:(NSString *)event) {
|
|
227
|
-
[self.receiveDictionary setValue:@(true) forKey:event];
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
RCT_EXPORT_METHOD(removeResultReceiver:(NSString *)event) {
|
|
231
|
-
[self.receiveDictionary removeObjectForKey:event];
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
RCT_EXPORT_METHOD(removeAllResultListeners) {
|
|
235
|
-
[self.cvr removeResultReceiver:self];
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
RCT_EXPORT_METHOD(addFilter:(NSString *)key) {
|
|
239
|
-
[self.cvr addResultFilter:[self.filterDictionary valueForKey:key]];
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
RCT_EXPORT_METHOD(removeFilter:(NSString *)key) {
|
|
243
|
-
[self.cvr removeResultFilter:[self.filterDictionary valueForKey:key]];
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
- (NSArray<NSString *> *)supportedEvents
|
|
247
|
-
{
|
|
248
|
-
return @[@"onCapturedResultReceived",
|
|
249
|
-
@"onDecodedBarcodesReceived",
|
|
250
|
-
@"onProcessedDocumentResultReceived",
|
|
251
|
-
@"onRecognizedTextLinesReceived",
|
|
252
|
-
@"onParsedResultsReceived"];
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
-(void)startObserving {
|
|
256
|
-
hasListeners = YES;
|
|
257
|
-
[self.cvr addResultReceiver:self];
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
-(void)stopObserving {
|
|
261
|
-
hasListeners = NO;
|
|
262
|
-
[self.cvr removeResultReceiver:self];
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
- (void)onCapturedResultReceived:(DSCapturedResult *)result {
|
|
266
|
-
if (hasListeners && [self.receiveDictionary valueForKey:@"onCapturedResultReceived"].boolValue) {
|
|
267
|
-
DSProcessedDocumentResult *imageResult = result.processedDocumentResult;
|
|
268
|
-
[self.deskewedImageDataArray removeAllObjects];
|
|
269
|
-
for (DSDeskewedImageResultItem *item in imageResult.deskewedImageResultItems) {
|
|
270
|
-
DSImageData *data = item.imageData;
|
|
271
|
-
if (data) {
|
|
272
|
-
[self.deskewedImageDataArray addObject:data];
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
[self.enhancedImageDataArray removeAllObjects];
|
|
276
|
-
for (DSEnhancedImageResultItem *item in imageResult.enhancedImageResultItems) {
|
|
277
|
-
DSImageData *data = item.imageData;
|
|
278
|
-
if (data) {
|
|
279
|
-
[self.enhancedImageDataArray addObject:data];
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
[self sendEventWithName:@"onCapturedResultReceived" body:[result toJson]];
|
|
283
|
-
dispatch_time_t timeout = dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC);
|
|
284
|
-
__unused long result = dispatch_semaphore_wait(semaphore, timeout);
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
- (void)onDecodedBarcodesReceived:(DSDecodedBarcodesResult *)result {
|
|
289
|
-
if (hasListeners && [self.receiveDictionary valueForKey:@"onDecodedBarcodesReceived"].boolValue) {
|
|
290
|
-
[self sendEventWithName:@"onDecodedBarcodesReceived" body:[result toJson]];
|
|
291
|
-
dispatch_time_t timeout = dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC);
|
|
292
|
-
__unused long result = dispatch_semaphore_wait(semaphore, timeout);
|
|
293
|
-
}
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
- (void)onProcessedDocumentResultReceived:(DSProcessedDocumentResult *)result {
|
|
297
|
-
if (hasListeners && [self.receiveDictionary valueForKey:@"onProcessedDocumentResultReceived"].boolValue) {
|
|
298
|
-
[self.deskewedImageDataArray removeAllObjects];
|
|
299
|
-
for (DSDeskewedImageResultItem *item in result.deskewedImageResultItems) {
|
|
300
|
-
DSImageData *data = item.imageData;
|
|
301
|
-
if (data) {
|
|
302
|
-
[self.deskewedImageDataArray addObject:data];
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
[self.enhancedImageDataArray removeAllObjects];
|
|
306
|
-
for (DSEnhancedImageResultItem *item in result.enhancedImageResultItems) {
|
|
307
|
-
DSImageData *data = item.imageData;
|
|
308
|
-
if (data) {
|
|
309
|
-
[self.enhancedImageDataArray addObject:data];
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
[self sendEventWithName:@"onProcessedDocumentResultReceived" body:[result toJson]];
|
|
313
|
-
dispatch_time_t timeout = dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC);
|
|
314
|
-
__unused long result = dispatch_semaphore_wait(semaphore, timeout);
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
- (void)onRecognizedTextLinesReceived:(DSRecognizedTextLinesResult *)result {
|
|
319
|
-
if (hasListeners && [self.receiveDictionary valueForKey:@"onRecognizedTextLinesReceived"].boolValue) {
|
|
320
|
-
[self sendEventWithName:@"onRecognizedTextLinesReceived" body:[result toJson]];
|
|
321
|
-
dispatch_time_t timeout = dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC);
|
|
322
|
-
__unused long result = dispatch_semaphore_wait(semaphore, timeout);
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
- (void)onParsedResultsReceived:(DSParsedResult *)result {
|
|
327
|
-
if (hasListeners && [self.receiveDictionary valueForKey:@"onParsedResultsReceived"].boolValue) {
|
|
328
|
-
[self sendEventWithName:@"onParsedResultsReceived" body:[result toJson]];
|
|
329
|
-
dispatch_time_t timeout = dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC);
|
|
330
|
-
__unused long result = dispatch_semaphore_wait(semaphore, timeout);
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
#pragma mark - Private
|
|
335
|
-
- (NSMutableArray<DSImageData *> *)deskewedImageDataArray {
|
|
336
|
-
if (!_deskewedImageDataArray) {
|
|
337
|
-
_deskewedImageDataArray = [NSMutableArray array];
|
|
338
|
-
}
|
|
339
|
-
return _deskewedImageDataArray;
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
- (NSMutableArray<DSImageData *> *)enhancedImageDataArray {
|
|
343
|
-
if (!_enhancedImageDataArray) {
|
|
344
|
-
_enhancedImageDataArray = [NSMutableArray array];
|
|
345
|
-
}
|
|
346
|
-
return _enhancedImageDataArray;
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
- (NSMutableDictionary<NSString *,DSMultiFrameResultCrossFilter *> *)filterDictionary {
|
|
350
|
-
if (!_filterDictionary) {
|
|
351
|
-
_filterDictionary = [NSMutableDictionary dictionary];
|
|
352
|
-
}
|
|
353
|
-
return _filterDictionary;
|
|
354
|
-
}
|
|
355
|
-
|
|
356
|
-
- (NSMutableDictionary<NSString *,NSNumber *> *)receiveDictionary {
|
|
357
|
-
if (!_receiveDictionary) {
|
|
358
|
-
_receiveDictionary = [NSMutableDictionary dictionary];
|
|
359
|
-
}
|
|
360
|
-
return _receiveDictionary;
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
- (DSImageData *)getOriginalImage:(NSString *)imageHashId {
|
|
364
|
-
return [[self.cvr getIntermediateResultManager] getOriginalImage:imageHashId];
|
|
365
|
-
}
|
|
366
|
-
|
|
367
|
-
#pragma mark - Global JSI
|
|
368
|
-
// --- RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(install) ---
|
|
369
|
-
RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(install)
|
|
370
|
-
{
|
|
371
|
-
RCTBridge *bridge = self.bridge;
|
|
372
|
-
|
|
373
|
-
if ([bridge respondsToSelector:NSSelectorFromString(@"parentBridge")]) {
|
|
374
|
-
bridge = [bridge valueForKey:@"parentBridge"];
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
RCTCxxBridge *cxxBridge = (RCTCxxBridge *)bridge;
|
|
378
|
-
if (cxxBridge == nil || cxxBridge.runtime == nil) {
|
|
379
|
-
return @false;
|
|
380
|
-
}
|
|
381
|
-
|
|
382
|
-
auto jsiRuntime = (jsi::Runtime*) cxxBridge.runtime;
|
|
383
|
-
if (jsiRuntime == nil) {
|
|
384
|
-
return @false;
|
|
385
|
-
}
|
|
386
|
-
|
|
387
|
-
install(*(facebook::jsi::Runtime *)cxxBridge.runtime, self);
|
|
388
|
-
return @true;
|
|
389
|
-
}
|
|
390
|
-
|
|
391
|
-
// --- Helper Functions and Macros ---
|
|
392
|
-
static void installHostFunction(
|
|
393
|
-
jsi::Runtime &jsiRuntime,
|
|
394
|
-
const char* name,
|
|
395
|
-
unsigned int argCount,
|
|
396
|
-
HostFunctionType hostFunction) {
|
|
397
|
-
|
|
398
|
-
auto func = Function::createFromHostFunction(
|
|
399
|
-
jsiRuntime,
|
|
400
|
-
PropNameID::forAscii(jsiRuntime, name),
|
|
401
|
-
argCount,
|
|
402
|
-
std::move(hostFunction)
|
|
403
|
-
);
|
|
404
|
-
jsiRuntime.global().setProperty(jsiRuntime, name, std::move(func));
|
|
405
|
-
}
|
|
406
|
-
|
|
407
|
-
// --- JSI Installation Logic ---
|
|
408
|
-
static void install(jsi::Runtime &jsiRuntime, RNDynamsoftCaptureVisionRouter *rnCapture) {
|
|
409
|
-
|
|
410
|
-
// 1. captureImageData(imageDataHostObject, templateName)
|
|
411
|
-
installHostFunction(jsiRuntime, "captureImageData", 2,
|
|
412
|
-
[rnCapture](Runtime &runtime, const Value &thisValue, const Value *arguments, size_t count) -> Value {
|
|
413
|
-
// Argument check
|
|
414
|
-
if (count != 2 || !arguments[1].isString() || !arguments[0].isObject()) {
|
|
415
|
-
return Value(false); // Or throw a JSI exception
|
|
416
|
-
}
|
|
417
|
-
|
|
418
|
-
NSString *name = convertJSIStringToNSString(runtime, arguments[1].getString(runtime));
|
|
419
|
-
Object obj = arguments[0].getObject(runtime);
|
|
420
|
-
|
|
421
|
-
if (obj.isHostObject<ImageDataHostObject>(runtime)) {
|
|
422
|
-
// Assuming ImageDataHostObject::getHOFromObject returns a non-owning copy or reference
|
|
423
|
-
ImageDataHostObject hostObject = ImageDataHostObject::getHOFromObject(runtime, obj);
|
|
424
|
-
|
|
425
|
-
// Get the Objective-C object from the HostObject
|
|
426
|
-
DSImageData *data = [DSImageData imageDataFromHostObject:hostObject];
|
|
427
|
-
|
|
428
|
-
DSCapturedResult *result = [rnCapture.cvr captureFromBuffer:data templateName:name];
|
|
429
|
-
return [result convertToJSIObject:runtime];
|
|
430
|
-
}
|
|
431
|
-
return Value(false);
|
|
432
|
-
}
|
|
433
|
-
);
|
|
434
|
-
|
|
435
|
-
// 2. captureFile(filePath, templateName)
|
|
436
|
-
installHostFunction(jsiRuntime, "captureFile", 2,
|
|
437
|
-
[rnCapture](Runtime &runtime, const Value &thisValue, const Value *arguments, size_t count) -> Value {
|
|
438
|
-
// Argument check
|
|
439
|
-
if (count != 2 || !arguments[0].isString() || !arguments[1].isString()) {
|
|
440
|
-
return Value(false);
|
|
441
|
-
}
|
|
442
|
-
|
|
443
|
-
NSString *file = convertJSIStringToNSString(runtime, arguments[0].getString(runtime));
|
|
444
|
-
NSString *name = convertJSIStringToNSString(runtime, arguments[1].getString(runtime));
|
|
445
|
-
|
|
446
|
-
DSCapturedResult *result = [rnCapture.cvr captureFromFile:file templateName:name];
|
|
447
|
-
return [result convertToJSIObject:runtime];
|
|
448
|
-
}
|
|
449
|
-
);
|
|
450
|
-
|
|
451
|
-
// 3. captureFileBytes(arrayBuffer, templateName)
|
|
452
|
-
installHostFunction(jsiRuntime, "captureFileBytes", 2,
|
|
453
|
-
[rnCapture](Runtime &runtime, const Value &thisValue, const Value *arguments, size_t count) -> Value {
|
|
454
|
-
// Argument check
|
|
455
|
-
if (count != 2 || !arguments[0].isObject() || !arguments[1].isString()) {
|
|
456
|
-
return Value(false);
|
|
457
|
-
}
|
|
458
|
-
|
|
459
|
-
Object obj = arguments[0].asObject(runtime);
|
|
460
|
-
if (!obj.isArrayBuffer(runtime)) {
|
|
461
|
-
return Value(false);
|
|
462
|
-
}
|
|
463
|
-
|
|
464
|
-
ArrayBuffer buffer = obj.getArrayBuffer(runtime);
|
|
465
|
-
NSData *data = convertArrayBufferToNSData(runtime, buffer);
|
|
466
|
-
NSString *name = convertJSIStringToNSString(runtime, arguments[1].getString(runtime));
|
|
467
|
-
|
|
468
|
-
DSCapturedResult *result = [rnCapture.cvr captureFromFileBytes:data templateName:name];
|
|
469
|
-
return [result convertToJSIObject:runtime];
|
|
470
|
-
}
|
|
471
|
-
);
|
|
472
|
-
|
|
473
|
-
// --- Image Data Array Accessors ---
|
|
474
|
-
|
|
475
|
-
// Generic lambda for getting a list of images (deskewed or enhanced)
|
|
476
|
-
auto getImageArrayFunc = [rnCapture](Runtime &runtime, NSArray<DSImageData *> *imageDataArray) -> Value {
|
|
477
|
-
Array array(runtime, imageDataArray.count);
|
|
478
|
-
for (int i = 0; i < imageDataArray.count; i++) {
|
|
479
|
-
// Create a new JSI Host Object wrapping the existing Objective-C object's data
|
|
480
|
-
// This assumes ImageDataHostObject has a suitable constructor/initialization.
|
|
481
|
-
ImageDataHostObject hostObject = [[imageDataArray objectAtIndex:i] hostObject];
|
|
482
|
-
Object obj = Object::createFromHostObject(runtime, std::make_shared<ImageDataHostObject>(hostObject));
|
|
483
|
-
array.setValueAtIndex(runtime, i, obj);
|
|
484
|
-
}
|
|
485
|
-
return array;
|
|
486
|
-
};
|
|
487
|
-
|
|
488
|
-
// 4. getCurrentDeskewedImages()
|
|
489
|
-
installHostFunction(jsiRuntime, "getCurrentDeskewedImages", 0,
|
|
490
|
-
[rnCapture, getImageArrayFunc](Runtime &runtime, const Value &thisValue, const Value *arguments, size_t count) -> Value {
|
|
491
|
-
if (count != 0) {
|
|
492
|
-
return Value(Array(runtime, 0));
|
|
493
|
-
}
|
|
494
|
-
return getImageArrayFunc(runtime, rnCapture.deskewedImageDataArray);
|
|
495
|
-
}
|
|
496
|
-
);
|
|
497
|
-
|
|
498
|
-
// 5. getCurrentEnhancedImages()
|
|
499
|
-
installHostFunction(jsiRuntime, "getCurrentEnhancedImages", 0,
|
|
500
|
-
[rnCapture, getImageArrayFunc](Runtime &runtime, const Value &thisValue, const Value *arguments, size_t count) -> Value {
|
|
501
|
-
if (count != 0) {
|
|
502
|
-
return Value(Array(runtime, 0));
|
|
503
|
-
}
|
|
504
|
-
return getImageArrayFunc(runtime, rnCapture.enhancedImageDataArray);
|
|
505
|
-
}
|
|
506
|
-
);
|
|
507
|
-
|
|
508
|
-
// 6. cvr_getOriginalImage(imageHashId)
|
|
509
|
-
installHostFunction(jsiRuntime, "cvr_getOriginalImage", 1,
|
|
510
|
-
[rnCapture](Runtime &runtime, const Value &thisValue, const Value *arguments, size_t count) -> Value {
|
|
511
|
-
// Argument check
|
|
512
|
-
if (count != 1 || !arguments[0].isString()) {
|
|
513
|
-
return Value::null(); // Or Value(false) depending on expected JS behavior
|
|
514
|
-
}
|
|
515
|
-
|
|
516
|
-
NSString *imageHashId = convertJSIStringToNSString(runtime, arguments[0].getString(runtime));
|
|
517
|
-
|
|
518
|
-
DSImageData *imageData = [rnCapture getOriginalImage:imageHashId];
|
|
519
|
-
if (imageData == nil) {
|
|
520
|
-
return Value::null();
|
|
521
|
-
}
|
|
522
|
-
|
|
523
|
-
ImageDataHostObject hostObject = [imageData hostObject];
|
|
524
|
-
// Create a new JSI Host Object wrapper
|
|
525
|
-
Object obj = Object::createFromHostObject(runtime, std::make_shared<ImageDataHostObject>(hostObject));
|
|
526
|
-
return obj;
|
|
527
|
-
}
|
|
528
|
-
);
|
|
529
|
-
}
|
|
530
|
-
|
|
531
|
-
@end
|
|
532
|
-
|
|
1
|
+
/*
|
|
2
|
+
* Copyright © Dynamsoft Corporation. All rights reserved.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
#import "RNDynamsoftCaptureVisionRouter.h"
|
|
6
|
+
#import <DynamsoftCaptureVisionBundle/DynamsoftCaptureVisionBundle.h>
|
|
7
|
+
#import <React/RCTUIManager.h>
|
|
8
|
+
#import "RNDynamsoftImageSourceAdapter.h"
|
|
9
|
+
#import "RNDynamsoft+Json.h"
|
|
10
|
+
#import "RNDynamsoft+JSI.h"
|
|
11
|
+
#import <jsi/jsi.h>
|
|
12
|
+
#import <React/RCTBridge+Private.h>
|
|
13
|
+
#import "DSImageData+HostObject.h"
|
|
14
|
+
#import "YeetJSIUtils.h"
|
|
15
|
+
|
|
16
|
+
using namespace facebook::jsi;
|
|
17
|
+
using namespace facebook;
|
|
18
|
+
using namespace std;
|
|
19
|
+
|
|
20
|
+
@interface RNDynamsoftCaptureVisionRouter () <DSCapturedResultReceiver>
|
|
21
|
+
|
|
22
|
+
@property (nonatomic, strong) DSCaptureVisionRouter *cvr;
|
|
23
|
+
|
|
24
|
+
@property (nonatomic, strong) NSMutableArray<DSImageData *> *deskewedImageDataArray;
|
|
25
|
+
|
|
26
|
+
@property (nonatomic, strong) NSMutableArray<DSImageData *> *enhancedImageDataArray;
|
|
27
|
+
|
|
28
|
+
@property (nonatomic, strong) NSMutableDictionary<NSString *, NSNumber *> *receiveDictionary;
|
|
29
|
+
|
|
30
|
+
@end
|
|
31
|
+
|
|
32
|
+
@implementation RNDynamsoftCaptureVisionRouter {
|
|
33
|
+
BOOL hasListeners;
|
|
34
|
+
dispatch_semaphore_t semaphore;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
RCT_EXPORT_MODULE(DynamsoftCaptureVisionRouterModule)
|
|
38
|
+
|
|
39
|
+
- (instancetype)init
|
|
40
|
+
{
|
|
41
|
+
self = [super init];
|
|
42
|
+
if (self) {
|
|
43
|
+
semaphore = dispatch_semaphore_create(0);
|
|
44
|
+
}
|
|
45
|
+
return self;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
- (void)dealloc
|
|
49
|
+
{
|
|
50
|
+
_cvr = nil;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(createInstance) {
|
|
54
|
+
self.cvr = [[DSCaptureVisionRouter alloc] init];
|
|
55
|
+
return @true;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(destroyInstance) {
|
|
59
|
+
self.cvr = nil;
|
|
60
|
+
return @true;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
RCT_EXPORT_METHOD(setGlobalIntraOpNumThreads:(NSInteger)intraOpNumThreads) {
|
|
64
|
+
[DSCaptureVisionRouter setGlobalIntraOpNumThreads:intraOpNumThreads];
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
RCT_EXPORT_METHOD(clearDLModelBuffers) {
|
|
68
|
+
[DSCaptureVisionRouter clearDLModelBuffers];
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
RCT_EXPORT_METHOD(switchCapturingTemplate:(NSString *)templateName
|
|
72
|
+
resolve:(RCTPromiseResolveBlock)resolve
|
|
73
|
+
rejecter: (RCTPromiseRejectBlock)reject)
|
|
74
|
+
{
|
|
75
|
+
NSError *error = nil;
|
|
76
|
+
[self.cvr switchCapturingTemplate:templateName error:&error];
|
|
77
|
+
if (error) {
|
|
78
|
+
NSString *code = [NSString stringWithFormat:@"%ld",(long)error.code];
|
|
79
|
+
reject(code, error.localizedDescription, error);
|
|
80
|
+
} else {
|
|
81
|
+
resolve(@(true));
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
RCT_EXPORT_METHOD(startCapturing:(NSString *)templateName
|
|
86
|
+
resolve:(RCTPromiseResolveBlock)resolve
|
|
87
|
+
rejecter: (RCTPromiseRejectBlock)reject)
|
|
88
|
+
{
|
|
89
|
+
[self.cvr startCapturing:templateName completionHandler:^(BOOL isSuccess, NSError * _Nullable error) {
|
|
90
|
+
if (!isSuccess && error) {
|
|
91
|
+
NSString *code = [NSString stringWithFormat:@"%ld",(long)error.code];
|
|
92
|
+
reject(code, error.localizedDescription, error);
|
|
93
|
+
} else {
|
|
94
|
+
self->semaphore = dispatch_semaphore_create(0);
|
|
95
|
+
resolve(@(true));
|
|
96
|
+
}
|
|
97
|
+
}];
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
RCT_EXPORT_METHOD(stopCapturing:(RCTPromiseResolveBlock)resolve
|
|
101
|
+
rejecter:(RCTPromiseRejectBlock)reject)
|
|
102
|
+
{
|
|
103
|
+
[self continueCRR];
|
|
104
|
+
[self.cvr stopCapturing];
|
|
105
|
+
resolve(@(true));
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
RCT_EXPORT_METHOD(setInput:(NSString *)key) {
|
|
109
|
+
RNDynamsoftImageSourceAdapter *rnAdapter = [self.bridge moduleForClass:[RNDynamsoftImageSourceAdapter class]];
|
|
110
|
+
DSImageSourceAdapter *isa = [rnAdapter.isaDictionary valueForKey:key];
|
|
111
|
+
NSError *error;
|
|
112
|
+
BOOL isSuccess = [self.cvr setInput:isa error:&error];
|
|
113
|
+
if (!isSuccess && error) {
|
|
114
|
+
__unused NSString *code = [NSString stringWithFormat:@"%ld",(long)error.code];
|
|
115
|
+
} else {
|
|
116
|
+
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
RCT_EXPORT_METHOD(getSimplifiedSettings:(NSString *)name
|
|
121
|
+
resolve:(RCTPromiseResolveBlock)resolve
|
|
122
|
+
rejecter: (RCTPromiseRejectBlock)reject)
|
|
123
|
+
{
|
|
124
|
+
NSError *error;
|
|
125
|
+
DSSimplifiedCaptureVisionSettings *settings = [self.cvr getSimplifiedSettings:name error:&error];
|
|
126
|
+
if (error) {
|
|
127
|
+
NSString *code = [NSString stringWithFormat:@"%ld",(long)error.code];
|
|
128
|
+
reject(code, error.localizedDescription, error);
|
|
129
|
+
} else {
|
|
130
|
+
resolve([settings toJson]);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
RCT_EXPORT_METHOD(updateSettings:(NSDictionary *)dictionary
|
|
135
|
+
templateName:(NSString *)templateName
|
|
136
|
+
resolve:(RCTPromiseResolveBlock)resolve
|
|
137
|
+
rejecter: (RCTPromiseRejectBlock)reject)
|
|
138
|
+
{
|
|
139
|
+
NSError *error;
|
|
140
|
+
DSSimplifiedCaptureVisionSettings *settings = [self.cvr getSimplifiedSettings:templateName error:nil];
|
|
141
|
+
[settings updateWithDicitionary:dictionary];
|
|
142
|
+
BOOL isSuccess = [self.cvr updateSettings:templateName settings:settings error:&error];
|
|
143
|
+
if (!isSuccess && error) {
|
|
144
|
+
NSString *code = [NSString stringWithFormat:@"%ld",(long)error.code];
|
|
145
|
+
reject(code, error.localizedDescription, error);
|
|
146
|
+
} else {
|
|
147
|
+
resolve(@(true));
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
RCT_EXPORT_METHOD(resetSettings:(RCTPromiseResolveBlock)resolve
|
|
152
|
+
rejecter: (RCTPromiseRejectBlock)reject)
|
|
153
|
+
{
|
|
154
|
+
NSError *error;
|
|
155
|
+
BOOL isSuccess = [self.cvr resetSettings:&error];
|
|
156
|
+
if (!isSuccess && error) {
|
|
157
|
+
NSString *code = [NSString stringWithFormat:@"%ld",(long)error.code];
|
|
158
|
+
reject(code, error.localizedDescription, error);
|
|
159
|
+
} else {
|
|
160
|
+
resolve(@(true));
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
RCT_EXPORT_METHOD(initSettings:(NSString *)content
|
|
165
|
+
resolve:(RCTPromiseResolveBlock)resolve
|
|
166
|
+
rejecter: (RCTPromiseRejectBlock)reject) {
|
|
167
|
+
NSError *error;
|
|
168
|
+
BOOL isSuccess = [self.cvr initSettings:content error:&error];
|
|
169
|
+
if (!isSuccess && error) {
|
|
170
|
+
NSString *code = [NSString stringWithFormat:@"%ld",(long)error.code];
|
|
171
|
+
reject(code, error.localizedDescription, error);
|
|
172
|
+
} else {
|
|
173
|
+
resolve(@(true));
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
RCT_EXPORT_METHOD(initSettingsFromFile:(NSString *)path
|
|
178
|
+
resolve:(RCTPromiseResolveBlock)resolve
|
|
179
|
+
rejecter: (RCTPromiseRejectBlock)reject) {
|
|
180
|
+
NSError *error;
|
|
181
|
+
BOOL isSuccess = [self.cvr initSettingsFromFile:path error:&error];
|
|
182
|
+
if (!isSuccess && error) {
|
|
183
|
+
NSString *code = [NSString stringWithFormat:@"%ld",(long)error.code];
|
|
184
|
+
reject(code, error.localizedDescription, error);
|
|
185
|
+
} else {
|
|
186
|
+
resolve(@(true));
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
RCT_EXPORT_METHOD(outputSettings:(NSString *)name
|
|
191
|
+
includeDefaultValues:(BOOL)includeDefaultValues
|
|
192
|
+
resolve:(RCTPromiseResolveBlock)resolve
|
|
193
|
+
rejecter: (RCTPromiseRejectBlock)reject)
|
|
194
|
+
{
|
|
195
|
+
NSError *error;
|
|
196
|
+
NSString *setting = [self.cvr outputSettings:name includeDefaultValues:includeDefaultValues error:&error];
|
|
197
|
+
if (error) {
|
|
198
|
+
NSString *code = [NSString stringWithFormat:@"%ld",(long)error.code];
|
|
199
|
+
reject(code, error.localizedDescription, error);
|
|
200
|
+
} else {
|
|
201
|
+
resolve(setting);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
RCT_EXPORT_METHOD(outputSettingsToFile:(NSString *)name
|
|
206
|
+
file:(NSString *)path
|
|
207
|
+
includeDefaultValues:(BOOL)includeDefaultValues
|
|
208
|
+
resolve:(RCTPromiseResolveBlock)resolve
|
|
209
|
+
rejecter: (RCTPromiseRejectBlock)reject)
|
|
210
|
+
{
|
|
211
|
+
NSError *error;
|
|
212
|
+
BOOL isSuccess = [self.cvr outputSettingsToFile:name filePath:path includeDefaultValues:includeDefaultValues error:&error];
|
|
213
|
+
if (!isSuccess && error) {
|
|
214
|
+
NSString *code = [NSString stringWithFormat:@"%ld",(long)error.code];
|
|
215
|
+
reject(code, error.localizedDescription, error);
|
|
216
|
+
} else {
|
|
217
|
+
resolve(@(true));
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
#pragma mark - Listener
|
|
222
|
+
RCT_EXPORT_METHOD(continueCRR) {
|
|
223
|
+
dispatch_semaphore_signal(semaphore);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
RCT_EXPORT_METHOD(addResultReceiver:(NSString *)event) {
|
|
227
|
+
[self.receiveDictionary setValue:@(true) forKey:event];
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
RCT_EXPORT_METHOD(removeResultReceiver:(NSString *)event) {
|
|
231
|
+
[self.receiveDictionary removeObjectForKey:event];
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
RCT_EXPORT_METHOD(removeAllResultListeners) {
|
|
235
|
+
[self.cvr removeResultReceiver:self];
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
RCT_EXPORT_METHOD(addFilter:(NSString *)key) {
|
|
239
|
+
[self.cvr addResultFilter:[self.filterDictionary valueForKey:key]];
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
RCT_EXPORT_METHOD(removeFilter:(NSString *)key) {
|
|
243
|
+
[self.cvr removeResultFilter:[self.filterDictionary valueForKey:key]];
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
- (NSArray<NSString *> *)supportedEvents
|
|
247
|
+
{
|
|
248
|
+
return @[@"onCapturedResultReceived",
|
|
249
|
+
@"onDecodedBarcodesReceived",
|
|
250
|
+
@"onProcessedDocumentResultReceived",
|
|
251
|
+
@"onRecognizedTextLinesReceived",
|
|
252
|
+
@"onParsedResultsReceived"];
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
-(void)startObserving {
|
|
256
|
+
hasListeners = YES;
|
|
257
|
+
[self.cvr addResultReceiver:self];
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
-(void)stopObserving {
|
|
261
|
+
hasListeners = NO;
|
|
262
|
+
[self.cvr removeResultReceiver:self];
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
- (void)onCapturedResultReceived:(DSCapturedResult *)result {
|
|
266
|
+
if (hasListeners && [self.receiveDictionary valueForKey:@"onCapturedResultReceived"].boolValue) {
|
|
267
|
+
DSProcessedDocumentResult *imageResult = result.processedDocumentResult;
|
|
268
|
+
[self.deskewedImageDataArray removeAllObjects];
|
|
269
|
+
for (DSDeskewedImageResultItem *item in imageResult.deskewedImageResultItems) {
|
|
270
|
+
DSImageData *data = item.imageData;
|
|
271
|
+
if (data) {
|
|
272
|
+
[self.deskewedImageDataArray addObject:data];
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
[self.enhancedImageDataArray removeAllObjects];
|
|
276
|
+
for (DSEnhancedImageResultItem *item in imageResult.enhancedImageResultItems) {
|
|
277
|
+
DSImageData *data = item.imageData;
|
|
278
|
+
if (data) {
|
|
279
|
+
[self.enhancedImageDataArray addObject:data];
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
[self sendEventWithName:@"onCapturedResultReceived" body:[result toJson]];
|
|
283
|
+
dispatch_time_t timeout = dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC);
|
|
284
|
+
__unused long result = dispatch_semaphore_wait(semaphore, timeout);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
- (void)onDecodedBarcodesReceived:(DSDecodedBarcodesResult *)result {
|
|
289
|
+
if (hasListeners && [self.receiveDictionary valueForKey:@"onDecodedBarcodesReceived"].boolValue) {
|
|
290
|
+
[self sendEventWithName:@"onDecodedBarcodesReceived" body:[result toJson]];
|
|
291
|
+
dispatch_time_t timeout = dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC);
|
|
292
|
+
__unused long result = dispatch_semaphore_wait(semaphore, timeout);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
- (void)onProcessedDocumentResultReceived:(DSProcessedDocumentResult *)result {
|
|
297
|
+
if (hasListeners && [self.receiveDictionary valueForKey:@"onProcessedDocumentResultReceived"].boolValue) {
|
|
298
|
+
[self.deskewedImageDataArray removeAllObjects];
|
|
299
|
+
for (DSDeskewedImageResultItem *item in result.deskewedImageResultItems) {
|
|
300
|
+
DSImageData *data = item.imageData;
|
|
301
|
+
if (data) {
|
|
302
|
+
[self.deskewedImageDataArray addObject:data];
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
[self.enhancedImageDataArray removeAllObjects];
|
|
306
|
+
for (DSEnhancedImageResultItem *item in result.enhancedImageResultItems) {
|
|
307
|
+
DSImageData *data = item.imageData;
|
|
308
|
+
if (data) {
|
|
309
|
+
[self.enhancedImageDataArray addObject:data];
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
[self sendEventWithName:@"onProcessedDocumentResultReceived" body:[result toJson]];
|
|
313
|
+
dispatch_time_t timeout = dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC);
|
|
314
|
+
__unused long result = dispatch_semaphore_wait(semaphore, timeout);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
- (void)onRecognizedTextLinesReceived:(DSRecognizedTextLinesResult *)result {
|
|
319
|
+
if (hasListeners && [self.receiveDictionary valueForKey:@"onRecognizedTextLinesReceived"].boolValue) {
|
|
320
|
+
[self sendEventWithName:@"onRecognizedTextLinesReceived" body:[result toJson]];
|
|
321
|
+
dispatch_time_t timeout = dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC);
|
|
322
|
+
__unused long result = dispatch_semaphore_wait(semaphore, timeout);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
- (void)onParsedResultsReceived:(DSParsedResult *)result {
|
|
327
|
+
if (hasListeners && [self.receiveDictionary valueForKey:@"onParsedResultsReceived"].boolValue) {
|
|
328
|
+
[self sendEventWithName:@"onParsedResultsReceived" body:[result toJson]];
|
|
329
|
+
dispatch_time_t timeout = dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC);
|
|
330
|
+
__unused long result = dispatch_semaphore_wait(semaphore, timeout);
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
#pragma mark - Private
|
|
335
|
+
- (NSMutableArray<DSImageData *> *)deskewedImageDataArray {
|
|
336
|
+
if (!_deskewedImageDataArray) {
|
|
337
|
+
_deskewedImageDataArray = [NSMutableArray array];
|
|
338
|
+
}
|
|
339
|
+
return _deskewedImageDataArray;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
- (NSMutableArray<DSImageData *> *)enhancedImageDataArray {
|
|
343
|
+
if (!_enhancedImageDataArray) {
|
|
344
|
+
_enhancedImageDataArray = [NSMutableArray array];
|
|
345
|
+
}
|
|
346
|
+
return _enhancedImageDataArray;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
- (NSMutableDictionary<NSString *,DSMultiFrameResultCrossFilter *> *)filterDictionary {
|
|
350
|
+
if (!_filterDictionary) {
|
|
351
|
+
_filterDictionary = [NSMutableDictionary dictionary];
|
|
352
|
+
}
|
|
353
|
+
return _filterDictionary;
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
- (NSMutableDictionary<NSString *,NSNumber *> *)receiveDictionary {
|
|
357
|
+
if (!_receiveDictionary) {
|
|
358
|
+
_receiveDictionary = [NSMutableDictionary dictionary];
|
|
359
|
+
}
|
|
360
|
+
return _receiveDictionary;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
- (DSImageData *)getOriginalImage:(NSString *)imageHashId {
|
|
364
|
+
return [[self.cvr getIntermediateResultManager] getOriginalImage:imageHashId];
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
#pragma mark - Global JSI
|
|
368
|
+
// --- RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(install) ---
|
|
369
|
+
RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(install)
|
|
370
|
+
{
|
|
371
|
+
RCTBridge *bridge = self.bridge;
|
|
372
|
+
|
|
373
|
+
if ([bridge respondsToSelector:NSSelectorFromString(@"parentBridge")]) {
|
|
374
|
+
bridge = [bridge valueForKey:@"parentBridge"];
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
RCTCxxBridge *cxxBridge = (RCTCxxBridge *)bridge;
|
|
378
|
+
if (cxxBridge == nil || cxxBridge.runtime == nil) {
|
|
379
|
+
return @false;
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
auto jsiRuntime = (jsi::Runtime*) cxxBridge.runtime;
|
|
383
|
+
if (jsiRuntime == nil) {
|
|
384
|
+
return @false;
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
install(*(facebook::jsi::Runtime *)cxxBridge.runtime, self);
|
|
388
|
+
return @true;
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
// --- Helper Functions and Macros ---
|
|
392
|
+
static void installHostFunction(
|
|
393
|
+
jsi::Runtime &jsiRuntime,
|
|
394
|
+
const char* name,
|
|
395
|
+
unsigned int argCount,
|
|
396
|
+
HostFunctionType hostFunction) {
|
|
397
|
+
|
|
398
|
+
auto func = Function::createFromHostFunction(
|
|
399
|
+
jsiRuntime,
|
|
400
|
+
PropNameID::forAscii(jsiRuntime, name),
|
|
401
|
+
argCount,
|
|
402
|
+
std::move(hostFunction)
|
|
403
|
+
);
|
|
404
|
+
jsiRuntime.global().setProperty(jsiRuntime, name, std::move(func));
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
// --- JSI Installation Logic ---
|
|
408
|
+
static void install(jsi::Runtime &jsiRuntime, RNDynamsoftCaptureVisionRouter *rnCapture) {
|
|
409
|
+
|
|
410
|
+
// 1. captureImageData(imageDataHostObject, templateName)
|
|
411
|
+
installHostFunction(jsiRuntime, "captureImageData", 2,
|
|
412
|
+
[rnCapture](Runtime &runtime, const Value &thisValue, const Value *arguments, size_t count) -> Value {
|
|
413
|
+
// Argument check
|
|
414
|
+
if (count != 2 || !arguments[1].isString() || !arguments[0].isObject()) {
|
|
415
|
+
return Value(false); // Or throw a JSI exception
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
NSString *name = convertJSIStringToNSString(runtime, arguments[1].getString(runtime));
|
|
419
|
+
Object obj = arguments[0].getObject(runtime);
|
|
420
|
+
|
|
421
|
+
if (obj.isHostObject<ImageDataHostObject>(runtime)) {
|
|
422
|
+
// Assuming ImageDataHostObject::getHOFromObject returns a non-owning copy or reference
|
|
423
|
+
ImageDataHostObject hostObject = ImageDataHostObject::getHOFromObject(runtime, obj);
|
|
424
|
+
|
|
425
|
+
// Get the Objective-C object from the HostObject
|
|
426
|
+
DSImageData *data = [DSImageData imageDataFromHostObject:hostObject];
|
|
427
|
+
|
|
428
|
+
DSCapturedResult *result = [rnCapture.cvr captureFromBuffer:data templateName:name];
|
|
429
|
+
return [result convertToJSIObject:runtime];
|
|
430
|
+
}
|
|
431
|
+
return Value(false);
|
|
432
|
+
}
|
|
433
|
+
);
|
|
434
|
+
|
|
435
|
+
// 2. captureFile(filePath, templateName)
|
|
436
|
+
installHostFunction(jsiRuntime, "captureFile", 2,
|
|
437
|
+
[rnCapture](Runtime &runtime, const Value &thisValue, const Value *arguments, size_t count) -> Value {
|
|
438
|
+
// Argument check
|
|
439
|
+
if (count != 2 || !arguments[0].isString() || !arguments[1].isString()) {
|
|
440
|
+
return Value(false);
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
NSString *file = convertJSIStringToNSString(runtime, arguments[0].getString(runtime));
|
|
444
|
+
NSString *name = convertJSIStringToNSString(runtime, arguments[1].getString(runtime));
|
|
445
|
+
|
|
446
|
+
DSCapturedResult *result = [rnCapture.cvr captureFromFile:file templateName:name];
|
|
447
|
+
return [result convertToJSIObject:runtime];
|
|
448
|
+
}
|
|
449
|
+
);
|
|
450
|
+
|
|
451
|
+
// 3. captureFileBytes(arrayBuffer, templateName)
|
|
452
|
+
installHostFunction(jsiRuntime, "captureFileBytes", 2,
|
|
453
|
+
[rnCapture](Runtime &runtime, const Value &thisValue, const Value *arguments, size_t count) -> Value {
|
|
454
|
+
// Argument check
|
|
455
|
+
if (count != 2 || !arguments[0].isObject() || !arguments[1].isString()) {
|
|
456
|
+
return Value(false);
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
Object obj = arguments[0].asObject(runtime);
|
|
460
|
+
if (!obj.isArrayBuffer(runtime)) {
|
|
461
|
+
return Value(false);
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
ArrayBuffer buffer = obj.getArrayBuffer(runtime);
|
|
465
|
+
NSData *data = convertArrayBufferToNSData(runtime, buffer);
|
|
466
|
+
NSString *name = convertJSIStringToNSString(runtime, arguments[1].getString(runtime));
|
|
467
|
+
|
|
468
|
+
DSCapturedResult *result = [rnCapture.cvr captureFromFileBytes:data templateName:name];
|
|
469
|
+
return [result convertToJSIObject:runtime];
|
|
470
|
+
}
|
|
471
|
+
);
|
|
472
|
+
|
|
473
|
+
// --- Image Data Array Accessors ---
|
|
474
|
+
|
|
475
|
+
// Generic lambda for getting a list of images (deskewed or enhanced)
|
|
476
|
+
auto getImageArrayFunc = [rnCapture](Runtime &runtime, NSArray<DSImageData *> *imageDataArray) -> Value {
|
|
477
|
+
Array array(runtime, imageDataArray.count);
|
|
478
|
+
for (int i = 0; i < imageDataArray.count; i++) {
|
|
479
|
+
// Create a new JSI Host Object wrapping the existing Objective-C object's data
|
|
480
|
+
// This assumes ImageDataHostObject has a suitable constructor/initialization.
|
|
481
|
+
ImageDataHostObject hostObject = [[imageDataArray objectAtIndex:i] hostObject];
|
|
482
|
+
Object obj = Object::createFromHostObject(runtime, std::make_shared<ImageDataHostObject>(hostObject));
|
|
483
|
+
array.setValueAtIndex(runtime, i, obj);
|
|
484
|
+
}
|
|
485
|
+
return array;
|
|
486
|
+
};
|
|
487
|
+
|
|
488
|
+
// 4. getCurrentDeskewedImages()
|
|
489
|
+
installHostFunction(jsiRuntime, "getCurrentDeskewedImages", 0,
|
|
490
|
+
[rnCapture, getImageArrayFunc](Runtime &runtime, const Value &thisValue, const Value *arguments, size_t count) -> Value {
|
|
491
|
+
if (count != 0) {
|
|
492
|
+
return Value(Array(runtime, 0));
|
|
493
|
+
}
|
|
494
|
+
return getImageArrayFunc(runtime, rnCapture.deskewedImageDataArray);
|
|
495
|
+
}
|
|
496
|
+
);
|
|
497
|
+
|
|
498
|
+
// 5. getCurrentEnhancedImages()
|
|
499
|
+
installHostFunction(jsiRuntime, "getCurrentEnhancedImages", 0,
|
|
500
|
+
[rnCapture, getImageArrayFunc](Runtime &runtime, const Value &thisValue, const Value *arguments, size_t count) -> Value {
|
|
501
|
+
if (count != 0) {
|
|
502
|
+
return Value(Array(runtime, 0));
|
|
503
|
+
}
|
|
504
|
+
return getImageArrayFunc(runtime, rnCapture.enhancedImageDataArray);
|
|
505
|
+
}
|
|
506
|
+
);
|
|
507
|
+
|
|
508
|
+
// 6. cvr_getOriginalImage(imageHashId)
|
|
509
|
+
installHostFunction(jsiRuntime, "cvr_getOriginalImage", 1,
|
|
510
|
+
[rnCapture](Runtime &runtime, const Value &thisValue, const Value *arguments, size_t count) -> Value {
|
|
511
|
+
// Argument check
|
|
512
|
+
if (count != 1 || !arguments[0].isString()) {
|
|
513
|
+
return Value::null(); // Or Value(false) depending on expected JS behavior
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
NSString *imageHashId = convertJSIStringToNSString(runtime, arguments[0].getString(runtime));
|
|
517
|
+
|
|
518
|
+
DSImageData *imageData = [rnCapture getOriginalImage:imageHashId];
|
|
519
|
+
if (imageData == nil) {
|
|
520
|
+
return Value::null();
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
ImageDataHostObject hostObject = [imageData hostObject];
|
|
524
|
+
// Create a new JSI Host Object wrapper
|
|
525
|
+
Object obj = Object::createFromHostObject(runtime, std::make_shared<ImageDataHostObject>(hostObject));
|
|
526
|
+
return obj;
|
|
527
|
+
}
|
|
528
|
+
);
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
@end
|
|
532
|
+
|