@nativescript/canvas 2.0.0-alpha.20 → 2.0.0-alpha.21

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 (234) hide show
  1. package/Canvas/common.d.ts +2 -0
  2. package/Canvas/common.js +6 -0
  3. package/Canvas/common.js.map +1 -1
  4. package/Canvas/index.android.d.ts +0 -2
  5. package/Canvas/index.android.js +8 -22
  6. package/Canvas/index.android.js.map +1 -1
  7. package/Canvas/index.d.ts +7 -0
  8. package/Canvas/index.ios.d.ts +0 -2
  9. package/Canvas/index.ios.js +7 -26
  10. package/Canvas/index.ios.js.map +1 -1
  11. package/Canvas2D/CanvasGradient/index.d.ts +1 -3
  12. package/Canvas2D/CanvasGradient/index.js +1 -10
  13. package/Canvas2D/CanvasGradient/index.js.map +1 -1
  14. package/Canvas2D/CanvasPattern/index.d.ts +1 -3
  15. package/Canvas2D/CanvasPattern/index.js +1 -10
  16. package/Canvas2D/CanvasPattern/index.js.map +1 -1
  17. package/Canvas2D/CanvasRenderingContext2D/index.d.ts +0 -2
  18. package/Canvas2D/CanvasRenderingContext2D/index.js +120 -138
  19. package/Canvas2D/CanvasRenderingContext2D/index.js.map +1 -1
  20. package/Canvas2D/DOMMatrix/index.js +3 -3
  21. package/Canvas2D/DOMMatrix/index.js.map +1 -1
  22. package/Canvas2D/ImageData/index.js +5 -5
  23. package/Canvas2D/ImageData/index.js.map +1 -1
  24. package/Canvas2D/Path2D/index.d.ts +0 -2
  25. package/Canvas2D/Path2D/index.js +34 -39
  26. package/Canvas2D/Path2D/index.js.map +1 -1
  27. package/ImageAsset/index.d.ts +2 -2
  28. package/ImageAsset/index.js +33 -37
  29. package/ImageAsset/index.js.map +1 -1
  30. package/ImageBitmap/index.d.ts +0 -2
  31. package/ImageBitmap/index.js +23 -29
  32. package/ImageBitmap/index.js.map +1 -1
  33. package/SVG/SVG.js +1 -1
  34. package/TextDecoder/index.d.ts +0 -2
  35. package/TextDecoder/index.js +3 -12
  36. package/TextDecoder/index.js.map +1 -1
  37. package/TextEncoder/index.d.ts +0 -2
  38. package/TextEncoder/index.js +4 -13
  39. package/TextEncoder/index.js.map +1 -1
  40. package/WebGL/WebGLExtensions/index.d.ts +0 -9
  41. package/WebGL/WebGLExtensions/index.js +17 -74
  42. package/WebGL/WebGLExtensions/index.js.map +1 -1
  43. package/WebGL/WebGLRenderingContext/common.d.ts +0 -2
  44. package/WebGL/WebGLRenderingContext/common.js +0 -10
  45. package/WebGL/WebGLRenderingContext/common.js.map +1 -1
  46. package/WebGL/WebGLRenderingContext/index.js +159 -298
  47. package/WebGL/WebGLRenderingContext/index.js.map +1 -1
  48. package/WebGL2/WebGL2RenderingContext/index.js +107 -195
  49. package/WebGL2/WebGL2RenderingContext/index.js.map +1 -1
  50. package/angular/esm2020/index.mjs +5 -5
  51. package/angular/fesm2015/nativescript-canvas-angular.mjs +4 -4
  52. package/angular/fesm2015/nativescript-canvas-angular.mjs.map +1 -1
  53. package/angular/fesm2020/nativescript-canvas-angular.mjs +4 -4
  54. package/angular/fesm2020/nativescript-canvas-angular.mjs.map +1 -1
  55. package/index.js.map +1 -1
  56. package/package.json +1 -1
  57. package/platforms/android/canvas-release.aar +0 -0
  58. package/platforms/android/include.gradle +15 -0
  59. package/platforms/ios/CanvasNative.xcframework/ios-arm64/CanvasNative.framework/CanvasNative +0 -0
  60. package/platforms/ios/CanvasNative.xcframework/ios-arm64/CanvasNative.framework/Headers/CanvasNative-Swift.h +87 -57
  61. package/platforms/ios/CanvasNative.xcframework/ios-arm64/CanvasNative.framework/Headers/CanvasNative.h +10 -0
  62. package/platforms/ios/CanvasNative.xcframework/ios-arm64/CanvasNative.framework/Headers/canvas_ios.h +142 -0
  63. package/platforms/ios/CanvasNative.xcframework/ios-arm64/CanvasNative.framework/Headers/canvas_native.h +2589 -110
  64. package/platforms/ios/CanvasNative.xcframework/ios-arm64/CanvasNative.framework/Info.plist +0 -0
  65. package/platforms/ios/CanvasNative.xcframework/ios-arm64/CanvasNative.framework/Modules/CanvasNative.swiftmodule/Project/arm64-apple-ios.swiftsourceinfo +0 -0
  66. package/platforms/ios/CanvasNative.xcframework/ios-arm64/CanvasNative.framework/Modules/CanvasNative.swiftmodule/arm64-apple-ios.abi.json +1174 -89
  67. package/platforms/ios/CanvasNative.xcframework/ios-arm64/CanvasNative.framework/Modules/CanvasNative.swiftmodule/arm64-apple-ios.private.swiftinterface +2 -2
  68. package/platforms/ios/CanvasNative.xcframework/ios-arm64/CanvasNative.framework/Modules/CanvasNative.swiftmodule/arm64-apple-ios.swiftdoc +0 -0
  69. package/platforms/ios/CanvasNative.xcframework/ios-arm64/CanvasNative.framework/Modules/CanvasNative.swiftmodule/arm64-apple-ios.swiftinterface +2 -2
  70. package/platforms/ios/CanvasNative.xcframework/ios-arm64/dSYMs/CanvasNative.framework.dSYM/Contents/Resources/DWARF/CanvasNative +0 -0
  71. package/platforms/ios/CanvasNative.xcframework/ios-arm64_x86_64-simulator/CanvasNative.framework/CanvasNative +0 -0
  72. package/platforms/ios/CanvasNative.xcframework/ios-arm64_x86_64-simulator/CanvasNative.framework/Headers/CanvasNative-Swift.h +174 -114
  73. package/platforms/ios/CanvasNative.xcframework/ios-arm64_x86_64-simulator/CanvasNative.framework/Headers/CanvasNative.h +10 -0
  74. package/platforms/ios/CanvasNative.xcframework/ios-arm64_x86_64-simulator/CanvasNative.framework/Headers/canvas_ios.h +142 -0
  75. package/platforms/ios/CanvasNative.xcframework/ios-arm64_x86_64-simulator/CanvasNative.framework/Headers/canvas_native.h +2589 -110
  76. package/platforms/ios/CanvasNative.xcframework/ios-arm64_x86_64-simulator/CanvasNative.framework/Info.plist +0 -0
  77. package/platforms/ios/CanvasNative.xcframework/ios-arm64_x86_64-simulator/CanvasNative.framework/Modules/CanvasNative.swiftmodule/Project/arm64-apple-ios-simulator.swiftsourceinfo +0 -0
  78. package/platforms/ios/CanvasNative.xcframework/ios-arm64_x86_64-simulator/CanvasNative.framework/Modules/CanvasNative.swiftmodule/Project/x86_64-apple-ios-simulator.swiftsourceinfo +0 -0
  79. package/platforms/ios/CanvasNative.xcframework/ios-arm64_x86_64-simulator/CanvasNative.framework/Modules/CanvasNative.swiftmodule/arm64-apple-ios-simulator.abi.json +1174 -89
  80. package/platforms/ios/CanvasNative.xcframework/ios-arm64_x86_64-simulator/CanvasNative.framework/Modules/CanvasNative.swiftmodule/arm64-apple-ios-simulator.private.swiftinterface +2 -2
  81. package/platforms/ios/CanvasNative.xcframework/ios-arm64_x86_64-simulator/CanvasNative.framework/Modules/CanvasNative.swiftmodule/arm64-apple-ios-simulator.swiftdoc +0 -0
  82. package/platforms/ios/CanvasNative.xcframework/ios-arm64_x86_64-simulator/CanvasNative.framework/Modules/CanvasNative.swiftmodule/arm64-apple-ios-simulator.swiftinterface +2 -2
  83. package/platforms/ios/CanvasNative.xcframework/ios-arm64_x86_64-simulator/CanvasNative.framework/Modules/CanvasNative.swiftmodule/x86_64-apple-ios-simulator.abi.json +1174 -89
  84. package/platforms/ios/CanvasNative.xcframework/ios-arm64_x86_64-simulator/CanvasNative.framework/Modules/CanvasNative.swiftmodule/x86_64-apple-ios-simulator.private.swiftinterface +2 -2
  85. package/platforms/ios/CanvasNative.xcframework/ios-arm64_x86_64-simulator/CanvasNative.framework/Modules/CanvasNative.swiftmodule/x86_64-apple-ios-simulator.swiftdoc +0 -0
  86. package/platforms/ios/CanvasNative.xcframework/ios-arm64_x86_64-simulator/CanvasNative.framework/Modules/CanvasNative.swiftmodule/x86_64-apple-ios-simulator.swiftinterface +2 -2
  87. package/platforms/ios/CanvasNative.xcframework/ios-arm64_x86_64-simulator/CanvasNative.framework/_CodeSignature/CodeResources +42 -31
  88. package/platforms/ios/CanvasNative.xcframework/ios-arm64_x86_64-simulator/dSYMs/CanvasNative.framework.dSYM/Contents/Resources/DWARF/CanvasNative +0 -0
  89. package/platforms/ios/Podfile +3 -0
  90. package/platforms/ios/build.xcconfig +3 -3
  91. package/platforms/ios/src/CanvasModule.h +0 -2
  92. package/platforms/ios/src/CanvasModule.mm +4 -4
  93. package/platforms/ios/src/NSOperationQueueWrapper.h +11 -0
  94. package/platforms/ios/src/NSOperationQueueWrapper.mm +74 -0
  95. package/platforms/ios/src/cpp/Caches.cpp +35 -0
  96. package/platforms/ios/src/cpp/Caches.h +186 -0
  97. package/platforms/ios/src/cpp/CanvasJSIModule.cpp +1582 -0
  98. package/platforms/ios/src/cpp/CanvasJSIModule.h +7 -34
  99. package/platforms/ios/src/cpp/Common.h +30 -0
  100. package/platforms/ios/src/cpp/ConcurrentMap.h +54 -0
  101. package/platforms/ios/src/cpp/Helpers.h +304 -38
  102. package/platforms/ios/src/cpp/ImageAssetImpl.cpp +802 -0
  103. package/platforms/ios/src/cpp/ImageAssetImpl.h +44 -12
  104. package/platforms/ios/src/cpp/ImageBitmapImpl.cpp +189 -0
  105. package/platforms/ios/src/cpp/ImageBitmapImpl.h +22 -16
  106. package/platforms/ios/src/cpp/JSICallback.h +61 -5
  107. package/platforms/ios/src/cpp/JSIReadFileCallback.h +86 -6
  108. package/platforms/ios/src/cpp/JSIRuntime.cpp +21 -0
  109. package/platforms/ios/src/cpp/JSIRuntime.h +7 -0
  110. package/platforms/ios/src/cpp/OneByteStringResource.cpp +25 -0
  111. package/platforms/ios/src/cpp/OneByteStringResource.h +21 -0
  112. package/platforms/ios/src/cpp/RafImpl.cpp +8 -0
  113. package/platforms/ios/src/cpp/RafImpl.h +11 -8
  114. package/platforms/ios/src/cpp/TextDecoderImpl.cpp +188 -0
  115. package/platforms/ios/src/cpp/TextDecoderImpl.h +20 -14
  116. package/platforms/ios/src/cpp/TextEncoderImpl.cpp +139 -0
  117. package/platforms/ios/src/cpp/TextEncoderImpl.h +20 -11
  118. package/platforms/ios/src/cpp/canvas2d/CanvasGradient.cpp +71 -0
  119. package/platforms/ios/src/cpp/canvas2d/CanvasGradient.h +27 -13
  120. package/platforms/ios/src/cpp/canvas2d/CanvasPattern.cpp +89 -0
  121. package/platforms/ios/src/cpp/canvas2d/CanvasPattern.h +26 -13
  122. package/platforms/ios/src/cpp/canvas2d/CanvasRenderingContext2DImpl.cpp +2402 -0
  123. package/platforms/ios/src/cpp/canvas2d/CanvasRenderingContext2DImpl.h +264 -21
  124. package/platforms/ios/src/cpp/canvas2d/ImageDataImpl.cpp +203 -0
  125. package/platforms/ios/src/cpp/canvas2d/ImageDataImpl.h +26 -12
  126. package/platforms/ios/src/cpp/canvas2d/MatrixImpl.cpp +800 -0
  127. package/platforms/ios/src/cpp/canvas2d/MatrixImpl.h +172 -13
  128. package/platforms/ios/src/cpp/canvas2d/Path2D.cpp +449 -0
  129. package/platforms/ios/src/cpp/canvas2d/Path2D.h +41 -12
  130. package/platforms/ios/src/cpp/canvas2d/TextMetricsImpl.cpp +253 -0
  131. package/platforms/ios/src/cpp/canvas2d/TextMetricsImpl.h +50 -12
  132. package/platforms/ios/src/cpp/gl.h +57 -7
  133. package/platforms/ios/src/cpp/gl3stub.c +425 -0
  134. package/platforms/ios/src/cpp/gl3stub.h +665 -0
  135. package/platforms/ios/src/cpp/gles3jni.h +37 -0
  136. package/platforms/ios/src/cpp/include/robin_hood.h +2544 -0
  137. package/platforms/ios/src/cpp/webgl/WebGLActiveInfoImpl.cpp +93 -0
  138. package/platforms/ios/src/cpp/webgl/WebGLActiveInfoImpl.h +33 -13
  139. package/platforms/ios/src/cpp/webgl/WebGLBuffer.h +41 -6
  140. package/platforms/ios/src/cpp/webgl/WebGLFramebuffer.h +46 -10
  141. package/platforms/ios/src/cpp/webgl/WebGLProgram.h +40 -5
  142. package/platforms/ios/src/cpp/webgl/WebGLRenderbuffer.h +40 -6
  143. package/platforms/ios/src/cpp/webgl/WebGLRenderingContext.cpp +6691 -0
  144. package/platforms/ios/src/cpp/webgl/WebGLRenderingContext.h +261 -390
  145. package/platforms/ios/src/cpp/webgl/{WebGLRenderingContextBase.mm → WebGLRenderingContextBase.cpp} +17 -16
  146. package/platforms/ios/src/cpp/webgl/WebGLRenderingContextBase.h +15 -36
  147. package/platforms/ios/src/cpp/webgl/WebGLShader.h +40 -6
  148. package/platforms/ios/src/cpp/webgl/WebGLShaderPrecisionFormatImpl.cpp +50 -0
  149. package/platforms/ios/src/cpp/webgl/WebGLShaderPrecisionFormatImpl.h +66 -11
  150. package/platforms/ios/src/cpp/webgl/WebGLTexture.h +40 -6
  151. package/platforms/ios/src/cpp/webgl/WebGLUniformLocation.h +44 -8
  152. package/platforms/ios/src/cpp/webgl/extensions/ANGLE_instanced_arraysImpl.cpp +126 -0
  153. package/platforms/ios/src/cpp/webgl/extensions/ANGLE_instanced_arraysImpl.h +25 -12
  154. package/platforms/ios/src/cpp/webgl/extensions/EXT_blend_minmaxImpl.cpp +35 -0
  155. package/platforms/ios/src/cpp/webgl/extensions/EXT_blend_minmaxImpl.h +25 -5
  156. package/platforms/ios/src/cpp/webgl/extensions/EXT_color_buffer_half_floatImpl.cpp +41 -0
  157. package/platforms/ios/src/cpp/webgl/extensions/EXT_color_buffer_half_floatImpl.h +25 -5
  158. package/platforms/ios/src/cpp/webgl/extensions/EXT_disjoint_timer_queryImpl.cpp +323 -0
  159. package/platforms/ios/src/cpp/webgl/extensions/EXT_disjoint_timer_queryImpl.h +47 -13
  160. package/platforms/ios/src/cpp/webgl/extensions/EXT_sRGBImpl.h +49 -6
  161. package/platforms/ios/src/cpp/webgl/extensions/EXT_shader_texture_lodImpl.h +37 -15
  162. package/platforms/ios/src/cpp/webgl/extensions/EXT_texture_filter_anisotropicImpl.h +47 -6
  163. package/platforms/ios/src/cpp/webgl/extensions/OES_element_index_uintImpl.h +49 -6
  164. package/platforms/ios/src/cpp/webgl/extensions/OES_fbo_render_mipmap.h +36 -15
  165. package/platforms/ios/src/cpp/webgl/extensions/OES_standard_derivativesImpl.h +44 -6
  166. package/platforms/ios/src/cpp/webgl/extensions/OES_texture_floatImpl.h +38 -15
  167. package/platforms/ios/src/cpp/webgl/extensions/OES_texture_float_linearImpl.h +37 -16
  168. package/platforms/ios/src/cpp/webgl/extensions/OES_texture_half_floatImpl.h +41 -6
  169. package/platforms/ios/src/cpp/webgl/extensions/OES_texture_half_float_linearImpl.h +40 -16
  170. package/platforms/ios/src/cpp/webgl/extensions/OES_vertex_array_objectImpl.cpp +102 -0
  171. package/platforms/ios/src/cpp/webgl/extensions/OES_vertex_array_objectImpl.h +69 -14
  172. package/platforms/ios/src/cpp/webgl/extensions/WEBGL_color_buffer_floatImpl.h +51 -8
  173. package/platforms/ios/src/cpp/webgl/extensions/WEBGL_compressed_texture_atcImpl.h +49 -6
  174. package/platforms/ios/src/cpp/webgl/extensions/WEBGL_compressed_texture_etc1Impl.h +49 -8
  175. package/platforms/ios/src/cpp/webgl/extensions/WEBGL_compressed_texture_etcImpl.h +76 -6
  176. package/platforms/ios/src/cpp/webgl/extensions/WEBGL_compressed_texture_pvrtcImpl.h +57 -6
  177. package/platforms/ios/src/cpp/webgl/extensions/WEBGL_compressed_texture_s3tcImpl.h +53 -6
  178. package/platforms/ios/src/cpp/webgl/extensions/WEBGL_compressed_texture_s3tc_srgbImpl.h +59 -6
  179. package/platforms/ios/src/cpp/webgl/extensions/WEBGL_depth_textureImpl.h +46 -6
  180. package/platforms/ios/src/cpp/webgl/extensions/WEBGL_draw_buffersImpl.cpp +43 -0
  181. package/platforms/ios/src/cpp/webgl/extensions/WEBGL_draw_buffersImpl.h +126 -14
  182. package/platforms/ios/src/cpp/webgl/extensions/WEBGL_lose_contextImpl.cpp +32 -0
  183. package/platforms/ios/src/cpp/webgl/extensions/WEBGL_lose_contextImpl.h +61 -12
  184. package/platforms/ios/src/cpp/webgl2/WebGL2RenderingContext.cpp +4517 -0
  185. package/platforms/ios/src/cpp/webgl2/WebGL2RenderingContext.h +139 -343
  186. package/platforms/ios/src/cpp/webgl2/WebGLQuery.h +40 -4
  187. package/platforms/ios/src/cpp/webgl2/WebGLSampler.h +42 -3
  188. package/platforms/ios/src/cpp/webgl2/WebGLSyncImpl.h +44 -11
  189. package/platforms/ios/src/cpp/webgl2/WebGLTransformFeedback.h +42 -4
  190. package/platforms/ios/src/cpp/webgl2/WebGLVertexArrayObject.h +43 -4
  191. package/platforms/ios/src/module.modulemap +1 -0
  192. package/platforms/ios/src/cpp/CanvasJSIModule.mm +0 -1105
  193. package/platforms/ios/src/cpp/ImageAssetImpl.mm +0 -417
  194. package/platforms/ios/src/cpp/ImageBitmapImpl.mm +0 -126
  195. package/platforms/ios/src/cpp/RafImpl.mm +0 -10
  196. package/platforms/ios/src/cpp/TextDecoderImpl.mm +0 -97
  197. package/platforms/ios/src/cpp/TextEncoderImpl.mm +0 -60
  198. package/platforms/ios/src/cpp/VecMutableBuffer.h +0 -46
  199. package/platforms/ios/src/cpp/canvas-cxx/src/lib.rs.cc +0 -6156
  200. package/platforms/ios/src/cpp/canvas-cxx/src/lib.rs.h +0 -2867
  201. package/platforms/ios/src/cpp/canvas2d/CanvasGradient.mm +0 -42
  202. package/platforms/ios/src/cpp/canvas2d/CanvasPattern.mm +0 -49
  203. package/platforms/ios/src/cpp/canvas2d/CanvasRenderingContext2DImpl.mm +0 -1972
  204. package/platforms/ios/src/cpp/canvas2d/ImageDataImpl.mm +0 -68
  205. package/platforms/ios/src/cpp/canvas2d/MatrixImpl.mm +0 -149
  206. package/platforms/ios/src/cpp/canvas2d/Path2D.mm +0 -335
  207. package/platforms/ios/src/cpp/canvas2d/TextMetricsImpl.mm +0 -68
  208. package/platforms/ios/src/cpp/rust/cxx.cc +0 -793
  209. package/platforms/ios/src/cpp/rust/cxx.h +0 -1111
  210. package/platforms/ios/src/cpp/webgl/WebGLActiveInfoImpl.mm +0 -39
  211. package/platforms/ios/src/cpp/webgl/WebGLRenderingContext.mm +0 -5958
  212. package/platforms/ios/src/cpp/webgl/WebGLShaderPrecisionFormatImpl.mm +0 -40
  213. package/platforms/ios/src/cpp/webgl/extensions/ANGLE_instanced_arraysImpl.mm +0 -108
  214. package/platforms/ios/src/cpp/webgl/extensions/EXT_blend_minmaxImpl.mm +0 -28
  215. package/platforms/ios/src/cpp/webgl/extensions/EXT_color_buffer_half_floatImpl.mm +0 -42
  216. package/platforms/ios/src/cpp/webgl/extensions/EXT_disjoint_timer_queryImpl.mm +0 -295
  217. package/platforms/ios/src/cpp/webgl/extensions/EXT_sRGBImpl.mm +0 -40
  218. package/platforms/ios/src/cpp/webgl/extensions/EXT_texture_filter_anisotropicImpl.mm +0 -37
  219. package/platforms/ios/src/cpp/webgl/extensions/OES_element_index_uintImpl.mm +0 -28
  220. package/platforms/ios/src/cpp/webgl/extensions/OES_standard_derivativesImpl.mm +0 -31
  221. package/platforms/ios/src/cpp/webgl/extensions/OES_texture_half_floatImpl.mm +0 -28
  222. package/platforms/ios/src/cpp/webgl/extensions/OES_vertex_array_objectImpl.mm +0 -127
  223. package/platforms/ios/src/cpp/webgl/extensions/WEBGL_color_buffer_floatImpl.mm +0 -45
  224. package/platforms/ios/src/cpp/webgl/extensions/WEBGL_compressed_texture_atcImpl.mm +0 -45
  225. package/platforms/ios/src/cpp/webgl/extensions/WEBGL_compressed_texture_etc1Impl.mm +0 -31
  226. package/platforms/ios/src/cpp/webgl/extensions/WEBGL_compressed_texture_etcImpl.mm +0 -70
  227. package/platforms/ios/src/cpp/webgl/extensions/WEBGL_compressed_texture_pvrtcImpl.mm +0 -47
  228. package/platforms/ios/src/cpp/webgl/extensions/WEBGL_compressed_texture_s3tcImpl.mm +0 -46
  229. package/platforms/ios/src/cpp/webgl/extensions/WEBGL_compressed_texture_s3tc_srgbImpl.mm +0 -49
  230. package/platforms/ios/src/cpp/webgl/extensions/WEBGL_depth_textureImpl.mm +0 -30
  231. package/platforms/ios/src/cpp/webgl/extensions/WEBGL_draw_buffersImpl.mm +0 -177
  232. package/platforms/ios/src/cpp/webgl/extensions/WEBGL_lose_contextImpl.mm +0 -64
  233. package/platforms/ios/src/cpp/webgl2/WebGL2RenderingContext.mm +0 -4551
  234. /package/platforms/ios/src/cpp/{OnRafCallback.mm → OnRafCallback.cpp} +0 -0
@@ -0,0 +1,802 @@
1
+ //
2
+ // Created by Osei Fortune on 22/03/2022.
3
+ //
4
+
5
+ #include "ImageAssetImpl.h"
6
+ #include <string>
7
+ #include "JSIRuntime.h"
8
+ #include "JSICallback.h"
9
+ #include "Caches.h"
10
+
11
+ #include "Helpers.h"
12
+ #include "Common.h"
13
+
14
+ ImageAssetImpl::ImageAssetImpl(ImageAsset *asset) : asset_(asset) {
15
+ }
16
+
17
+ ImageAssetImpl::~ImageAssetImpl() {
18
+ canvas_native_image_asset_destroy(this->GetImageAsset());
19
+ asset_ = nullptr;
20
+ }
21
+
22
+ void ImageAssetImpl::Init(v8::Local<v8::Object> canvasModule, v8::Isolate *isolate) {
23
+ v8::Locker locker(isolate);
24
+ v8::Isolate::Scope isolate_scope(isolate);
25
+ v8::HandleScope handle_scope(isolate);
26
+
27
+ auto ctor = GetCtor(isolate);
28
+ auto context = isolate->GetCurrentContext();
29
+ auto func = ctor->GetFunction(context).ToLocalChecked();
30
+
31
+ canvasModule->Set(context, ConvertToV8String(isolate, "ImageAsset"), func);
32
+ }
33
+
34
+ ImageAssetImpl *ImageAssetImpl::GetPointer(const v8::Local<v8::Object> &object) {
35
+ auto ptr = object->GetInternalField(0).As<v8::External>()->Value();
36
+ if (ptr == nullptr) {
37
+ return nullptr;
38
+ }
39
+ return static_cast<ImageAssetImpl *>(ptr);
40
+ }
41
+
42
+ v8::Local<v8::FunctionTemplate> ImageAssetImpl::GetCtor(v8::Isolate *isolate) {
43
+ auto cache = Caches::Get(isolate);
44
+ auto ctor = cache->ImageAssetTmpl.get();
45
+ if (ctor != nullptr) {
46
+ return ctor->Get(isolate);
47
+ }
48
+
49
+ v8::Local<v8::FunctionTemplate> ctorTmpl = v8::FunctionTemplate::New(isolate, Ctor);
50
+ ctorTmpl->InstanceTemplate()->SetInternalFieldCount(1);
51
+ ctorTmpl->SetClassName(ConvertToV8String(isolate, "ImageAsset"));
52
+
53
+ auto tmpl = ctorTmpl->InstanceTemplate();
54
+ tmpl->SetInternalFieldCount(1);
55
+ tmpl->SetAccessor(
56
+ ConvertToV8String(isolate, "width"),
57
+ GetWidth);
58
+ tmpl->SetAccessor(
59
+ ConvertToV8String(isolate, "height"),
60
+ GetHeight);
61
+ tmpl->SetAccessor(
62
+ ConvertToV8String(isolate, "error"),
63
+ GetError);
64
+
65
+ tmpl->Set(
66
+ ConvertToV8String(isolate, "scale"),
67
+ v8::FunctionTemplate::New(isolate, &Scale));
68
+
69
+ tmpl->Set(
70
+ ConvertToV8String(isolate, "fromUrlSync"),
71
+ v8::FunctionTemplate::New(isolate, &FromUrlSync));
72
+
73
+ tmpl->Set(
74
+ ConvertToV8String(isolate, "fromUrlCb"),
75
+ v8::FunctionTemplate::New(isolate, &FromUrlCb));
76
+
77
+
78
+ tmpl->Set(
79
+ ConvertToV8String(isolate, "fromFileSync"),
80
+ v8::FunctionTemplate::New(isolate, &FromFileSync));
81
+
82
+ tmpl->Set(
83
+ ConvertToV8String(isolate, "fromFileCb"),
84
+ v8::FunctionTemplate::New(isolate, &FromFileCb));
85
+
86
+
87
+ tmpl->Set(
88
+ ConvertToV8String(isolate, "fromBytesSync"),
89
+ v8::FunctionTemplate::New(isolate, &FromBytesSync));
90
+
91
+ tmpl->Set(
92
+ ConvertToV8String(isolate, "fromBytesCb"),
93
+ v8::FunctionTemplate::New(isolate, &FromBytesCb));
94
+
95
+
96
+ tmpl->Set(
97
+ ConvertToV8String(isolate, "saveSync"),
98
+ v8::FunctionTemplate::New(isolate, &SaveSync));
99
+
100
+ tmpl->Set(
101
+ ConvertToV8String(isolate, "saveCb"),
102
+ v8::FunctionTemplate::New(isolate, &SaveCb));
103
+
104
+
105
+ cache->ImageAssetTmpl =
106
+ std::make_unique<v8::Persistent<v8::FunctionTemplate>>(isolate, ctorTmpl);
107
+ return ctorTmpl;
108
+ }
109
+
110
+ void ImageAssetImpl::Ctor(const v8::FunctionCallbackInfo<v8::Value> &args) {
111
+ auto isolate = args.GetIsolate();
112
+
113
+ auto ret = args.This();
114
+
115
+ SetNativeType(isolate, ret, NativeType::ImageAsset);
116
+
117
+ auto image_asset = canvas_native_image_asset_create();
118
+
119
+ auto object = new ImageAssetImpl(image_asset);
120
+
121
+ auto ext = v8::External::New(isolate, object);
122
+
123
+ ret->SetInternalField(0, ext);
124
+
125
+ args.GetReturnValue().Set(ret);
126
+ }
127
+
128
+ void
129
+ ImageAssetImpl::GetWidth(v8::Local<v8::String> name,
130
+ const v8::PropertyCallbackInfo<v8::Value> &info) {
131
+ auto ptr = GetPointer(info.This());
132
+ if (ptr != nullptr) {
133
+ auto ret = canvas_native_image_asset_width(ptr->GetImageAsset());
134
+ info.GetReturnValue().Set(ret);
135
+ return;
136
+ }
137
+ info.GetReturnValue().Set(0);
138
+ }
139
+
140
+ void
141
+ ImageAssetImpl::GetHeight(v8::Local<v8::String> name,
142
+ const v8::PropertyCallbackInfo<v8::Value> &info) {
143
+ auto ptr = GetPointer(info.This());
144
+ if (ptr != nullptr) {
145
+ auto ret = canvas_native_image_asset_height(ptr->GetImageAsset());
146
+ info.GetReturnValue().Set(ret);
147
+ return;
148
+ }
149
+ info.GetReturnValue().Set(0);
150
+ }
151
+
152
+ void
153
+ ImageAssetImpl::GetError(v8::Local<v8::String> name,
154
+ const v8::PropertyCallbackInfo<v8::Value> &info) {
155
+ auto ptr = GetPointer(info.This());
156
+ if (ptr != nullptr) {
157
+ auto ret = canvas_native_image_asset_get_error(ptr->GetImageAsset());
158
+ auto isolate = info.GetIsolate();
159
+ info.GetReturnValue().Set(ConvertToV8String(isolate, ret));
160
+ canvas_native_string_destroy((char *) ret);
161
+ return;
162
+ }
163
+ info.GetReturnValue().SetEmptyString();
164
+ }
165
+
166
+ void ImageAssetImpl::Scale(const v8::FunctionCallbackInfo<v8::Value> &args) {
167
+ ImageAssetImpl *ptr = GetPointer(args.This());
168
+ if (ptr == nullptr) {
169
+ args.GetReturnValue().SetUndefined();
170
+ return;
171
+ }
172
+ auto isolate = args.GetIsolate();
173
+ auto context = isolate->GetCurrentContext();
174
+
175
+ if (args.Length() > 1) {
176
+ auto x = (uint32_t) args[0]->NumberValue(context).ToChecked();
177
+ auto y = (uint32_t) args[1]->NumberValue(context).ToChecked();
178
+ if (x > 0 && y > 0) {
179
+ canvas_native_image_asset_scale(
180
+ ptr->GetImageAsset(), x,
181
+ y);
182
+ }
183
+ }
184
+ }
185
+
186
+ void ImageAssetImpl::FromUrlSync(const v8::FunctionCallbackInfo<v8::Value> &args) {
187
+ ImageAssetImpl *ptr = GetPointer(args.This());
188
+ if (ptr == nullptr) {
189
+ args.GetReturnValue().Set(false);
190
+ return;
191
+ }
192
+ auto isolate = args.GetIsolate();
193
+ auto url = ConvertFromV8String(isolate, args[0]);
194
+
195
+ auto done = canvas_native_image_asset_load_from_url(ptr->GetImageAsset(), url.c_str());
196
+
197
+ args.GetReturnValue().Set(done);
198
+ }
199
+
200
+ void ImageAssetImpl::FromUrlCb(const v8::FunctionCallbackInfo<v8::Value> &args) {
201
+ ImageAssetImpl *ptr = GetPointer(args.This());
202
+ if (ptr == nullptr) {
203
+ return;
204
+ }
205
+
206
+ auto isolate = args.GetIsolate();
207
+
208
+ if (args.Length() < 2) {
209
+ return;
210
+ }
211
+
212
+ auto url = ConvertFromV8String(isolate, args[0]);
213
+
214
+ auto asset = canvas_native_image_asset_shared_clone(ptr->asset_);
215
+
216
+ auto callback = args[1].As<v8::Function>();
217
+
218
+ auto jsi_callback = new JSICallback(isolate, callback);
219
+
220
+ #ifdef __ANDROID__
221
+
222
+ ALooper_addFd(jsi_callback->looper_,
223
+ jsi_callback->fd_[0],
224
+ ALOOPER_POLL_CALLBACK,
225
+ ALOOPER_EVENT_INPUT,
226
+ [](int fd, int events,
227
+ void *data) {
228
+ auto cb = static_cast<JSICallback *>(data);
229
+ bool done;
230
+ read(fd, &done,
231
+ sizeof(bool));
232
+
233
+ v8::Isolate *isolate = cb->isolate_;
234
+ v8::Locker locker(isolate);
235
+ v8::Isolate::Scope isolate_scope(isolate);
236
+ v8::HandleScope handle_scope(isolate);
237
+ v8::Local<v8::Function> callback = cb->callback_->Get(isolate);
238
+ v8::Local<v8::Context> context = callback->GetCreationContextChecked();
239
+ v8::Context::Scope context_scope(context);
240
+
241
+ v8::Local<v8::Value> args[1] = {v8::Boolean::New(isolate, done)};
242
+
243
+ // v8::TryCatch tc(isolate);
244
+
245
+ callback->Call(context, context->Global(), 1,
246
+ args); // ignore JS return value
247
+
248
+
249
+ delete static_cast<JSICallback *>(data);
250
+ return 0;
251
+ }, jsi_callback);
252
+
253
+ ALooper_wake(jsi_callback->looper_);
254
+
255
+
256
+ std::thread thread(
257
+ [jsi_callback, asset](
258
+ const std::string &url) {
259
+ auto done = canvas_native_image_asset_load_from_url(asset, url.c_str());
260
+
261
+ canvas_native_image_asset_destroy(asset);
262
+
263
+ write(jsi_callback->fd_[1],
264
+ &done,
265
+ sizeof(bool));
266
+
267
+ }, std::move(url));
268
+
269
+ thread.detach();
270
+
271
+ #endif
272
+
273
+
274
+ #ifdef __APPLE__
275
+
276
+ auto current_queue = new NSOperationQueueWrapper(true);
277
+
278
+ auto queue = new NSOperationQueueWrapper(false);
279
+
280
+
281
+
282
+ /* std::thread task([jsi_callback, current_queue, asset](std::string url) {
283
+
284
+
285
+ auto done = canvas_native_image_asset_load_from_url(asset, url.c_str());
286
+
287
+
288
+ auto main_task = [jsi_callback, current_queue, url, done]() {
289
+
290
+
291
+ v8::Isolate *isolate = jsi_callback->isolate_;
292
+ v8::Locker locker(isolate);
293
+ v8::Isolate::Scope isolate_scope(isolate);
294
+ v8::HandleScope handle_scope(isolate);
295
+ v8::Local<v8::Function> callback = jsi_callback->callback_->Get(isolate);
296
+ v8::Local<v8::Context> context = callback->GetCreationContextChecked();
297
+ v8::Context::Scope context_scope(context);
298
+
299
+ v8::Local<v8::Value> args[1] = {v8::Boolean::New(isolate, done)};
300
+
301
+ // v8::TryCatch tc(isolate);
302
+
303
+ callback->Call(context, context->Global(), 1,
304
+ args); // ignore JS return value
305
+
306
+
307
+ delete jsi_callback;
308
+ // delete queue;
309
+ delete current_queue;
310
+
311
+
312
+ };
313
+
314
+ current_queue->addOperation(main_task);
315
+
316
+
317
+ }, std::move(url));
318
+
319
+ task.detach();
320
+
321
+ */
322
+
323
+
324
+
325
+
326
+
327
+ auto task = [jsi_callback, current_queue, queue, asset, url]() {
328
+
329
+ auto done = canvas_native_image_asset_load_from_url(asset, url.c_str());
330
+ canvas_native_image_asset_destroy(asset);
331
+
332
+ auto main_task = [jsi_callback, current_queue, queue, url, done]() {
333
+
334
+
335
+ v8::Isolate *isolate = jsi_callback->isolate_;
336
+ v8::Locker locker(isolate);
337
+ v8::Isolate::Scope isolate_scope(isolate);
338
+ v8::HandleScope handle_scope(isolate);
339
+ v8::Local<v8::Function> callback = jsi_callback->callback_->Get(isolate);
340
+ v8::Local<v8::Context> context = callback->GetCreationContextChecked();
341
+ v8::Context::Scope context_scope(context);
342
+
343
+ v8::Local<v8::Value> args[1] = {v8::Boolean::New(isolate, done)};
344
+
345
+ // v8::TryCatch tc(isolate);
346
+
347
+ callback->Call(context, context->Global(), 1,
348
+ args); // ignore JS return value
349
+
350
+
351
+ delete jsi_callback;
352
+ delete queue;
353
+ delete current_queue;
354
+
355
+
356
+ };
357
+
358
+ current_queue->addOperation(main_task);
359
+
360
+ };
361
+
362
+
363
+
364
+ queue->addOperation(task);
365
+ #endif
366
+
367
+ }
368
+
369
+ void ImageAssetImpl::FromFileSync(const v8::FunctionCallbackInfo<v8::Value> &args) {
370
+ ImageAssetImpl *ptr = GetPointer(args.This());
371
+ if (ptr == nullptr) {
372
+ args.GetReturnValue().Set(false);
373
+ return;
374
+ }
375
+ auto isolate = args.GetIsolate();
376
+ auto path = ConvertFromV8String(isolate, args[0]);
377
+
378
+ auto done = canvas_native_image_asset_load_from_path(ptr->GetImageAsset(), path.c_str());
379
+
380
+
381
+ args.GetReturnValue().Set(done);
382
+ }
383
+
384
+ void ImageAssetImpl::FromFileCb(const v8::FunctionCallbackInfo<v8::Value> &args) {
385
+ ImageAssetImpl *ptr = GetPointer(args.This());
386
+ if (ptr == nullptr) {
387
+ return;
388
+ }
389
+ auto isolate = args.GetIsolate();
390
+
391
+ if (args.Length() < 2) {
392
+ return;
393
+ }
394
+
395
+
396
+ auto path = ConvertFromV8String(isolate, args[0]);
397
+
398
+ auto asset = canvas_native_image_asset_shared_clone(
399
+ ptr->GetImageAsset());
400
+
401
+ auto callback = args[1].As<v8::Function>();
402
+
403
+
404
+ auto jsi_callback = new JSICallback(isolate, callback);
405
+
406
+ #ifdef __ANDROID__
407
+
408
+ ALooper_addFd(jsi_callback->looper_,
409
+ jsi_callback->fd_[0],
410
+ ALOOPER_POLL_CALLBACK,
411
+ ALOOPER_EVENT_INPUT,
412
+ [](int fd, int events,
413
+ void *data) {
414
+ auto cb = static_cast<JSICallback *>(data);
415
+ bool done;
416
+ read(fd, &done,
417
+ sizeof(bool));
418
+
419
+ v8::Isolate *isolate = cb->isolate_;
420
+ v8::Locker locker(isolate);
421
+ v8::Isolate::Scope isolate_scope(isolate);
422
+ v8::HandleScope handle_scope(isolate);
423
+ v8::Local<v8::Function> callback = cb->callback_->Get(isolate);
424
+ v8::Local<v8::Context> context = callback->GetCreationContextChecked();
425
+ v8::Context::Scope context_scope(context);
426
+
427
+ v8::Local<v8::Value> args[1] = {v8::Boolean::New(isolate, done)};
428
+
429
+ // v8::TryCatch tc(isolate);
430
+
431
+ callback->Call(context, context->Global(), 1,
432
+ args); // ignore JS return value
433
+
434
+ delete static_cast<JSICallback *>(data);
435
+ return 0;
436
+ }, jsi_callback);
437
+
438
+ ALooper_wake(jsi_callback->looper_);
439
+
440
+
441
+ std::thread thread(
442
+ [jsi_callback, asset](
443
+ const std::string &path) {
444
+
445
+ auto done = canvas_native_image_asset_load_from_path(asset, path.c_str());
446
+
447
+ canvas_native_image_asset_destroy(asset);
448
+
449
+ write(jsi_callback->fd_[1],
450
+ &done,
451
+ sizeof(bool));
452
+
453
+ }, std::move(path));
454
+
455
+ thread.detach();
456
+
457
+ #endif
458
+
459
+
460
+ #ifdef __APPLE__
461
+
462
+ auto current_queue = new NSOperationQueueWrapper(true);
463
+
464
+ auto queue = new NSOperationQueueWrapper(false);
465
+
466
+ auto task = [jsi_callback, current_queue, queue, asset, path]() {
467
+
468
+ auto done = canvas_native_image_asset_load_from_path(asset, path.c_str());
469
+
470
+ canvas_native_image_asset_destroy(asset);
471
+
472
+ auto main_task = [jsi_callback, current_queue, queue, done]() {
473
+
474
+ v8::Isolate *isolate = jsi_callback->isolate_;
475
+ v8::Locker locker(isolate);
476
+ v8::Isolate::Scope isolate_scope(isolate);
477
+ v8::HandleScope handle_scope(isolate);
478
+ v8::Local<v8::Function> callback = jsi_callback->callback_->Get(isolate);
479
+ v8::Local<v8::Context> context = callback->GetCreationContextChecked();
480
+ v8::Context::Scope context_scope(context);
481
+
482
+ v8::Local<v8::Value> args[1] = {v8::Boolean::New(isolate, done)};
483
+
484
+ // v8::TryCatch tc(isolate);
485
+
486
+ callback->Call(context, context->Global(), 1,
487
+ args); // ignore JS return value
488
+
489
+
490
+ delete jsi_callback;
491
+ delete queue;
492
+ delete current_queue;
493
+
494
+
495
+ };
496
+
497
+ current_queue->addOperation(main_task);
498
+
499
+ };
500
+
501
+ queue->addOperation(task);
502
+ #endif
503
+ }
504
+
505
+ void ImageAssetImpl::FromBytesSync(const v8::FunctionCallbackInfo<v8::Value> &args) {
506
+ ImageAssetImpl *ptr = GetPointer(args.This());
507
+ if (ptr == nullptr) {
508
+ args.GetReturnValue().Set(false);
509
+ return;
510
+ }
511
+
512
+ auto value = args[0];
513
+
514
+ if (value->IsObject()) {
515
+ if (!value->IsArrayBuffer()) {
516
+ args.GetReturnValue().Set(false);
517
+ return;
518
+ }
519
+ auto buf = value.As<v8::ArrayBuffer>();
520
+
521
+ auto size = (uintptr_t) buf->ByteLength();
522
+ auto data = (uint8_t *) buf->GetBackingStore()->Data();
523
+
524
+ auto done = canvas_native_image_asset_load_from_raw(ptr->GetImageAsset(), data, size);
525
+
526
+ args.GetReturnValue().Set(done);
527
+ }
528
+
529
+ args.GetReturnValue().Set(false);
530
+ }
531
+
532
+ void ImageAssetImpl::FromBytesCb(const v8::FunctionCallbackInfo<v8::Value> &args) {
533
+ ImageAssetImpl *ptr = GetPointer(args.This());
534
+ if (ptr == nullptr) {
535
+ return;
536
+ }
537
+ auto isolate = args.GetIsolate();
538
+
539
+ if (args.Length() < 2) {
540
+ return;
541
+ }
542
+
543
+
544
+ auto bytes = args[0].As<v8::ArrayBuffer>();
545
+
546
+ auto size = bytes->ByteLength();
547
+
548
+ auto data = (uint8_t *) bytes->GetBackingStore()->Data();
549
+
550
+ auto asset = canvas_native_image_asset_shared_clone(ptr->GetImageAsset());
551
+
552
+ auto callback = args[1].As<v8::Function>();
553
+
554
+ auto jsi_callback = new JSICallback(isolate, callback);
555
+
556
+ #ifdef __ANDROID__
557
+
558
+ ALooper_addFd(jsi_callback->looper_,
559
+ jsi_callback->fd_[0],
560
+ ALOOPER_POLL_CALLBACK,
561
+ ALOOPER_EVENT_INPUT,
562
+ [](int fd, int events,
563
+ void *data) {
564
+ auto cb = static_cast<JSICallback *>(data);
565
+ bool done;
566
+ read(fd, &done,
567
+ sizeof(bool));
568
+
569
+ v8::Isolate *isolate = cb->isolate_;
570
+ v8::Locker locker(isolate);
571
+ v8::Isolate::Scope isolate_scope(isolate);
572
+ v8::HandleScope handle_scope(isolate);
573
+ v8::Local<v8::Function> callback = cb->callback_->Get(isolate);
574
+ v8::Local<v8::Context> context = callback->GetCreationContextChecked();
575
+ v8::Context::Scope context_scope(context);
576
+
577
+ v8::Local<v8::Value> args[1] = {v8::Boolean::New(isolate, done)};
578
+
579
+ // v8::TryCatch tc(isolate);
580
+
581
+ callback->Call(context, context->Global(), 1,
582
+ args); // ignore JS return value
583
+
584
+ delete static_cast<JSICallback *>(data);
585
+ return 0;
586
+ }, jsi_callback);
587
+
588
+ ALooper_wake(jsi_callback->looper_);
589
+
590
+
591
+ std::thread thread(
592
+ [jsi_callback, asset, data, size]() {
593
+
594
+ auto done = canvas_native_image_asset_load_from_raw(asset, data, size);
595
+
596
+ canvas_native_image_asset_destroy(asset);
597
+
598
+ write(jsi_callback->fd_[1],
599
+ &done,
600
+ sizeof(bool));
601
+
602
+ });
603
+
604
+ thread.detach();
605
+
606
+ #endif
607
+
608
+
609
+ #ifdef __APPLE__
610
+
611
+ auto current_queue = new NSOperationQueueWrapper(true);
612
+
613
+ auto queue = new NSOperationQueueWrapper(false);
614
+
615
+ auto task = [jsi_callback, current_queue, queue, asset, data, size]() {
616
+
617
+ auto done = canvas_native_image_asset_load_from_raw(asset, data, size);
618
+
619
+ canvas_native_image_asset_destroy(asset);
620
+
621
+ auto main_task = [jsi_callback, current_queue, queue, done]() {
622
+
623
+
624
+ v8::Isolate *isolate = jsi_callback->isolate_;
625
+ v8::Locker locker(isolate);
626
+ v8::Isolate::Scope isolate_scope(isolate);
627
+ v8::HandleScope handle_scope(isolate);
628
+ v8::Local<v8::Function> callback = jsi_callback->callback_->Get(isolate);
629
+ v8::Local<v8::Context> context = callback->GetCreationContextChecked();
630
+ v8::Context::Scope context_scope(context);
631
+
632
+ v8::Local<v8::Value> args[1] = {v8::Boolean::New(isolate, done)};
633
+
634
+ // v8::TryCatch tc(isolate);
635
+
636
+ callback->Call(context, context->Global(), 1,
637
+ args); // ignore JS return value
638
+
639
+
640
+ delete jsi_callback;
641
+ delete queue;
642
+ delete current_queue;
643
+
644
+
645
+ };
646
+
647
+ current_queue->addOperation(main_task);
648
+
649
+ };
650
+
651
+ queue->addOperation(task);
652
+ #endif
653
+
654
+ }
655
+
656
+ void ImageAssetImpl::SaveSync(const v8::FunctionCallbackInfo<v8::Value> &args) {
657
+ ImageAssetImpl *ptr = GetPointer(args.This());
658
+ if (ptr == nullptr) {
659
+ args.GetReturnValue().Set(false);
660
+ return;
661
+ }
662
+
663
+ auto isolate = args.GetIsolate();
664
+ auto context = isolate->GetCurrentContext();
665
+ auto path = ConvertFromV8String(isolate, args[0]);
666
+ auto format = (uint32_t) args[1]->NumberValue(context).ToChecked();
667
+ auto done = canvas_native_image_asset_save_path(ptr->GetImageAsset(), path.c_str(), format);
668
+
669
+ args.GetReturnValue().Set(done);
670
+ }
671
+
672
+ void ImageAssetImpl::SaveCb(const v8::FunctionCallbackInfo<v8::Value> &args) {
673
+ ImageAssetImpl *ptr = GetPointer(args.This());
674
+ if (ptr == nullptr) {
675
+ return;
676
+ }
677
+ auto isolate = args.GetIsolate();
678
+ auto context = isolate->GetCurrentContext();
679
+ if (args.Length() < 2) {
680
+ return;
681
+ }
682
+
683
+
684
+ auto path = ConvertFromV8String(isolate, args[0]);
685
+
686
+ auto format = (uint32_t) args[1]->NumberValue(context).ToChecked();
687
+
688
+ auto asset = canvas_native_image_asset_shared_clone(
689
+ ptr->GetImageAsset());
690
+
691
+ auto callback = args[1].As<v8::Function>();
692
+
693
+ auto jsi_callback = new JSICallback(isolate, callback);
694
+
695
+
696
+ #ifdef __ANDROID__
697
+
698
+ ALooper_addFd(jsi_callback->looper_,
699
+ jsi_callback->fd_[0],
700
+ ALOOPER_POLL_CALLBACK,
701
+ ALOOPER_EVENT_INPUT,
702
+ [](int fd, int events,
703
+ void *data) {
704
+ auto cb = static_cast<JSICallback *>(data);
705
+ bool done;
706
+ read(fd, &done,
707
+ sizeof(bool));
708
+
709
+ v8::Isolate *isolate = cb->isolate_;
710
+ v8::Locker locker(isolate);
711
+ v8::Isolate::Scope isolate_scope(isolate);
712
+ v8::HandleScope handle_scope(isolate);
713
+ v8::Local<v8::Function> callback = cb->callback_->Get(isolate);
714
+ v8::Local<v8::Context> context = callback->GetCreationContextChecked();
715
+ v8::Context::Scope context_scope(context);
716
+
717
+ v8::Local<v8::Value> args[1] = {v8::Boolean::New(isolate, done)};
718
+
719
+ // v8::TryCatch tc(isolate);
720
+
721
+ callback->Call(context, context->Global(), 1,
722
+ args); // ignore JS return value
723
+
724
+ delete static_cast<JSICallback *>(data);
725
+ return 0;
726
+ }, jsi_callback);
727
+
728
+ ALooper_wake(jsi_callback->looper_);
729
+
730
+
731
+ std::thread thread(
732
+ [jsi_callback, asset, format](
733
+ const std::string &path) {
734
+
735
+ auto done = canvas_native_image_asset_save_path(asset,
736
+ path.c_str(),
737
+ format);
738
+
739
+ canvas_native_image_asset_destroy(asset);
740
+
741
+ write(jsi_callback->fd_[1],
742
+ &done,
743
+ sizeof(bool));
744
+
745
+ }, std::move(path));
746
+
747
+
748
+ thread.detach();
749
+
750
+ #endif
751
+
752
+
753
+ #ifdef __APPLE__
754
+
755
+ auto current_queue = new NSOperationQueueWrapper(true);
756
+
757
+ auto queue = new NSOperationQueueWrapper(false);
758
+
759
+ auto task = [jsi_callback, current_queue, queue, asset, path, format]() {
760
+
761
+ auto done = canvas_native_image_asset_save_path(asset, path.c_str(), format);
762
+
763
+ canvas_native_image_asset_destroy(asset);
764
+
765
+ auto main_task = [jsi_callback, current_queue, queue, done]() {
766
+
767
+
768
+ v8::Isolate *isolate = jsi_callback->isolate_;
769
+ v8::Locker locker(isolate);
770
+ v8::Isolate::Scope isolate_scope(isolate);
771
+ v8::HandleScope handle_scope(isolate);
772
+ v8::Local<v8::Function> callback = jsi_callback->callback_->Get(isolate);
773
+ v8::Local<v8::Context> context = callback->GetCreationContextChecked();
774
+ v8::Context::Scope context_scope(context);
775
+
776
+ v8::Local<v8::Value> args[1] = {v8::Boolean::New(isolate, done)};
777
+
778
+ // v8::TryCatch tc(isolate);
779
+
780
+ callback->Call(context, context->Global(), 1,
781
+ args); // ignore JS return value
782
+
783
+
784
+ delete jsi_callback;
785
+ delete queue;
786
+ delete current_queue;
787
+
788
+
789
+ };
790
+ current_queue->addOperation(main_task);
791
+ };
792
+
793
+ queue->addOperation(task);
794
+ #endif
795
+
796
+
797
+ }
798
+
799
+ ImageAsset *ImageAssetImpl::GetImageAsset() {
800
+ return this->asset_;
801
+ }
802
+