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,604 +1,604 @@
|
|
|
1
|
-
//
|
|
2
|
-
// Created by Allen on 24/09/23.
|
|
3
|
-
//
|
|
4
|
-
|
|
5
|
-
#include "JsiUtility.h"
|
|
6
|
-
#include "RawBuffer.h"
|
|
7
|
-
|
|
8
|
-
jobject jImageManagerModule = nullptr;
|
|
9
|
-
jclass jclzQuad = nullptr;
|
|
10
|
-
jclass jclzPoint = nullptr;
|
|
11
|
-
jclass jclzDSRect = nullptr;
|
|
12
|
-
|
|
13
|
-
using namespace facebook::jsi;
|
|
14
|
-
|
|
15
|
-
jobject jsPointToJobject(Runtime &rt, JNIEnv *env, Object jsPoint) {
|
|
16
|
-
if (jsPoint.hasProperty(rt, "x") && jsPoint.hasProperty(rt, "y")) {
|
|
17
|
-
int x = jsPoint.getProperty(rt, "x").asNumber();
|
|
18
|
-
int y = jsPoint.getProperty(rt, "y").asNumber();
|
|
19
|
-
jmethodID init = env->GetMethodID(jclzPoint, "<init>", "(II)V");
|
|
20
|
-
jobject jPoint = env->NewObject(jclzPoint, init, x, y);
|
|
21
|
-
return jPoint;
|
|
22
|
-
}
|
|
23
|
-
return nullptr;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
jobject jsQuadToJobject(Runtime &rt, JNIEnv *env, Object &jsQuad) {
|
|
27
|
-
if (jsQuad.hasProperty(rt, "points")) {
|
|
28
|
-
auto jsPoints = jsQuad.getProperty(rt, "points").asObject(rt).asArray(rt);
|
|
29
|
-
int count = jsPoints.length(rt);
|
|
30
|
-
auto jPoints = env->NewObjectArray(count, jclzPoint, nullptr);
|
|
31
|
-
for (int i = 0; i < count; ++i) {
|
|
32
|
-
auto jPoint = jsPointToJobject(rt, env, jsPoints.getValueAtIndex(rt, i).asObject(rt));
|
|
33
|
-
env->SetObjectArrayElement(jPoints, i, jPoint);
|
|
34
|
-
env->DeleteLocalRef(jPoint);
|
|
35
|
-
}
|
|
36
|
-
auto initQuad = env->GetMethodID(jclzQuad, "<init>", "()V");
|
|
37
|
-
auto fieldId_points = env->GetFieldID(jclzQuad, "points", "[Landroid/graphics/Point;");
|
|
38
|
-
auto jQuad = env->NewObject(jclzQuad, initQuad);
|
|
39
|
-
env->SetObjectField(jQuad, fieldId_points, jPoints);
|
|
40
|
-
return jQuad;
|
|
41
|
-
}
|
|
42
|
-
return nullptr;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
jobjectArray jsQuadArrayToJobjectArray(Runtime &rt, JNIEnv *env, Array &jsQuads) {
|
|
46
|
-
int count = jsQuads.length(rt);
|
|
47
|
-
jobjectArray jQuads = env->NewObjectArray(count, jclzQuad, nullptr);
|
|
48
|
-
for (int i = 0; i < count; ++i) {
|
|
49
|
-
auto jsQuad = jsQuads.getValueAtIndex(rt, i).asObject(rt);
|
|
50
|
-
auto jQuad = jsQuadToJobject(rt, env, jsQuad);
|
|
51
|
-
env->SetObjectArrayElement(jQuads, i, jQuad);
|
|
52
|
-
env->DeleteLocalRef(jQuad);
|
|
53
|
-
}
|
|
54
|
-
return jQuads;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
jobject jsDsRectToJobject(Runtime &rt, JNIEnv *env, Object &jsDSRect) {
|
|
58
|
-
if (!jsDSRect.hasProperty(rt, "left") || !jsDSRect.hasProperty(rt, "top") || !jsDSRect.hasProperty(rt, "right") || !jsDSRect.hasProperty(rt, "bottom") ||
|
|
59
|
-
!jsDSRect.hasProperty(rt, "measuredInPercentage")) {
|
|
60
|
-
return nullptr;
|
|
61
|
-
}
|
|
62
|
-
float top = (float) jsDSRect.getProperty(rt, "top").asNumber();
|
|
63
|
-
float left = (float) jsDSRect.getProperty(rt, "left").asNumber();
|
|
64
|
-
float bottom = (float) jsDSRect.getProperty(rt, "bottom").asNumber();
|
|
65
|
-
float right = (float) jsDSRect.getProperty(rt, "right").asNumber();
|
|
66
|
-
bool measuredInPercentage = jsDSRect.getProperty(rt, "measuredInPercentage").asBool();
|
|
67
|
-
jmethodID init = env->GetMethodID(jclzDSRect, "<init>", "(FFFFZ)V");
|
|
68
|
-
jobject jDSRect = env->NewObject(jclzDSRect, init, left, top, right, bottom, measuredInPercentage);
|
|
69
|
-
return jDSRect;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
void saveImageDataHOToFile(Runtime &rt, ImageDataHostObject &imageDataHO, string filePath, bool overWrite) {
|
|
74
|
-
JNIEnv *env;
|
|
75
|
-
bool needDetach = false;
|
|
76
|
-
int state = gJvm->GetEnv((void **) &env, JNI_VERSION_1_6);
|
|
77
|
-
if (state == JNI_EDETACHED || env == nullptr) {
|
|
78
|
-
gJvm->AttachCurrentThread(&env, nullptr);
|
|
79
|
-
needDetach = true;
|
|
80
|
-
}
|
|
81
|
-
jclass clz = env->GetObjectClass(jImageManagerModule);
|
|
82
|
-
jmethodID methodId = env->GetMethodID(clz, "saveToFileCalledInJsi", "(Lcom/dynamsoft/core/basic_structures/ImageData;Ljava/lang/String;Z)V");
|
|
83
|
-
auto jImageData = jsiConversion::core::getJImageDataFromHO(env, imageDataHO);
|
|
84
|
-
env->CallVoidMethod(jImageManagerModule, methodId, jImageData, env->NewStringUTF(filePath.c_str()), overWrite);
|
|
85
|
-
env->DeleteLocalRef(clz);
|
|
86
|
-
env->DeleteLocalRef(jImageData);
|
|
87
|
-
if (needDetach) {
|
|
88
|
-
gJvm->DetachCurrentThread();
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
ImageDataHostObject readImageDataHOFromFile(Runtime &rt, string filePath) {
|
|
93
|
-
JNIEnv *env;
|
|
94
|
-
bool needDetach = false;
|
|
95
|
-
int state = gJvm->GetEnv((void **) &env, JNI_VERSION_1_6);
|
|
96
|
-
if (state == JNI_EDETACHED || env == nullptr) {
|
|
97
|
-
gJvm->AttachCurrentThread(&env, nullptr);
|
|
98
|
-
needDetach = true;
|
|
99
|
-
}
|
|
100
|
-
jclass clz = env->GetObjectClass(jImageManagerModule);
|
|
101
|
-
jmethodID methodId = env->GetMethodID(clz, "readFromFileCalledInJsi", "(Ljava/lang/String;)Lcom/dynamsoft/core/basic_structures/ImageData;");
|
|
102
|
-
jstring jFilePath = env->NewStringUTF(filePath.c_str());
|
|
103
|
-
auto jImageData = env->CallObjectMethod(jImageManagerModule, methodId, jFilePath);
|
|
104
|
-
ImageDataHostObject imageHO;
|
|
105
|
-
jsiConversion::core::getHOFromJImageData(env, jImageData, imageHO);
|
|
106
|
-
env->DeleteLocalRef(clz);
|
|
107
|
-
env->DeleteLocalRef(jFilePath);
|
|
108
|
-
env->DeleteLocalRef(jImageData);
|
|
109
|
-
if (needDetach) {
|
|
110
|
-
gJvm->DetachCurrentThread();
|
|
111
|
-
}
|
|
112
|
-
return imageHO;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
ImageDataHostObject readImageDataHOFromMemory(Runtime &rt, unsigned char *buffer, int bufferSize) {
|
|
116
|
-
JNIEnv *env;
|
|
117
|
-
bool needDetach = false;
|
|
118
|
-
int state = gJvm->GetEnv((void **) &env, JNI_VERSION_1_6);
|
|
119
|
-
if (state == JNI_EDETACHED || env == nullptr) {
|
|
120
|
-
gJvm->AttachCurrentThread(&env, nullptr);
|
|
121
|
-
needDetach = true;
|
|
122
|
-
}
|
|
123
|
-
jclass clz = env->GetObjectClass(jImageManagerModule);
|
|
124
|
-
jmethodID methodId = env->GetMethodID(clz, "readFromMemoryCalledInJsi", "([B)Lcom/dynamsoft/core/basic_structures/ImageData;");
|
|
125
|
-
auto jBuffer = env->NewByteArray(bufferSize);
|
|
126
|
-
env->SetByteArrayRegion(jBuffer, 0, bufferSize, (jbyte *) buffer);
|
|
127
|
-
auto jImageData = env->CallObjectMethod(jImageManagerModule, methodId, jBuffer);
|
|
128
|
-
ImageDataHostObject imageHO;
|
|
129
|
-
jsiConversion::core::getHOFromJImageData(env, jImageData, imageHO);
|
|
130
|
-
env->DeleteLocalRef(clz);
|
|
131
|
-
env->DeleteLocalRef(jBuffer);
|
|
132
|
-
env->DeleteLocalRef(jImageData);
|
|
133
|
-
if (needDetach) {
|
|
134
|
-
gJvm->DetachCurrentThread();
|
|
135
|
-
}
|
|
136
|
-
return imageHO;
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
ArrayBuffer saveImageDataHOToMemory(Runtime &rt, ImageDataHostObject &imageDataHO, int fileFormat) {
|
|
140
|
-
JNIEnv *env;
|
|
141
|
-
bool needDetach = false;
|
|
142
|
-
int state = gJvm->GetEnv((void **) &env, JNI_VERSION_1_6);
|
|
143
|
-
if (state == JNI_EDETACHED || env == nullptr) {
|
|
144
|
-
gJvm->AttachCurrentThread(&env, nullptr);
|
|
145
|
-
needDetach = true;
|
|
146
|
-
}
|
|
147
|
-
jclass clz = env->GetObjectClass(jImageManagerModule);
|
|
148
|
-
jmethodID methodId = env->GetMethodID(clz, "saveToMemoryCalledInJsi", "(Lcom/dynamsoft/core/basic_structures/ImageData;I)[B");
|
|
149
|
-
auto jImageData = jsiConversion::core::getJImageDataFromHO(env, imageDataHO);
|
|
150
|
-
auto jBuffer = (jbyteArray) env->CallObjectMethod(jImageManagerModule, methodId, jImageData, fileFormat);
|
|
151
|
-
auto pBuffer = (uint8_t *) env->GetByteArrayElements(jBuffer, nullptr);
|
|
152
|
-
int bufferSize = env->GetArrayLength(jBuffer);
|
|
153
|
-
auto mutableBuffer = std::make_shared<MutableRawBuffer>(pBuffer, bufferSize, false);
|
|
154
|
-
ArrayBuffer arrayBuffer(rt, mutableBuffer);
|
|
155
|
-
env->DeleteLocalRef(clz);
|
|
156
|
-
env->DeleteLocalRef(jImageData);
|
|
157
|
-
return arrayBuffer;
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
ImageDataHostObject drawOnImage(Runtime &rt, ImageDataHostObject &imageDataHO, Array &jsQuads, int color, int thickness) {
|
|
161
|
-
JNIEnv *env;
|
|
162
|
-
bool needDetach = false;
|
|
163
|
-
int state = gJvm->GetEnv((void **) &env, JNI_VERSION_1_6);
|
|
164
|
-
if (state == JNI_EDETACHED || env == nullptr) {
|
|
165
|
-
gJvm->AttachCurrentThread(&env, nullptr);
|
|
166
|
-
needDetach = true;
|
|
167
|
-
}
|
|
168
|
-
jclass clz = env->GetObjectClass(jImageManagerModule);
|
|
169
|
-
jmethodID methodId = env->GetMethodID(clz, "drawOnImageCalledInJsi",
|
|
170
|
-
"(Lcom/dynamsoft/core/basic_structures/ImageData;[Lcom/dynamsoft/core/basic_structures/Quadrilateral;II)Lcom/dynamsoft/core/basic_structures/ImageData;");
|
|
171
|
-
auto jImageData = jsiConversion::core::getJImageDataFromHO(env, imageDataHO);
|
|
172
|
-
auto jQuads = jsQuadArrayToJobjectArray(rt, env, jsQuads);
|
|
173
|
-
auto jImageDataAfterDraw = env->CallObjectMethod(jImageManagerModule, methodId, jImageData, jQuads, color, thickness);
|
|
174
|
-
ImageDataHostObject imageHOAfterDraw;
|
|
175
|
-
jsiConversion::core::getHOFromJImageData(env, jImageDataAfterDraw, imageHOAfterDraw);
|
|
176
|
-
env->DeleteLocalRef(jQuads);
|
|
177
|
-
env->DeleteLocalRef(jImageDataAfterDraw);
|
|
178
|
-
env->DeleteLocalRef(clz);
|
|
179
|
-
env->DeleteLocalRef(jImageData);
|
|
180
|
-
if (needDetach) {
|
|
181
|
-
gJvm->DetachCurrentThread();
|
|
182
|
-
}
|
|
183
|
-
return imageHOAfterDraw;
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
ImageDataHostObject cropImage(Runtime &rt, ImageDataHostObject &imageDataHO, Object &jsDSRect) {
|
|
187
|
-
JNIEnv *env;
|
|
188
|
-
bool needDetach = false;
|
|
189
|
-
int state = gJvm->GetEnv((void **) &env, JNI_VERSION_1_6);
|
|
190
|
-
if (state == JNI_EDETACHED || env == nullptr) {
|
|
191
|
-
gJvm->AttachCurrentThread(&env, nullptr);
|
|
192
|
-
needDetach = true;
|
|
193
|
-
}
|
|
194
|
-
jclass clz = env->GetObjectClass(jImageManagerModule);
|
|
195
|
-
jmethodID methodId = env->GetMethodID(clz, "cropImageCalledInJsi",
|
|
196
|
-
"(Lcom/dynamsoft/core/basic_structures/ImageData;Lcom/dynamsoft/core/basic_structures/DSRect;)Lcom/dynamsoft/core/basic_structures/ImageData;");
|
|
197
|
-
auto jImageData = jsiConversion::core::getJImageDataFromHO(env, imageDataHO);
|
|
198
|
-
auto jDSRect = jsDsRectToJobject(rt, env, jsDSRect);
|
|
199
|
-
auto jImageDataAfterCrop = env->CallObjectMethod(jImageManagerModule, methodId, jImageData, jDSRect);
|
|
200
|
-
ImageDataHostObject imageHOAfterCrop;
|
|
201
|
-
jsiConversion::core::getHOFromJImageData(env, jImageDataAfterCrop, imageHOAfterCrop);
|
|
202
|
-
env->DeleteLocalRef(jDSRect);
|
|
203
|
-
env->DeleteLocalRef(jImageDataAfterCrop);
|
|
204
|
-
env->DeleteLocalRef(clz);
|
|
205
|
-
env->DeleteLocalRef(jImageData);
|
|
206
|
-
if (needDetach) {
|
|
207
|
-
gJvm->DetachCurrentThread();
|
|
208
|
-
}
|
|
209
|
-
return imageHOAfterCrop;
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
ImageDataHostObject cropAndDeskewImage(Runtime &rt, ImageDataHostObject &imageDataHO, Object &jsQuad, int dstWidth, int dstHeight, int padding) {
|
|
213
|
-
JNIEnv *env;
|
|
214
|
-
bool needDetach = false;
|
|
215
|
-
int state = gJvm->GetEnv((void **) &env, JNI_VERSION_1_6);
|
|
216
|
-
if (state == JNI_EDETACHED || env == nullptr) {
|
|
217
|
-
gJvm->AttachCurrentThread(&env, nullptr);
|
|
218
|
-
needDetach = true;
|
|
219
|
-
}
|
|
220
|
-
jclass clz = env->GetObjectClass(jImageManagerModule);
|
|
221
|
-
jmethodID methodId = env->GetMethodID(clz, "cropAndDeskewImageCalledInJsi",
|
|
222
|
-
"(Lcom/dynamsoft/core/basic_structures/ImageData;Lcom/dynamsoft/core/basic_structures/Quadrilateral;III)Lcom/dynamsoft/core/basic_structures/ImageData;");
|
|
223
|
-
auto jImageData = jsiConversion::core::getJImageDataFromHO(env, imageDataHO);
|
|
224
|
-
auto jQuad = jsQuadToJobject(rt, env, jsQuad);
|
|
225
|
-
auto jImageDataAfterCropAndDeskew = env->CallObjectMethod(jImageManagerModule, methodId, jImageData, jQuad, dstWidth, dstHeight, padding);
|
|
226
|
-
ImageDataHostObject imageHOAfterCrop;
|
|
227
|
-
jsiConversion::core::getHOFromJImageData(env, jImageDataAfterCropAndDeskew, imageHOAfterCrop);
|
|
228
|
-
env->DeleteLocalRef(jQuad);
|
|
229
|
-
env->DeleteLocalRef(jImageDataAfterCropAndDeskew);
|
|
230
|
-
env->DeleteLocalRef(clz);
|
|
231
|
-
env->DeleteLocalRef(jImageData);
|
|
232
|
-
if (needDetach) {
|
|
233
|
-
gJvm->DetachCurrentThread();
|
|
234
|
-
}
|
|
235
|
-
return imageHOAfterCrop;
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
const int type_adjust_brightness = 0;
|
|
240
|
-
const int type_adjust_contrast = 1;
|
|
241
|
-
const int type_filter = 2;
|
|
242
|
-
|
|
243
|
-
ImageDataHostObject adjustOrFilter(Runtime &rt, ImageDataHostObject &imageDataHO, int value, int type) {
|
|
244
|
-
JNIEnv *env;
|
|
245
|
-
bool needDetach = false;
|
|
246
|
-
int state = gJvm->GetEnv((void **) &env, JNI_VERSION_1_6);
|
|
247
|
-
if (state == JNI_EDETACHED || env == nullptr) {
|
|
248
|
-
gJvm->AttachCurrentThread(&env, nullptr);
|
|
249
|
-
needDetach = true;
|
|
250
|
-
}
|
|
251
|
-
jclass clz = env->GetObjectClass(jImageManagerModule);
|
|
252
|
-
jmethodID methodId;
|
|
253
|
-
switch (type) {
|
|
254
|
-
case type_adjust_brightness:
|
|
255
|
-
methodId = env->GetMethodID(clz, "adjustBrightnessCalledInJsi",
|
|
256
|
-
"(Lcom/dynamsoft/core/basic_structures/ImageData;I)Lcom/dynamsoft/core/basic_structures/ImageData;");
|
|
257
|
-
break;
|
|
258
|
-
case type_adjust_contrast:
|
|
259
|
-
methodId = env->GetMethodID(clz, "adjustContrastCalledInJsi",
|
|
260
|
-
"(Lcom/dynamsoft/core/basic_structures/ImageData;I)Lcom/dynamsoft/core/basic_structures/ImageData;");
|
|
261
|
-
break;
|
|
262
|
-
case type_filter:
|
|
263
|
-
default:
|
|
264
|
-
methodId = env->GetMethodID(clz, "filterImageCalledInJsi",
|
|
265
|
-
"(Lcom/dynamsoft/core/basic_structures/ImageData;I)Lcom/dynamsoft/core/basic_structures/ImageData;");
|
|
266
|
-
break;
|
|
267
|
-
}
|
|
268
|
-
auto jImageData = jsiConversion::core::getJImageDataFromHO(env, imageDataHO);
|
|
269
|
-
auto jImageDataAfter = env->CallObjectMethod(jImageManagerModule, methodId, jImageData, value);
|
|
270
|
-
ImageDataHostObject imageHOAfter;
|
|
271
|
-
jsiConversion::core::getHOFromJImageData(env, jImageDataAfter, imageHOAfter);
|
|
272
|
-
env->DeleteLocalRef(jImageDataAfter);
|
|
273
|
-
env->DeleteLocalRef(clz);
|
|
274
|
-
env->DeleteLocalRef(jImageData);
|
|
275
|
-
if (needDetach) {
|
|
276
|
-
gJvm->DetachCurrentThread();
|
|
277
|
-
}
|
|
278
|
-
return imageHOAfter;
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
ImageDataHostObject convertToGray(Runtime &rt, ImageDataHostObject &imageDataHO, float r, float g, float b) {
|
|
282
|
-
JNIEnv *env;
|
|
283
|
-
bool needDetach = false;
|
|
284
|
-
int state = gJvm->GetEnv((void **) &env, JNI_VERSION_1_6);
|
|
285
|
-
if (state == JNI_EDETACHED || env == nullptr) {
|
|
286
|
-
gJvm->AttachCurrentThread(&env, nullptr);
|
|
287
|
-
needDetach = true;
|
|
288
|
-
}
|
|
289
|
-
jclass clz = env->GetObjectClass(jImageManagerModule);
|
|
290
|
-
jmethodID methodId = env->GetMethodID(clz, "convertToGrayCalledInJsi",
|
|
291
|
-
"(Lcom/dynamsoft/core/basic_structures/ImageData;FFF)Lcom/dynamsoft/core/basic_structures/ImageData;");
|
|
292
|
-
auto jImageData = jsiConversion::core::getJImageDataFromHO(env, imageDataHO);
|
|
293
|
-
auto jImageDataAfterConvert = env->CallObjectMethod(jImageManagerModule, methodId, jImageData, r, g, b);
|
|
294
|
-
ImageDataHostObject imageHOAfterConvert;
|
|
295
|
-
jsiConversion::core::getHOFromJImageData(env, jImageDataAfterConvert, imageHOAfterConvert);
|
|
296
|
-
env->DeleteLocalRef(jImageDataAfterConvert);
|
|
297
|
-
env->DeleteLocalRef(clz);
|
|
298
|
-
env->DeleteLocalRef(jImageData);
|
|
299
|
-
if (needDetach) {
|
|
300
|
-
gJvm->DetachCurrentThread();
|
|
301
|
-
}
|
|
302
|
-
return imageHOAfterConvert;
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
ImageDataHostObject convertToBinaryGlobal(Runtime &rt, ImageDataHostObject &imageDataHO, int threshold, bool invert) {
|
|
306
|
-
JNIEnv *env;
|
|
307
|
-
bool needDetach = false;
|
|
308
|
-
int state = gJvm->GetEnv((void **) &env, JNI_VERSION_1_6);
|
|
309
|
-
if (state == JNI_EDETACHED || env == nullptr) {
|
|
310
|
-
gJvm->AttachCurrentThread(&env, nullptr);
|
|
311
|
-
needDetach = true;
|
|
312
|
-
}
|
|
313
|
-
jclass clz = env->GetObjectClass(jImageManagerModule);
|
|
314
|
-
jmethodID methodId = env->GetMethodID(clz, "convertToBinaryGlobalCalledInJsi",
|
|
315
|
-
"(Lcom/dynamsoft/core/basic_structures/ImageData;IZ)Lcom/dynamsoft/core/basic_structures/ImageData;");
|
|
316
|
-
auto jImageData = jsiConversion::core::getJImageDataFromHO(env, imageDataHO);
|
|
317
|
-
auto jImageDataAfterConvert = env->CallObjectMethod(jImageManagerModule, methodId, jImageData, threshold, invert);
|
|
318
|
-
ImageDataHostObject imageHOAfterConvert;
|
|
319
|
-
jsiConversion::core::getHOFromJImageData(env, jImageDataAfterConvert, imageHOAfterConvert);
|
|
320
|
-
env->DeleteLocalRef(jImageDataAfterConvert);
|
|
321
|
-
env->DeleteLocalRef(clz);
|
|
322
|
-
env->DeleteLocalRef(jImageData);
|
|
323
|
-
if (needDetach) {
|
|
324
|
-
gJvm->DetachCurrentThread();
|
|
325
|
-
}
|
|
326
|
-
return imageHOAfterConvert;
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
ImageDataHostObject convertToBinaryLocal(Runtime &rt, ImageDataHostObject &imageDataHO, int blockSize, int compensation, bool invert) {
|
|
330
|
-
JNIEnv *env;
|
|
331
|
-
bool needDetach = false;
|
|
332
|
-
int state = gJvm->GetEnv((void **) &env, JNI_VERSION_1_6);
|
|
333
|
-
if (state == JNI_EDETACHED || env == nullptr) {
|
|
334
|
-
gJvm->AttachCurrentThread(&env, nullptr);
|
|
335
|
-
needDetach = true;
|
|
336
|
-
}
|
|
337
|
-
jclass clz = env->GetObjectClass(jImageManagerModule);
|
|
338
|
-
jmethodID methodId = env->GetMethodID(clz, "convertToBinaryLocalCalledInJsi",
|
|
339
|
-
"(Lcom/dynamsoft/core/basic_structures/ImageData;IIZ)Lcom/dynamsoft/core/basic_structures/ImageData;");
|
|
340
|
-
auto jImageData = jsiConversion::core::getJImageDataFromHO(env, imageDataHO);
|
|
341
|
-
auto jImageDataAfterConvert = env->CallObjectMethod(jImageManagerModule, methodId, jImageData, blockSize, compensation, invert);
|
|
342
|
-
ImageDataHostObject imageHOAfterConvert;
|
|
343
|
-
jsiConversion::core::getHOFromJImageData(env, jImageDataAfterConvert, imageHOAfterConvert);
|
|
344
|
-
env->DeleteLocalRef(jImageDataAfterConvert);
|
|
345
|
-
env->DeleteLocalRef(clz);
|
|
346
|
-
env->DeleteLocalRef(jImageData);
|
|
347
|
-
if (needDetach) {
|
|
348
|
-
gJvm->DetachCurrentThread();
|
|
349
|
-
}
|
|
350
|
-
return imageHOAfterConvert;
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
#define JSI_FUNC [](Runtime &runtime, const Value &thisValue, const Value *arguments, size_t count) -> Value
|
|
355
|
-
|
|
356
|
-
namespace jsi_install::utility {
|
|
357
|
-
void install_imageIO_saveToFile(Runtime &jsiRuntime) {
|
|
358
|
-
auto nameID = PropNameID::forAscii(jsiRuntime, "imageIO_saveToFile");
|
|
359
|
-
if (!jsiRuntime.global().hasProperty(jsiRuntime, nameID)) {
|
|
360
|
-
auto saveToFileFcn = Function::createFromHostFunction(jsiRuntime, nameID, 3, JSI_FUNC {
|
|
361
|
-
auto imageDataObj = arguments[0].asObject(runtime);
|
|
362
|
-
auto imageDataHostObject = ImageDataHostObject::getHOFromObject(runtime, std::move(imageDataObj));
|
|
363
|
-
auto filePath = arguments[1].asString(runtime).utf8(runtime);
|
|
364
|
-
bool overWrite = arguments[2].asBool();
|
|
365
|
-
saveImageDataHOToFile(runtime, imageDataHostObject, filePath, overWrite);
|
|
366
|
-
return {};
|
|
367
|
-
});
|
|
368
|
-
jsiRuntime.global().setProperty(jsiRuntime, nameID, std::move(saveToFileFcn));
|
|
369
|
-
}
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
void install_imageIO_readFromFile(Runtime &jsiRuntime) {
|
|
373
|
-
auto nameID = PropNameID::forAscii(jsiRuntime, "imageIO_readFromFile");
|
|
374
|
-
if (!jsiRuntime.global().hasProperty(jsiRuntime, nameID)) {
|
|
375
|
-
auto readFromFileFcn = Function::createFromHostFunction(jsiRuntime, nameID, 1, JSI_FUNC {
|
|
376
|
-
auto filePath = arguments[0].asString(runtime).utf8(runtime);
|
|
377
|
-
auto imageDataHostObject = readImageDataHOFromFile(runtime, filePath);
|
|
378
|
-
return Object::createFromHostObject(runtime, std::make_shared<ImageDataHostObject>(imageDataHostObject));
|
|
379
|
-
});
|
|
380
|
-
jsiRuntime.global().setProperty(jsiRuntime, nameID, std::move(readFromFileFcn));
|
|
381
|
-
}
|
|
382
|
-
}
|
|
383
|
-
|
|
384
|
-
void install_imageIO_readFromMemory(Runtime &jsiRuntime) {
|
|
385
|
-
auto nameID = PropNameID::forAscii(jsiRuntime, "imageIO_readFromMemory");
|
|
386
|
-
if (!jsiRuntime.global().hasProperty(jsiRuntime, nameID)) {
|
|
387
|
-
auto readFromMemoryFcn = Function::createFromHostFunction(jsiRuntime, nameID, 1, JSI_FUNC {
|
|
388
|
-
auto buffer = arguments[0].asObject(runtime).getArrayBuffer(runtime);
|
|
389
|
-
auto pBuffer = (unsigned char *) buffer.data(runtime);
|
|
390
|
-
auto len = (int) buffer.length(runtime);
|
|
391
|
-
auto imageDataHostObject = readImageDataHOFromMemory(runtime, pBuffer, len);
|
|
392
|
-
return Object::createFromHostObject(runtime, std::make_shared<ImageDataHostObject>(imageDataHostObject));
|
|
393
|
-
});
|
|
394
|
-
jsiRuntime.global().setProperty(jsiRuntime, nameID, std::move(readFromMemoryFcn));
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
void install_imageIO_saveToMemory(Runtime &jsiRuntime) {
|
|
399
|
-
auto nameID = PropNameID::forAscii(jsiRuntime, "imageIO_saveToMemory");
|
|
400
|
-
if (!jsiRuntime.global().hasProperty(jsiRuntime, nameID)) {
|
|
401
|
-
auto saveToMemoryFcn = Function::createFromHostFunction(jsiRuntime, nameID, 2, JSI_FUNC {
|
|
402
|
-
auto imageDataObj = arguments[0].asObject(runtime);
|
|
403
|
-
auto imageDataHostObject = ImageDataHostObject::getHOFromObject(runtime, std::move(imageDataObj));
|
|
404
|
-
int fileFormat = arguments[1].asNumber();
|
|
405
|
-
auto arrayBuffer = saveImageDataHOToMemory(runtime, imageDataHostObject, fileFormat);
|
|
406
|
-
return arrayBuffer;
|
|
407
|
-
});
|
|
408
|
-
jsiRuntime.global().setProperty(jsiRuntime, nameID, std::move(saveToMemoryFcn));
|
|
409
|
-
}
|
|
410
|
-
}
|
|
411
|
-
|
|
412
|
-
void install_imageDrawer_drawOnImage(Runtime &jsiRuntime) {
|
|
413
|
-
auto nameID = PropNameID::forAscii(jsiRuntime, "imageDrawer_drawOnImage");
|
|
414
|
-
if (!jsiRuntime.global().hasProperty(jsiRuntime, nameID)) {
|
|
415
|
-
auto drawOnImageFcn = Function::createFromHostFunction(jsiRuntime, nameID, 4, JSI_FUNC {
|
|
416
|
-
auto imageDataObj = arguments[0].asObject(runtime);
|
|
417
|
-
auto imageDataHostObject = ImageDataHostObject::getHOFromObject(runtime, std::move(imageDataObj));
|
|
418
|
-
auto jsQuads = arguments[1].asObject(runtime).asArray(runtime);
|
|
419
|
-
auto color = arguments[2].asNumber();
|
|
420
|
-
auto thickness = arguments[3].asNumber();
|
|
421
|
-
ImageDataHostObject imageHOAfterDraw = drawOnImage(runtime, imageDataHostObject, jsQuads, (int) color, (int) thickness);
|
|
422
|
-
return Object::createFromHostObject(runtime, std::make_shared<ImageDataHostObject>(imageHOAfterDraw));
|
|
423
|
-
});
|
|
424
|
-
jsiRuntime.global().setProperty(jsiRuntime, nameID, std::move(drawOnImageFcn));
|
|
425
|
-
}
|
|
426
|
-
}
|
|
427
|
-
|
|
428
|
-
void install_imageProcessor_cropImage(Runtime &jsiRuntime) {
|
|
429
|
-
auto nameID = PropNameID::forAscii(jsiRuntime, "imageProcessor_cropImage");
|
|
430
|
-
if (!jsiRuntime.global().hasProperty(jsiRuntime, nameID)) {
|
|
431
|
-
auto cropImageFcn = Function::createFromHostFunction(jsiRuntime, nameID, 2, JSI_FUNC {
|
|
432
|
-
auto imageDataObj = arguments[0].asObject(runtime);
|
|
433
|
-
auto imageDataHostObject = ImageDataHostObject::getHOFromObject(runtime, std::move(imageDataObj));
|
|
434
|
-
auto jsDsRect = arguments[1].asObject(runtime);
|
|
435
|
-
ImageDataHostObject imageHOAfterCrop = cropImage(runtime, imageDataHostObject, jsDsRect);
|
|
436
|
-
return Object::createFromHostObject(runtime, std::make_shared<ImageDataHostObject>(imageHOAfterCrop));
|
|
437
|
-
});
|
|
438
|
-
jsiRuntime.global().setProperty(jsiRuntime, nameID, std::move(cropImageFcn));
|
|
439
|
-
}
|
|
440
|
-
}
|
|
441
|
-
|
|
442
|
-
void install_imageProcessor_cropAndDeskewImage(Runtime &jsiRuntime) {
|
|
443
|
-
auto nameID = PropNameID::forAscii(jsiRuntime, "imageProcessor_cropAndDeskewImage");
|
|
444
|
-
if (!jsiRuntime.global().hasProperty(jsiRuntime, nameID)) {
|
|
445
|
-
auto cropAndDeskewImageFcn = Function::createFromHostFunction(jsiRuntime, nameID, 5, JSI_FUNC {
|
|
446
|
-
auto imageDataObj = arguments[0].asObject(runtime);
|
|
447
|
-
auto imageDataHostObject = ImageDataHostObject::getHOFromObject(runtime, std::move(imageDataObj));
|
|
448
|
-
auto jsQuads = arguments[1].asObject(runtime);
|
|
449
|
-
int dstWidth = arguments[2].asNumber();
|
|
450
|
-
int dstHeight = arguments[3].asNumber();
|
|
451
|
-
int padding = arguments[4].asNumber();
|
|
452
|
-
ImageDataHostObject imageHOAfterCrop = cropAndDeskewImage(runtime, imageDataHostObject, jsQuads, dstWidth, dstHeight, padding);
|
|
453
|
-
if (imageHOAfterCrop.buffer == nullptr) {
|
|
454
|
-
return Value::undefined();
|
|
455
|
-
}
|
|
456
|
-
return Object::createFromHostObject(runtime, std::make_shared<ImageDataHostObject>(imageHOAfterCrop));
|
|
457
|
-
});
|
|
458
|
-
jsiRuntime.global().setProperty(jsiRuntime, nameID, std::move(cropAndDeskewImageFcn));
|
|
459
|
-
}
|
|
460
|
-
}
|
|
461
|
-
|
|
462
|
-
void install_imageProcessor_adjustBrightness(Runtime &jsiRuntime) {
|
|
463
|
-
PropNameID nameId = PropNameID::forAscii(jsiRuntime, "imageProcessor_adjustBrightness");
|
|
464
|
-
if (!jsiRuntime.global().hasProperty(jsiRuntime, nameId)) {
|
|
465
|
-
auto adjustOrFilterFcn = Function::createFromHostFunction(jsiRuntime, nameId, 2, JSI_FUNC {
|
|
466
|
-
auto imageDataObj = arguments[0].asObject(runtime);
|
|
467
|
-
auto imageDataHostObject = ImageDataHostObject::getHOFromObject(runtime, std::move(imageDataObj));
|
|
468
|
-
auto value = arguments[1].asNumber();
|
|
469
|
-
ImageDataHostObject imageHOAfter = adjustOrFilter(runtime, imageDataHostObject, (int) value, type_adjust_brightness);
|
|
470
|
-
if (imageHOAfter.buffer == nullptr) {
|
|
471
|
-
return Value::undefined();
|
|
472
|
-
}
|
|
473
|
-
return Object::createFromHostObject(runtime, std::make_shared<ImageDataHostObject>(imageHOAfter));
|
|
474
|
-
});
|
|
475
|
-
jsiRuntime.global().setProperty(jsiRuntime, nameId, std::move(adjustOrFilterFcn));
|
|
476
|
-
}
|
|
477
|
-
}
|
|
478
|
-
|
|
479
|
-
void install_imageProcessor_adjustContrast(Runtime &jsiRuntime) {
|
|
480
|
-
PropNameID nameId = PropNameID::forAscii(jsiRuntime, "imageProcessor_adjustContrast");
|
|
481
|
-
if (!jsiRuntime.global().hasProperty(jsiRuntime, nameId)) {
|
|
482
|
-
auto adjustOrFilterFcn = Function::createFromHostFunction(jsiRuntime, nameId, 2, JSI_FUNC {
|
|
483
|
-
auto imageDataObj = arguments[0].asObject(runtime);
|
|
484
|
-
auto imageDataHostObject = ImageDataHostObject::getHOFromObject(runtime, std::move(imageDataObj));
|
|
485
|
-
auto value = arguments[1].asNumber();
|
|
486
|
-
ImageDataHostObject imageHOAfter = adjustOrFilter(runtime, imageDataHostObject, (int) value, type_adjust_contrast);
|
|
487
|
-
if (imageHOAfter.buffer == nullptr) {
|
|
488
|
-
return Value::undefined();
|
|
489
|
-
}
|
|
490
|
-
return Object::createFromHostObject(runtime, std::make_shared<ImageDataHostObject>(imageHOAfter));
|
|
491
|
-
});
|
|
492
|
-
jsiRuntime.global().setProperty(jsiRuntime, nameId, std::move(adjustOrFilterFcn));
|
|
493
|
-
}
|
|
494
|
-
}
|
|
495
|
-
|
|
496
|
-
void install_imageProcessor_filterImage(Runtime &jsiRuntime) {
|
|
497
|
-
PropNameID nameId = PropNameID::forAscii(jsiRuntime, "imageProcessor_filterImage");
|
|
498
|
-
if (!jsiRuntime.global().hasProperty(jsiRuntime, nameId)) {
|
|
499
|
-
auto adjustOrFilterFcn = Function::createFromHostFunction(jsiRuntime, nameId, 2, JSI_FUNC {
|
|
500
|
-
auto imageDataObj = arguments[0].asObject(runtime);
|
|
501
|
-
auto imageDataHostObject = ImageDataHostObject::getHOFromObject(runtime, std::move(imageDataObj));
|
|
502
|
-
auto value = arguments[1].asNumber();
|
|
503
|
-
ImageDataHostObject imageHOAfter = adjustOrFilter(runtime, imageDataHostObject, (int) value, type_filter);
|
|
504
|
-
if (imageHOAfter.buffer == nullptr) {
|
|
505
|
-
return Value::undefined();
|
|
506
|
-
}
|
|
507
|
-
return Object::createFromHostObject(runtime, std::make_shared<ImageDataHostObject>(imageHOAfter));
|
|
508
|
-
});
|
|
509
|
-
jsiRuntime.global().setProperty(jsiRuntime, nameId, std::move(adjustOrFilterFcn));
|
|
510
|
-
}
|
|
511
|
-
}
|
|
512
|
-
|
|
513
|
-
void install_imageProcessor_convertToGray(Runtime &jsiRuntime) {
|
|
514
|
-
PropNameID nameId = PropNameID::forAscii(jsiRuntime, "imageProcessor_convertToGray");
|
|
515
|
-
if (!jsiRuntime.global().hasProperty(jsiRuntime, nameId)) {
|
|
516
|
-
auto convertToGrayFcn = Function::createFromHostFunction(jsiRuntime, nameId, 4, JSI_FUNC {
|
|
517
|
-
auto imageDataObj = arguments[0].asObject(runtime);
|
|
518
|
-
auto imageDataHostObject = ImageDataHostObject::getHOFromObject(runtime, std::move(imageDataObj));
|
|
519
|
-
float r = arguments[1].asNumber();
|
|
520
|
-
float g = arguments[2].asNumber();
|
|
521
|
-
float b = arguments[3].asNumber();
|
|
522
|
-
ImageDataHostObject grayImageHO = convertToGray(runtime, imageDataHostObject, r, g, b);
|
|
523
|
-
if (grayImageHO.buffer == nullptr) {
|
|
524
|
-
return Value::undefined();
|
|
525
|
-
}
|
|
526
|
-
return Object::createFromHostObject(runtime, std::make_shared<ImageDataHostObject>(grayImageHO));
|
|
527
|
-
});
|
|
528
|
-
jsiRuntime.global().setProperty(jsiRuntime, nameId, std::move(convertToGrayFcn));
|
|
529
|
-
}
|
|
530
|
-
}
|
|
531
|
-
|
|
532
|
-
void install_imageProcessor_convertToBinaryGlobal(Runtime &jsiRuntime) {
|
|
533
|
-
PropNameID nameId = PropNameID::forAscii(jsiRuntime, "imageProcessor_convertToBinaryGlobal");
|
|
534
|
-
if (!jsiRuntime.global().hasProperty(jsiRuntime, nameId)) {
|
|
535
|
-
auto convertToBinaryGlobalFcn = Function::createFromHostFunction(jsiRuntime, nameId, 3, JSI_FUNC {
|
|
536
|
-
auto imageDataObj = arguments[0].asObject(runtime);
|
|
537
|
-
auto imageDataHostObject = ImageDataHostObject::getHOFromObject(runtime, std::move(imageDataObj));
|
|
538
|
-
int threshold = arguments[1].asNumber();
|
|
539
|
-
bool isInvert = arguments[2].asBool();
|
|
540
|
-
ImageDataHostObject binaryImageHO = convertToBinaryGlobal(runtime, imageDataHostObject, threshold, isInvert);
|
|
541
|
-
if (binaryImageHO.buffer == nullptr) {
|
|
542
|
-
return Value::undefined();
|
|
543
|
-
}
|
|
544
|
-
return Object::createFromHostObject(runtime, std::make_shared<ImageDataHostObject>(binaryImageHO));
|
|
545
|
-
});
|
|
546
|
-
jsiRuntime.global().setProperty(jsiRuntime, nameId, std::move(convertToBinaryGlobalFcn));
|
|
547
|
-
}
|
|
548
|
-
}
|
|
549
|
-
|
|
550
|
-
void install_imageProcessor_convertToBinaryLocal(Runtime &jsiRuntime) {
|
|
551
|
-
PropNameID nameId = PropNameID::forAscii(jsiRuntime, "imageProcessor_convertToBinaryLocal");
|
|
552
|
-
if (!jsiRuntime.global().hasProperty(jsiRuntime, nameId)) {
|
|
553
|
-
auto convertToBinaryLocalFcn = Function::createFromHostFunction(jsiRuntime, nameId, 4, JSI_FUNC {
|
|
554
|
-
auto imageDataObj = arguments[0].asObject(runtime);
|
|
555
|
-
auto imageDataHostObject = ImageDataHostObject::getHOFromObject(runtime, std::move(imageDataObj));
|
|
556
|
-
int blockSize = arguments[1].asNumber();
|
|
557
|
-
int compensation = arguments[2].asNumber();
|
|
558
|
-
bool isInvert = arguments[3].asBool();
|
|
559
|
-
ImageDataHostObject binaryImageHO = convertToBinaryLocal(runtime, imageDataHostObject, blockSize, compensation, isInvert);
|
|
560
|
-
if (binaryImageHO.buffer == nullptr) {
|
|
561
|
-
return Value::undefined();
|
|
562
|
-
}
|
|
563
|
-
return Object::createFromHostObject(runtime, std::make_shared<ImageDataHostObject>(binaryImageHO));
|
|
564
|
-
});
|
|
565
|
-
jsiRuntime.global().setProperty(jsiRuntime, nameId, std::move(convertToBinaryLocalFcn));
|
|
566
|
-
}
|
|
567
|
-
}
|
|
568
|
-
} //namespace jsi_install::utility
|
|
569
|
-
|
|
570
|
-
void install_imageManager_methods(Runtime &jsiRuntime) {
|
|
571
|
-
jsi_install::utility::install_imageIO_saveToFile(jsiRuntime);
|
|
572
|
-
jsi_install::utility::install_imageIO_readFromFile(jsiRuntime);
|
|
573
|
-
jsi_install::utility::install_imageIO_readFromMemory(jsiRuntime);
|
|
574
|
-
jsi_install::utility::install_imageIO_saveToMemory(jsiRuntime);
|
|
575
|
-
jsi_install::utility::install_imageDrawer_drawOnImage(jsiRuntime);
|
|
576
|
-
jsi_install::utility::install_imageProcessor_cropImage(jsiRuntime);
|
|
577
|
-
jsi_install::utility::install_imageProcessor_cropAndDeskewImage(jsiRuntime);
|
|
578
|
-
jsi_install::utility::install_imageProcessor_adjustBrightness(jsiRuntime);
|
|
579
|
-
jsi_install::utility::install_imageProcessor_adjustContrast(jsiRuntime);
|
|
580
|
-
jsi_install::utility::install_imageProcessor_filterImage(jsiRuntime);
|
|
581
|
-
jsi_install::utility::install_imageProcessor_convertToGray(jsiRuntime);
|
|
582
|
-
jsi_install::utility::install_imageProcessor_convertToBinaryGlobal(jsiRuntime);
|
|
583
|
-
jsi_install::utility::install_imageProcessor_convertToBinaryLocal(jsiRuntime);
|
|
584
|
-
}
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
extern "C"
|
|
588
|
-
JNIEXPORT void JNICALL
|
|
589
|
-
Java_com_dynamsoft_reactnativelib_utility_ImageManagerModuleImpl_nativeInstall(JNIEnv *env, jobject thiz, jlong jsiPtr) {
|
|
590
|
-
if (!env->IsSameObject(jImageManagerModule, thiz)) {
|
|
591
|
-
jImageManagerModule = env->NewWeakGlobalRef(thiz);
|
|
592
|
-
}
|
|
593
|
-
if (jclzQuad == nullptr) {
|
|
594
|
-
jclzQuad = (jclass) env->NewWeakGlobalRef(env->FindClass("com/dynamsoft/core/basic_structures/Quadrilateral"));
|
|
595
|
-
}
|
|
596
|
-
if (jclzPoint == nullptr) {
|
|
597
|
-
jclzPoint = (jclass) env->NewWeakGlobalRef(env->FindClass("android/graphics/Point"));
|
|
598
|
-
}
|
|
599
|
-
if (jclzDSRect == nullptr) {
|
|
600
|
-
jclzDSRect = (jclass) env->NewWeakGlobalRef(env->FindClass("com/dynamsoft/core/basic_structures/DSRect"));
|
|
601
|
-
}
|
|
602
|
-
auto rt = reinterpret_cast<Runtime *>(jsiPtr);
|
|
603
|
-
install_imageManager_methods(*rt);
|
|
604
|
-
}
|
|
1
|
+
//
|
|
2
|
+
// Created by Allen on 24/09/23.
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
#include "JsiUtility.h"
|
|
6
|
+
#include "RawBuffer.h"
|
|
7
|
+
|
|
8
|
+
jobject jImageManagerModule = nullptr;
|
|
9
|
+
jclass jclzQuad = nullptr;
|
|
10
|
+
jclass jclzPoint = nullptr;
|
|
11
|
+
jclass jclzDSRect = nullptr;
|
|
12
|
+
|
|
13
|
+
using namespace facebook::jsi;
|
|
14
|
+
|
|
15
|
+
jobject jsPointToJobject(Runtime &rt, JNIEnv *env, Object jsPoint) {
|
|
16
|
+
if (jsPoint.hasProperty(rt, "x") && jsPoint.hasProperty(rt, "y")) {
|
|
17
|
+
int x = jsPoint.getProperty(rt, "x").asNumber();
|
|
18
|
+
int y = jsPoint.getProperty(rt, "y").asNumber();
|
|
19
|
+
jmethodID init = env->GetMethodID(jclzPoint, "<init>", "(II)V");
|
|
20
|
+
jobject jPoint = env->NewObject(jclzPoint, init, x, y);
|
|
21
|
+
return jPoint;
|
|
22
|
+
}
|
|
23
|
+
return nullptr;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
jobject jsQuadToJobject(Runtime &rt, JNIEnv *env, Object &jsQuad) {
|
|
27
|
+
if (jsQuad.hasProperty(rt, "points")) {
|
|
28
|
+
auto jsPoints = jsQuad.getProperty(rt, "points").asObject(rt).asArray(rt);
|
|
29
|
+
int count = jsPoints.length(rt);
|
|
30
|
+
auto jPoints = env->NewObjectArray(count, jclzPoint, nullptr);
|
|
31
|
+
for (int i = 0; i < count; ++i) {
|
|
32
|
+
auto jPoint = jsPointToJobject(rt, env, jsPoints.getValueAtIndex(rt, i).asObject(rt));
|
|
33
|
+
env->SetObjectArrayElement(jPoints, i, jPoint);
|
|
34
|
+
env->DeleteLocalRef(jPoint);
|
|
35
|
+
}
|
|
36
|
+
auto initQuad = env->GetMethodID(jclzQuad, "<init>", "()V");
|
|
37
|
+
auto fieldId_points = env->GetFieldID(jclzQuad, "points", "[Landroid/graphics/Point;");
|
|
38
|
+
auto jQuad = env->NewObject(jclzQuad, initQuad);
|
|
39
|
+
env->SetObjectField(jQuad, fieldId_points, jPoints);
|
|
40
|
+
return jQuad;
|
|
41
|
+
}
|
|
42
|
+
return nullptr;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
jobjectArray jsQuadArrayToJobjectArray(Runtime &rt, JNIEnv *env, Array &jsQuads) {
|
|
46
|
+
int count = jsQuads.length(rt);
|
|
47
|
+
jobjectArray jQuads = env->NewObjectArray(count, jclzQuad, nullptr);
|
|
48
|
+
for (int i = 0; i < count; ++i) {
|
|
49
|
+
auto jsQuad = jsQuads.getValueAtIndex(rt, i).asObject(rt);
|
|
50
|
+
auto jQuad = jsQuadToJobject(rt, env, jsQuad);
|
|
51
|
+
env->SetObjectArrayElement(jQuads, i, jQuad);
|
|
52
|
+
env->DeleteLocalRef(jQuad);
|
|
53
|
+
}
|
|
54
|
+
return jQuads;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
jobject jsDsRectToJobject(Runtime &rt, JNIEnv *env, Object &jsDSRect) {
|
|
58
|
+
if (!jsDSRect.hasProperty(rt, "left") || !jsDSRect.hasProperty(rt, "top") || !jsDSRect.hasProperty(rt, "right") || !jsDSRect.hasProperty(rt, "bottom") ||
|
|
59
|
+
!jsDSRect.hasProperty(rt, "measuredInPercentage")) {
|
|
60
|
+
return nullptr;
|
|
61
|
+
}
|
|
62
|
+
float top = (float) jsDSRect.getProperty(rt, "top").asNumber();
|
|
63
|
+
float left = (float) jsDSRect.getProperty(rt, "left").asNumber();
|
|
64
|
+
float bottom = (float) jsDSRect.getProperty(rt, "bottom").asNumber();
|
|
65
|
+
float right = (float) jsDSRect.getProperty(rt, "right").asNumber();
|
|
66
|
+
bool measuredInPercentage = jsDSRect.getProperty(rt, "measuredInPercentage").asBool();
|
|
67
|
+
jmethodID init = env->GetMethodID(jclzDSRect, "<init>", "(FFFFZ)V");
|
|
68
|
+
jobject jDSRect = env->NewObject(jclzDSRect, init, left, top, right, bottom, measuredInPercentage);
|
|
69
|
+
return jDSRect;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
void saveImageDataHOToFile(Runtime &rt, ImageDataHostObject &imageDataHO, string filePath, bool overWrite) {
|
|
74
|
+
JNIEnv *env;
|
|
75
|
+
bool needDetach = false;
|
|
76
|
+
int state = gJvm->GetEnv((void **) &env, JNI_VERSION_1_6);
|
|
77
|
+
if (state == JNI_EDETACHED || env == nullptr) {
|
|
78
|
+
gJvm->AttachCurrentThread(&env, nullptr);
|
|
79
|
+
needDetach = true;
|
|
80
|
+
}
|
|
81
|
+
jclass clz = env->GetObjectClass(jImageManagerModule);
|
|
82
|
+
jmethodID methodId = env->GetMethodID(clz, "saveToFileCalledInJsi", "(Lcom/dynamsoft/core/basic_structures/ImageData;Ljava/lang/String;Z)V");
|
|
83
|
+
auto jImageData = jsiConversion::core::getJImageDataFromHO(env, imageDataHO);
|
|
84
|
+
env->CallVoidMethod(jImageManagerModule, methodId, jImageData, env->NewStringUTF(filePath.c_str()), overWrite);
|
|
85
|
+
env->DeleteLocalRef(clz);
|
|
86
|
+
env->DeleteLocalRef(jImageData);
|
|
87
|
+
if (needDetach) {
|
|
88
|
+
gJvm->DetachCurrentThread();
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
ImageDataHostObject readImageDataHOFromFile(Runtime &rt, string filePath) {
|
|
93
|
+
JNIEnv *env;
|
|
94
|
+
bool needDetach = false;
|
|
95
|
+
int state = gJvm->GetEnv((void **) &env, JNI_VERSION_1_6);
|
|
96
|
+
if (state == JNI_EDETACHED || env == nullptr) {
|
|
97
|
+
gJvm->AttachCurrentThread(&env, nullptr);
|
|
98
|
+
needDetach = true;
|
|
99
|
+
}
|
|
100
|
+
jclass clz = env->GetObjectClass(jImageManagerModule);
|
|
101
|
+
jmethodID methodId = env->GetMethodID(clz, "readFromFileCalledInJsi", "(Ljava/lang/String;)Lcom/dynamsoft/core/basic_structures/ImageData;");
|
|
102
|
+
jstring jFilePath = env->NewStringUTF(filePath.c_str());
|
|
103
|
+
auto jImageData = env->CallObjectMethod(jImageManagerModule, methodId, jFilePath);
|
|
104
|
+
ImageDataHostObject imageHO;
|
|
105
|
+
jsiConversion::core::getHOFromJImageData(env, jImageData, imageHO);
|
|
106
|
+
env->DeleteLocalRef(clz);
|
|
107
|
+
env->DeleteLocalRef(jFilePath);
|
|
108
|
+
env->DeleteLocalRef(jImageData);
|
|
109
|
+
if (needDetach) {
|
|
110
|
+
gJvm->DetachCurrentThread();
|
|
111
|
+
}
|
|
112
|
+
return imageHO;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
ImageDataHostObject readImageDataHOFromMemory(Runtime &rt, unsigned char *buffer, int bufferSize) {
|
|
116
|
+
JNIEnv *env;
|
|
117
|
+
bool needDetach = false;
|
|
118
|
+
int state = gJvm->GetEnv((void **) &env, JNI_VERSION_1_6);
|
|
119
|
+
if (state == JNI_EDETACHED || env == nullptr) {
|
|
120
|
+
gJvm->AttachCurrentThread(&env, nullptr);
|
|
121
|
+
needDetach = true;
|
|
122
|
+
}
|
|
123
|
+
jclass clz = env->GetObjectClass(jImageManagerModule);
|
|
124
|
+
jmethodID methodId = env->GetMethodID(clz, "readFromMemoryCalledInJsi", "([B)Lcom/dynamsoft/core/basic_structures/ImageData;");
|
|
125
|
+
auto jBuffer = env->NewByteArray(bufferSize);
|
|
126
|
+
env->SetByteArrayRegion(jBuffer, 0, bufferSize, (jbyte *) buffer);
|
|
127
|
+
auto jImageData = env->CallObjectMethod(jImageManagerModule, methodId, jBuffer);
|
|
128
|
+
ImageDataHostObject imageHO;
|
|
129
|
+
jsiConversion::core::getHOFromJImageData(env, jImageData, imageHO);
|
|
130
|
+
env->DeleteLocalRef(clz);
|
|
131
|
+
env->DeleteLocalRef(jBuffer);
|
|
132
|
+
env->DeleteLocalRef(jImageData);
|
|
133
|
+
if (needDetach) {
|
|
134
|
+
gJvm->DetachCurrentThread();
|
|
135
|
+
}
|
|
136
|
+
return imageHO;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
ArrayBuffer saveImageDataHOToMemory(Runtime &rt, ImageDataHostObject &imageDataHO, int fileFormat) {
|
|
140
|
+
JNIEnv *env;
|
|
141
|
+
bool needDetach = false;
|
|
142
|
+
int state = gJvm->GetEnv((void **) &env, JNI_VERSION_1_6);
|
|
143
|
+
if (state == JNI_EDETACHED || env == nullptr) {
|
|
144
|
+
gJvm->AttachCurrentThread(&env, nullptr);
|
|
145
|
+
needDetach = true;
|
|
146
|
+
}
|
|
147
|
+
jclass clz = env->GetObjectClass(jImageManagerModule);
|
|
148
|
+
jmethodID methodId = env->GetMethodID(clz, "saveToMemoryCalledInJsi", "(Lcom/dynamsoft/core/basic_structures/ImageData;I)[B");
|
|
149
|
+
auto jImageData = jsiConversion::core::getJImageDataFromHO(env, imageDataHO);
|
|
150
|
+
auto jBuffer = (jbyteArray) env->CallObjectMethod(jImageManagerModule, methodId, jImageData, fileFormat);
|
|
151
|
+
auto pBuffer = (uint8_t *) env->GetByteArrayElements(jBuffer, nullptr);
|
|
152
|
+
int bufferSize = env->GetArrayLength(jBuffer);
|
|
153
|
+
auto mutableBuffer = std::make_shared<MutableRawBuffer>(pBuffer, bufferSize, false);
|
|
154
|
+
ArrayBuffer arrayBuffer(rt, mutableBuffer);
|
|
155
|
+
env->DeleteLocalRef(clz);
|
|
156
|
+
env->DeleteLocalRef(jImageData);
|
|
157
|
+
return arrayBuffer;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
ImageDataHostObject drawOnImage(Runtime &rt, ImageDataHostObject &imageDataHO, Array &jsQuads, int color, int thickness) {
|
|
161
|
+
JNIEnv *env;
|
|
162
|
+
bool needDetach = false;
|
|
163
|
+
int state = gJvm->GetEnv((void **) &env, JNI_VERSION_1_6);
|
|
164
|
+
if (state == JNI_EDETACHED || env == nullptr) {
|
|
165
|
+
gJvm->AttachCurrentThread(&env, nullptr);
|
|
166
|
+
needDetach = true;
|
|
167
|
+
}
|
|
168
|
+
jclass clz = env->GetObjectClass(jImageManagerModule);
|
|
169
|
+
jmethodID methodId = env->GetMethodID(clz, "drawOnImageCalledInJsi",
|
|
170
|
+
"(Lcom/dynamsoft/core/basic_structures/ImageData;[Lcom/dynamsoft/core/basic_structures/Quadrilateral;II)Lcom/dynamsoft/core/basic_structures/ImageData;");
|
|
171
|
+
auto jImageData = jsiConversion::core::getJImageDataFromHO(env, imageDataHO);
|
|
172
|
+
auto jQuads = jsQuadArrayToJobjectArray(rt, env, jsQuads);
|
|
173
|
+
auto jImageDataAfterDraw = env->CallObjectMethod(jImageManagerModule, methodId, jImageData, jQuads, color, thickness);
|
|
174
|
+
ImageDataHostObject imageHOAfterDraw;
|
|
175
|
+
jsiConversion::core::getHOFromJImageData(env, jImageDataAfterDraw, imageHOAfterDraw);
|
|
176
|
+
env->DeleteLocalRef(jQuads);
|
|
177
|
+
env->DeleteLocalRef(jImageDataAfterDraw);
|
|
178
|
+
env->DeleteLocalRef(clz);
|
|
179
|
+
env->DeleteLocalRef(jImageData);
|
|
180
|
+
if (needDetach) {
|
|
181
|
+
gJvm->DetachCurrentThread();
|
|
182
|
+
}
|
|
183
|
+
return imageHOAfterDraw;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
ImageDataHostObject cropImage(Runtime &rt, ImageDataHostObject &imageDataHO, Object &jsDSRect) {
|
|
187
|
+
JNIEnv *env;
|
|
188
|
+
bool needDetach = false;
|
|
189
|
+
int state = gJvm->GetEnv((void **) &env, JNI_VERSION_1_6);
|
|
190
|
+
if (state == JNI_EDETACHED || env == nullptr) {
|
|
191
|
+
gJvm->AttachCurrentThread(&env, nullptr);
|
|
192
|
+
needDetach = true;
|
|
193
|
+
}
|
|
194
|
+
jclass clz = env->GetObjectClass(jImageManagerModule);
|
|
195
|
+
jmethodID methodId = env->GetMethodID(clz, "cropImageCalledInJsi",
|
|
196
|
+
"(Lcom/dynamsoft/core/basic_structures/ImageData;Lcom/dynamsoft/core/basic_structures/DSRect;)Lcom/dynamsoft/core/basic_structures/ImageData;");
|
|
197
|
+
auto jImageData = jsiConversion::core::getJImageDataFromHO(env, imageDataHO);
|
|
198
|
+
auto jDSRect = jsDsRectToJobject(rt, env, jsDSRect);
|
|
199
|
+
auto jImageDataAfterCrop = env->CallObjectMethod(jImageManagerModule, methodId, jImageData, jDSRect);
|
|
200
|
+
ImageDataHostObject imageHOAfterCrop;
|
|
201
|
+
jsiConversion::core::getHOFromJImageData(env, jImageDataAfterCrop, imageHOAfterCrop);
|
|
202
|
+
env->DeleteLocalRef(jDSRect);
|
|
203
|
+
env->DeleteLocalRef(jImageDataAfterCrop);
|
|
204
|
+
env->DeleteLocalRef(clz);
|
|
205
|
+
env->DeleteLocalRef(jImageData);
|
|
206
|
+
if (needDetach) {
|
|
207
|
+
gJvm->DetachCurrentThread();
|
|
208
|
+
}
|
|
209
|
+
return imageHOAfterCrop;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
ImageDataHostObject cropAndDeskewImage(Runtime &rt, ImageDataHostObject &imageDataHO, Object &jsQuad, int dstWidth, int dstHeight, int padding) {
|
|
213
|
+
JNIEnv *env;
|
|
214
|
+
bool needDetach = false;
|
|
215
|
+
int state = gJvm->GetEnv((void **) &env, JNI_VERSION_1_6);
|
|
216
|
+
if (state == JNI_EDETACHED || env == nullptr) {
|
|
217
|
+
gJvm->AttachCurrentThread(&env, nullptr);
|
|
218
|
+
needDetach = true;
|
|
219
|
+
}
|
|
220
|
+
jclass clz = env->GetObjectClass(jImageManagerModule);
|
|
221
|
+
jmethodID methodId = env->GetMethodID(clz, "cropAndDeskewImageCalledInJsi",
|
|
222
|
+
"(Lcom/dynamsoft/core/basic_structures/ImageData;Lcom/dynamsoft/core/basic_structures/Quadrilateral;III)Lcom/dynamsoft/core/basic_structures/ImageData;");
|
|
223
|
+
auto jImageData = jsiConversion::core::getJImageDataFromHO(env, imageDataHO);
|
|
224
|
+
auto jQuad = jsQuadToJobject(rt, env, jsQuad);
|
|
225
|
+
auto jImageDataAfterCropAndDeskew = env->CallObjectMethod(jImageManagerModule, methodId, jImageData, jQuad, dstWidth, dstHeight, padding);
|
|
226
|
+
ImageDataHostObject imageHOAfterCrop;
|
|
227
|
+
jsiConversion::core::getHOFromJImageData(env, jImageDataAfterCropAndDeskew, imageHOAfterCrop);
|
|
228
|
+
env->DeleteLocalRef(jQuad);
|
|
229
|
+
env->DeleteLocalRef(jImageDataAfterCropAndDeskew);
|
|
230
|
+
env->DeleteLocalRef(clz);
|
|
231
|
+
env->DeleteLocalRef(jImageData);
|
|
232
|
+
if (needDetach) {
|
|
233
|
+
gJvm->DetachCurrentThread();
|
|
234
|
+
}
|
|
235
|
+
return imageHOAfterCrop;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
const int type_adjust_brightness = 0;
|
|
240
|
+
const int type_adjust_contrast = 1;
|
|
241
|
+
const int type_filter = 2;
|
|
242
|
+
|
|
243
|
+
ImageDataHostObject adjustOrFilter(Runtime &rt, ImageDataHostObject &imageDataHO, int value, int type) {
|
|
244
|
+
JNIEnv *env;
|
|
245
|
+
bool needDetach = false;
|
|
246
|
+
int state = gJvm->GetEnv((void **) &env, JNI_VERSION_1_6);
|
|
247
|
+
if (state == JNI_EDETACHED || env == nullptr) {
|
|
248
|
+
gJvm->AttachCurrentThread(&env, nullptr);
|
|
249
|
+
needDetach = true;
|
|
250
|
+
}
|
|
251
|
+
jclass clz = env->GetObjectClass(jImageManagerModule);
|
|
252
|
+
jmethodID methodId;
|
|
253
|
+
switch (type) {
|
|
254
|
+
case type_adjust_brightness:
|
|
255
|
+
methodId = env->GetMethodID(clz, "adjustBrightnessCalledInJsi",
|
|
256
|
+
"(Lcom/dynamsoft/core/basic_structures/ImageData;I)Lcom/dynamsoft/core/basic_structures/ImageData;");
|
|
257
|
+
break;
|
|
258
|
+
case type_adjust_contrast:
|
|
259
|
+
methodId = env->GetMethodID(clz, "adjustContrastCalledInJsi",
|
|
260
|
+
"(Lcom/dynamsoft/core/basic_structures/ImageData;I)Lcom/dynamsoft/core/basic_structures/ImageData;");
|
|
261
|
+
break;
|
|
262
|
+
case type_filter:
|
|
263
|
+
default:
|
|
264
|
+
methodId = env->GetMethodID(clz, "filterImageCalledInJsi",
|
|
265
|
+
"(Lcom/dynamsoft/core/basic_structures/ImageData;I)Lcom/dynamsoft/core/basic_structures/ImageData;");
|
|
266
|
+
break;
|
|
267
|
+
}
|
|
268
|
+
auto jImageData = jsiConversion::core::getJImageDataFromHO(env, imageDataHO);
|
|
269
|
+
auto jImageDataAfter = env->CallObjectMethod(jImageManagerModule, methodId, jImageData, value);
|
|
270
|
+
ImageDataHostObject imageHOAfter;
|
|
271
|
+
jsiConversion::core::getHOFromJImageData(env, jImageDataAfter, imageHOAfter);
|
|
272
|
+
env->DeleteLocalRef(jImageDataAfter);
|
|
273
|
+
env->DeleteLocalRef(clz);
|
|
274
|
+
env->DeleteLocalRef(jImageData);
|
|
275
|
+
if (needDetach) {
|
|
276
|
+
gJvm->DetachCurrentThread();
|
|
277
|
+
}
|
|
278
|
+
return imageHOAfter;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
ImageDataHostObject convertToGray(Runtime &rt, ImageDataHostObject &imageDataHO, float r, float g, float b) {
|
|
282
|
+
JNIEnv *env;
|
|
283
|
+
bool needDetach = false;
|
|
284
|
+
int state = gJvm->GetEnv((void **) &env, JNI_VERSION_1_6);
|
|
285
|
+
if (state == JNI_EDETACHED || env == nullptr) {
|
|
286
|
+
gJvm->AttachCurrentThread(&env, nullptr);
|
|
287
|
+
needDetach = true;
|
|
288
|
+
}
|
|
289
|
+
jclass clz = env->GetObjectClass(jImageManagerModule);
|
|
290
|
+
jmethodID methodId = env->GetMethodID(clz, "convertToGrayCalledInJsi",
|
|
291
|
+
"(Lcom/dynamsoft/core/basic_structures/ImageData;FFF)Lcom/dynamsoft/core/basic_structures/ImageData;");
|
|
292
|
+
auto jImageData = jsiConversion::core::getJImageDataFromHO(env, imageDataHO);
|
|
293
|
+
auto jImageDataAfterConvert = env->CallObjectMethod(jImageManagerModule, methodId, jImageData, r, g, b);
|
|
294
|
+
ImageDataHostObject imageHOAfterConvert;
|
|
295
|
+
jsiConversion::core::getHOFromJImageData(env, jImageDataAfterConvert, imageHOAfterConvert);
|
|
296
|
+
env->DeleteLocalRef(jImageDataAfterConvert);
|
|
297
|
+
env->DeleteLocalRef(clz);
|
|
298
|
+
env->DeleteLocalRef(jImageData);
|
|
299
|
+
if (needDetach) {
|
|
300
|
+
gJvm->DetachCurrentThread();
|
|
301
|
+
}
|
|
302
|
+
return imageHOAfterConvert;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
ImageDataHostObject convertToBinaryGlobal(Runtime &rt, ImageDataHostObject &imageDataHO, int threshold, bool invert) {
|
|
306
|
+
JNIEnv *env;
|
|
307
|
+
bool needDetach = false;
|
|
308
|
+
int state = gJvm->GetEnv((void **) &env, JNI_VERSION_1_6);
|
|
309
|
+
if (state == JNI_EDETACHED || env == nullptr) {
|
|
310
|
+
gJvm->AttachCurrentThread(&env, nullptr);
|
|
311
|
+
needDetach = true;
|
|
312
|
+
}
|
|
313
|
+
jclass clz = env->GetObjectClass(jImageManagerModule);
|
|
314
|
+
jmethodID methodId = env->GetMethodID(clz, "convertToBinaryGlobalCalledInJsi",
|
|
315
|
+
"(Lcom/dynamsoft/core/basic_structures/ImageData;IZ)Lcom/dynamsoft/core/basic_structures/ImageData;");
|
|
316
|
+
auto jImageData = jsiConversion::core::getJImageDataFromHO(env, imageDataHO);
|
|
317
|
+
auto jImageDataAfterConvert = env->CallObjectMethod(jImageManagerModule, methodId, jImageData, threshold, invert);
|
|
318
|
+
ImageDataHostObject imageHOAfterConvert;
|
|
319
|
+
jsiConversion::core::getHOFromJImageData(env, jImageDataAfterConvert, imageHOAfterConvert);
|
|
320
|
+
env->DeleteLocalRef(jImageDataAfterConvert);
|
|
321
|
+
env->DeleteLocalRef(clz);
|
|
322
|
+
env->DeleteLocalRef(jImageData);
|
|
323
|
+
if (needDetach) {
|
|
324
|
+
gJvm->DetachCurrentThread();
|
|
325
|
+
}
|
|
326
|
+
return imageHOAfterConvert;
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
ImageDataHostObject convertToBinaryLocal(Runtime &rt, ImageDataHostObject &imageDataHO, int blockSize, int compensation, bool invert) {
|
|
330
|
+
JNIEnv *env;
|
|
331
|
+
bool needDetach = false;
|
|
332
|
+
int state = gJvm->GetEnv((void **) &env, JNI_VERSION_1_6);
|
|
333
|
+
if (state == JNI_EDETACHED || env == nullptr) {
|
|
334
|
+
gJvm->AttachCurrentThread(&env, nullptr);
|
|
335
|
+
needDetach = true;
|
|
336
|
+
}
|
|
337
|
+
jclass clz = env->GetObjectClass(jImageManagerModule);
|
|
338
|
+
jmethodID methodId = env->GetMethodID(clz, "convertToBinaryLocalCalledInJsi",
|
|
339
|
+
"(Lcom/dynamsoft/core/basic_structures/ImageData;IIZ)Lcom/dynamsoft/core/basic_structures/ImageData;");
|
|
340
|
+
auto jImageData = jsiConversion::core::getJImageDataFromHO(env, imageDataHO);
|
|
341
|
+
auto jImageDataAfterConvert = env->CallObjectMethod(jImageManagerModule, methodId, jImageData, blockSize, compensation, invert);
|
|
342
|
+
ImageDataHostObject imageHOAfterConvert;
|
|
343
|
+
jsiConversion::core::getHOFromJImageData(env, jImageDataAfterConvert, imageHOAfterConvert);
|
|
344
|
+
env->DeleteLocalRef(jImageDataAfterConvert);
|
|
345
|
+
env->DeleteLocalRef(clz);
|
|
346
|
+
env->DeleteLocalRef(jImageData);
|
|
347
|
+
if (needDetach) {
|
|
348
|
+
gJvm->DetachCurrentThread();
|
|
349
|
+
}
|
|
350
|
+
return imageHOAfterConvert;
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
|
|
354
|
+
#define JSI_FUNC [](Runtime &runtime, const Value &thisValue, const Value *arguments, size_t count) -> Value
|
|
355
|
+
|
|
356
|
+
namespace jsi_install::utility {
|
|
357
|
+
void install_imageIO_saveToFile(Runtime &jsiRuntime) {
|
|
358
|
+
auto nameID = PropNameID::forAscii(jsiRuntime, "imageIO_saveToFile");
|
|
359
|
+
if (!jsiRuntime.global().hasProperty(jsiRuntime, nameID)) {
|
|
360
|
+
auto saveToFileFcn = Function::createFromHostFunction(jsiRuntime, nameID, 3, JSI_FUNC {
|
|
361
|
+
auto imageDataObj = arguments[0].asObject(runtime);
|
|
362
|
+
auto imageDataHostObject = ImageDataHostObject::getHOFromObject(runtime, std::move(imageDataObj));
|
|
363
|
+
auto filePath = arguments[1].asString(runtime).utf8(runtime);
|
|
364
|
+
bool overWrite = arguments[2].asBool();
|
|
365
|
+
saveImageDataHOToFile(runtime, imageDataHostObject, filePath, overWrite);
|
|
366
|
+
return {};
|
|
367
|
+
});
|
|
368
|
+
jsiRuntime.global().setProperty(jsiRuntime, nameID, std::move(saveToFileFcn));
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
void install_imageIO_readFromFile(Runtime &jsiRuntime) {
|
|
373
|
+
auto nameID = PropNameID::forAscii(jsiRuntime, "imageIO_readFromFile");
|
|
374
|
+
if (!jsiRuntime.global().hasProperty(jsiRuntime, nameID)) {
|
|
375
|
+
auto readFromFileFcn = Function::createFromHostFunction(jsiRuntime, nameID, 1, JSI_FUNC {
|
|
376
|
+
auto filePath = arguments[0].asString(runtime).utf8(runtime);
|
|
377
|
+
auto imageDataHostObject = readImageDataHOFromFile(runtime, filePath);
|
|
378
|
+
return Object::createFromHostObject(runtime, std::make_shared<ImageDataHostObject>(imageDataHostObject));
|
|
379
|
+
});
|
|
380
|
+
jsiRuntime.global().setProperty(jsiRuntime, nameID, std::move(readFromFileFcn));
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
void install_imageIO_readFromMemory(Runtime &jsiRuntime) {
|
|
385
|
+
auto nameID = PropNameID::forAscii(jsiRuntime, "imageIO_readFromMemory");
|
|
386
|
+
if (!jsiRuntime.global().hasProperty(jsiRuntime, nameID)) {
|
|
387
|
+
auto readFromMemoryFcn = Function::createFromHostFunction(jsiRuntime, nameID, 1, JSI_FUNC {
|
|
388
|
+
auto buffer = arguments[0].asObject(runtime).getArrayBuffer(runtime);
|
|
389
|
+
auto pBuffer = (unsigned char *) buffer.data(runtime);
|
|
390
|
+
auto len = (int) buffer.length(runtime);
|
|
391
|
+
auto imageDataHostObject = readImageDataHOFromMemory(runtime, pBuffer, len);
|
|
392
|
+
return Object::createFromHostObject(runtime, std::make_shared<ImageDataHostObject>(imageDataHostObject));
|
|
393
|
+
});
|
|
394
|
+
jsiRuntime.global().setProperty(jsiRuntime, nameID, std::move(readFromMemoryFcn));
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
void install_imageIO_saveToMemory(Runtime &jsiRuntime) {
|
|
399
|
+
auto nameID = PropNameID::forAscii(jsiRuntime, "imageIO_saveToMemory");
|
|
400
|
+
if (!jsiRuntime.global().hasProperty(jsiRuntime, nameID)) {
|
|
401
|
+
auto saveToMemoryFcn = Function::createFromHostFunction(jsiRuntime, nameID, 2, JSI_FUNC {
|
|
402
|
+
auto imageDataObj = arguments[0].asObject(runtime);
|
|
403
|
+
auto imageDataHostObject = ImageDataHostObject::getHOFromObject(runtime, std::move(imageDataObj));
|
|
404
|
+
int fileFormat = arguments[1].asNumber();
|
|
405
|
+
auto arrayBuffer = saveImageDataHOToMemory(runtime, imageDataHostObject, fileFormat);
|
|
406
|
+
return arrayBuffer;
|
|
407
|
+
});
|
|
408
|
+
jsiRuntime.global().setProperty(jsiRuntime, nameID, std::move(saveToMemoryFcn));
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
void install_imageDrawer_drawOnImage(Runtime &jsiRuntime) {
|
|
413
|
+
auto nameID = PropNameID::forAscii(jsiRuntime, "imageDrawer_drawOnImage");
|
|
414
|
+
if (!jsiRuntime.global().hasProperty(jsiRuntime, nameID)) {
|
|
415
|
+
auto drawOnImageFcn = Function::createFromHostFunction(jsiRuntime, nameID, 4, JSI_FUNC {
|
|
416
|
+
auto imageDataObj = arguments[0].asObject(runtime);
|
|
417
|
+
auto imageDataHostObject = ImageDataHostObject::getHOFromObject(runtime, std::move(imageDataObj));
|
|
418
|
+
auto jsQuads = arguments[1].asObject(runtime).asArray(runtime);
|
|
419
|
+
auto color = arguments[2].asNumber();
|
|
420
|
+
auto thickness = arguments[3].asNumber();
|
|
421
|
+
ImageDataHostObject imageHOAfterDraw = drawOnImage(runtime, imageDataHostObject, jsQuads, (int) color, (int) thickness);
|
|
422
|
+
return Object::createFromHostObject(runtime, std::make_shared<ImageDataHostObject>(imageHOAfterDraw));
|
|
423
|
+
});
|
|
424
|
+
jsiRuntime.global().setProperty(jsiRuntime, nameID, std::move(drawOnImageFcn));
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
void install_imageProcessor_cropImage(Runtime &jsiRuntime) {
|
|
429
|
+
auto nameID = PropNameID::forAscii(jsiRuntime, "imageProcessor_cropImage");
|
|
430
|
+
if (!jsiRuntime.global().hasProperty(jsiRuntime, nameID)) {
|
|
431
|
+
auto cropImageFcn = Function::createFromHostFunction(jsiRuntime, nameID, 2, JSI_FUNC {
|
|
432
|
+
auto imageDataObj = arguments[0].asObject(runtime);
|
|
433
|
+
auto imageDataHostObject = ImageDataHostObject::getHOFromObject(runtime, std::move(imageDataObj));
|
|
434
|
+
auto jsDsRect = arguments[1].asObject(runtime);
|
|
435
|
+
ImageDataHostObject imageHOAfterCrop = cropImage(runtime, imageDataHostObject, jsDsRect);
|
|
436
|
+
return Object::createFromHostObject(runtime, std::make_shared<ImageDataHostObject>(imageHOAfterCrop));
|
|
437
|
+
});
|
|
438
|
+
jsiRuntime.global().setProperty(jsiRuntime, nameID, std::move(cropImageFcn));
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
void install_imageProcessor_cropAndDeskewImage(Runtime &jsiRuntime) {
|
|
443
|
+
auto nameID = PropNameID::forAscii(jsiRuntime, "imageProcessor_cropAndDeskewImage");
|
|
444
|
+
if (!jsiRuntime.global().hasProperty(jsiRuntime, nameID)) {
|
|
445
|
+
auto cropAndDeskewImageFcn = Function::createFromHostFunction(jsiRuntime, nameID, 5, JSI_FUNC {
|
|
446
|
+
auto imageDataObj = arguments[0].asObject(runtime);
|
|
447
|
+
auto imageDataHostObject = ImageDataHostObject::getHOFromObject(runtime, std::move(imageDataObj));
|
|
448
|
+
auto jsQuads = arguments[1].asObject(runtime);
|
|
449
|
+
int dstWidth = arguments[2].asNumber();
|
|
450
|
+
int dstHeight = arguments[3].asNumber();
|
|
451
|
+
int padding = arguments[4].asNumber();
|
|
452
|
+
ImageDataHostObject imageHOAfterCrop = cropAndDeskewImage(runtime, imageDataHostObject, jsQuads, dstWidth, dstHeight, padding);
|
|
453
|
+
if (imageHOAfterCrop.buffer == nullptr) {
|
|
454
|
+
return Value::undefined();
|
|
455
|
+
}
|
|
456
|
+
return Object::createFromHostObject(runtime, std::make_shared<ImageDataHostObject>(imageHOAfterCrop));
|
|
457
|
+
});
|
|
458
|
+
jsiRuntime.global().setProperty(jsiRuntime, nameID, std::move(cropAndDeskewImageFcn));
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
void install_imageProcessor_adjustBrightness(Runtime &jsiRuntime) {
|
|
463
|
+
PropNameID nameId = PropNameID::forAscii(jsiRuntime, "imageProcessor_adjustBrightness");
|
|
464
|
+
if (!jsiRuntime.global().hasProperty(jsiRuntime, nameId)) {
|
|
465
|
+
auto adjustOrFilterFcn = Function::createFromHostFunction(jsiRuntime, nameId, 2, JSI_FUNC {
|
|
466
|
+
auto imageDataObj = arguments[0].asObject(runtime);
|
|
467
|
+
auto imageDataHostObject = ImageDataHostObject::getHOFromObject(runtime, std::move(imageDataObj));
|
|
468
|
+
auto value = arguments[1].asNumber();
|
|
469
|
+
ImageDataHostObject imageHOAfter = adjustOrFilter(runtime, imageDataHostObject, (int) value, type_adjust_brightness);
|
|
470
|
+
if (imageHOAfter.buffer == nullptr) {
|
|
471
|
+
return Value::undefined();
|
|
472
|
+
}
|
|
473
|
+
return Object::createFromHostObject(runtime, std::make_shared<ImageDataHostObject>(imageHOAfter));
|
|
474
|
+
});
|
|
475
|
+
jsiRuntime.global().setProperty(jsiRuntime, nameId, std::move(adjustOrFilterFcn));
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
void install_imageProcessor_adjustContrast(Runtime &jsiRuntime) {
|
|
480
|
+
PropNameID nameId = PropNameID::forAscii(jsiRuntime, "imageProcessor_adjustContrast");
|
|
481
|
+
if (!jsiRuntime.global().hasProperty(jsiRuntime, nameId)) {
|
|
482
|
+
auto adjustOrFilterFcn = Function::createFromHostFunction(jsiRuntime, nameId, 2, JSI_FUNC {
|
|
483
|
+
auto imageDataObj = arguments[0].asObject(runtime);
|
|
484
|
+
auto imageDataHostObject = ImageDataHostObject::getHOFromObject(runtime, std::move(imageDataObj));
|
|
485
|
+
auto value = arguments[1].asNumber();
|
|
486
|
+
ImageDataHostObject imageHOAfter = adjustOrFilter(runtime, imageDataHostObject, (int) value, type_adjust_contrast);
|
|
487
|
+
if (imageHOAfter.buffer == nullptr) {
|
|
488
|
+
return Value::undefined();
|
|
489
|
+
}
|
|
490
|
+
return Object::createFromHostObject(runtime, std::make_shared<ImageDataHostObject>(imageHOAfter));
|
|
491
|
+
});
|
|
492
|
+
jsiRuntime.global().setProperty(jsiRuntime, nameId, std::move(adjustOrFilterFcn));
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
void install_imageProcessor_filterImage(Runtime &jsiRuntime) {
|
|
497
|
+
PropNameID nameId = PropNameID::forAscii(jsiRuntime, "imageProcessor_filterImage");
|
|
498
|
+
if (!jsiRuntime.global().hasProperty(jsiRuntime, nameId)) {
|
|
499
|
+
auto adjustOrFilterFcn = Function::createFromHostFunction(jsiRuntime, nameId, 2, JSI_FUNC {
|
|
500
|
+
auto imageDataObj = arguments[0].asObject(runtime);
|
|
501
|
+
auto imageDataHostObject = ImageDataHostObject::getHOFromObject(runtime, std::move(imageDataObj));
|
|
502
|
+
auto value = arguments[1].asNumber();
|
|
503
|
+
ImageDataHostObject imageHOAfter = adjustOrFilter(runtime, imageDataHostObject, (int) value, type_filter);
|
|
504
|
+
if (imageHOAfter.buffer == nullptr) {
|
|
505
|
+
return Value::undefined();
|
|
506
|
+
}
|
|
507
|
+
return Object::createFromHostObject(runtime, std::make_shared<ImageDataHostObject>(imageHOAfter));
|
|
508
|
+
});
|
|
509
|
+
jsiRuntime.global().setProperty(jsiRuntime, nameId, std::move(adjustOrFilterFcn));
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
void install_imageProcessor_convertToGray(Runtime &jsiRuntime) {
|
|
514
|
+
PropNameID nameId = PropNameID::forAscii(jsiRuntime, "imageProcessor_convertToGray");
|
|
515
|
+
if (!jsiRuntime.global().hasProperty(jsiRuntime, nameId)) {
|
|
516
|
+
auto convertToGrayFcn = Function::createFromHostFunction(jsiRuntime, nameId, 4, JSI_FUNC {
|
|
517
|
+
auto imageDataObj = arguments[0].asObject(runtime);
|
|
518
|
+
auto imageDataHostObject = ImageDataHostObject::getHOFromObject(runtime, std::move(imageDataObj));
|
|
519
|
+
float r = arguments[1].asNumber();
|
|
520
|
+
float g = arguments[2].asNumber();
|
|
521
|
+
float b = arguments[3].asNumber();
|
|
522
|
+
ImageDataHostObject grayImageHO = convertToGray(runtime, imageDataHostObject, r, g, b);
|
|
523
|
+
if (grayImageHO.buffer == nullptr) {
|
|
524
|
+
return Value::undefined();
|
|
525
|
+
}
|
|
526
|
+
return Object::createFromHostObject(runtime, std::make_shared<ImageDataHostObject>(grayImageHO));
|
|
527
|
+
});
|
|
528
|
+
jsiRuntime.global().setProperty(jsiRuntime, nameId, std::move(convertToGrayFcn));
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
void install_imageProcessor_convertToBinaryGlobal(Runtime &jsiRuntime) {
|
|
533
|
+
PropNameID nameId = PropNameID::forAscii(jsiRuntime, "imageProcessor_convertToBinaryGlobal");
|
|
534
|
+
if (!jsiRuntime.global().hasProperty(jsiRuntime, nameId)) {
|
|
535
|
+
auto convertToBinaryGlobalFcn = Function::createFromHostFunction(jsiRuntime, nameId, 3, JSI_FUNC {
|
|
536
|
+
auto imageDataObj = arguments[0].asObject(runtime);
|
|
537
|
+
auto imageDataHostObject = ImageDataHostObject::getHOFromObject(runtime, std::move(imageDataObj));
|
|
538
|
+
int threshold = arguments[1].asNumber();
|
|
539
|
+
bool isInvert = arguments[2].asBool();
|
|
540
|
+
ImageDataHostObject binaryImageHO = convertToBinaryGlobal(runtime, imageDataHostObject, threshold, isInvert);
|
|
541
|
+
if (binaryImageHO.buffer == nullptr) {
|
|
542
|
+
return Value::undefined();
|
|
543
|
+
}
|
|
544
|
+
return Object::createFromHostObject(runtime, std::make_shared<ImageDataHostObject>(binaryImageHO));
|
|
545
|
+
});
|
|
546
|
+
jsiRuntime.global().setProperty(jsiRuntime, nameId, std::move(convertToBinaryGlobalFcn));
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
void install_imageProcessor_convertToBinaryLocal(Runtime &jsiRuntime) {
|
|
551
|
+
PropNameID nameId = PropNameID::forAscii(jsiRuntime, "imageProcessor_convertToBinaryLocal");
|
|
552
|
+
if (!jsiRuntime.global().hasProperty(jsiRuntime, nameId)) {
|
|
553
|
+
auto convertToBinaryLocalFcn = Function::createFromHostFunction(jsiRuntime, nameId, 4, JSI_FUNC {
|
|
554
|
+
auto imageDataObj = arguments[0].asObject(runtime);
|
|
555
|
+
auto imageDataHostObject = ImageDataHostObject::getHOFromObject(runtime, std::move(imageDataObj));
|
|
556
|
+
int blockSize = arguments[1].asNumber();
|
|
557
|
+
int compensation = arguments[2].asNumber();
|
|
558
|
+
bool isInvert = arguments[3].asBool();
|
|
559
|
+
ImageDataHostObject binaryImageHO = convertToBinaryLocal(runtime, imageDataHostObject, blockSize, compensation, isInvert);
|
|
560
|
+
if (binaryImageHO.buffer == nullptr) {
|
|
561
|
+
return Value::undefined();
|
|
562
|
+
}
|
|
563
|
+
return Object::createFromHostObject(runtime, std::make_shared<ImageDataHostObject>(binaryImageHO));
|
|
564
|
+
});
|
|
565
|
+
jsiRuntime.global().setProperty(jsiRuntime, nameId, std::move(convertToBinaryLocalFcn));
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
} //namespace jsi_install::utility
|
|
569
|
+
|
|
570
|
+
void install_imageManager_methods(Runtime &jsiRuntime) {
|
|
571
|
+
jsi_install::utility::install_imageIO_saveToFile(jsiRuntime);
|
|
572
|
+
jsi_install::utility::install_imageIO_readFromFile(jsiRuntime);
|
|
573
|
+
jsi_install::utility::install_imageIO_readFromMemory(jsiRuntime);
|
|
574
|
+
jsi_install::utility::install_imageIO_saveToMemory(jsiRuntime);
|
|
575
|
+
jsi_install::utility::install_imageDrawer_drawOnImage(jsiRuntime);
|
|
576
|
+
jsi_install::utility::install_imageProcessor_cropImage(jsiRuntime);
|
|
577
|
+
jsi_install::utility::install_imageProcessor_cropAndDeskewImage(jsiRuntime);
|
|
578
|
+
jsi_install::utility::install_imageProcessor_adjustBrightness(jsiRuntime);
|
|
579
|
+
jsi_install::utility::install_imageProcessor_adjustContrast(jsiRuntime);
|
|
580
|
+
jsi_install::utility::install_imageProcessor_filterImage(jsiRuntime);
|
|
581
|
+
jsi_install::utility::install_imageProcessor_convertToGray(jsiRuntime);
|
|
582
|
+
jsi_install::utility::install_imageProcessor_convertToBinaryGlobal(jsiRuntime);
|
|
583
|
+
jsi_install::utility::install_imageProcessor_convertToBinaryLocal(jsiRuntime);
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
|
|
587
|
+
extern "C"
|
|
588
|
+
JNIEXPORT void JNICALL
|
|
589
|
+
Java_com_dynamsoft_reactnativelib_utility_ImageManagerModuleImpl_nativeInstall(JNIEnv *env, jobject thiz, jlong jsiPtr) {
|
|
590
|
+
if (!env->IsSameObject(jImageManagerModule, thiz)) {
|
|
591
|
+
jImageManagerModule = env->NewWeakGlobalRef(thiz);
|
|
592
|
+
}
|
|
593
|
+
if (jclzQuad == nullptr) {
|
|
594
|
+
jclzQuad = (jclass) env->NewWeakGlobalRef(env->FindClass("com/dynamsoft/core/basic_structures/Quadrilateral"));
|
|
595
|
+
}
|
|
596
|
+
if (jclzPoint == nullptr) {
|
|
597
|
+
jclzPoint = (jclass) env->NewWeakGlobalRef(env->FindClass("android/graphics/Point"));
|
|
598
|
+
}
|
|
599
|
+
if (jclzDSRect == nullptr) {
|
|
600
|
+
jclzDSRect = (jclass) env->NewWeakGlobalRef(env->FindClass("com/dynamsoft/core/basic_structures/DSRect"));
|
|
601
|
+
}
|
|
602
|
+
auto rt = reinterpret_cast<Runtime *>(jsiPtr);
|
|
603
|
+
install_imageManager_methods(*rt);
|
|
604
|
+
}
|