dynamsoft-capture-vision-react-native 2.6.1016 → 3.0.5100

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/LICENSE +2 -2
  2. package/README.md +7 -9
  3. package/android/build.gradle +73 -42
  4. package/android/src/main/cpp/CMakeLists.txt +22 -0
  5. package/android/src/main/cpp/ImgHO.cpp +95 -0
  6. package/android/src/main/cpp/ImgHO.h +34 -0
  7. package/android/src/main/cpp/JsiCore.cpp +284 -0
  8. package/android/src/main/cpp/JsiCore.h +51 -0
  9. package/android/src/main/cpp/JsiCvr.cpp +327 -0
  10. package/android/src/main/cpp/JsiCvr.h +54 -0
  11. package/android/src/main/cpp/JsiDbr.cpp +38 -0
  12. package/android/src/main/cpp/JsiDbr.h +26 -0
  13. package/android/src/main/cpp/JsiDce.cpp +59 -0
  14. package/android/src/main/cpp/JsiDce.h +17 -0
  15. package/android/src/main/cpp/JsiDcp.cpp +51 -0
  16. package/android/src/main/cpp/JsiDcp.h +31 -0
  17. package/android/src/main/cpp/JsiDdn.cpp +50 -0
  18. package/android/src/main/cpp/JsiDdn.h +28 -0
  19. package/android/src/main/cpp/JsiDlr.cpp +51 -0
  20. package/android/src/main/cpp/JsiDlr.h +26 -0
  21. package/android/src/main/cpp/JsiUtility.cpp +196 -0
  22. package/android/src/main/cpp/JsiUtility.h +16 -0
  23. package/android/src/main/cpp/RawBuffer.cpp +24 -0
  24. package/android/src/main/cpp/RawBuffer.h +24 -0
  25. package/android/src/main/cpp/android_log.h +14 -0
  26. package/android/src/main/dysJniLibs/debug/arm64-v8a/librn_dys.so +0 -0
  27. package/android/src/main/dysJniLibs/debug/armeabi-v7a/librn_dys.so +0 -0
  28. package/android/src/main/dysJniLibs/debug/x86/librn_dys.so +0 -0
  29. package/android/src/main/dysJniLibs/debug/x86_64/librn_dys.so +0 -0
  30. package/android/src/main/dysJniLibs/release/arm64-v8a/librn_dys.so +0 -0
  31. package/android/src/main/dysJniLibs/release/armeabi-v7a/librn_dys.so +0 -0
  32. package/android/src/main/dysJniLibs/release/x86/librn_dys.so +0 -0
  33. package/android/src/main/dysJniLibs/release/x86_64/librn_dys.so +0 -0
  34. package/android/src/{oldarch → main/java}/com/dynamsoft/reactnativelib/CVRModule.kt +4 -4
  35. package/android/src/{oldarch → main/java}/com/dynamsoft/reactnativelib/DCEModule.kt +10 -0
  36. package/android/src/main/java/com/dynamsoft/reactnativelib/ReactNativeDcvPackage.kt +13 -85
  37. package/android/src/{oldarch → main/java}/com/dynamsoft/reactnativelib/VersionsModule.kt +2 -2
  38. package/android/src/main/java/com/dynamsoft/reactnativelib/cvr/CaptureVisionRouterModuleImpl.kt +25 -25
  39. package/android/src/main/java/com/dynamsoft/reactnativelib/dce/CameraEnhancerModuleImpl.kt +23 -2
  40. package/android/src/main/java/com/dynamsoft/reactnativelib/license/LicenseModuleImpl.kt +1 -1
  41. package/android/src/main/java/com/dynamsoft/reactnativelib/utility/ImageManagerModuleImpl.kt +19 -4
  42. package/android/src/main/java/com/dynamsoft/reactnativelib/utils/ForCore.kt +14 -0
  43. package/android/src/main/java/com/dynamsoft/reactnativelib/utils/ForCvr.kt +12 -7
  44. package/android/src/main/java/com/dynamsoft/reactnativelib/utils/ForDBR.kt +1 -7
  45. package/android/src/main/java/com/dynamsoft/reactnativelib/utils/ForDCE.kt +2 -2
  46. package/android/src/main/java/com/dynamsoft/reactnativelib/utils/ForDDN.kt +27 -19
  47. package/dynamsoft-capture-vision-react-native.podspec +9 -7
  48. package/ios/CPP/DSImageData+HostObject.h +1 -1
  49. package/ios/CPP/RNDynamsoft+JSI.h +2 -2
  50. package/ios/CPP/RNDynamsoft+JSI.mm +18 -10
  51. package/ios/CPP/RNDynamsoft+Json.h +2 -13
  52. package/ios/CPP/RNDynamsoft+Json.m +48 -39
  53. package/ios/CPP/YeetJSIUtils.h +3 -1
  54. package/ios/CPP/YeetJSIUtils.mm +5 -0
  55. package/ios/RNDynamsoftCameraView.m +1 -1
  56. package/ios/RNDynamsoftCameraViewManager.m +23 -8
  57. package/ios/RNDynamsoftCaptureVisionRouter.mm +76 -45
  58. package/ios/RNDynamsoftImageEditorView.m +1 -1
  59. package/ios/RNDynamsoftImageEditorViewManager.mm +36 -13
  60. package/ios/RNDynamsoftImageManager.mm +33 -4
  61. package/ios/RNDynamsoftImageSourceAdapter.mm +1 -1
  62. package/ios/RNDynamsoftLicense.m +1 -1
  63. package/ios/RNDynamsoftMultiCrossFilter.m +9 -9
  64. package/ios/RNDynamsoftVersions.m +1 -13
  65. package/package.json +3 -11
  66. package/src/core/CapturedResultBase.tsx +18 -0
  67. package/src/core/EnumCaptureResultItemType.tsx +12 -6
  68. package/src/core/EnumCrossVerificationStatus.tsx +6 -6
  69. package/src/core/ImageData.tsx +1 -1
  70. package/src/core/index.tsx +1 -0
  71. package/src/cvr/CaptureVisionRouter.tsx +47 -51
  72. package/src/cvr/CapturedResult.tsx +24 -46
  73. package/src/cvr/CapturedResultReceiver.tsx +12 -19
  74. package/src/cvr/NativeDynamsoftCaptureVisionRouterModule.tsx +2 -2
  75. package/src/cvr/SimplifiedCaptureVisionSettings.tsx +4 -4
  76. package/src/dbr/DecodedBarcodesResult.tsx +3 -17
  77. package/src/dce/CameraEnhancer.tsx +9 -0
  78. package/src/dce/DynamsoftCameraViewNativeComponent.ts +2 -2
  79. package/src/dce/EnumResolution.tsx +7 -0
  80. package/src/dce/NativeDynamsoftCameraViewModule.tsx +4 -0
  81. package/src/dce/index.tsx +1 -0
  82. package/src/dcp/ParsedResult.tsx +3 -14
  83. package/src/ddn/DeskewedImageResultItem.tsx +40 -0
  84. package/src/ddn/DetectedQuadResultItem.tsx +3 -1
  85. package/src/ddn/EnhancedImageResultItem.tsx +20 -0
  86. package/src/ddn/ProcessedDocumentResult.tsx +27 -0
  87. package/src/ddn/SimplifiedDocumentNormalizerSettings.tsx +18 -3
  88. package/src/ddn/index.tsx +3 -3
  89. package/src/dlr/RecognizedTextLinesResult.tsx +2 -16
  90. package/src/index.tsx +0 -1
  91. package/src/utility/ImageManager.tsx +66 -45
  92. package/android/src/main/java/com/dynamsoft/reactnativelib/rtu/BarcodeScannerModuleImpl.kt +0 -80
  93. package/android/src/main/java/com/dynamsoft/reactnativelib/rtu/MRZScannerModuleImpl.kt +0 -77
  94. package/android/src/main/java/com/dynamsoft/reactnativelib/rtu/ScannerInterface.kt +0 -47
  95. package/android/src/main/jniLibs/arm64-v8a/librn_dys.so +0 -0
  96. package/android/src/main/jniLibs/armeabi-v7a/librn_dys.so +0 -0
  97. package/android/src/main/jniLibs/x86/librn_dys.so +0 -0
  98. package/android/src/main/jniLibs/x86_64/librn_dys.so +0 -0
  99. package/android/src/newarch/com/dynamsoft/reactnativelib/BarcodeScannerModule.kt +0 -22
  100. package/android/src/newarch/com/dynamsoft/reactnativelib/CVRModule.kt +0 -91
  101. package/android/src/newarch/com/dynamsoft/reactnativelib/CameraViewManager.kt +0 -52
  102. package/android/src/newarch/com/dynamsoft/reactnativelib/DCEModule.kt +0 -91
  103. package/android/src/newarch/com/dynamsoft/reactnativelib/ISAModule.kt +0 -60
  104. package/android/src/newarch/com/dynamsoft/reactnativelib/ImageEditorViewManager.kt +0 -16
  105. package/android/src/newarch/com/dynamsoft/reactnativelib/ImageEditorViewModule.kt +0 -24
  106. package/android/src/newarch/com/dynamsoft/reactnativelib/ImageManagerModule.kt +0 -12
  107. package/android/src/newarch/com/dynamsoft/reactnativelib/LicenseModule.kt +0 -14
  108. package/android/src/newarch/com/dynamsoft/reactnativelib/MRZScannerModule.kt +0 -22
  109. package/android/src/newarch/com/dynamsoft/reactnativelib/MultiCrossFilterModule.kt +0 -58
  110. package/android/src/newarch/com/dynamsoft/reactnativelib/VersionsModule.kt +0 -41
  111. package/android/src/oldarch/com/dynamsoft/reactnativelib/BarcodeScannerModule.kt +0 -24
  112. package/android/src/oldarch/com/dynamsoft/reactnativelib/MRZScannerModule.kt +0 -24
  113. package/ios/RNDynamsoftBarcodeScanner.h +0 -14
  114. package/ios/RNDynamsoftBarcodeScanner.m +0 -169
  115. package/ios/RNDynamsoftMRZScanner.h +0 -14
  116. package/ios/RNDynamsoftMRZScanner.m +0 -140
  117. package/src/ddn/DetectedQuadsResult.tsx +0 -31
  118. package/src/ddn/NormalizedImageResultItem.tsx +0 -32
  119. package/src/ddn/NormalizedImagesResult.tsx +0 -27
  120. package/src/rtu/BarcodeScanConfig.tsx +0 -104
  121. package/src/rtu/BarcodeScanResult.tsx +0 -31
  122. package/src/rtu/BarcodeScanner.tsx +0 -112
  123. package/src/rtu/EnumResultState.tsx +0 -21
  124. package/src/rtu/MRZScanConfig.tsx +0 -67
  125. package/src/rtu/MRZScanResult.tsx +0 -84
  126. package/src/rtu/MRZScanner.tsx +0 -90
  127. package/src/rtu/NativeDynamsoftBarcodeScannerModule.tsx +0 -6
  128. package/src/rtu/NativeDynamsoftMRZScannerModule.tsx +0 -6
  129. package/src/rtu/index.tsx +0 -7
  130. /package/android/src/main/{withNamespace/AndroidManifest.xml → AndroidManifest.xml} +0 -0
  131. /package/android/src/main/{withoutNamespace/AndroidManifest.xml → AndroidManifest_noPackage.xml} +0 -0
  132. /package/android/src/{oldarch → main/java}/com/dynamsoft/reactnativelib/CameraViewManager.kt +0 -0
  133. /package/android/src/{oldarch → main/java}/com/dynamsoft/reactnativelib/ISAModule.kt +0 -0
  134. /package/android/src/{oldarch → main/java}/com/dynamsoft/reactnativelib/ImageEditorViewManager.kt +0 -0
  135. /package/android/src/{oldarch → main/java}/com/dynamsoft/reactnativelib/ImageEditorViewModule.kt +0 -0
  136. /package/android/src/{oldarch → main/java}/com/dynamsoft/reactnativelib/ImageManagerModule.kt +0 -0
  137. /package/android/src/{oldarch → main/java}/com/dynamsoft/reactnativelib/LicenseModule.kt +0 -0
  138. /package/android/src/{oldarch → main/java}/com/dynamsoft/reactnativelib/MultiCrossFilterModule.kt +0 -0
@@ -72,9 +72,9 @@ void runOnMainThread(void (^block)(void))
72
72
  @implementation DSSimplifiedCaptureVisionSettings (Json)
73
73
 
74
74
  - (void)updateWithDicitionary:(NSDictionary *)dictionary {
75
- NSNumber *capturedResultItemTypes = [dictionary valueForKey:@"capturedResultItemTypes"];
76
- if (capturedResultItemTypes) {
77
- self.capturedResultItemTypes = capturedResultItemTypes.integerValue;
75
+ NSNumber *outputOriginalImage = [dictionary valueForKey:@"outputOriginalImage"];
76
+ if (outputOriginalImage) {
77
+ self.outputOriginalImage = outputOriginalImage.boolValue;
78
78
  }
79
79
  NSDictionary *roi = [dictionary valueForKey:@"roi"];
80
80
  if (roi) {
@@ -112,7 +112,7 @@ void runOnMainThread(void (^block)(void))
112
112
 
113
113
  - (NSObject *)toJson {
114
114
  if (self) {
115
- NSDictionary *dictionary = @{@"capturedResultItemTypes":@(self.capturedResultItemTypes),
115
+ NSDictionary *dictionary = @{@"outputOriginalImage":@(self.outputOriginalImage),
116
116
  @"roi":self.roi ? [self.roi toJson] : [NSNull null],
117
117
  @"roiMeasuredInPercentage":@(self.roiMeasuredInPercentage),
118
118
  @"maxParallelTasks":@(self.maxParallelTasks),
@@ -134,7 +134,8 @@ void runOnMainThread(void (^block)(void))
134
134
  - (void)updateWithDicitionary:(NSDictionary *)dictionary {
135
135
  NSString *_barcodeFormatIdsNumberString = [dictionary valueForKey:@"_barcodeFormatIdsNumberString"];
136
136
  if (_barcodeFormatIdsNumberString) {
137
- self.barcodeFormatIds = _barcodeFormatIdsNumberString.integerValue;
137
+ NSUInteger unsignedIntegerValue = strtoull([_barcodeFormatIdsNumberString UTF8String], NULL, 10);
138
+ self.barcodeFormatIds = unsignedIntegerValue;
138
139
  }
139
140
  NSNumber *expectedBarcodesCount = [dictionary valueForKey:@"expectedBarcodesCount"];
140
141
  if (expectedBarcodesCount) {
@@ -377,17 +378,27 @@ void runOnMainThread(void (^block)(void))
377
378
  };
378
379
  }
379
380
  break;
380
- case DSCapturedResultItemTypeNormalizedImage:
381
+ case DSCapturedResultItemTypeDeskewedImage:
381
382
  {
382
- DSNormalizedImageResultItem *item = (DSNormalizedImageResultItem *)self;
383
+ DSDeskewedImageResultItem *item = (DSDeskewedImageResultItem *)self;
383
384
  dictionary = @{ @"type":@(item.type),
384
385
  @"targetROIDefName":item.targetROIDefName,
385
386
  @"taskName":item.taskName,
386
- @"location":[item.location toJson],
387
- @"crossVerificationStatus":@(item.crossVerificationStatus)
387
+ @"sourceDeskewQuad":[item.sourceDeskewQuad toJson],
388
+ @"crossVerificationStatus":@(item.crossVerificationStatus),
389
+ @"originalToLocalMatrix":CGAffineTransformToArray(item.originalToLocalMatrix)
388
390
  };
389
391
  }
390
392
  break;
393
+ case DSCapturedResultItemTypeEnhancedImage: {
394
+ DSEnhancedImageResultItem *item = (DSEnhancedImageResultItem *)self;
395
+ dictionary = @{ @"type":@(item.type),
396
+ @"targetROIDefName":item.targetROIDefName,
397
+ @"taskName":item.taskName,
398
+ @"originalToLocalMatrix":CGAffineTransformToArray(item.originalToLocalMatrix)
399
+ };
400
+ break;
401
+ }
391
402
  case DSCapturedResultItemTypeParsedResult:
392
403
  {
393
404
  DSParsedResultItem *item = (DSParsedResultItem *)self;
@@ -475,56 +486,54 @@ void runOnMainThread(void (^block)(void))
475
486
 
476
487
  @end
477
488
 
478
- @implementation DSDetectedQuadsResult (Json)
489
+ @implementation DSProcessedDocumentResult (Json)
479
490
 
480
491
  - (NSObject *)toJson {
481
492
  if (self) {
482
- id items;
483
- if (self.items.count > 0) {
493
+ id detectedQuadResultItems;
494
+ if (self.detectedQuadResultItems.count > 0) {
484
495
  NSMutableArray *array = [NSMutableArray array];
485
- for (DSDetectedQuadResultItem *item in self.items) {
496
+ for (DSDetectedQuadResultItem *item in self.detectedQuadResultItems) {
486
497
  NSDictionary *obj = [item toJson];
487
498
  if (obj) {
488
499
  [array addObject:obj];
489
500
  }
490
501
  }
491
- items = [array copy];
502
+ detectedQuadResultItems = [array copy];
492
503
  } else {
493
- items = [NSNull null];
504
+ detectedQuadResultItems = [NSNull null];
494
505
  }
495
- NSDictionary *dictionary = @{@"originalImageHashId":self.originalImageHashId,
496
- @"items":items,
497
- @"rotationTransformMatrix":CGAffineTransformToArray(self.rotationTransformMatrix),
498
- @"errorCode":@(self.errorCode),
499
- @"errorMessage":self.errorMessage ? self.errorMessage : [NSNull null]
500
- };
501
- return dictionary;
502
- } else {
503
- return [NSNull null];
504
- }
505
- }
506
-
507
- @end
508
-
509
- @implementation DSNormalizedImagesResult (Json)
510
-
511
- - (NSObject *)toJson {
512
- if (self) {
513
- id items;
514
- if (self.items.count > 0) {
506
+ id deskewedImageResultItems;
507
+ if (self.deskewedImageResultItems.count > 0) {
515
508
  NSMutableArray *array = [NSMutableArray array];
516
- for (DSNormalizedImageResultItem *item in self.items) {
509
+ for (DSDeskewedImageResultItem *item in self.deskewedImageResultItems) {
517
510
  NSDictionary *obj = [item toJson];
518
511
  if (obj) {
519
512
  [array addObject:obj];
520
513
  }
521
514
  }
522
- items = [array copy];
515
+ deskewedImageResultItems = [array copy];
523
516
  } else {
524
- items = [NSNull null];
517
+ deskewedImageResultItems = [NSNull null];
525
518
  }
519
+ id enhancedImageResultItems;
520
+ if (self.enhancedImageResultItems.count > 0) {
521
+ NSMutableArray *array = [NSMutableArray array];
522
+ for (DSEnhancedImageResultItem *item in self.enhancedImageResultItems) {
523
+ NSDictionary *obj = [item toJson];
524
+ if (obj) {
525
+ [array addObject:obj];
526
+ }
527
+ }
528
+ enhancedImageResultItems = [array copy];
529
+ } else {
530
+ enhancedImageResultItems = [NSNull null];
531
+ }
532
+
526
533
  NSDictionary *dictionary = @{@"originalImageHashId":self.originalImageHashId,
527
- @"items":items,
534
+ @"detectedQuadResultItems":detectedQuadResultItems,
535
+ @"deskewedImageResultItems":deskewedImageResultItems,
536
+ @"enhancedImageResultItems":enhancedImageResultItems,
528
537
  @"rotationTransformMatrix":CGAffineTransformToArray(self.rotationTransformMatrix),
529
538
  @"errorCode":@(self.errorCode),
530
539
  @"errorMessage":self.errorMessage ? self.errorMessage : [NSNull null]
@@ -6,7 +6,7 @@
6
6
  #import <jsi/jsi.h>
7
7
  #import <React/RCTBridgeModule.h>
8
8
  #include "ImageDataHostObject.hpp"
9
- #import <DynamsoftCore/DSImageData.h>
9
+ #import <DynamsoftCaptureVisionBundle/DSImageData.h>
10
10
 
11
11
  using namespace facebook;
12
12
  /**
@@ -34,6 +34,8 @@ RCTResponseSenderBlock convertJSIFunctionToCallback(
34
34
  jsi::Runtime &runtime,
35
35
  const jsi::Function &value);
36
36
 
37
+ NSData* convertArrayBufferToNSData(jsi::Runtime &runtime, const jsi::ArrayBuffer &buffer);
38
+
37
39
  struct Promise {
38
40
  Promise(jsi::Runtime &rt, jsi::Function resolve, jsi::Function reject);
39
41
 
@@ -149,6 +149,11 @@ RCTResponseSenderBlock convertJSIFunctionToCallback(
149
149
  };
150
150
  }
151
151
 
152
+ NSData* convertArrayBufferToNSData(jsi::Runtime &runtime, const jsi::ArrayBuffer &buffer) {
153
+ return [NSData dataWithBytes:buffer.data(runtime)
154
+ length:buffer.size(runtime)];
155
+ }
156
+
152
157
  Promise::Promise(jsi::Runtime &rt, jsi::Function resolve, jsi::Function reject)
153
158
  : runtime_(rt), resolve_(std::move(resolve)), reject_(std::move(reject)) {}
154
159
 
@@ -3,7 +3,7 @@
3
3
  */
4
4
 
5
5
  #import "RNDynamsoftCameraView.h"
6
- #import <DynamsoftCameraEnhancer/DynamsoftCameraEnhancer.h>
6
+ #import <DynamsoftCaptureVisionBundle/DynamsoftCaptureVisionBundle.h>
7
7
 
8
8
  @interface RNDynamsoftCameraView ()
9
9
 
@@ -4,8 +4,7 @@
4
4
 
5
5
  #import "RNDynamsoftCameraViewManager.h"
6
6
  #import "RNDynamsoftCameraView.h"
7
- #import <DynamsoftCameraEnhancer/DynamsoftCameraEnhancer.h>
8
- #import <DynamsoftCore/DynamsoftCore.h>
7
+ #import <DynamsoftCaptureVisionBundle/DynamsoftCaptureVisionBundle.h>
9
8
  #import <React/RCTUIManager.h>
10
9
  #import "RNDynamsoftImageSourceAdapter.h"
11
10
 
@@ -60,11 +59,24 @@ RCT_EXPORT_METHOD(close) {
60
59
  }
61
60
 
62
61
  RCT_EXPORT_METHOD(setCameraView:(nonnull NSNumber *)tag) {
62
+ [self trySetCameraViewWithTag:tag attempt:1];
63
+ }
64
+
65
+ - (void)trySetCameraViewWithTag:(nonnull NSNumber *)tag attempt:(NSInteger)attempt {
66
+ const NSInteger maxAttempts = 10;
67
+ const NSTimeInterval retryDelay = 0.1; // 100ms
68
+
63
69
  [self.bridge.uiManager addUIBlock:
64
70
  ^(__unused RCTUIManager *uiManager, NSDictionary<NSNumber *, UIView *> *viewRegistry) {
65
71
  id view = viewRegistry[tag];
66
72
  if (!view || ![view isKindOfClass:[RNDynamsoftCameraView class]]) {
67
- RCTLogError(@"Cannot find RNDynamsoftCameraView with tag #%@", tag);
73
+ if (attempt < maxAttempts) {
74
+ dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(retryDelay * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
75
+ [self trySetCameraViewWithTag:tag attempt:attempt + 1];
76
+ });
77
+ } else {
78
+ RCTLogError(@"Cannot find RNDynamsoftCameraView with tag #%@ after %ld attempts", tag, (long)attempt);
79
+ }
68
80
  } else {
69
81
  self.dce.cameraView = ((RNDynamsoftCameraView *)view).cameraView;
70
82
  }
@@ -72,8 +84,7 @@ RCT_EXPORT_METHOD(setCameraView:(nonnull NSNumber *)tag) {
72
84
  }
73
85
 
74
86
  RCT_EXPORT_METHOD(selectCamera:(NSInteger)position) {
75
- NSError *error;
76
- [self.dce selectCameraWithPosition:position error:&error];
87
+ [self.dce selectCameraWithPosition:position completion:nil];
77
88
  }
78
89
 
79
90
  RCT_EXPORT_METHOD(getCameraPosition:(RCTPromiseResolveBlock)resolve
@@ -87,7 +98,7 @@ RCT_EXPORT_METHOD(setFocus:(CGFloat)x y:(CGFloat)y mode:(NSInteger)mode) {
87
98
  }
88
99
 
89
100
  RCT_EXPORT_METHOD(getFocusMode:(RCTPromiseResolveBlock)resolve
90
- rejecter:(RCTPromiseRejectBlock)reject)
101
+ rejecter:(RCTPromiseRejectBlock)reject)
91
102
  {
92
103
  resolve(@([self.dce getFocusMode]));
93
104
  }
@@ -110,9 +121,9 @@ RCT_EXPORT_METHOD(disableEnhancedFeatures:(NSInteger)features) {
110
121
  [self.dce disableEnhancedFeatures:features];
111
122
  }
112
123
 
113
- RCT_EXPORT_METHOD(setScanRegion:(NSDictionary *)region
124
+ RCT_EXPORT_METHOD(setScanRegion:(NSDictionary *)region
114
125
  resolve:(RCTPromiseResolveBlock)resolve
115
- rejecter: (RCTPromiseRejectBlock)reject)
126
+ rejecter: (RCTPromiseRejectBlock)reject)
116
127
  {
117
128
  if (region) {
118
129
  NSNumber *top = [region valueForKey:@"top"];
@@ -164,4 +175,8 @@ RCT_EXPORT_METHOD(vibrate) {
164
175
  [DSFeedback vibrate];
165
176
  }
166
177
 
178
+ RCT_EXPORT_METHOD(setResolution:(NSInteger)resolution) {
179
+ [self.dce setResolution:resolution];
180
+ }
181
+
167
182
  @end
@@ -3,11 +3,7 @@
3
3
  */
4
4
 
5
5
  #import "RNDynamsoftCaptureVisionRouter.h"
6
- #import <DynamsoftCaptureVisionRouter/DynamsoftCaptureVisionRouter.h>
7
- #import <DynamsoftBarcodeReader/DynamsoftBarcodeReader.h>
8
- #import <DynamsoftLabelRecognizer/DynamsoftLabelRecognizer.h>
9
- #import <DynamsoftDocumentNormalizer/DynamsoftDocumentNormalizer.h>
10
- #import <DynamsoftUtility/DynamsoftUtility.h>
6
+ #import <DynamsoftCaptureVisionBundle/DynamsoftCaptureVisionBundle.h>
11
7
  #import <React/RCTUIManager.h>
12
8
  #import "RNDynamsoftImageSourceAdapter.h"
13
9
  #import "RNDynamsoft+Json.h"
@@ -25,7 +21,9 @@ using namespace std;
25
21
 
26
22
  @property (nonatomic, strong) DSCaptureVisionRouter *cvr;
27
23
 
28
- @property (nonatomic, strong) NSMutableArray<DSImageData *> *imageDataArray;
24
+ @property (nonatomic, strong) NSMutableArray<DSImageData *> *deskewedImageDataArray;
25
+
26
+ @property (nonatomic, strong) NSMutableArray<DSImageData *> *enhancedImageDataArray;
29
27
 
30
28
  @property (nonatomic, strong) NSMutableDictionary<NSString *, NSNumber *> *receiveDictionary;
31
29
 
@@ -55,7 +53,7 @@ RCT_EXPORT_MODULE(DynamsoftCaptureVisionRouterModule)
55
53
 
56
54
  RCT_EXPORT_METHOD(startCapturing:(NSString *)templateName
57
55
  resolve:(RCTPromiseResolveBlock)resolve
58
- rejecter: (RCTPromiseRejectBlock)reject)
56
+ rejecter: (RCTPromiseRejectBlock)reject)
59
57
  {
60
58
  [self.cvr startCapturing:templateName completionHandler:^(BOOL isSuccess, NSError * _Nullable error) {
61
59
  if (!isSuccess && error) {
@@ -88,7 +86,7 @@ RCT_EXPORT_METHOD(setInput:(NSString *)key) {
88
86
  }
89
87
  }
90
88
 
91
- RCT_EXPORT_METHOD(getSettings:(NSString *)name
89
+ RCT_EXPORT_METHOD(getSimplifiedSettings:(NSString *)name
92
90
  resolve:(RCTPromiseResolveBlock)resolve
93
91
  rejecter: (RCTPromiseRejectBlock)reject)
94
92
  {
@@ -105,7 +103,7 @@ RCT_EXPORT_METHOD(getSettings:(NSString *)name
105
103
  RCT_EXPORT_METHOD(updateSettings:(NSDictionary *)dictionary
106
104
  templateName:(NSString *)templateName
107
105
  resolve:(RCTPromiseResolveBlock)resolve
108
- rejecter: (RCTPromiseRejectBlock)reject)
106
+ rejecter: (RCTPromiseRejectBlock)reject)
109
107
  {
110
108
  NSError *error;
111
109
  DSSimplifiedCaptureVisionSettings *settings = [self.cvr getSimplifiedSettings:templateName error:nil];
@@ -120,7 +118,7 @@ RCT_EXPORT_METHOD(updateSettings:(NSDictionary *)dictionary
120
118
  }
121
119
 
122
120
  RCT_EXPORT_METHOD(resetSettings:(RCTPromiseResolveBlock)resolve
123
- rejecter: (RCTPromiseRejectBlock)reject)
121
+ rejecter: (RCTPromiseRejectBlock)reject)
124
122
  {
125
123
  NSError *error;
126
124
  BOOL isSuccess = [self.cvr resetSettings:&error];
@@ -159,11 +157,12 @@ RCT_EXPORT_METHOD(initSettingsFromFile:(NSString *)path
159
157
  }
160
158
 
161
159
  RCT_EXPORT_METHOD(outputSettings:(NSString *)name
160
+ includeDefaultValues:(BOOL)includeDefaultValues
162
161
  resolve:(RCTPromiseResolveBlock)resolve
163
162
  rejecter: (RCTPromiseRejectBlock)reject)
164
163
  {
165
164
  NSError *error;
166
- NSString *setting = [self.cvr outputSettings:name error:&error];
165
+ NSString *setting = [self.cvr outputSettings:name includeDefaultValues:includeDefaultValues error:&error];
167
166
  if (error) {
168
167
  NSString *code = [NSString stringWithFormat:@"%ld",(long)error.code];
169
168
  reject(code, error.localizedDescription, error);
@@ -172,13 +171,14 @@ RCT_EXPORT_METHOD(outputSettings:(NSString *)name
172
171
  }
173
172
  }
174
173
 
175
- RCT_EXPORT_METHOD(outputSettingsToFile:(NSString *)name
174
+ RCT_EXPORT_METHOD(outputSettingsToFile:(NSString *)name
176
175
  file:(NSString *)path
176
+ includeDefaultValues:(BOOL)includeDefaultValues
177
177
  resolve:(RCTPromiseResolveBlock)resolve
178
- rejecter: (RCTPromiseRejectBlock)reject)
178
+ rejecter: (RCTPromiseRejectBlock)reject)
179
179
  {
180
180
  NSError *error;
181
- BOOL isSuccess = [self.cvr outputSettingsToFile:name file:path error:&error];
181
+ BOOL isSuccess = [self.cvr outputSettingsToFile:name filePath:path includeDefaultValues:includeDefaultValues error:&error];
182
182
  if (!isSuccess && error) {
183
183
  NSString *code = [NSString stringWithFormat:@"%ld",(long)error.code];
184
184
  reject(code, error.localizedDescription, error);
@@ -216,8 +216,7 @@ RCT_EXPORT_METHOD(removeFilter:(NSString *)key) {
216
216
  {
217
217
  return @[@"onCapturedResultReceived",
218
218
  @"onDecodedBarcodesReceived",
219
- @"onDetectedQuadsReceived",
220
- @"onNormalizedImagesReceived",
219
+ @"onProcessedDocumentResultReceived",
221
220
  @"onRecognizedTextLinesReceived",
222
221
  @"onParsedResultsReceived"];
223
222
  }
@@ -234,12 +233,19 @@ RCT_EXPORT_METHOD(removeFilter:(NSString *)key) {
234
233
 
235
234
  - (void)onCapturedResultReceived:(DSCapturedResult *)result {
236
235
  if (hasListeners && [self.receiveDictionary valueForKey:@"onCapturedResultReceived"].boolValue) {
237
- [self.imageDataArray removeAllObjects];
238
- DSNormalizedImagesResult *imageResult = result.normalizedImagesResult;
239
- for (DSNormalizedImageResultItem *item in imageResult.items) {
236
+ DSProcessedDocumentResult *imageResult = result.processedDocumentResult;
237
+ [self.deskewedImageDataArray removeAllObjects];
238
+ for (DSDeskewedImageResultItem *item in imageResult.deskewedImageResultItems) {
239
+ DSImageData *data = item.imageData;
240
+ if (data) {
241
+ [self.deskewedImageDataArray addObject:data];
242
+ }
243
+ }
244
+ [self.enhancedImageDataArray removeAllObjects];
245
+ for (DSEnhancedImageResultItem *item in imageResult.enhancedImageResultItems) {
240
246
  DSImageData *data = item.imageData;
241
247
  if (data) {
242
- [self.imageDataArray addObject:data];
248
+ [self.enhancedImageDataArray addObject:data];
243
249
  }
244
250
  }
245
251
  [self sendEventWithName:@"onCapturedResultReceived" body:[result toJson]];
@@ -256,24 +262,23 @@ RCT_EXPORT_METHOD(removeFilter:(NSString *)key) {
256
262
  }
257
263
  }
258
264
 
259
- - (void)onDetectedQuadsReceived:(DSDetectedQuadsResult *)result {
260
- if (hasListeners && [self.receiveDictionary valueForKey:@"onDetectedQuadsReceived"].boolValue) {
261
- [self sendEventWithName:@"onDetectedQuadsReceived" body:[result toJson]];
262
- dispatch_time_t timeout = dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC);
263
- __unused long result = dispatch_semaphore_wait(semaphore, timeout);
264
- }
265
- }
266
-
267
- - (void)onNormalizedImagesReceived:(DSNormalizedImagesResult *)result {
268
- if (hasListeners && [self.receiveDictionary valueForKey:@"onNormalizedImagesReceived"].boolValue) {
269
- [self.imageDataArray removeAllObjects];
270
- for (DSNormalizedImageResultItem *item in result.items) {
265
+ - (void)onProcessedDocumentResultReceived:(DSProcessedDocumentResult *)result {
266
+ if (hasListeners && [self.receiveDictionary valueForKey:@"onProcessedDocumentResultReceived"].boolValue) {
267
+ [self.deskewedImageDataArray removeAllObjects];
268
+ for (DSDeskewedImageResultItem *item in result.deskewedImageResultItems) {
269
+ DSImageData *data = item.imageData;
270
+ if (data) {
271
+ [self.deskewedImageDataArray addObject:data];
272
+ }
273
+ }
274
+ [self.enhancedImageDataArray removeAllObjects];
275
+ for (DSEnhancedImageResultItem *item in result.enhancedImageResultItems) {
271
276
  DSImageData *data = item.imageData;
272
277
  if (data) {
273
- [self.imageDataArray addObject:data];
278
+ [self.enhancedImageDataArray addObject:data];
274
279
  }
275
280
  }
276
- [self sendEventWithName:@"onNormalizedImagesReceived" body:[result toJson]];
281
+ [self sendEventWithName:@"onProcessedDocumentResultReceived" body:[result toJson]];
277
282
  dispatch_time_t timeout = dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC);
278
283
  __unused long result = dispatch_semaphore_wait(semaphore, timeout);
279
284
  }
@@ -296,11 +301,18 @@ RCT_EXPORT_METHOD(removeFilter:(NSString *)key) {
296
301
  }
297
302
 
298
303
  #pragma mark - Private
299
- - (NSMutableArray<DSImageData *> *)imageDataArray {
300
- if (!_imageDataArray) {
301
- _imageDataArray = [NSMutableArray array];
304
+ - (NSMutableArray<DSImageData *> *)deskewedImageDataArray {
305
+ if (!_deskewedImageDataArray) {
306
+ _deskewedImageDataArray = [NSMutableArray array];
302
307
  }
303
- return _imageDataArray;
308
+ return _deskewedImageDataArray;
309
+ }
310
+
311
+ - (NSMutableArray<DSImageData *> *)enhancedImageDataArray {
312
+ if (!_enhancedImageDataArray) {
313
+ _enhancedImageDataArray = [NSMutableArray array];
314
+ }
315
+ return _enhancedImageDataArray;
304
316
  }
305
317
 
306
318
  - (NSMutableDictionary<NSString *,DSMultiFrameResultCrossFilter *> *)filterDictionary {
@@ -382,23 +394,42 @@ static void install(jsi::Runtime &jsiRuntime, RNDynamsoftCaptureVisionRouter *rn
382
394
  const Value &thisValue,
383
395
  const Value *arguments,
384
396
  size_t count) -> Value {
385
- NSString *bytes = convertJSIStringToNSString(runtime, arguments[0].getString(runtime));
397
+ ArrayBuffer buffer = arguments[0].asObject(runtime).getArrayBuffer(runtime);
398
+ NSData *data = convertArrayBufferToNSData(runtime, buffer);
386
399
  NSString *name = convertJSIStringToNSString(runtime, arguments[1].getString(runtime));
387
- NSData *data = [[NSData alloc] initWithBase64EncodedString:bytes options:(NSDataBase64DecodingIgnoreUnknownCharacters)];
388
400
  DSCapturedResult *result = [rnCapture.cvr captureFromFileBytes:data templateName:name];
389
401
  return [result convertToJSIObject:runtime];
390
402
  });
391
403
  jsiRuntime.global().setProperty(jsiRuntime, captureFileBytes, std::move(captureFileBytesFunc));
392
404
 
393
- const char* getCurrentNormalizedImages = "getCurrentNormalizedImages";
394
- auto getCurrentNormalizedImagesFunc = Function::createFromHostFunction(jsiRuntime,
395
- PropNameID::forAscii(jsiRuntime, getCurrentNormalizedImages),
405
+ const char* getCurrentDeskewedImages = "getCurrentDeskewedImages";
406
+ auto getCurrentDeskewedImagesFunc = Function::createFromHostFunction(jsiRuntime,
407
+ PropNameID::forAscii(jsiRuntime, getCurrentDeskewedImages),
408
+ 0,
409
+ [rnCapture](Runtime &runtime,
410
+ const Value &thisValue,
411
+ const Value *arguments,
412
+ size_t count) -> Value {
413
+ NSMutableArray<DSImageData *> *imageDataArray = rnCapture.deskewedImageDataArray;
414
+ Array array(runtime, imageDataArray.count);
415
+ for (int i = 0; i < imageDataArray.count; i++) {
416
+ ImageDataHostObject hostObject = [[imageDataArray objectAtIndex:i] hostObject];
417
+ Object obj = Object::createFromHostObject(runtime, std::make_shared<ImageDataHostObject>(hostObject));
418
+ array.setValueAtIndex(runtime, i, obj);
419
+ }
420
+ return array;
421
+ });
422
+ jsiRuntime.global().setProperty(jsiRuntime, getCurrentDeskewedImages, std::move(getCurrentDeskewedImagesFunc));
423
+
424
+ const char* getCurrentEnhancedImages = "getCurrentEnhancedImages";
425
+ auto getCurrentEnhancedImagesFunc = Function::createFromHostFunction(jsiRuntime,
426
+ PropNameID::forAscii(jsiRuntime, getCurrentEnhancedImages),
396
427
  0,
397
428
  [rnCapture](Runtime &runtime,
398
429
  const Value &thisValue,
399
430
  const Value *arguments,
400
431
  size_t count) -> Value {
401
- NSMutableArray<DSImageData *> *imageDataArray = rnCapture.imageDataArray;
432
+ NSMutableArray<DSImageData *> *imageDataArray = rnCapture.enhancedImageDataArray;
402
433
  Array array(runtime, imageDataArray.count);
403
434
  for (int i = 0; i < imageDataArray.count; i++) {
404
435
  ImageDataHostObject hostObject = [[imageDataArray objectAtIndex:i] hostObject];
@@ -407,7 +438,7 @@ static void install(jsi::Runtime &jsiRuntime, RNDynamsoftCaptureVisionRouter *rn
407
438
  }
408
439
  return array;
409
440
  });
410
- jsiRuntime.global().setProperty(jsiRuntime, getCurrentNormalizedImages, std::move(getCurrentNormalizedImagesFunc));
441
+ jsiRuntime.global().setProperty(jsiRuntime, getCurrentEnhancedImages, std::move(getCurrentEnhancedImagesFunc));
411
442
 
412
443
  const char* getOriginalImage = "cvr_getOriginalImage";
413
444
  auto getOriginalImageFunc = Function::createFromHostFunction(jsiRuntime,
@@ -3,7 +3,7 @@
3
3
  */
4
4
 
5
5
  #import "RNDynamsoftImageEditorView.h"
6
- #import <DynamsoftCameraEnhancer/DynamsoftCameraEnhancer.h>
6
+ #import <DynamsoftCaptureVisionBundle/DynamsoftCaptureVisionBundle.h>
7
7
 
8
8
  @implementation RNDynamsoftImageEditorView
9
9
 
@@ -4,7 +4,7 @@
4
4
 
5
5
  #import "RNDynamsoftImageEditorViewManager.h"
6
6
  #import "RNDynamsoftImageEditorView.h"
7
- #import <DynamsoftCameraEnhancer/DynamsoftCameraEnhancer.h>
7
+ #import <DynamsoftCaptureVisionBundle/DynamsoftCaptureVisionBundle.h>
8
8
  #import <React/RCTBridge+Private.h>
9
9
  #import "DSImageData+HostObject.h"
10
10
  #import <React/RCTUIManager.h>
@@ -23,11 +23,24 @@ RCT_EXPORT_MODULE(DynamsoftImageEditorView)
23
23
  }
24
24
 
25
25
  RCT_EXPORT_METHOD(setQuads:(nonnull NSNumber *)tag quadArray:(NSArray *)array layerId:(NSInteger)layerId) {
26
+ [self trySetQuadsWithTag:tag quadArray:array layerId:layerId attempt:1];
27
+ }
28
+
29
+ - (void)trySetQuadsWithTag:(nonnull NSNumber *)tag quadArray:(NSArray *)array layerId:(NSInteger)layerId attempt:(NSInteger)attempt {
30
+ const NSInteger maxAttempts = 10;
31
+ const NSTimeInterval retryDelay = 0.1; // 100ms
32
+
26
33
  [self.bridge.uiManager addUIBlock:
27
34
  ^(__unused RCTUIManager *uiManager, NSDictionary<NSNumber *, UIView *> *viewRegistry) {
28
35
  id view = viewRegistry[tag];
29
36
  if (!view || ![view isKindOfClass:[RNDynamsoftImageEditorView class]]) {
30
- RCTLogError(@"Cannot find RNDynamsoftImageEditorView with tag #%@", tag);
37
+ if (attempt < maxAttempts) {
38
+ dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(retryDelay * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
39
+ [self trySetQuadsWithTag:tag quadArray:array layerId:layerId attempt:attempt + 1];
40
+ });
41
+ } else {
42
+ RCTLogError(@"Cannot find RNDynamsoftImageEditorView with tag #%@ after %ld attempts", tag, (long)attempt);
43
+ }
31
44
  } else {
32
45
  if (array && array.count > 0) {
33
46
  NSMutableArray<DSQuadDrawingItem *> *items = [NSMutableArray array];
@@ -46,7 +59,7 @@ RCT_EXPORT_METHOD(setQuads:(nonnull NSNumber *)tag quadArray:(NSArray *)array la
46
59
 
47
60
  RCT_EXPORT_METHOD(getSelectedQuad:(nonnull NSNumber *)tag
48
61
  resolver:(RCTPromiseResolveBlock)resolve
49
- rejecter:(RCTPromiseRejectBlock)reject)
62
+ rejecter:(RCTPromiseRejectBlock)reject)
50
63
  {
51
64
  [self.bridge.uiManager addUIBlock:
52
65
  ^(__unused RCTUIManager *uiManager, NSDictionary<NSNumber *, UIView *> *viewRegistry) {
@@ -100,7 +113,7 @@ static void install(jsi::Runtime &jsiRuntime, RNDynamsoftImageEditorViewManager
100
113
  if (obj.isHostObject<ImageDataHostObject>(runtime)) {
101
114
  ImageDataHostObject hostObject = ImageDataHostObject::getHOFromObject(runtime, std::move(obj));
102
115
  DSImageData *data = [DSImageData imageDataFromHostObject:hostObject];
103
- [rnEditorViewManager setImageData:data toView:@(tag)];
116
+ [rnEditorViewManager trySetImageDataWithTag:@(tag) data:data attempt:1];
104
117
  return Value(true);
105
118
  }
106
119
  return Value(false);
@@ -109,15 +122,25 @@ static void install(jsi::Runtime &jsiRuntime, RNDynamsoftImageEditorViewManager
109
122
  jsiRuntime.global().setProperty(jsiRuntime, setOriginalImage, std::move(setOriginalImageFunc));
110
123
  }
111
124
 
112
- - (void)setImageData:(DSImageData *)data toView:(nonnull NSNumber *)tag {
113
- dispatch_async(dispatch_get_main_queue(), ^{
114
- UIView *view = [self.bridge.uiManager viewForReactTag:tag];
115
- if (!view || ![view isKindOfClass:[RNDynamsoftImageEditorView class]]) {
116
- RCTLogError(@"Cannot find RNDynamsoftImageEditorView with tag #%@", tag);
117
- } else {
118
- ((RNDynamsoftImageEditorView *)view).editorView.imageData = data;
119
- }
120
- });
125
+ - (void)trySetImageDataWithTag:(nonnull NSNumber *)tag data:(DSImageData *)data attempt:(NSInteger)attempt {
126
+ const NSInteger maxAttempts = 10;
127
+ const NSTimeInterval retryDelay = 0.1; // 100ms
128
+
129
+ [self.bridge.uiManager addUIBlock:
130
+ ^(__unused RCTUIManager *uiManager, NSDictionary<NSNumber *, UIView *> *viewRegistry) {
131
+ id view = viewRegistry[tag];
132
+ if (!view || ![view isKindOfClass:[RNDynamsoftImageEditorView class]]) {
133
+ if (attempt < maxAttempts) {
134
+ dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(retryDelay * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
135
+ [self trySetImageDataWithTag:tag data:data attempt:1];
136
+ });
137
+ } else {
138
+ RCTLogError(@"Cannot find RNDynamsoftImageEditorView with tag #%@ after %ld attempts", tag, (long)attempt);
139
+ }
140
+ } else {
141
+ ((RNDynamsoftImageEditorView *)view).editorView.imageData = data;
142
+ }
143
+ }];
121
144
  }
122
145
 
123
146
  @end