dynamsoft-capture-vision-react-native 3.0.5200 → 3.2.3000
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -2
- package/android/build.gradle +20 -10
- package/android/gradle.properties +3 -3
- package/android/src/main/cpp/JsiCore.cpp +1 -1
- package/android/src/main/cpp/JsiDbr.cpp +208 -23
- package/android/src/main/cpp/JsiDcp.cpp +1 -1
- package/android/src/main/cpp/JsiDlr.cpp +10 -1
- package/android/src/main/cpp/JsiUtility.cpp +470 -62
- package/android/src/main/cpp/JsiUtility.h +13 -3
- package/android/src/main/dysJniLibs/debug/arm64-v8a/librn_dys.so +0 -0
- package/android/src/main/dysJniLibs/debug/armeabi-v7a/librn_dys.so +0 -0
- package/android/src/main/dysJniLibs/debug/x86/librn_dys.so +0 -0
- package/android/src/main/dysJniLibs/debug/x86_64/librn_dys.so +0 -0
- package/android/src/main/dysJniLibs/release/arm64-v8a/librn_dys.so +0 -0
- package/android/src/main/dysJniLibs/release/armeabi-v7a/librn_dys.so +0 -0
- package/android/src/main/dysJniLibs/release/x86/librn_dys.so +0 -0
- package/android/src/main/dysJniLibs/release/x86_64/librn_dys.so +0 -0
- package/android/src/main/dysJniLibsFor81/debug/arm64-v8a/librn_dys.so +0 -0
- package/android/src/main/dysJniLibsFor81/debug/armeabi-v7a/librn_dys.so +0 -0
- package/android/src/main/dysJniLibsFor81/debug/x86/librn_dys.so +0 -0
- package/android/src/main/dysJniLibsFor81/debug/x86_64/librn_dys.so +0 -0
- package/android/src/main/dysJniLibsFor81/release/arm64-v8a/librn_dys.so +0 -0
- package/android/src/main/dysJniLibsFor81/release/armeabi-v7a/librn_dys.so +0 -0
- package/android/src/main/dysJniLibsFor81/release/x86/librn_dys.so +0 -0
- package/android/src/main/dysJniLibsFor81/release/x86_64/librn_dys.so +0 -0
- package/android/src/main/dysJniLibsFor82/debug/arm64-v8a/librn_dys.so +0 -0
- package/android/src/main/dysJniLibsFor82/debug/armeabi-v7a/librn_dys.so +0 -0
- package/android/src/main/dysJniLibsFor82/debug/x86/librn_dys.so +0 -0
- package/android/src/main/dysJniLibsFor82/debug/x86_64/librn_dys.so +0 -0
- package/android/src/main/dysJniLibsFor82/release/arm64-v8a/librn_dys.so +0 -0
- package/android/src/main/dysJniLibsFor82/release/armeabi-v7a/librn_dys.so +0 -0
- package/android/src/main/dysJniLibsFor82/release/x86/librn_dys.so +0 -0
- package/android/src/main/dysJniLibsFor82/release/x86_64/librn_dys.so +0 -0
- package/android/src/main/java/com/dynamsoft/reactnativelib/CVRModule.kt +17 -2
- package/android/src/main/java/com/dynamsoft/reactnativelib/CameraViewManager.kt +13 -1
- package/android/src/main/java/com/dynamsoft/reactnativelib/ImageEditorViewManager.kt +1 -1
- package/android/src/main/java/com/dynamsoft/reactnativelib/{utils → basicutils}/Basic.kt +1 -1
- package/android/src/main/java/com/dynamsoft/reactnativelib/{utils → basicutils}/ForCore.kt +1 -2
- package/android/src/main/java/com/dynamsoft/reactnativelib/{utils → basicutils}/ForCvr.kt +1 -5
- package/android/src/main/java/com/dynamsoft/reactnativelib/{utils → basicutils}/ForDBR.kt +74 -3
- package/android/src/main/java/com/dynamsoft/reactnativelib/{utils → basicutils}/ForDCE.kt +33 -13
- package/android/src/main/java/com/dynamsoft/reactnativelib/{utils → basicutils}/ForDCP.kt +1 -1
- package/android/src/main/java/com/dynamsoft/reactnativelib/{utils → basicutils}/ForDDN.kt +1 -3
- package/android/src/main/java/com/dynamsoft/reactnativelib/{utils → basicutils}/ForDLR.kt +6 -3
- package/android/src/main/java/com/dynamsoft/reactnativelib/{utils → basicutils}/ImageUtil.kt +2 -2
- package/android/src/main/java/com/dynamsoft/reactnativelib/cvr/CaptureVisionRouterModuleImpl.kt +25 -5
- package/android/src/main/java/com/dynamsoft/reactnativelib/dce/CameraEnhancerModuleImpl.kt +6 -3
- package/android/src/main/java/com/dynamsoft/reactnativelib/dce/CameraViewManagerImpl.kt +15 -3
- package/android/src/main/java/com/dynamsoft/reactnativelib/dce/ImageEditorViewManagerImpl.kt +1 -5
- package/android/src/main/java/com/dynamsoft/reactnativelib/dce/ImageEditorViewModuleImpl.kt +2 -4
- package/android/src/main/java/com/dynamsoft/reactnativelib/dce/RNCameraView.kt +1 -2
- package/android/src/main/java/com/dynamsoft/reactnativelib/utility/ImageManagerModuleImpl.kt +75 -3
- package/android/src/main/java/com/dynamsoft/reactnativelib/utility/MultiCrossFilterModuleImpl.kt +2 -2
- package/dynamsoft-capture-vision-react-native.podspec +1 -1
- package/ios/CPP/ImageDataHostObject.cpp +1 -1
- package/ios/CPP/ImageDataHostObject.hpp +1 -1
- package/ios/CPP/RNDynamsoft+JSI.h +3 -0
- package/ios/CPP/RNDynamsoft+JSI.mm +119 -2
- package/ios/CPP/RNDynamsoft+Json.m +114 -14
- package/ios/CPP/YeetJSIUtils.h +2 -0
- package/ios/CPP/YeetJSIUtils.mm +15 -0
- package/ios/RNDynamsoftCameraView.h +4 -0
- package/ios/RNDynamsoftCameraView.m +25 -0
- package/ios/RNDynamsoftCameraViewManager.m +8 -2
- package/ios/RNDynamsoftCaptureVisionRouter.mm +149 -92
- package/ios/RNDynamsoftImageEditorViewManager.mm +71 -40
- package/ios/RNDynamsoftImageManager.mm +295 -81
- package/ios/RNDynamsoftImageSourceAdapter.mm +100 -65
- package/package.json +1 -1
- package/src/core/EnumGrayscaleEnhancementMode.tsx +1 -0
- package/src/core/EnumGrayscaleTransformationMode.tsx +1 -0
- package/src/core/EnumImageFileFormat.tsx +6 -0
- package/src/core/index.tsx +1 -0
- package/src/cvr/CaptureVisionRouter.tsx +33 -5
- package/src/dbr/BarcodeDetails.tsx +51 -0
- package/src/dbr/BarcodeResultItem.tsx +11 -0
- package/src/dbr/EnumBarcodeFormat.tsx +2 -0
- package/src/dbr/EnumDeblurMode.tsx +1 -0
- package/src/dbr/EnumLocalizationMode.tsx +1 -0
- package/src/dbr/EnumQRCodeErrorCorrectionLevel.tsx +6 -0
- package/src/dbr/index.tsx +2 -0
- package/src/dce/CameraEnhancer.tsx +14 -6
- package/src/dce/CameraView.tsx +10 -2
- package/src/dce/DynamsoftCameraViewNativeComponent.ts +25 -0
- package/src/dce/EnumCameraPosition.tsx +13 -1
- package/src/dce/EnumEnhancedFeatures.tsx +3 -4
- package/src/dce/ImageEditorView.tsx +1 -1
- package/src/dlr/CharacterResult.tsx +4 -1
- package/src/dlr/SimplifiedLabelRecognizerSettings.tsx +2 -0
- package/src/dlr/TextLineResultItem.tsx +5 -0
- package/src/utility/EnumFilterType.tsx +5 -0
- package/src/utility/ImageManager.tsx +227 -9
- package/src/utility/index.tsx +1 -0
|
@@ -51,6 +51,28 @@ RCT_EXPORT_MODULE(DynamsoftCaptureVisionRouterModule)
|
|
|
51
51
|
_cvr = nil;
|
|
52
52
|
}
|
|
53
53
|
|
|
54
|
+
RCT_EXPORT_METHOD(setGlobalIntraOpNumThreads:(NSInteger)intraOpNumThreads) {
|
|
55
|
+
[DSCaptureVisionRouter setGlobalIntraOpNumThreads:intraOpNumThreads];
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
RCT_EXPORT_METHOD(clearDLModelBuffers) {
|
|
59
|
+
[DSCaptureVisionRouter clearDLModelBuffers];
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
RCT_EXPORT_METHOD(switchCapturingTemplate:(NSString *)templateName
|
|
63
|
+
resolve:(RCTPromiseResolveBlock)resolve
|
|
64
|
+
rejecter: (RCTPromiseRejectBlock)reject)
|
|
65
|
+
{
|
|
66
|
+
NSError *error = nil;
|
|
67
|
+
[self.cvr switchCapturingTemplate:templateName error:&error];
|
|
68
|
+
if (error) {
|
|
69
|
+
NSString *code = [NSString stringWithFormat:@"%ld",(long)error.code];
|
|
70
|
+
reject(code, error.localizedDescription, error);
|
|
71
|
+
} else {
|
|
72
|
+
resolve(@(true));
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
54
76
|
RCT_EXPORT_METHOD(startCapturing:(NSString *)templateName
|
|
55
77
|
resolve:(RCTPromiseResolveBlock)resolve
|
|
56
78
|
rejecter: (RCTPromiseRejectBlock)reject)
|
|
@@ -333,7 +355,8 @@ RCT_EXPORT_METHOD(removeFilter:(NSString *)key) {
|
|
|
333
355
|
return [[self.cvr getIntermediateResultManager] getOriginalImage:imageHashId];
|
|
334
356
|
}
|
|
335
357
|
|
|
336
|
-
#pragma mark -
|
|
358
|
+
#pragma mark - Global JSI
|
|
359
|
+
// --- RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(install) ---
|
|
337
360
|
RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(install)
|
|
338
361
|
{
|
|
339
362
|
RCTBridge* bridge = [RCTBridge currentBridge];
|
|
@@ -350,110 +373,144 @@ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(install)
|
|
|
350
373
|
return @true;
|
|
351
374
|
}
|
|
352
375
|
|
|
376
|
+
// --- Helper Functions and Macros ---
|
|
377
|
+
static void installHostFunction(
|
|
378
|
+
jsi::Runtime &jsiRuntime,
|
|
379
|
+
const char* name,
|
|
380
|
+
size_t argCount,
|
|
381
|
+
HostFunctionType hostFunction) {
|
|
382
|
+
|
|
383
|
+
auto func = Function::createFromHostFunction(
|
|
384
|
+
jsiRuntime,
|
|
385
|
+
PropNameID::forAscii(jsiRuntime, name),
|
|
386
|
+
argCount,
|
|
387
|
+
std::move(hostFunction)
|
|
388
|
+
);
|
|
389
|
+
jsiRuntime.global().setProperty(jsiRuntime, name, std::move(func));
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
// --- JSI Installation Logic ---
|
|
353
393
|
static void install(jsi::Runtime &jsiRuntime, RNDynamsoftCaptureVisionRouter *rnCapture) {
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
394
|
+
|
|
395
|
+
// 1. captureImageData(imageDataHostObject, templateName)
|
|
396
|
+
installHostFunction(jsiRuntime, "captureImageData", 2,
|
|
397
|
+
[rnCapture](Runtime &runtime, const Value &thisValue, const Value *arguments, size_t count) -> Value {
|
|
398
|
+
// Argument check
|
|
399
|
+
if (count != 2 || !arguments[1].isString() || !arguments[0].isObject()) {
|
|
400
|
+
return Value(false); // Or throw a JSI exception
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
NSString *name = convertJSIStringToNSString(runtime, arguments[1].getString(runtime));
|
|
404
|
+
Object obj = arguments[0].getObject(runtime);
|
|
405
|
+
|
|
406
|
+
if (obj.isHostObject<ImageDataHostObject>(runtime)) {
|
|
407
|
+
// Assuming ImageDataHostObject::getHOFromObject returns a non-owning copy or reference
|
|
408
|
+
ImageDataHostObject hostObject = ImageDataHostObject::getHOFromObject(runtime, obj);
|
|
409
|
+
|
|
410
|
+
// Get the Objective-C object from the HostObject
|
|
411
|
+
DSImageData *data = [DSImageData imageDataFromHostObject:hostObject];
|
|
412
|
+
|
|
413
|
+
DSCapturedResult *result = [rnCapture.cvr captureFromBuffer:data templateName:name];
|
|
414
|
+
return [result convertToJSIObject:runtime];
|
|
415
|
+
}
|
|
416
|
+
return Value(false);
|
|
417
|
+
}
|
|
418
|
+
);
|
|
419
|
+
|
|
420
|
+
// 2. captureFile(filePath, templateName)
|
|
421
|
+
installHostFunction(jsiRuntime, "captureFile", 2,
|
|
422
|
+
[rnCapture](Runtime &runtime, const Value &thisValue, const Value *arguments, size_t count) -> Value {
|
|
423
|
+
// Argument check
|
|
424
|
+
if (count != 2 || !arguments[0].isString() || !arguments[1].isString()) {
|
|
425
|
+
return Value(false);
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
NSString *file = convertJSIStringToNSString(runtime, arguments[0].getString(runtime));
|
|
429
|
+
NSString *name = convertJSIStringToNSString(runtime, arguments[1].getString(runtime));
|
|
430
|
+
|
|
431
|
+
DSCapturedResult *result = [rnCapture.cvr captureFromFile:file templateName:name];
|
|
368
432
|
return [result convertToJSIObject:runtime];
|
|
369
433
|
}
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
[rnCapture](Runtime &runtime,
|
|
394
|
-
const Value &thisValue,
|
|
395
|
-
const Value *arguments,
|
|
396
|
-
size_t count) -> Value {
|
|
397
|
-
ArrayBuffer buffer = arguments[0].asObject(runtime).getArrayBuffer(runtime);
|
|
398
|
-
NSData *data = convertArrayBufferToNSData(runtime, buffer);
|
|
399
|
-
NSString *name = convertJSIStringToNSString(runtime, arguments[1].getString(runtime));
|
|
400
|
-
DSCapturedResult *result = [rnCapture.cvr captureFromFileBytes:data templateName:name];
|
|
401
|
-
return [result convertToJSIObject:runtime];
|
|
402
|
-
});
|
|
403
|
-
jsiRuntime.global().setProperty(jsiRuntime, captureFileBytes, std::move(captureFileBytesFunc));
|
|
434
|
+
);
|
|
435
|
+
|
|
436
|
+
// 3. captureFileBytes(arrayBuffer, templateName)
|
|
437
|
+
installHostFunction(jsiRuntime, "captureFileBytes", 2,
|
|
438
|
+
[rnCapture](Runtime &runtime, const Value &thisValue, const Value *arguments, size_t count) -> Value {
|
|
439
|
+
// Argument check
|
|
440
|
+
if (count != 2 || !arguments[0].isObject() || !arguments[1].isString()) {
|
|
441
|
+
return Value(false);
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
Object obj = arguments[0].asObject(runtime);
|
|
445
|
+
if (!obj.isArrayBuffer(runtime)) {
|
|
446
|
+
return Value(false);
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
ArrayBuffer buffer = obj.getArrayBuffer(runtime);
|
|
450
|
+
NSData *data = convertArrayBufferToNSData(runtime, buffer);
|
|
451
|
+
NSString *name = convertJSIStringToNSString(runtime, arguments[1].getString(runtime));
|
|
452
|
+
|
|
453
|
+
DSCapturedResult *result = [rnCapture.cvr captureFromFileBytes:data templateName:name];
|
|
454
|
+
return [result convertToJSIObject:runtime];
|
|
455
|
+
}
|
|
456
|
+
);
|
|
404
457
|
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
[rnCapture](Runtime &runtime,
|
|
410
|
-
const Value &thisValue,
|
|
411
|
-
const Value *arguments,
|
|
412
|
-
size_t count) -> Value {
|
|
413
|
-
NSMutableArray<DSImageData *> *imageDataArray = rnCapture.deskewedImageDataArray;
|
|
458
|
+
// --- Image Data Array Accessors ---
|
|
459
|
+
|
|
460
|
+
// Generic lambda for getting a list of images (deskewed or enhanced)
|
|
461
|
+
auto getImageArrayFunc = [rnCapture](Runtime &runtime, NSArray<DSImageData *> *imageDataArray) -> Value {
|
|
414
462
|
Array array(runtime, imageDataArray.count);
|
|
415
463
|
for (int i = 0; i < imageDataArray.count; i++) {
|
|
464
|
+
// Create a new JSI Host Object wrapping the existing Objective-C object's data
|
|
465
|
+
// This assumes ImageDataHostObject has a suitable constructor/initialization.
|
|
416
466
|
ImageDataHostObject hostObject = [[imageDataArray objectAtIndex:i] hostObject];
|
|
417
467
|
Object obj = Object::createFromHostObject(runtime, std::make_shared<ImageDataHostObject>(hostObject));
|
|
418
468
|
array.setValueAtIndex(runtime, i, obj);
|
|
419
469
|
}
|
|
420
470
|
return array;
|
|
421
|
-
}
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
471
|
+
};
|
|
472
|
+
|
|
473
|
+
// 4. getCurrentDeskewedImages()
|
|
474
|
+
installHostFunction(jsiRuntime, "getCurrentDeskewedImages", 0,
|
|
475
|
+
[rnCapture, getImageArrayFunc](Runtime &runtime, const Value &thisValue, const Value *arguments, size_t count) -> Value {
|
|
476
|
+
if (count != 0) {
|
|
477
|
+
return Value(Array(runtime, 0));
|
|
478
|
+
}
|
|
479
|
+
return getImageArrayFunc(runtime, rnCapture.deskewedImageDataArray);
|
|
480
|
+
}
|
|
481
|
+
);
|
|
482
|
+
|
|
483
|
+
// 5. getCurrentEnhancedImages()
|
|
484
|
+
installHostFunction(jsiRuntime, "getCurrentEnhancedImages", 0,
|
|
485
|
+
[rnCapture, getImageArrayFunc](Runtime &runtime, const Value &thisValue, const Value *arguments, size_t count) -> Value {
|
|
486
|
+
if (count != 0) {
|
|
487
|
+
return Value(Array(runtime, 0));
|
|
488
|
+
}
|
|
489
|
+
return getImageArrayFunc(runtime, rnCapture.enhancedImageDataArray);
|
|
490
|
+
}
|
|
491
|
+
);
|
|
492
|
+
|
|
493
|
+
// 6. cvr_getOriginalImage(imageHashId)
|
|
494
|
+
installHostFunction(jsiRuntime, "cvr_getOriginalImage", 1,
|
|
495
|
+
[rnCapture](Runtime &runtime, const Value &thisValue, const Value *arguments, size_t count) -> Value {
|
|
496
|
+
// Argument check
|
|
497
|
+
if (count != 1 || !arguments[0].isString()) {
|
|
498
|
+
return Value::null(); // Or Value(false) depending on expected JS behavior
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
NSString *imageHashId = convertJSIStringToNSString(runtime, arguments[0].getString(runtime));
|
|
502
|
+
|
|
503
|
+
DSImageData *imageData = [rnCapture getOriginalImage:imageHashId];
|
|
504
|
+
if (imageData == nil) {
|
|
505
|
+
return Value::null();
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
ImageDataHostObject hostObject = [imageData hostObject];
|
|
509
|
+
// Create a new JSI Host Object wrapper
|
|
436
510
|
Object obj = Object::createFromHostObject(runtime, std::make_shared<ImageDataHostObject>(hostObject));
|
|
437
|
-
|
|
511
|
+
return obj;
|
|
438
512
|
}
|
|
439
|
-
|
|
440
|
-
});
|
|
441
|
-
jsiRuntime.global().setProperty(jsiRuntime, getCurrentEnhancedImages, std::move(getCurrentEnhancedImagesFunc));
|
|
442
|
-
|
|
443
|
-
const char* getOriginalImage = "cvr_getOriginalImage";
|
|
444
|
-
auto getOriginalImageFunc = Function::createFromHostFunction(jsiRuntime,
|
|
445
|
-
PropNameID::forAscii(jsiRuntime, getOriginalImage),
|
|
446
|
-
1,
|
|
447
|
-
[rnCapture](Runtime &runtime,
|
|
448
|
-
const Value &thisValue,
|
|
449
|
-
const Value *arguments,
|
|
450
|
-
size_t count) -> Value {
|
|
451
|
-
NSString *imageHashId = convertJSIStringToNSString(runtime, arguments[0].getString(runtime));
|
|
452
|
-
ImageDataHostObject hostObject = [[rnCapture getOriginalImage:imageHashId] hostObject];
|
|
453
|
-
Object obj = Object::createFromHostObject(runtime, std::make_shared<ImageDataHostObject>(hostObject));
|
|
454
|
-
return obj;
|
|
455
|
-
});
|
|
456
|
-
jsiRuntime.global().setProperty(jsiRuntime, getOriginalImage, std::move(getOriginalImageFunc));
|
|
513
|
+
);
|
|
457
514
|
}
|
|
458
515
|
|
|
459
516
|
@end
|
|
@@ -81,7 +81,29 @@ RCT_EXPORT_METHOD(getSelectedQuad:(nonnull NSNumber *)tag
|
|
|
81
81
|
}];
|
|
82
82
|
}
|
|
83
83
|
|
|
84
|
-
|
|
84
|
+
- (void)trySetImageDataWithTag:(nonnull NSNumber *)tag data:(DSImageData *)data attempt:(NSInteger)attempt {
|
|
85
|
+
const NSInteger maxAttempts = 10;
|
|
86
|
+
const NSTimeInterval retryDelay = 0.1; // 100ms
|
|
87
|
+
|
|
88
|
+
[self.bridge.uiManager addUIBlock:
|
|
89
|
+
^(__unused RCTUIManager *uiManager, NSDictionary<NSNumber *, UIView *> *viewRegistry) {
|
|
90
|
+
id view = viewRegistry[tag];
|
|
91
|
+
if (!view || ![view isKindOfClass:[RNDynamsoftImageEditorView class]]) {
|
|
92
|
+
if (attempt < maxAttempts) {
|
|
93
|
+
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(retryDelay * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
|
|
94
|
+
[self trySetImageDataWithTag:tag data:data attempt:1];
|
|
95
|
+
});
|
|
96
|
+
} else {
|
|
97
|
+
RCTLogError(@"Cannot find RNDynamsoftImageEditorView with tag #%@ after %ld attempts", tag, (long)attempt);
|
|
98
|
+
}
|
|
99
|
+
} else {
|
|
100
|
+
((RNDynamsoftImageEditorView *)view).editorView.imageData = data;
|
|
101
|
+
}
|
|
102
|
+
}];
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
#pragma mark - Global JSI
|
|
106
|
+
// --- RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(install) ---
|
|
85
107
|
RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(install)
|
|
86
108
|
{
|
|
87
109
|
RCTBridge* bridge = [RCTBridge currentBridge];
|
|
@@ -98,49 +120,58 @@ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(install)
|
|
|
98
120
|
return @true;
|
|
99
121
|
}
|
|
100
122
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
const Value &thisValue,
|
|
108
|
-
const Value *arguments,
|
|
109
|
-
size_t count) -> Value {
|
|
110
|
-
|
|
111
|
-
double tag = arguments[0].getNumber();
|
|
112
|
-
Object obj = arguments[1].getObject(runtime);
|
|
113
|
-
if (obj.isHostObject<ImageDataHostObject>(runtime)) {
|
|
114
|
-
ImageDataHostObject hostObject = ImageDataHostObject::getHOFromObject(runtime, std::move(obj));
|
|
115
|
-
DSImageData *data = [DSImageData imageDataFromHostObject:hostObject];
|
|
116
|
-
[rnEditorViewManager trySetImageDataWithTag:@(tag) data:data attempt:1];
|
|
117
|
-
return Value(true);
|
|
118
|
-
}
|
|
119
|
-
return Value(false);
|
|
120
|
-
});
|
|
123
|
+
// --- Helper Function (Assumed to be accessible, copied here for completeness) ---
|
|
124
|
+
static void installHostFunction(
|
|
125
|
+
jsi::Runtime &jsiRuntime,
|
|
126
|
+
const char* name,
|
|
127
|
+
size_t argCount,
|
|
128
|
+
HostFunctionType hostFunction) {
|
|
121
129
|
|
|
122
|
-
|
|
130
|
+
auto func = Function::createFromHostFunction(
|
|
131
|
+
jsiRuntime,
|
|
132
|
+
PropNameID::forAscii(jsiRuntime, name),
|
|
133
|
+
argCount,
|
|
134
|
+
std::move(hostFunction)
|
|
135
|
+
);
|
|
136
|
+
jsiRuntime.global().setProperty(jsiRuntime, name, std::move(func));
|
|
123
137
|
}
|
|
124
138
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
const NSTimeInterval retryDelay = 0.1; // 100ms
|
|
139
|
+
// --- JSI Installation Logic ---
|
|
140
|
+
static void install(jsi::Runtime &jsiRuntime, RNDynamsoftImageEditorViewManager *rnEditorViewManager) {
|
|
128
141
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
142
|
+
// 1. editorView_setOriginalImage(viewTag, imageDataHostObject)
|
|
143
|
+
installHostFunction(jsiRuntime, "editorView_setOriginalImage", 2,
|
|
144
|
+
[rnEditorViewManager](Runtime &runtime, const Value &thisValue, const Value *arguments, size_t count) -> Value {
|
|
145
|
+
|
|
146
|
+
// 🔍 Argument Validation & Type Check (Optimized)
|
|
147
|
+
if (count != 2 || !arguments[0].isNumber() || !arguments[1].isObject()) {
|
|
148
|
+
// Should potentially throw an exception for incorrect usage,
|
|
149
|
+
// but returning Value(false) keeps it consistent with original code style.
|
|
150
|
+
return Value(false);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// Extract View Tag (JS number)
|
|
154
|
+
double tag = arguments[0].getNumber();
|
|
155
|
+
NSNumber *viewTag = @(tag); // Convert to NSNumber for Objective-C method
|
|
156
|
+
|
|
157
|
+
// Extract Image Data Host Object (Requires runtime for getObject)
|
|
158
|
+
Object obj = arguments[1].getObject(runtime);
|
|
159
|
+
|
|
160
|
+
// Check if it's the specific Host Object type (Requires runtime for isHostObject)
|
|
161
|
+
if (obj.isHostObject<ImageDataHostObject>(runtime)) {
|
|
162
|
+
// Safely convert Host Object to DSImageData
|
|
163
|
+
ImageDataHostObject hostObject = ImageDataHostObject::getHOFromObject(runtime, obj);
|
|
164
|
+
DSImageData *data = [DSImageData imageDataFromHostObject:hostObject];
|
|
165
|
+
|
|
166
|
+
// Call the Objective-C View Manager method
|
|
167
|
+
[rnEditorViewManager trySetImageDataWithTag:viewTag data:data attempt:1];
|
|
168
|
+
|
|
169
|
+
return Value(true);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
return Value(false);
|
|
173
|
+
}
|
|
174
|
+
);
|
|
144
175
|
}
|
|
145
176
|
|
|
146
177
|
@end
|