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.
Files changed (222) hide show
  1. package/LICENSE +5 -5
  2. package/README.md +62 -66
  3. package/android/README.md +14 -14
  4. package/android/build.gradle +167 -163
  5. package/android/gradle.properties +20 -20
  6. package/android/settings.gradle +5 -5
  7. package/android/src/main/AndroidManifest.xml +6 -6
  8. package/android/src/main/AndroidManifest_noPackage.xml +5 -5
  9. package/android/src/main/cpp/CMakeLists.txt +21 -21
  10. package/android/src/main/cpp/ImgHO.cpp +94 -94
  11. package/android/src/main/cpp/ImgHO.h +34 -34
  12. package/android/src/main/cpp/JsiCore.cpp +296 -296
  13. package/android/src/main/cpp/JsiCore.h +51 -51
  14. package/android/src/main/cpp/JsiCvr.cpp +332 -332
  15. package/android/src/main/cpp/JsiCvr.h +54 -54
  16. package/android/src/main/cpp/JsiDbr.cpp +283 -283
  17. package/android/src/main/cpp/JsiDbr.h +26 -26
  18. package/android/src/main/cpp/JsiDce.cpp +59 -59
  19. package/android/src/main/cpp/JsiDce.h +17 -17
  20. package/android/src/main/cpp/JsiDcp.cpp +51 -51
  21. package/android/src/main/cpp/JsiDcp.h +31 -31
  22. package/android/src/main/cpp/JsiDdn.cpp +50 -50
  23. package/android/src/main/cpp/JsiDdn.h +28 -28
  24. package/android/src/main/cpp/JsiDlr.cpp +60 -60
  25. package/android/src/main/cpp/JsiDlr.h +26 -26
  26. package/android/src/main/cpp/JsiUtility.cpp +604 -604
  27. package/android/src/main/cpp/JsiUtility.h +26 -26
  28. package/android/src/main/cpp/RawBuffer.cpp +23 -23
  29. package/android/src/main/cpp/RawBuffer.h +24 -24
  30. package/android/src/main/cpp/android_log.h +14 -14
  31. package/android/src/main/dysJniLibs/debug/arm64-v8a/librn_dys.so +0 -0
  32. package/android/src/main/dysJniLibs/debug/armeabi-v7a/librn_dys.so +0 -0
  33. package/android/src/main/dysJniLibs/debug/x86/librn_dys.so +0 -0
  34. package/android/src/main/dysJniLibs/debug/x86_64/librn_dys.so +0 -0
  35. package/android/src/main/dysJniLibs/release/arm64-v8a/librn_dys.so +0 -0
  36. package/android/src/main/dysJniLibs/release/armeabi-v7a/librn_dys.so +0 -0
  37. package/android/src/main/dysJniLibs/release/x86/librn_dys.so +0 -0
  38. package/android/src/main/dysJniLibs/release/x86_64/librn_dys.so +0 -0
  39. package/android/src/main/dysJniLibsFor81/debug/arm64-v8a/librn_dys.so +0 -0
  40. package/android/src/main/dysJniLibsFor81/debug/armeabi-v7a/librn_dys.so +0 -0
  41. package/android/src/main/dysJniLibsFor81/debug/x86/librn_dys.so +0 -0
  42. package/android/src/main/dysJniLibsFor81/debug/x86_64/librn_dys.so +0 -0
  43. package/android/src/main/dysJniLibsFor81/release/arm64-v8a/librn_dys.so +0 -0
  44. package/android/src/main/dysJniLibsFor81/release/armeabi-v7a/librn_dys.so +0 -0
  45. package/android/src/main/dysJniLibsFor81/release/x86/librn_dys.so +0 -0
  46. package/android/src/main/dysJniLibsFor81/release/x86_64/librn_dys.so +0 -0
  47. package/android/src/main/dysJniLibsFor82/debug/arm64-v8a/librn_dys.so +0 -0
  48. package/android/src/main/dysJniLibsFor82/debug/armeabi-v7a/librn_dys.so +0 -0
  49. package/android/src/main/dysJniLibsFor82/debug/x86/librn_dys.so +0 -0
  50. package/android/src/main/dysJniLibsFor82/debug/x86_64/librn_dys.so +0 -0
  51. package/android/src/main/dysJniLibsFor82/release/arm64-v8a/librn_dys.so +0 -0
  52. package/android/src/main/dysJniLibsFor82/release/armeabi-v7a/librn_dys.so +0 -0
  53. package/android/src/main/dysJniLibsFor82/release/x86/librn_dys.so +0 -0
  54. package/android/src/main/dysJniLibsFor82/release/x86_64/librn_dys.so +0 -0
  55. package/android/src/main/dysJniLibsFor86/debug/arm64-v8a/librn_dys.so +3 -0
  56. package/android/src/main/dysJniLibsFor86/debug/armeabi-v7a/librn_dys.so +3 -0
  57. package/android/src/main/dysJniLibsFor86/debug/x86/librn_dys.so +3 -0
  58. package/android/src/main/dysJniLibsFor86/debug/x86_64/librn_dys.so +3 -0
  59. package/android/src/main/dysJniLibsFor86/release/arm64-v8a/librn_dys.so +3 -0
  60. package/android/src/main/dysJniLibsFor86/release/armeabi-v7a/librn_dys.so +3 -0
  61. package/android/src/main/dysJniLibsFor86/release/x86/librn_dys.so +3 -0
  62. package/android/src/main/dysJniLibsFor86/release/x86_64/librn_dys.so +3 -0
  63. package/android/src/main/java/com/dynamsoft/reactnativelib/CVRModule.kt +137 -137
  64. package/android/src/main/java/com/dynamsoft/reactnativelib/CameraViewManager.kt +62 -62
  65. package/android/src/main/java/com/dynamsoft/reactnativelib/DCEModule.kt +125 -125
  66. package/android/src/main/java/com/dynamsoft/reactnativelib/DynamsoftBaseModule.kt +8 -8
  67. package/android/src/main/java/com/dynamsoft/reactnativelib/ISAModule.kt +73 -73
  68. package/android/src/main/java/com/dynamsoft/reactnativelib/ImageEditorViewManager.kt +14 -14
  69. package/android/src/main/java/com/dynamsoft/reactnativelib/ImageEditorViewModule.kt +35 -35
  70. package/android/src/main/java/com/dynamsoft/reactnativelib/ImageManagerModule.kt +15 -15
  71. package/android/src/main/java/com/dynamsoft/reactnativelib/LicenseModule.kt +29 -29
  72. package/android/src/main/java/com/dynamsoft/reactnativelib/MultiCrossFilterModule.kt +83 -83
  73. package/android/src/main/java/com/dynamsoft/reactnativelib/ReactNativeDcvPackage.kt +32 -32
  74. package/android/src/main/java/com/dynamsoft/reactnativelib/VersionsModule.kt +41 -41
  75. package/android/src/main/java/com/dynamsoft/reactnativelib/basicutils/Basic.kt +44 -44
  76. package/android/src/main/java/com/dynamsoft/reactnativelib/basicutils/ForCore.kt +50 -50
  77. package/android/src/main/java/com/dynamsoft/reactnativelib/basicutils/ForCvr.kt +129 -129
  78. package/android/src/main/java/com/dynamsoft/reactnativelib/basicutils/ForDBR.kt +157 -157
  79. package/android/src/main/java/com/dynamsoft/reactnativelib/basicutils/ForDCE.kt +110 -110
  80. package/android/src/main/java/com/dynamsoft/reactnativelib/basicutils/ForDCP.kt +49 -49
  81. package/android/src/main/java/com/dynamsoft/reactnativelib/basicutils/ForDDN.kt +85 -85
  82. package/android/src/main/java/com/dynamsoft/reactnativelib/basicutils/ForDLR.kt +72 -72
  83. package/android/src/main/java/com/dynamsoft/reactnativelib/basicutils/ImageUtil.kt +58 -58
  84. package/android/src/main/java/com/dynamsoft/reactnativelib/core/ImageSourceAdapterModuleImpl.kt +120 -120
  85. package/android/src/main/java/com/dynamsoft/reactnativelib/cvr/CaptureVisionRouterModuleImpl.kt +306 -306
  86. package/android/src/main/java/com/dynamsoft/reactnativelib/dce/CameraEnhancerModuleImpl.kt +247 -247
  87. package/android/src/main/java/com/dynamsoft/reactnativelib/dce/CameraLifeCycleOwner.java +14 -14
  88. package/android/src/main/java/com/dynamsoft/reactnativelib/dce/CameraViewManagerImpl.kt +77 -77
  89. package/android/src/main/java/com/dynamsoft/reactnativelib/dce/ImageEditorViewManagerImpl.kt +15 -15
  90. package/android/src/main/java/com/dynamsoft/reactnativelib/dce/ImageEditorViewModuleImpl.kt +110 -110
  91. package/android/src/main/java/com/dynamsoft/reactnativelib/dce/RNCameraView.kt +20 -20
  92. package/android/src/main/java/com/dynamsoft/reactnativelib/dce/RNImageEditorView.kt +19 -19
  93. package/android/src/main/java/com/dynamsoft/reactnativelib/license/LicenseModuleImpl.kt +39 -39
  94. package/android/src/main/java/com/dynamsoft/reactnativelib/utility/ImageManagerModuleImpl.kt +120 -120
  95. package/android/src/main/java/com/dynamsoft/reactnativelib/utility/MultiCrossFilterModuleImpl.kt +111 -111
  96. package/app.plugin.js +21 -21
  97. package/dynamsoft-capture-vision-react-native.podspec +24 -24
  98. package/ios/CPP/DSImageData+HostObject.h +18 -18
  99. package/ios/CPP/DSImageData+HostObject.mm +38 -38
  100. package/ios/CPP/ImageDataHostObject.cpp +87 -87
  101. package/ios/CPP/ImageDataHostObject.hpp +35 -35
  102. package/ios/CPP/MutableRawBuffer.cpp +23 -23
  103. package/ios/CPP/MutableRawBuffer.hpp +23 -23
  104. package/ios/CPP/RNDynamsoft+JSI.h +22 -22
  105. package/ios/CPP/RNDynamsoft+JSI.mm +303 -303
  106. package/ios/CPP/RNDynamsoft+Json.h +93 -93
  107. package/ios/CPP/RNDynamsoft+Json.m +733 -733
  108. package/ios/CPP/YeetJSIUtils.h +56 -56
  109. package/ios/CPP/YeetJSIUtils.mm +208 -208
  110. package/ios/RNDynamsoftCameraView.h +31 -31
  111. package/ios/RNDynamsoftCameraView.m +108 -108
  112. package/ios/RNDynamsoftCameraViewManager.h +14 -14
  113. package/ios/RNDynamsoftCameraViewManager.m +195 -195
  114. package/ios/RNDynamsoftCaptureVisionRouter.h +18 -18
  115. package/ios/RNDynamsoftCaptureVisionRouter.mm +532 -532
  116. package/ios/RNDynamsoftImageEditorView.h +17 -17
  117. package/ios/RNDynamsoftImageEditorView.m +25 -25
  118. package/ios/RNDynamsoftImageEditorViewManager.h +14 -14
  119. package/ios/RNDynamsoftImageEditorViewManager.mm +183 -183
  120. package/ios/RNDynamsoftImageManager.h +14 -14
  121. package/ios/RNDynamsoftImageManager.mm +369 -369
  122. package/ios/RNDynamsoftImageSourceAdapter.h +19 -19
  123. package/ios/RNDynamsoftImageSourceAdapter.mm +255 -255
  124. package/ios/RNDynamsoftLicense.h +14 -14
  125. package/ios/RNDynamsoftLicense.m +62 -62
  126. package/ios/RNDynamsoftMultiCrossFilter.h +14 -14
  127. package/ios/RNDynamsoftMultiCrossFilter.m +145 -145
  128. package/ios/RNDynamsoftVersions.h +13 -13
  129. package/ios/RNDynamsoftVersions.m +27 -27
  130. package/package.json +48 -48
  131. package/src/NativeDynamsoftVersionsModule.tsx +20 -20
  132. package/src/VersionsModule.tsx +7 -7
  133. package/src/core/CapturedResultBase.tsx +18 -18
  134. package/src/core/CapturedResultItem.tsx +23 -23
  135. package/src/core/CoreModule.tsx +9 -9
  136. package/src/core/DSRect.tsx +29 -29
  137. package/src/core/EnumCaptureResultItemType.tsx +52 -52
  138. package/src/core/EnumColourChannelUsageType.tsx +26 -26
  139. package/src/core/EnumCrossVerificationStatus.tsx +46 -46
  140. package/src/core/EnumGrayscaleEnhancementMode.tsx +46 -46
  141. package/src/core/EnumGrayscaleTransformationMode.tsx +35 -35
  142. package/src/core/EnumImageFileFormat.tsx +6 -6
  143. package/src/core/EnumPixelFormat.tsx +53 -53
  144. package/src/core/ImageData.tsx +87 -87
  145. package/src/core/ImageSourceAdapter.tsx +160 -160
  146. package/src/core/NativeDynamsoftImageSourceAdapterModule.tsx +29 -29
  147. package/src/core/Point.tsx +13 -13
  148. package/src/core/Quadrilateral.tsx +12 -12
  149. package/src/core/index.tsx +18 -18
  150. package/src/cvr/CaptureVisionRouter.tsx +683 -683
  151. package/src/cvr/CaptureVisionRouterModule.tsx +9 -9
  152. package/src/cvr/CapturedResult.tsx +123 -123
  153. package/src/cvr/CapturedResultFilter.tsx +13 -13
  154. package/src/cvr/CapturedResultReceiver.tsx +71 -71
  155. package/src/cvr/EnumPresetTemplate.tsx +81 -81
  156. package/src/cvr/NativeDynamsoftCaptureVisionRouterModule.tsx +25 -25
  157. package/src/cvr/SimplifiedCaptureVisionSettings.tsx +61 -61
  158. package/src/cvr/index.tsx +11 -11
  159. package/src/dbr/BarcodeDetails.tsx +51 -51
  160. package/src/dbr/BarcodeReaderModule.tsx +9 -9
  161. package/src/dbr/BarcodeResultItem.tsx +65 -65
  162. package/src/dbr/DecodedBarcodesResult.tsx +14 -14
  163. package/src/dbr/ECISegment.tsx +23 -23
  164. package/src/dbr/EnumBarcodeFormat.tsx +112 -112
  165. package/src/dbr/EnumDeblurMode.tsx +29 -29
  166. package/src/dbr/EnumLocalizationMode.tsx +27 -27
  167. package/src/dbr/EnumQRCodeErrorCorrectionLevel.tsx +6 -6
  168. package/src/dbr/SimplifiedBarcodeReaderSettings.tsx +80 -80
  169. package/src/dbr/index.tsx +9 -9
  170. package/src/dce/CameraEnhancer.tsx +254 -254
  171. package/src/dce/CameraEnhancerModule.tsx +9 -9
  172. package/src/dce/CameraView.tsx +100 -100
  173. package/src/dce/DynamsoftCameraViewNativeComponent.ts +96 -96
  174. package/src/dce/DynamsoftImageEditorViewNativeComponent.ts +9 -9
  175. package/src/dce/EnumCameraPosition.tsx +25 -25
  176. package/src/dce/EnumDrawingLayerId.tsx +17 -17
  177. package/src/dce/EnumEnhancedFeatures.tsx +24 -24
  178. package/src/dce/EnumFocusMode.tsx +6 -6
  179. package/src/dce/EnumResolution.tsx +8 -8
  180. package/src/dce/EnumTorchState.tsx +10 -10
  181. package/src/dce/FeedBack.tsx +28 -28
  182. package/src/dce/ImageEditorView.tsx +131 -131
  183. package/src/dce/NativeDynamsoftCameraViewModule.tsx +47 -47
  184. package/src/dce/NativeDynamsoftImageEditorViewModule.ts +9 -9
  185. package/src/dce/index.tsx +13 -13
  186. package/src/dcp/CodeParserDedicatorModule.tsx +9 -9
  187. package/src/dcp/CodeParserModule.tsx +9 -9
  188. package/src/dcp/EnumMappingStatus.tsx +14 -14
  189. package/src/dcp/EnumValidationStatus.tsx +14 -14
  190. package/src/dcp/ParsedResult.tsx +14 -14
  191. package/src/dcp/ParsedResultItem.tsx +50 -50
  192. package/src/dcp/index.tsx +8 -8
  193. package/src/ddn/DeskewedImageResultItem.tsx +40 -40
  194. package/src/ddn/DetectedQuadResultItem.tsx +31 -31
  195. package/src/ddn/DocumentNormalizerModule.tsx +9 -9
  196. package/src/ddn/EnhancedImageResultItem.tsx +20 -20
  197. package/src/ddn/EnumImageColourMode.tsx +14 -14
  198. package/src/ddn/ProcessedDocumentResult.tsx +27 -27
  199. package/src/ddn/SimplifiedDocumentNormalizerSettings.tsx +65 -65
  200. package/src/ddn/index.tsx +11 -11
  201. package/src/dip/ImageProcessingModule.tsx +9 -9
  202. package/src/dip/index.tsx +1 -1
  203. package/src/dlr/CharacterResult.tsx +28 -28
  204. package/src/dlr/LabelRecognizerModule.tsx +9 -9
  205. package/src/dlr/RecognizedTextLinesResult.tsx +19 -19
  206. package/src/dlr/SimplifiedLabelRecognizerSettings.tsx +33 -33
  207. package/src/dlr/TextLineResultItem.tsx +41 -41
  208. package/src/dlr/index.tsx +8 -8
  209. package/src/index.tsx +13 -13
  210. package/src/license/LicenseManager.tsx +49 -49
  211. package/src/license/LicenseModule.tsx +9 -9
  212. package/src/license/NativeDynamsoftLicenseModule.tsx +7 -7
  213. package/src/license/index.tsx +7 -7
  214. package/src/utility/CrossVerificationCriteria.tsx +11 -11
  215. package/src/utility/EnumFilterType.tsx +5 -5
  216. package/src/utility/ImageManager.tsx +348 -348
  217. package/src/utility/MultiFrameResultCrossFilter.tsx +183 -183
  218. package/src/utility/NativeDynamsoftImageManagerModule.tsx +7 -7
  219. package/src/utility/NativeDynamsoftMultiCrossFilterModule.tsx +18 -18
  220. package/src/utility/UtilityModule.tsx +9 -9
  221. package/src/utility/index.tsx +4 -4
  222. 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
+ }