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

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 -24
  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 +2391 -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 +6457 -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 +4380 -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,1582 @@
1
+ //
2
+ // Created by Osei Fortune on 25/02/2023.
3
+ //
4
+
5
+ #include "CanvasJSIModule.h"
6
+ #include "JSICallback.h"
7
+ #include "JSIRuntime.h"
8
+ #include "JSIReadFileCallback.h"
9
+ #include "Helpers.h"
10
+
11
+ void CanvasJSIModule::install(v8::Isolate *isolate) {
12
+
13
+ auto context = isolate->GetCurrentContext();
14
+ auto global = context->Global();
15
+
16
+ if (!global->
17
+ HasOwnProperty(context, ConvertToV8String(isolate, "CanvasJSIModule")).FromMaybe(
18
+ false)) {
19
+
20
+
21
+ v8::Locker locker(isolate);
22
+ v8::Isolate::Scope isolate_scope(isolate);
23
+ v8::HandleScope handle_scope(isolate);
24
+
25
+ auto v8Global = context->Global();
26
+
27
+ auto canvasMod = v8::Object::New(isolate);
28
+ TextDecoderImpl::Init(canvasMod, isolate);
29
+ TextEncoderImpl::Init(canvasMod, isolate);
30
+ Path2D::Init(canvasMod, isolate);
31
+ ImageDataImpl::Init(canvasMod, isolate);
32
+ ImageAssetImpl::Init(canvasMod, isolate);
33
+ CanvasGradient::Init(canvasMod, isolate);
34
+ CanvasPattern::Init(canvasMod, isolate);
35
+ MatrixImpl::Init(canvasMod, isolate);
36
+ TextMetricsImpl::Init(canvasMod, isolate);
37
+ v8Global->Set(context, ConvertToV8String(isolate, "CanvasModule"), canvasMod);
38
+ canvasMod->Set(context, ConvertToV8String(isolate, "create2DContext"),
39
+ v8::FunctionTemplate::New(isolate, &Create2DContext)->GetFunction(
40
+ context).ToLocalChecked());
41
+ canvasMod->Set(context, ConvertToV8String(isolate, "createImageBitmap"),
42
+ v8::FunctionTemplate::New(isolate, &CreateImageBitmap)->GetFunction(
43
+ context).ToLocalChecked());
44
+ canvasMod->Set(context, ConvertToV8String(isolate, "create2DContextWithPointer"),
45
+ v8::FunctionTemplate::New(isolate, &Create2DContextWithPointer)->GetFunction(
46
+ context).ToLocalChecked());
47
+ canvasMod->Set(context, ConvertToV8String(isolate, "readFile"),
48
+ v8::FunctionTemplate::New(isolate, &ReadFile)->GetFunction(
49
+ context).ToLocalChecked());
50
+
51
+ canvasMod->Set(context, ConvertToV8String(isolate, "createWebGLContext"),
52
+ v8::FunctionTemplate::New(isolate, &CreateWebGLContext)->GetFunction(
53
+ context).ToLocalChecked());
54
+
55
+ canvasMod->Set(context, ConvertToV8String(isolate, "createWebGL2Context"),
56
+ v8::FunctionTemplate::New(isolate, &CreateWebGL2Context)->GetFunction(
57
+ context).ToLocalChecked());
58
+
59
+ global->Set(context,
60
+ ConvertToV8String(isolate, "CanvasModule"), canvasMod);
61
+
62
+ }
63
+ }
64
+
65
+
66
+ void CanvasJSIModule::Create2DContext(const v8::FunctionCallbackInfo<v8::Value> &args) {
67
+ auto isolate = args.GetIsolate();
68
+ auto context = isolate->GetCurrentContext();
69
+ auto ptr = args[0].As<v8::BigInt>()->Int64Value();
70
+ auto width = (float) args[1]->NumberValue(context).ToChecked();
71
+ auto height = (float) args[2]->NumberValue(context).ToChecked();
72
+ auto density = (float) args[3]->NumberValue(context).ToChecked();
73
+ auto samples = (int) args[4]->NumberValue(context).ToChecked();
74
+ auto alpha = (bool) args[5]->BooleanValue(isolate);
75
+ auto font_color = (int) args[6]->NumberValue(context).ToChecked();
76
+ auto ppi = (float) args[7]->NumberValue(context).ToChecked();
77
+ auto direction = (int) args[8]->NumberValue(context).ToChecked();
78
+
79
+ auto context_2d = canvas_native_context_create_gl(width, height, density,
80
+ ptr,
81
+ samples, alpha,
82
+ font_color, ppi, direction);
83
+
84
+ auto ret = CanvasRenderingContext2DImpl::NewInstance(isolate, new CanvasRenderingContext2DImpl(
85
+ context_2d));
86
+
87
+ args.GetReturnValue().Set(ret);
88
+ }
89
+
90
+ void CanvasJSIModule::CreateImageBitmap(const v8::FunctionCallbackInfo<v8::Value> &args) {
91
+ auto count = args.Length();
92
+ auto isolate = args.GetIsolate();
93
+ auto context = isolate->GetCurrentContext();
94
+
95
+ auto image = args[0];
96
+ auto sx_or_options = args[1];
97
+ auto sy = args[2];
98
+ auto sw = args[3];
99
+ auto sh = args[4];
100
+
101
+ auto len = count - 1;
102
+ auto cb = args[count - 1];
103
+
104
+ if ((len == 1 && !image->IsObject()) || image->IsFunction()) {
105
+ isolate->ThrowError("Illegal constructor");
106
+ return;
107
+ }
108
+
109
+ Options options;
110
+
111
+ if (len == 0) {
112
+ isolate->ThrowError("Illegal constructor");
113
+ return;
114
+ }
115
+
116
+ if (!cb->IsObject() && !cb->IsFunction()) {
117
+ isolate->ThrowError("Illegal constructor");
118
+ return;
119
+ }
120
+
121
+
122
+ if (image->IsNullOrUndefined()) {
123
+ v8::Local<v8::Value> ret[2] = {ConvertToV8String(isolate, "Failed to load image"),
124
+ v8::Undefined(isolate)};
125
+
126
+ cb.As<v8::Function>()->Call(context, context->Global(), 2, ret);
127
+ return;
128
+ }
129
+
130
+ if (len >= 4 && (sw->IsNumber() && sw->IsNumber() == 0)) {
131
+
132
+ v8::Local<v8::Value> ret[2] = {ConvertToV8String(isolate,
133
+ "Failed to execute 'createImageBitmap' : The crop rect width is 0"),
134
+ v8::Undefined(isolate)};
135
+
136
+ cb.As<v8::Function>()->Call(context, context->Global(), 2, ret);
137
+
138
+ return;
139
+ }
140
+ if (len >= 5 && (sh->IsNumber() && sh->IsNumber() == 0)) {
141
+ v8::Local<v8::Value> ret[2] = {ConvertToV8String(isolate,
142
+ "Failed to execute 'createImageBitmap' : The crop rect height is 0"),
143
+ v8::Undefined(isolate)};
144
+
145
+ cb.As<v8::Function>()->Call(context, context->Global(), 2, ret);
146
+ return;
147
+ }
148
+
149
+
150
+ if (image->IsObject()) {
151
+ auto imageObject = image.As<v8::Object>();
152
+ auto isArrayBuffer = imageObject->IsArrayBuffer();
153
+ auto IsArrayBufferView = imageObject->IsArrayBufferView();
154
+ if (isArrayBuffer || IsArrayBufferView) {
155
+
156
+ if (len == 1 || len == 2) {
157
+ if (len == 2) {
158
+ options = ImageBitmapImpl::HandleOptions(isolate, args[1]);
159
+ }
160
+
161
+ auto asset = canvas_native_image_asset_create();
162
+
163
+ auto shared_asset = canvas_native_image_asset_shared_clone(asset);
164
+
165
+ auto ret = new ImageBitmapImpl(asset);
166
+
167
+ auto cbFunc = args[count - 1].As<v8::Function>();
168
+ auto data = v8::External::New(isolate, ret);
169
+
170
+ auto jsi_callback = new JSICallback(isolate, cbFunc, data);
171
+
172
+
173
+ #ifdef __ANDROID__
174
+ ALooper_addFd(jsi_callback->looper_,
175
+ jsi_callback->fd_[0],
176
+ ALOOPER_POLL_CALLBACK,
177
+ ALOOPER_EVENT_INPUT,
178
+ [](int fd, int events,
179
+ void *data) {
180
+ auto cb = static_cast<JSICallback *>(data);
181
+ bool done;
182
+ read(fd, &done,
183
+ sizeof(bool));
184
+
185
+
186
+ v8::Isolate *isolate = cb->isolate_;
187
+ v8::Locker locker(isolate);
188
+ v8::Isolate::Scope isolate_scope(isolate);
189
+ v8::HandleScope handle_scope(isolate);
190
+ v8::Local<v8::Function> callback = cb->callback_->Get(isolate);
191
+ v8::Local<v8::External> cbData = cb->data_->Get(
192
+ isolate).As<v8::External>();
193
+ v8::Local<v8::Context> context = callback->GetCreationContextChecked();
194
+ v8::Context::Scope context_scope(context);
195
+
196
+ auto ret = ImageBitmapImpl::GetCtor(isolate)->GetFunction(
197
+ context).ToLocalChecked()->NewInstance(
198
+ context).ToLocalChecked();
199
+
200
+ SetNativeType(isolate, ret, NativeType::ImageBitmap);
201
+
202
+ ret->SetInternalField(0, cbData);
203
+
204
+ v8::Local<v8::Value> args[2];
205
+
206
+ if (done) {
207
+ args[0] = v8::Null(isolate);
208
+ args[1] = ret;
209
+
210
+ } else {
211
+ args[0] = v8::Exception::Error(
212
+ ConvertToV8String(isolate, "Failed to load image"));
213
+ args[1] = v8::Null(isolate);
214
+ }
215
+
216
+
217
+ callback->Call(context, context->Global(), 2, args);
218
+
219
+ delete static_cast<JSICallback *>(data);
220
+ return 0;
221
+ }, jsi_callback);
222
+
223
+ ALooper_wake(jsi_callback->looper_);
224
+
225
+ if (isArrayBuffer) {
226
+ auto arrayBuffer = imageObject.As<v8::ArrayBuffer>();
227
+ auto store = arrayBuffer->GetBackingStore();
228
+ auto dataBuffer = (uint8_t *) store->Data();
229
+ v8::Global<v8::ArrayBuffer> ab(isolate, arrayBuffer);
230
+ std::thread thread(
231
+ [&dataBuffer, jsi_callback, &options, store, shared_asset](
232
+ v8::Global<v8::ArrayBuffer> ab, size_t size) {
233
+
234
+
235
+ auto done = canvas_native_image_bitmap_create_from_encoded_bytes_with_output(
236
+ dataBuffer, size,
237
+ options.flipY,
238
+ options.premultiplyAlpha,
239
+ options.colorSpaceConversion,
240
+ options.resizeQuality,
241
+ options.resizeWidth,
242
+ options.resizeHeight,
243
+ shared_asset);
244
+
245
+ canvas_native_image_asset_destroy(shared_asset);
246
+
247
+ write(jsi_callback->fd_[1],
248
+ &done,
249
+ sizeof(bool));
250
+
251
+
252
+ }, std::move(ab), arrayBuffer->ByteLength());
253
+
254
+ thread.detach();
255
+ return;
256
+ }
257
+
258
+
259
+ auto ta = imageObject.As<v8::ArrayBufferView>();
260
+
261
+
262
+ auto array = ta->Buffer();
263
+ auto offset = ta->ByteOffset();
264
+ auto size = ta->ByteLength();
265
+ auto data_ptr = static_cast<uint8_t *>(array->GetBackingStore()->Data()) + offset;
266
+
267
+
268
+ v8::Global<v8::ArrayBufferView> ab(isolate, ta);
269
+
270
+ std::thread thread(
271
+ [jsi_callback, &options, shared_asset, data_ptr, size](
272
+ v8::Global<v8::ArrayBufferView> ab) {
273
+
274
+ auto done = canvas_native_image_bitmap_create_from_encoded_bytes_with_output(
275
+ data_ptr, size,
276
+ options.flipY,
277
+ options.premultiplyAlpha,
278
+ options.colorSpaceConversion,
279
+ options.resizeQuality,
280
+ options.resizeWidth,
281
+ options.resizeHeight,
282
+ shared_asset);
283
+
284
+ canvas_native_image_asset_destroy(shared_asset);
285
+
286
+ write(jsi_callback->fd_[1],
287
+ &done,
288
+ sizeof(bool));
289
+
290
+
291
+ }, std::move(ab));
292
+ thread.detach();
293
+
294
+ #endif
295
+
296
+
297
+ #ifdef __APPLE__
298
+
299
+ auto current_queue = new NSOperationQueueWrapper(true);
300
+
301
+
302
+ if (isArrayBuffer) {
303
+ auto arrayBuffer = imageObject.As<v8::ArrayBuffer>();
304
+ auto store = arrayBuffer->GetBackingStore();
305
+ auto dataBuffer = (uint8_t *) store->Data();
306
+ v8::Global<v8::ArrayBuffer> ab(isolate, arrayBuffer);
307
+
308
+ std::thread thread(
309
+ [&dataBuffer, jsi_callback, &options, store, shared_asset, current_queue](
310
+ v8::Global<v8::ArrayBuffer> ab, size_t size
311
+ ) {
312
+
313
+ auto done = canvas_native_image_bitmap_create_from_encoded_bytes_with_output(
314
+ dataBuffer, size,
315
+ options.flipY,
316
+ options.premultiplyAlpha,
317
+ options.colorSpaceConversion,
318
+ options.resizeQuality,
319
+ options.resizeWidth,
320
+ options.resizeHeight,
321
+ shared_asset);
322
+
323
+ canvas_native_image_asset_destroy(shared_asset);
324
+
325
+
326
+ auto main_task = [jsi_callback, current_queue, done]() {
327
+
328
+
329
+ v8::Isolate *isolate = jsi_callback->isolate_;
330
+ v8::Locker locker(isolate);
331
+ v8::Isolate::Scope isolate_scope(isolate);
332
+ v8::HandleScope handle_scope(isolate);
333
+ v8::Local<v8::Function> callback = jsi_callback->callback_->Get(isolate);
334
+ v8::Local<v8::External> cbData = jsi_callback->data_->Get(
335
+ isolate).As<v8::External>();
336
+ v8::Local<v8::Context> context = callback->GetCreationContextChecked();
337
+ v8::Context::Scope context_scope(context);
338
+
339
+ auto ret = ImageBitmapImpl::GetCtor(isolate)->GetFunction(
340
+ context).ToLocalChecked()->NewInstance(
341
+ context).ToLocalChecked();
342
+
343
+ SetNativeType(isolate, ret, NativeType::ImageBitmap);
344
+
345
+ ret->SetInternalField(0, cbData);
346
+
347
+ v8::Local<v8::Value> args[2];
348
+
349
+ if (done) {
350
+ args[0] = v8::Null(isolate);
351
+ args[1] = ret;
352
+
353
+ } else {
354
+ args[0] = v8::Exception::Error(
355
+ ConvertToV8String(isolate, "Failed to load image"));
356
+ args[1] = v8::Null(isolate);
357
+ }
358
+
359
+
360
+ callback->Call(context, context->Global(), 2, args);
361
+
362
+
363
+ delete jsi_callback;
364
+ delete current_queue;
365
+
366
+ };
367
+ current_queue->addOperation(main_task);
368
+
369
+ }, std::move(ab), arrayBuffer->ByteLength());
370
+
371
+ thread.detach();
372
+
373
+ return;
374
+ }
375
+
376
+ auto ta = imageObject.As<v8::ArrayBufferView>();
377
+
378
+
379
+ auto array = ta->Buffer();
380
+ auto offset = ta->ByteOffset();
381
+ auto size = ta->ByteLength();
382
+ auto data_ptr = static_cast<uint8_t *>(array->GetBackingStore()->Data()) + offset;
383
+
384
+
385
+ v8::Global<v8::ArrayBufferView> ab(isolate, ta);
386
+
387
+
388
+ std::thread thread(
389
+ [jsi_callback, &options, shared_asset, data_ptr, size, current_queue](
390
+ v8::Global<v8::ArrayBufferView> ab
391
+ ) {
392
+
393
+ auto done = canvas_native_image_bitmap_create_from_encoded_bytes_with_output(
394
+ data_ptr, size,
395
+ options.flipY,
396
+ options.premultiplyAlpha,
397
+ options.colorSpaceConversion,
398
+ options.resizeQuality,
399
+ options.resizeWidth,
400
+ options.resizeHeight,
401
+ shared_asset);
402
+
403
+ canvas_native_image_asset_destroy(shared_asset);
404
+
405
+ auto main_task = [jsi_callback, current_queue, done]() {
406
+
407
+
408
+ v8::Isolate *isolate = jsi_callback->isolate_;
409
+ v8::Locker locker(isolate);
410
+ v8::Isolate::Scope isolate_scope(isolate);
411
+ v8::HandleScope handle_scope(isolate);
412
+ v8::Local<v8::Function> callback = jsi_callback->callback_->Get(isolate);
413
+ v8::Local<v8::External> cbData = jsi_callback->data_->Get(
414
+ isolate).As<v8::External>();
415
+ v8::Local<v8::Context> context = callback->GetCreationContextChecked();
416
+ v8::Context::Scope context_scope(context);
417
+
418
+ auto ret = ImageBitmapImpl::GetCtor(isolate)->GetFunction(
419
+ context).ToLocalChecked()->NewInstance(
420
+ context).ToLocalChecked();
421
+
422
+ SetNativeType(isolate, ret, NativeType::ImageBitmap);
423
+
424
+ ret->SetInternalField(0, cbData);
425
+
426
+ v8::Local<v8::Value> args[2];
427
+
428
+ if (done) {
429
+ args[0] = v8::Null(isolate);
430
+ args[1] = ret;
431
+ } else {
432
+ args[0] = v8::Exception::Error(
433
+ ConvertToV8String(isolate, "Failed to load image"));
434
+ args[1] = v8::Null(isolate);
435
+ }
436
+
437
+ callback->Call(context, context->Global(), 2, args);
438
+
439
+
440
+ delete jsi_callback;
441
+ delete current_queue;
442
+
443
+ };
444
+ current_queue->addOperation(main_task);
445
+
446
+
447
+
448
+ }, std::move(ab));
449
+ thread.detach();
450
+
451
+ #endif
452
+
453
+ return;
454
+ } else if (len == 5 || len == 6) {
455
+ auto asset = canvas_native_image_asset_create();
456
+
457
+ auto shared_asset = canvas_native_image_asset_shared_clone(asset);
458
+
459
+ auto ret = new ImageBitmapImpl(asset);
460
+
461
+ auto cbFunc = args[count - 1].As<v8::Function>();
462
+ auto data = v8::External::New(isolate, ret);
463
+ if (len == 6) {
464
+ options = ImageBitmapImpl::HandleOptions(isolate, args[5]);
465
+ }
466
+
467
+ auto jsi_callback = new JSICallback(isolate, cbFunc, data);
468
+
469
+
470
+ #ifdef __ANDROID__
471
+ ALooper_addFd(jsi_callback->looper_,
472
+ jsi_callback->fd_[0],
473
+ ALOOPER_POLL_CALLBACK,
474
+ ALOOPER_EVENT_INPUT,
475
+ [](int fd, int events,
476
+ void *data) {
477
+ auto cb = static_cast<JSICallback *>(data);
478
+ bool done;
479
+ read(fd, &done,
480
+ sizeof(bool));
481
+
482
+ v8::Isolate *isolate = cb->isolate_;
483
+ v8::Locker locker(isolate);
484
+ v8::Isolate::Scope isolate_scope(isolate);
485
+ v8::HandleScope handle_scope(isolate);
486
+ v8::Local<v8::Function> callback = cb->callback_->Get(isolate);
487
+ v8::Local<v8::External> cbData = cb->data_->Get(
488
+ isolate).As<v8::External>();
489
+ v8::Local<v8::Context> context = callback->GetCreationContextChecked();
490
+ v8::Context::Scope context_scope(context);
491
+
492
+ auto ret = ImageBitmapImpl::GetCtor(isolate)->GetFunction(
493
+ context).ToLocalChecked()->NewInstance(
494
+ context).ToLocalChecked();
495
+
496
+ SetNativeType(isolate, ret, NativeType::ImageBitmap);
497
+
498
+ ret->SetInternalField(0, cbData);
499
+
500
+ v8::Local<v8::Value> args[2];
501
+
502
+ if (done) {
503
+ args[0] = v8::Null(isolate);
504
+ args[1] = ret;
505
+ } else {
506
+ args[0] = v8::Exception::Error(
507
+ ConvertToV8String(isolate, "Failed to load image"));
508
+ args[1] = v8::Null(isolate);
509
+ }
510
+
511
+ callback->Call(context, context->Global(), 2, args);
512
+
513
+ delete static_cast<JSICallback *>(data);
514
+ return 0;
515
+ }, jsi_callback);
516
+
517
+ ALooper_wake(jsi_callback->looper_);
518
+
519
+ auto bufferValue = args[0];
520
+
521
+ if (isArrayBuffer) {
522
+ auto arrayBuffer = bufferValue.As<v8::ArrayBuffer>();
523
+ auto dataBuffer = (uint8_t *) arrayBuffer->GetBackingStore()->Data();
524
+ v8::Global<v8::ArrayBuffer> ab(isolate, arrayBuffer);
525
+ std::thread thread(
526
+ [&dataBuffer, jsi_callback, &options, shared_asset](
527
+ float sx_or_options,
528
+ float sy,
529
+ float sw,
530
+ float sh,
531
+ v8::Global<v8::ArrayBuffer> ab,
532
+ size_t size
533
+ ) {
534
+
535
+ auto done = canvas_native_image_bitmap_create_from_encoded_bytes_src_rect_with_output(
536
+ dataBuffer, size,
537
+ sx_or_options,
538
+ sy,
539
+ sw,
540
+ sh,
541
+ options.flipY,
542
+ options.premultiplyAlpha,
543
+ options.colorSpaceConversion,
544
+ options.resizeQuality,
545
+ options.resizeWidth,
546
+ options.resizeHeight, shared_asset);
547
+
548
+ canvas_native_image_asset_destroy(shared_asset);
549
+
550
+
551
+ write(jsi_callback->fd_[1],
552
+ &done,
553
+ sizeof(bool));
554
+
555
+ },
556
+ (float) sx_or_options->NumberValue(context).ToChecked(),
557
+ (float) sy->NumberValue(context).ToChecked(),
558
+ (float) sw->NumberValue(context).ToChecked(),
559
+ (float) sh->NumberValue(context).ToChecked(), std::move(ab),
560
+ arrayBuffer->ByteLength());
561
+
562
+ thread.detach();
563
+
564
+ return;
565
+ }
566
+
567
+ auto ta = bufferValue.As<v8::ArrayBufferView>();
568
+
569
+ auto array = ta->Buffer();
570
+ auto offset = ta->ByteOffset();
571
+ auto size = ta->ByteLength();
572
+ auto data_ptr = static_cast<uint8_t *>(array->GetBackingStore()->Data()) + offset;
573
+
574
+
575
+ v8::Global<v8::ArrayBufferView> ab(isolate, ta);
576
+ std::thread thread(
577
+ [jsi_callback, &options, shared_asset, data_ptr, size](
578
+ float sx_or_options,
579
+ float sy,
580
+ float sw,
581
+ float sh,
582
+ v8::Global<v8::ArrayBufferView> ab
583
+ ) {
584
+
585
+ auto done = canvas_native_image_bitmap_create_from_encoded_bytes_src_rect_with_output(
586
+ data_ptr, size,
587
+ sx_or_options,
588
+ sy,
589
+ sw,
590
+ sh,
591
+ options.flipY,
592
+ options.premultiplyAlpha,
593
+ options.colorSpaceConversion,
594
+ options.resizeQuality,
595
+ options.resizeWidth,
596
+ options.resizeHeight, shared_asset);
597
+
598
+ canvas_native_image_asset_destroy(shared_asset);
599
+
600
+
601
+ write(jsi_callback->fd_[1],
602
+ &done,
603
+ sizeof(bool));
604
+
605
+ },
606
+ (float) sx_or_options->NumberValue(context).ToChecked(),
607
+ (float) sy->NumberValue(context).ToChecked(),
608
+ (float) sw->NumberValue(context).ToChecked(),
609
+ (float) sh->NumberValue(context).ToChecked(), std::move(ab));
610
+ thread.detach();
611
+
612
+ #endif
613
+
614
+ #ifdef __APPLE__
615
+
616
+ auto current_queue = new NSOperationQueueWrapper(true);
617
+
618
+
619
+ auto bufferValue = args[0];
620
+
621
+ if (isArrayBuffer) {
622
+ auto arrayBuffer = bufferValue.As<v8::ArrayBuffer>();
623
+ auto dataBuffer = (uint8_t *) arrayBuffer->GetBackingStore()->Data();
624
+ v8::Global<v8::ArrayBuffer> ab(isolate, arrayBuffer);
625
+ std::thread thread(
626
+ [&dataBuffer, jsi_callback, &options, shared_asset, current_queue](
627
+ float sx_or_options,
628
+ float sy,
629
+ float sw,
630
+ float sh,
631
+ v8::Global<v8::ArrayBuffer> ab,
632
+ size_t size
633
+ ) {
634
+
635
+ auto done = canvas_native_image_bitmap_create_from_encoded_bytes_src_rect_with_output(
636
+ dataBuffer, size,
637
+ sx_or_options,
638
+ sy,
639
+ sw,
640
+ sh,
641
+ options.flipY,
642
+ options.premultiplyAlpha,
643
+ options.colorSpaceConversion,
644
+ options.resizeQuality,
645
+ options.resizeWidth,
646
+ options.resizeHeight, shared_asset);
647
+
648
+ canvas_native_image_asset_destroy(shared_asset);
649
+
650
+
651
+ auto main_task = [jsi_callback, current_queue, done]() {
652
+
653
+
654
+ v8::Isolate *isolate = jsi_callback->isolate_;
655
+ v8::Locker locker(isolate);
656
+ v8::Isolate::Scope isolate_scope(isolate);
657
+ v8::HandleScope handle_scope(isolate);
658
+ v8::Local<v8::Function> callback = jsi_callback->callback_->Get(isolate);
659
+ v8::Local<v8::External> cbData = jsi_callback->data_->Get(
660
+ isolate).As<v8::External>();
661
+ v8::Local<v8::Context> context = callback->GetCreationContextChecked();
662
+ v8::Context::Scope context_scope(context);
663
+
664
+ auto ret = ImageBitmapImpl::GetCtor(isolate)->GetFunction(
665
+ context).ToLocalChecked()->NewInstance(
666
+ context).ToLocalChecked();
667
+
668
+ SetNativeType(isolate, ret, NativeType::ImageBitmap);
669
+
670
+ ret->SetInternalField(0, cbData);
671
+
672
+ v8::Local<v8::Value> args[2];
673
+
674
+ if (done) {
675
+ args[0] = v8::Null(isolate);
676
+ args[1] = ret;
677
+ } else {
678
+ args[0] = v8::Exception::Error(
679
+ ConvertToV8String(isolate, "Failed to load image"));
680
+ args[1] = v8::Null(isolate);
681
+ }
682
+
683
+ callback->Call(context, context->Global(), 2, args);
684
+
685
+
686
+ delete jsi_callback;
687
+ delete current_queue;
688
+
689
+ };
690
+ current_queue->addOperation(main_task);
691
+
692
+ },
693
+ (float) sx_or_options->NumberValue(context).ToChecked(),
694
+ (float) sy->NumberValue(context).ToChecked(),
695
+ (float) sw->NumberValue(context).ToChecked(),
696
+ (float) sh->NumberValue(context).ToChecked(),
697
+ std::move(ab),
698
+ arrayBuffer->ByteLength());
699
+
700
+ thread.detach();
701
+
702
+ return;
703
+ }
704
+
705
+ auto ta = bufferValue.As<v8::ArrayBufferView>();
706
+
707
+ auto array = ta->Buffer();
708
+ auto offset = ta->ByteOffset();
709
+ auto size = ta->ByteLength();
710
+ auto data_ptr = static_cast<uint8_t*>(array->GetBackingStore()->Data()) + offset;
711
+
712
+
713
+
714
+ v8::Global<v8::ArrayBufferView> ab(isolate, ta);
715
+ std::thread thread(
716
+ [jsi_callback, &options, data_ptr, size, shared_asset, current_queue](
717
+ float sx_or_options,
718
+ float sy,
719
+ float sw,
720
+ float sh,
721
+ v8::Global<v8::ArrayBufferView> ab
722
+ ) {
723
+
724
+ auto done = canvas_native_image_bitmap_create_from_encoded_bytes_src_rect_with_output(
725
+ data_ptr, size,
726
+ sx_or_options,
727
+ sy,
728
+ sw,
729
+ sh,
730
+ options.flipY,
731
+ options.premultiplyAlpha,
732
+ options.colorSpaceConversion,
733
+ options.resizeQuality,
734
+ options.resizeWidth,
735
+ options.resizeHeight, shared_asset);
736
+
737
+ canvas_native_image_asset_destroy(shared_asset);
738
+
739
+ auto main_task = [jsi_callback, current_queue, done]() {
740
+
741
+
742
+ v8::Isolate *isolate = jsi_callback->isolate_;
743
+ v8::Locker locker(isolate);
744
+ v8::Isolate::Scope isolate_scope(isolate);
745
+ v8::HandleScope handle_scope(isolate);
746
+ v8::Local<v8::Function> callback = jsi_callback->callback_->Get(isolate);
747
+ v8::Local<v8::External> cbData = jsi_callback->data_->Get(
748
+ isolate).As<v8::External>();
749
+ v8::Local<v8::Context> context = callback->GetCreationContextChecked();
750
+ v8::Context::Scope context_scope(context);
751
+
752
+ auto ret = ImageBitmapImpl::GetCtor(isolate)->GetFunction(
753
+ context).ToLocalChecked()->NewInstance(
754
+ context).ToLocalChecked();
755
+
756
+ SetNativeType(isolate, ret, NativeType::ImageBitmap);
757
+
758
+ ret->SetInternalField(0, cbData);
759
+
760
+ v8::Local<v8::Value> args[2];
761
+
762
+ if (done) {
763
+ args[0] = v8::Null(isolate);
764
+ args[1] = ret;
765
+ } else {
766
+ args[0] = v8::Exception::Error(
767
+ ConvertToV8String(isolate, "Failed to load image"));
768
+ args[1] = v8::Null(isolate);
769
+ }
770
+
771
+ callback->Call(context, context->Global(), 2, args);
772
+
773
+
774
+ delete jsi_callback;
775
+ delete current_queue;
776
+
777
+ };
778
+ current_queue->addOperation(main_task);
779
+
780
+
781
+
782
+ },
783
+ (float) sx_or_options->NumberValue(context).ToChecked(),
784
+ (float) sy->NumberValue(context).ToChecked(),
785
+ (float) sw->NumberValue(context).ToChecked(),
786
+ (float) sh->NumberValue(context).ToChecked(), std::move(ab));
787
+ thread.detach();
788
+
789
+
790
+
791
+ #endif
792
+
793
+
794
+ return;
795
+ }
796
+ }
797
+ }
798
+
799
+ auto type = GetNativeType(isolate, image);
800
+
801
+ if (len == 1 || len == 2) {
802
+ if (len == 2) {
803
+ options = ImageBitmapImpl::HandleOptions(isolate, args[1]);
804
+ }
805
+
806
+ v8::Local<v8::Value> retArgs[2];
807
+ retArgs[0] = v8::Null(isolate);
808
+
809
+ switch (type) {
810
+ case NativeType::ImageAsset: {
811
+ auto image_asset = ImageAssetImpl::GetPointer(image.As<v8::Object>());
812
+ auto ret = canvas_native_image_bitmap_create_from_asset(
813
+ image_asset->GetImageAsset(),
814
+ options.flipY,
815
+ options.premultiplyAlpha,
816
+ options.colorSpaceConversion,
817
+ options.resizeQuality,
818
+ options.resizeWidth,
819
+ options.resizeHeight);
820
+
821
+
822
+ auto bitmap = new ImageBitmapImpl(ret);
823
+ auto data = v8::External::New(isolate, bitmap);
824
+ auto object = ImageBitmapImpl::GetCtor(isolate)->GetFunction(
825
+ context).ToLocalChecked()->NewInstance(context).ToLocalChecked();
826
+
827
+ object->SetInternalField(0, data);
828
+
829
+ SetNativeType(isolate, object, NativeType::ImageBitmap);
830
+
831
+ retArgs[1] = object;
832
+ }
833
+ break;
834
+ case NativeType::ImageBitmap: {
835
+ auto image_bitmap = ImageBitmapImpl::GetPointer(image.As<v8::Object>());
836
+ auto ret = canvas_native_image_bitmap_create_from_asset(
837
+ image_bitmap->GetImageAsset(),
838
+ options.flipY,
839
+ options.premultiplyAlpha,
840
+ options.colorSpaceConversion,
841
+ options.resizeQuality,
842
+ options.resizeWidth,
843
+ options.resizeHeight);
844
+
845
+
846
+ auto bitmap = new ImageBitmapImpl(ret);
847
+ auto data = v8::External::New(isolate, bitmap);
848
+ auto object = ImageBitmapImpl::GetCtor(isolate)->GetFunction(
849
+ context).ToLocalChecked()->NewInstance(context).ToLocalChecked();
850
+
851
+ object->SetInternalField(0, data);
852
+
853
+ SetNativeType(isolate, object, NativeType::ImageBitmap);
854
+
855
+ retArgs[1] = object;
856
+
857
+ }
858
+ break;
859
+ default:
860
+ break;
861
+ }
862
+
863
+ cb.As<v8::Function>()->Call(context, context->Global(), 2, retArgs);
864
+
865
+ return;
866
+ } else if (len == 5 || len == 6) {
867
+
868
+ if (len == 6) {
869
+ options = ImageBitmapImpl::HandleOptions(isolate, args[5]);
870
+ }
871
+
872
+ v8::Local<v8::Value> retArgs[2];
873
+ retArgs[0] = v8::Null(isolate);
874
+
875
+
876
+ switch (type) {
877
+ case NativeType::ImageAsset: {
878
+ auto image_asset = ImageBitmapImpl::GetPointer(image.As<v8::Object>());
879
+ auto ret = canvas_native_image_bitmap_create_from_asset_src_rect(
880
+ image_asset->GetImageAsset(),
881
+ (float) sx_or_options->NumberValue(context).ToChecked(),
882
+ (float) sy->NumberValue(context).ToChecked(),
883
+ (float) sw->NumberValue(context).ToChecked(),
884
+ (float) sh->NumberValue(context).ToChecked(),
885
+ options.flipY,
886
+ options.premultiplyAlpha,
887
+ options.colorSpaceConversion,
888
+ options.resizeQuality,
889
+ options.resizeWidth,
890
+ options.resizeHeight);
891
+
892
+
893
+ auto bitmap = new ImageBitmapImpl(ret);
894
+ auto data = v8::External::New(isolate, bitmap);
895
+ auto object = ImageBitmapImpl::GetCtor(isolate)->GetFunction(
896
+ context).ToLocalChecked()->NewInstance(context).ToLocalChecked();
897
+
898
+ object->SetInternalField(0, data);
899
+
900
+ SetNativeType(isolate, object, NativeType::ImageBitmap);
901
+
902
+ retArgs[1] = object;
903
+ }
904
+ break;
905
+ case NativeType::ImageBitmap: {
906
+ auto image_bitmap = ImageBitmapImpl::GetPointer(image.As<v8::Object>());
907
+ auto ret = canvas_native_image_bitmap_create_from_asset_src_rect(
908
+ image_bitmap->GetImageAsset(),
909
+ (float) sx_or_options->NumberValue(context).ToChecked(),
910
+ (float) sy->NumberValue(context).ToChecked(),
911
+ (float) sw->NumberValue(context).ToChecked(),
912
+ (float) sh->NumberValue(context).ToChecked(),
913
+ options.flipY,
914
+ options.premultiplyAlpha,
915
+ options.colorSpaceConversion,
916
+ options.resizeQuality,
917
+ options.resizeWidth,
918
+ options.resizeHeight);
919
+
920
+
921
+ auto bitmap = new ImageBitmapImpl(ret);
922
+ auto data = v8::External::New(isolate, bitmap);
923
+ auto object = ImageBitmapImpl::GetCtor(isolate)->GetFunction(
924
+ context).ToLocalChecked()->NewInstance(context).ToLocalChecked();
925
+
926
+ object->SetInternalField(0, data);
927
+
928
+ SetNativeType(isolate, object, NativeType::ImageBitmap);
929
+
930
+ retArgs[1] = object;
931
+
932
+ }
933
+ break;
934
+ default:
935
+ break;
936
+ }
937
+
938
+
939
+ cb.As<v8::Function>()->Call(context, context->Global(), 2, retArgs);
940
+
941
+ return;
942
+ }
943
+
944
+
945
+ args.GetReturnValue().SetUndefined();
946
+
947
+ }
948
+
949
+ void CanvasJSIModule::Create2DContextWithPointer(const v8::FunctionCallbackInfo<v8::Value> &args) {
950
+ auto isolate = args.GetIsolate();
951
+ auto context = isolate->GetCurrentContext();
952
+ auto ptr = args[0]->ToBigInt(context).ToLocalChecked()->Int64Value();
953
+
954
+ auto context_2d = canvas_native_context_create_with_pointer(ptr);
955
+
956
+ auto ret = CanvasRenderingContext2DImpl::NewInstance(isolate, new CanvasRenderingContext2DImpl(
957
+ context_2d));
958
+ args.GetReturnValue().Set(ret);
959
+ }
960
+
961
+ void CanvasJSIModule::ReadFile(const v8::FunctionCallbackInfo<v8::Value> &args) {
962
+ auto isolate = args.GetIsolate();
963
+ auto file = ConvertFromV8String(isolate, args[0]);
964
+ auto cbFunc = args[1].As<v8::Function>();
965
+
966
+ auto jsi_callback = new JSIReadFileCallback(isolate, cbFunc);
967
+
968
+ #ifdef __ANDROID__
969
+ ALooper_addFd(jsi_callback->looper_,
970
+ jsi_callback->fd_[0],
971
+ ALOOPER_POLL_CALLBACK,
972
+ ALOOPER_EVENT_INPUT,
973
+ [](int fd, int events,
974
+ void *data) {
975
+
976
+ auto cb = static_cast<JSIReadFileCallback *>(data);
977
+ bool done;
978
+ read(fd, &done,
979
+ sizeof(bool));
980
+
981
+ if (cb->data_ == nullptr) {
982
+ return 1;
983
+ }
984
+
985
+ v8::Isolate *isolate = cb->isolate_;
986
+ v8::Locker locker(isolate);
987
+ v8::Isolate::Scope isolate_scope(isolate);
988
+ v8::HandleScope handle_scope(isolate);
989
+ v8::Local<v8::Function> callback = cb->callback_.Get(isolate);
990
+ v8::Local<v8::Context> context = callback->GetCreationContextChecked();
991
+ v8::Context::Scope context_scope(context);
992
+
993
+ v8::Local<v8::Value> args[2];
994
+
995
+ if (done) {
996
+ args[0] = v8::Null(isolate);
997
+
998
+ auto vec = cb->data_;
999
+
1000
+ auto buf = (void *) canvas_native_u8_buffer_get_bytes_mut(vec);
1001
+ auto size = (size_t) canvas_native_u8_buffer_get_length(vec);
1002
+
1003
+ auto store = v8::ArrayBuffer::NewBackingStore(buf, size,
1004
+ [](void *data,
1005
+ size_t length,
1006
+ void *deleter_data) {
1007
+ if (deleter_data !=
1008
+ nullptr) {
1009
+ // a little extreme :'D
1010
+ delete static_cast<JSIReadFileCallback *>(deleter_data);
1011
+ }
1012
+ },
1013
+ data);
1014
+
1015
+ args[1] = v8::ArrayBuffer::New(isolate, std::move(store));
1016
+ } else {
1017
+ auto error = cb->error_;
1018
+ args[0] = v8::Exception::Error(ConvertToV8String(isolate, error));
1019
+ args[1] = v8::Null(isolate);
1020
+ }
1021
+
1022
+ v8::TryCatch tc(isolate);
1023
+ v8::Local<v8::Value> result;
1024
+ if (!callback->Call(context, context->Global(), 2, args).ToLocal(
1025
+ &result)) {
1026
+ if (tc.HasCaught()) {
1027
+
1028
+ v8::Local<v8::Value> stack;
1029
+ bool success = tc.StackTrace(context).ToLocal(&stack);
1030
+ if (!success || stack.IsEmpty()) {
1031
+ if (!done) {
1032
+ delete cb;
1033
+ }
1034
+ return 0;
1035
+ }
1036
+
1037
+ v8::Local<v8::String> stackV8Str;
1038
+ success = stack->ToDetailString(context).ToLocal(&stackV8Str);
1039
+ if (!success || stackV8Str.IsEmpty()) {
1040
+ if (!done) {
1041
+ delete cb;
1042
+ }
1043
+ return 0;
1044
+ }
1045
+ LogToConsole(ConvertFromV8String(isolate, stackV8Str));
1046
+
1047
+ }
1048
+ }
1049
+
1050
+ if (!done) {
1051
+ delete cb;
1052
+ }
1053
+ return 0;
1054
+ }, jsi_callback);
1055
+
1056
+ ALooper_wake(jsi_callback->looper_);
1057
+
1058
+ std::thread thread(
1059
+ [jsi_callback](const std::string &file) {
1060
+ bool done = false;
1061
+ auto ret = canvas_native_helper_read_file(file.c_str());
1062
+
1063
+ if (!canvas_native_helper_read_file_has_error(ret)) {
1064
+ auto buf = canvas_native_helper_read_file_get_data(ret);
1065
+
1066
+ jsi_callback->SetData(buf);
1067
+
1068
+ done = true;
1069
+ } else {
1070
+ auto error = canvas_native_helper_read_file_get_error(ret);
1071
+
1072
+ jsi_callback->SetError(const_cast<char *>(error));
1073
+ }
1074
+ canvas_native_helper_destroy(ret);
1075
+
1076
+ write(jsi_callback->fd_[1],
1077
+ &done,
1078
+ sizeof(bool));
1079
+
1080
+ }, std::move(file));
1081
+
1082
+ thread.detach();
1083
+
1084
+ #endif
1085
+
1086
+
1087
+ #ifdef __APPLE__
1088
+
1089
+ auto current_queue = new NSOperationQueueWrapper(true);
1090
+
1091
+ auto queue = new NSOperationQueueWrapper(false);
1092
+
1093
+ auto task = [jsi_callback, current_queue, queue, file]() {
1094
+
1095
+
1096
+
1097
+ bool done = false;
1098
+ auto ret = canvas_native_helper_read_file(file.c_str());
1099
+
1100
+ if (!canvas_native_helper_read_file_has_error(ret)) {
1101
+ auto buf = canvas_native_helper_read_file_get_data(ret);
1102
+
1103
+ jsi_callback->SetData(buf);
1104
+
1105
+ done = true;
1106
+ } else {
1107
+ auto error = canvas_native_helper_read_file_get_error(ret);
1108
+
1109
+ jsi_callback->SetError((char*)error);
1110
+ }
1111
+
1112
+ canvas_native_helper_destroy(ret);
1113
+
1114
+ auto main_task = [jsi_callback, current_queue, queue, done]() {
1115
+
1116
+ v8::Isolate *isolate = jsi_callback->isolate_;
1117
+ v8::Locker locker(isolate);
1118
+ v8::Isolate::Scope isolate_scope(isolate);
1119
+ v8::HandleScope handle_scope(isolate);
1120
+ v8::Local<v8::Function> callback = jsi_callback->callback_.Get(isolate);
1121
+ v8::Local<v8::Context> context = callback->GetCreationContextChecked();
1122
+ v8::Context::Scope context_scope(context);
1123
+
1124
+ v8::Local<v8::Value> args[2];
1125
+
1126
+ if (done) {
1127
+ args[0] = v8::Null(isolate);
1128
+
1129
+ auto vec = jsi_callback->data_;
1130
+
1131
+
1132
+ auto buf = (void*)canvas_native_u8_buffer_get_bytes_mut(vec);
1133
+
1134
+ auto size = (size_t)canvas_native_u8_buffer_get_length(vec);
1135
+
1136
+ auto store = v8::ArrayBuffer::NewBackingStore(buf, size,
1137
+ [](void *data,
1138
+ size_t length,
1139
+ void *deleter_data) {
1140
+ if (deleter_data !=
1141
+ nullptr) {
1142
+ // a little extreme :'D
1143
+ delete static_cast<JSIReadFileCallback *>(deleter_data);
1144
+ }
1145
+ },
1146
+ jsi_callback);
1147
+
1148
+ args[1] = v8::ArrayBuffer::New(isolate, std::move(store));
1149
+ } else {
1150
+ auto error = jsi_callback->error_;
1151
+ args[0] = v8::Exception::Error(ConvertToV8String(isolate, error));
1152
+ args[1] = v8::Null(isolate);
1153
+ }
1154
+
1155
+ v8::TryCatch tc(isolate);
1156
+ v8::Local<v8::Value> result;
1157
+ if (!callback->Call(context, context->Global(), 2, args).ToLocal(
1158
+ &result)) {
1159
+ if (tc.HasCaught()) {
1160
+
1161
+ v8::Local<v8::Value> stack;
1162
+ bool success = tc.StackTrace(context).ToLocal(&stack);
1163
+ if (!success || stack.IsEmpty()) {
1164
+ if (!done) {
1165
+ delete jsi_callback;
1166
+ }
1167
+ return;
1168
+ }
1169
+
1170
+ v8::Local<v8::String> stackV8Str;
1171
+ success = stack->ToDetailString(context).ToLocal(&stackV8Str);
1172
+ if (!success || stackV8Str.IsEmpty()) {
1173
+ if (!done) {
1174
+ delete jsi_callback;
1175
+ }
1176
+ return;
1177
+ }
1178
+ LogToConsole(ConvertFromV8String(isolate, stackV8Str));
1179
+
1180
+ }
1181
+ }
1182
+
1183
+ if (!done) {
1184
+ delete jsi_callback;
1185
+ }
1186
+
1187
+ delete queue;
1188
+ delete current_queue;
1189
+
1190
+ };
1191
+ current_queue->addOperation(main_task);
1192
+ };
1193
+
1194
+ queue->addOperation(task);
1195
+ #endif
1196
+
1197
+
1198
+ }
1199
+
1200
+ void CanvasJSIModule::CreateWebGLContext(const v8::FunctionCallbackInfo<v8::Value> &args) {
1201
+ auto configValue = args[0];
1202
+ auto isolate = args.GetIsolate();
1203
+ auto context = isolate->GetCurrentContext();
1204
+ if (!configValue->IsNullOrUndefined() && configValue->IsObject()) {
1205
+ auto config = configValue.As<v8::Object>();
1206
+ std::string version("none");
1207
+ auto alpha = true;
1208
+ auto antialias = true;
1209
+ auto depth = true;
1210
+ auto fail_if_major_performance_caveat = false;
1211
+ std::string power_preference("default");
1212
+ auto premultiplied_alpha = true;
1213
+ auto preserve_drawing_buffer = false;
1214
+ auto stencil = false;
1215
+ auto desynchronized = false;
1216
+ auto xr_compatible = false;
1217
+
1218
+ v8::Local<v8::Value> versionValue;
1219
+
1220
+ config->Get(context, ConvertToV8String(isolate, "version")).ToLocal(&versionValue);
1221
+
1222
+ if (!versionValue.IsEmpty() && versionValue->IsString()) {
1223
+ version = ConvertFromV8String(isolate, versionValue);
1224
+ }
1225
+
1226
+ v8::Local<v8::Value> alphaValue;
1227
+
1228
+ config->Get(context, ConvertToV8String(isolate, "alpha")).ToLocal(&alphaValue);
1229
+ if (!alphaValue.IsEmpty() && alphaValue->IsBoolean()) {
1230
+ alpha = alphaValue->BooleanValue(isolate);
1231
+ }
1232
+
1233
+ v8::Local<v8::Value> antialiasValue;
1234
+ config->Get(context, ConvertToV8String(isolate, "antialias")).ToLocal(&antialiasValue);
1235
+ if (!antialiasValue.IsEmpty() && antialiasValue->IsBoolean()) {
1236
+ antialias = antialiasValue->BooleanValue(isolate);
1237
+ }
1238
+
1239
+ v8::Local<v8::Value> failIfMajorPerformanceCaveatValue;
1240
+ config->Get(context,
1241
+ ConvertToV8String(isolate, "failIfMajorPerformanceCaveat")).ToLocal(
1242
+ &failIfMajorPerformanceCaveatValue);
1243
+ if (!failIfMajorPerformanceCaveatValue.IsEmpty() &&
1244
+ failIfMajorPerformanceCaveatValue->IsBoolean()) {
1245
+ fail_if_major_performance_caveat = failIfMajorPerformanceCaveatValue->BooleanValue(
1246
+ isolate);
1247
+ }
1248
+
1249
+ v8::Local<v8::Value> powerPreferenceValue;
1250
+ config->Get(context, ConvertToV8String(isolate, "powerPreference")).ToLocal(
1251
+ &powerPreferenceValue);
1252
+ if (!powerPreferenceValue.IsEmpty() && powerPreferenceValue->IsString()) {
1253
+ power_preference = ConvertFromV8String(isolate, powerPreferenceValue);
1254
+ }
1255
+
1256
+ v8::Local<v8::Value> premultipliedAlphaValue;
1257
+ config->Get(context,
1258
+ ConvertToV8String(isolate, "premultipliedAlpha")).ToLocal(
1259
+ &premultipliedAlphaValue);
1260
+ if (!premultipliedAlphaValue.IsEmpty() && premultipliedAlphaValue->IsBoolean()) {
1261
+ premultiplied_alpha = premultipliedAlphaValue->BooleanValue(isolate);
1262
+ }
1263
+
1264
+ v8::Local<v8::Value> preserveDrawingBufferValue;
1265
+ config->Get(context,
1266
+ ConvertToV8String(isolate, "preserveDrawingBuffer")).ToLocal(
1267
+ &preserveDrawingBufferValue);
1268
+ if (!preserveDrawingBufferValue.IsEmpty() && preserveDrawingBufferValue->IsBoolean()) {
1269
+ preserve_drawing_buffer = preserveDrawingBufferValue->BooleanValue(isolate);
1270
+ }
1271
+
1272
+ v8::Local<v8::Value> stencilValue;
1273
+ config->Get(context, ConvertToV8String(isolate, "stencil")).ToLocal(&stencilValue);
1274
+ if (!stencilValue.IsEmpty() && stencilValue->IsBoolean()) {
1275
+ stencil = stencilValue->BooleanValue(isolate);
1276
+ }
1277
+
1278
+ v8::Local<v8::Value> desynchronizedValue;
1279
+ config->Get(context, ConvertToV8String(isolate, "desynchronized")).ToLocal(
1280
+ &desynchronizedValue);
1281
+ if (!desynchronizedValue.IsEmpty() && desynchronizedValue->IsBoolean()) {
1282
+ desynchronized = desynchronizedValue->BooleanValue(isolate);
1283
+ }
1284
+
1285
+ v8::Local<v8::Value> xrCompatibleValue;
1286
+ config->Get(context,
1287
+ ConvertToV8String(isolate, "xrCompatible")).ToLocal(&xrCompatibleValue);
1288
+ if (!xrCompatibleValue.IsEmpty() && xrCompatibleValue->IsBoolean()) {
1289
+ xr_compatible = xrCompatibleValue->BooleanValue(isolate);
1290
+ }
1291
+
1292
+ if (version !=
1293
+ "v1") {
1294
+ args.GetReturnValue().SetNull();
1295
+ return;
1296
+ } else {
1297
+ auto count = args.Length();
1298
+ if (count == 6) {
1299
+ auto ctx = args[1].As<v8::BigInt>()->Int64Value();
1300
+ // auto density = args[2]->NumberValue(context).ToChecked();
1301
+ // auto fontColor = args[3]->NumberValue(context).ToChecked();
1302
+ // auto ppi = args[4]->NumberValue(context).ToChecked();
1303
+ // auto direction = args[5]->NumberValue(context).ToChecked();
1304
+ auto webgl = canvas_native_webgl_create(
1305
+ ctx,
1306
+ version.c_str(),
1307
+ alpha,
1308
+ antialias,
1309
+ depth,
1310
+ fail_if_major_performance_caveat,
1311
+ power_preference.c_str(),
1312
+ premultiplied_alpha,
1313
+ preserve_drawing_buffer,
1314
+ stencil,
1315
+ desynchronized,
1316
+ xr_compatible
1317
+ );
1318
+
1319
+ auto renderingContext = WebGLRenderingContext::NewInstance(isolate,
1320
+ new WebGLRenderingContext(
1321
+ webgl));
1322
+
1323
+ args.GetReturnValue().Set(renderingContext);
1324
+ return;
1325
+ } else if (count == 7) {
1326
+ auto width = args[1]->NumberValue(context).ToChecked();
1327
+ auto height = args[2]->NumberValue(context).ToChecked();
1328
+ // auto density = args[3]->NumberValue(context).ToChecked();
1329
+ // auto fontColor = args[4]->NumberValue(context).ToChecked();
1330
+ // auto ppi = args[5]->NumberValue(context).ToChecked();
1331
+ // auto direction = args[6]->NumberValue(context).ToChecked();
1332
+ auto ctx = canvas_native_webgl_create_no_window(
1333
+ (int32_t) width,
1334
+ (int32_t) height,
1335
+ version.c_str(),
1336
+ alpha,
1337
+ antialias,
1338
+ depth,
1339
+ fail_if_major_performance_caveat,
1340
+ power_preference.c_str(),
1341
+ premultiplied_alpha,
1342
+ preserve_drawing_buffer,
1343
+ stencil,
1344
+ desynchronized,
1345
+ xr_compatible,
1346
+ false
1347
+ );
1348
+
1349
+ auto renderingContext = WebGLRenderingContext::NewInstance(isolate,
1350
+ new WebGLRenderingContext(
1351
+ ctx));
1352
+
1353
+ args.GetReturnValue().Set(renderingContext);
1354
+ return;
1355
+
1356
+ } else {
1357
+ auto width = (int32_t) args[1]->NumberValue(context).ToChecked();
1358
+ auto height = (int32_t) args[2]->NumberValue(context).ToChecked();
1359
+
1360
+ auto ctx = canvas_native_webgl_create_no_window(
1361
+ width,
1362
+ height,
1363
+ version.c_str(),
1364
+ alpha,
1365
+ antialias,
1366
+ depth,
1367
+ fail_if_major_performance_caveat,
1368
+ power_preference.c_str(),
1369
+ premultiplied_alpha,
1370
+ preserve_drawing_buffer,
1371
+ stencil,
1372
+ desynchronized,
1373
+ xr_compatible,
1374
+ false
1375
+ );
1376
+
1377
+ auto renderingContext = WebGLRenderingContext::NewInstance(isolate,
1378
+ new WebGLRenderingContext(
1379
+ ctx));
1380
+
1381
+ args.GetReturnValue().Set(renderingContext);
1382
+ return;
1383
+ }
1384
+
1385
+ }
1386
+ }
1387
+ args.GetReturnValue().SetNull();
1388
+ }
1389
+
1390
+ void CanvasJSIModule::CreateWebGL2Context(const v8::FunctionCallbackInfo<v8::Value> &args) {
1391
+ auto configValue = args[0];
1392
+ auto isolate = args.GetIsolate();
1393
+ auto context = isolate->GetCurrentContext();
1394
+ if (!configValue->IsNullOrUndefined() && configValue->IsObject()) {
1395
+ auto config = configValue.As<v8::Object>();
1396
+ std::string version("none");
1397
+ auto alpha = true;
1398
+ auto antialias = true;
1399
+ auto depth = true;
1400
+ auto fail_if_major_performance_caveat = false;
1401
+ std::string power_preference("default");
1402
+ auto premultiplied_alpha = true;
1403
+ auto preserve_drawing_buffer = false;
1404
+ auto stencil = false;
1405
+ auto desynchronized = false;
1406
+ auto xr_compatible = false;
1407
+
1408
+ v8::Local<v8::Value> versionValue;
1409
+
1410
+ config->Get(context, ConvertToV8String(isolate, "version")).ToLocal(&versionValue);
1411
+
1412
+ if (!versionValue.IsEmpty() && versionValue->IsString()) {
1413
+ version = ConvertFromV8String(isolate, versionValue);
1414
+ }
1415
+
1416
+ v8::Local<v8::Value> alphaValue;
1417
+
1418
+ config->Get(context, ConvertToV8String(isolate, "alpha")).ToLocal(&alphaValue);
1419
+ if (!alphaValue.IsEmpty() && alphaValue->IsBoolean()) {
1420
+ alpha = alphaValue->BooleanValue(isolate);
1421
+ }
1422
+
1423
+ v8::Local<v8::Value> antialiasValue;
1424
+ config->Get(context, ConvertToV8String(isolate, "antialias")).ToLocal(&antialiasValue);
1425
+ if (!antialiasValue.IsEmpty() && antialiasValue->IsBoolean()) {
1426
+ antialias = antialiasValue->BooleanValue(isolate);
1427
+ }
1428
+
1429
+ v8::Local<v8::Value> failIfMajorPerformanceCaveatValue;
1430
+ config->Get(context,
1431
+ ConvertToV8String(isolate, "failIfMajorPerformanceCaveat")).ToLocal(
1432
+ &failIfMajorPerformanceCaveatValue);
1433
+ if (!failIfMajorPerformanceCaveatValue.IsEmpty() &&
1434
+ failIfMajorPerformanceCaveatValue->IsBoolean()) {
1435
+ fail_if_major_performance_caveat = failIfMajorPerformanceCaveatValue->BooleanValue(
1436
+ isolate);
1437
+ }
1438
+
1439
+ v8::Local<v8::Value> powerPreferenceValue;
1440
+ config->Get(context, ConvertToV8String(isolate, "powerPreference")).ToLocal(
1441
+ &powerPreferenceValue);
1442
+ if (!powerPreferenceValue.IsEmpty() && powerPreferenceValue->IsString()) {
1443
+ power_preference = ConvertFromV8String(isolate, powerPreferenceValue);
1444
+ }
1445
+
1446
+ v8::Local<v8::Value> premultipliedAlphaValue;
1447
+ config->Get(context,
1448
+ ConvertToV8String(isolate, "premultipliedAlpha")).ToLocal(
1449
+ &premultipliedAlphaValue);
1450
+ if (!premultipliedAlphaValue.IsEmpty() && premultipliedAlphaValue->IsBoolean()) {
1451
+ premultiplied_alpha = premultipliedAlphaValue->BooleanValue(isolate);
1452
+ }
1453
+
1454
+ v8::Local<v8::Value> preserveDrawingBufferValue;
1455
+ config->Get(context,
1456
+ ConvertToV8String(isolate, "preserveDrawingBuffer")).ToLocal(
1457
+ &preserveDrawingBufferValue);
1458
+ if (!preserveDrawingBufferValue.IsEmpty() && preserveDrawingBufferValue->IsBoolean()) {
1459
+ preserve_drawing_buffer = preserveDrawingBufferValue->BooleanValue(isolate);
1460
+ }
1461
+
1462
+ v8::Local<v8::Value> stencilValue;
1463
+ config->Get(context, ConvertToV8String(isolate, "stencil")).ToLocal(&stencilValue);
1464
+ if (!stencilValue.IsEmpty() && stencilValue->IsBoolean()) {
1465
+ stencil = stencilValue->BooleanValue(isolate);
1466
+ }
1467
+
1468
+ v8::Local<v8::Value> desynchronizedValue;
1469
+ config->Get(context, ConvertToV8String(isolate, "desynchronized")).ToLocal(
1470
+ &desynchronizedValue);
1471
+ if (!desynchronizedValue.IsEmpty() && desynchronizedValue->IsBoolean()) {
1472
+ desynchronized = desynchronizedValue->BooleanValue(isolate);
1473
+ }
1474
+
1475
+ v8::Local<v8::Value> xrCompatibleValue;
1476
+ config->Get(context,
1477
+ ConvertToV8String(isolate, "xrCompatible")).ToLocal(&xrCompatibleValue);
1478
+ if (!xrCompatibleValue.IsEmpty() && xrCompatibleValue->IsBoolean()) {
1479
+ xr_compatible = xrCompatibleValue->BooleanValue(isolate);
1480
+ }
1481
+
1482
+ if (version !=
1483
+ "v2") {
1484
+ args.GetReturnValue().SetNull();
1485
+ return;
1486
+ } else {
1487
+ auto count = args.Length();
1488
+ if (count == 6) {
1489
+ auto ctx = args[1].As<v8::BigInt>()->Int64Value();
1490
+ // auto density = args[2]->NumberValue(context).ToChecked();
1491
+ // auto fontColor = args[3]->NumberValue(context).ToChecked();
1492
+ // auto ppi = args[4]->NumberValue(context).ToChecked();
1493
+ // auto direction = args[5]->NumberValue(context).ToChecked();
1494
+
1495
+ auto webgl = canvas_native_webgl_create(
1496
+ ctx,
1497
+ version.c_str(),
1498
+ alpha,
1499
+ antialias,
1500
+ depth,
1501
+ fail_if_major_performance_caveat,
1502
+ power_preference.c_str(),
1503
+ premultiplied_alpha,
1504
+ preserve_drawing_buffer,
1505
+ stencil,
1506
+ desynchronized,
1507
+ xr_compatible
1508
+ );
1509
+
1510
+ auto renderingContext = WebGL2RenderingContext::NewInstance(isolate,
1511
+ new WebGL2RenderingContext(
1512
+ webgl,
1513
+ WebGLRenderingVersion::V2));
1514
+
1515
+ args.GetReturnValue().Set(renderingContext);
1516
+ return;
1517
+
1518
+ } else if (count ==
1519
+ 7) {
1520
+ auto width = args[1]->NumberValue(context).ToChecked();
1521
+ auto height = args[2]->NumberValue(context).ToChecked();
1522
+ // auto density = args[3]->NumberValue(context).ToChecked();
1523
+ // auto fontColor = args[4]->NumberValue(context).ToChecked();
1524
+ // auto ppi = args[5]->NumberValue(context).ToChecked();
1525
+ // auto direction = args[6]->NumberValue(context).ToChecked();
1526
+ auto ctx = canvas_native_webgl_create_no_window(
1527
+ (int32_t) width,
1528
+ (int32_t) height,
1529
+ version.c_str(),
1530
+ alpha,
1531
+ antialias,
1532
+ depth,
1533
+ fail_if_major_performance_caveat,
1534
+ power_preference.c_str(),
1535
+ premultiplied_alpha,
1536
+ preserve_drawing_buffer,
1537
+ stencil,
1538
+ desynchronized,
1539
+ xr_compatible,
1540
+ false
1541
+ );
1542
+ auto renderingContext = WebGL2RenderingContext::NewInstance(isolate,
1543
+ new WebGL2RenderingContext(
1544
+ ctx,
1545
+ WebGLRenderingVersion::V2));
1546
+
1547
+ args.GetReturnValue().Set(renderingContext);
1548
+ return;
1549
+
1550
+ } else {
1551
+ auto width = (int32_t) args[1]->NumberValue(context).ToChecked();
1552
+ auto height = (int32_t) args[2]->NumberValue(context).ToChecked();
1553
+ auto ctx = canvas_native_webgl_create_no_window(
1554
+ width,
1555
+ height,
1556
+ version.c_str(),
1557
+ alpha,
1558
+ antialias,
1559
+ depth,
1560
+ fail_if_major_performance_caveat,
1561
+ power_preference.c_str(),
1562
+ premultiplied_alpha,
1563
+ preserve_drawing_buffer,
1564
+ stencil,
1565
+ desynchronized,
1566
+ xr_compatible,
1567
+ false
1568
+ );
1569
+
1570
+ auto renderingContext = WebGL2RenderingContext::NewInstance(isolate,
1571
+ new WebGL2RenderingContext(
1572
+ ctx,
1573
+ WebGLRenderingVersion::V2));
1574
+
1575
+ args.GetReturnValue().Set(renderingContext);
1576
+ return;
1577
+ }
1578
+ }
1579
+ }
1580
+
1581
+ args.GetReturnValue().SetNull();
1582
+ }