@shopify/react-native-skia 2.9.1 → 2.10.1

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 (387) hide show
  1. package/android/CMakeLists.txt +8 -46
  2. package/android/build.gradle +33 -0
  3. package/android/src/main/java/com/shopify/reactnative/skia/RNSkiaPackage.java +1 -2
  4. package/cpp/api/JsiNativeBuffer.h +23 -24
  5. package/cpp/api/JsiSkAnimatedImage.h +24 -25
  6. package/cpp/api/JsiSkAnimatedImageFactory.h +18 -17
  7. package/cpp/api/JsiSkApi.h +254 -96
  8. package/cpp/api/JsiSkCanvas.h +141 -266
  9. package/cpp/api/JsiSkColor.h +7 -5
  10. package/cpp/api/JsiSkColorFilter.h +15 -8
  11. package/cpp/api/JsiSkColorFilterFactory.h +49 -67
  12. package/cpp/api/JsiSkContourMeasure.h +31 -38
  13. package/cpp/api/JsiSkContourMeasureIter.h +20 -23
  14. package/cpp/api/JsiSkConverters.h +410 -0
  15. package/cpp/api/JsiSkData.h +13 -7
  16. package/cpp/api/JsiSkDataFactory.h +27 -32
  17. package/cpp/api/JsiSkFont.h +123 -192
  18. package/cpp/api/JsiSkFontMgr.h +33 -26
  19. package/cpp/api/JsiSkFontMgrFactory.h +12 -11
  20. package/cpp/api/JsiSkFontStyle.h +14 -12
  21. package/cpp/api/JsiSkImage.h +90 -79
  22. package/cpp/api/JsiSkImageFactory.h +93 -95
  23. package/cpp/api/JsiSkImageFilter.h +21 -11
  24. package/cpp/api/JsiSkImageFilterFactory.h +375 -629
  25. package/cpp/api/JsiSkImageInfo.h +25 -25
  26. package/cpp/api/JsiSkMaskFilter.h +21 -11
  27. package/cpp/api/JsiSkMaskFilterFactory.h +17 -17
  28. package/cpp/api/JsiSkMatrix.h +51 -88
  29. package/cpp/api/JsiSkNativeObjects.h +387 -0
  30. package/cpp/api/JsiSkPaint.h +104 -142
  31. package/cpp/api/JsiSkParagraph.h +54 -64
  32. package/cpp/api/JsiSkParagraphBuilder.h +43 -68
  33. package/cpp/api/JsiSkParagraphBuilderFactory.h +20 -24
  34. package/cpp/api/JsiSkPath.h +242 -350
  35. package/cpp/api/JsiSkPathBuilder.h +153 -273
  36. package/cpp/api/JsiSkPathBuilderFactory.h +19 -20
  37. package/cpp/api/JsiSkPathEffect.h +21 -11
  38. package/cpp/api/JsiSkPathEffectFactory.h +61 -80
  39. package/cpp/api/JsiSkPathFactory.h +148 -238
  40. package/cpp/api/JsiSkPicture.h +32 -27
  41. package/cpp/api/JsiSkPictureFactory.h +21 -26
  42. package/cpp/api/JsiSkPictureRecorder.h +27 -29
  43. package/cpp/api/JsiSkPoint.h +20 -23
  44. package/cpp/api/JsiSkRRect.h +24 -32
  45. package/cpp/api/JsiSkRSXform.h +31 -48
  46. package/cpp/api/JsiSkRect.h +40 -50
  47. package/cpp/api/JsiSkRuntimeEffect.h +85 -92
  48. package/cpp/api/JsiSkRuntimeEffectFactory.h +14 -18
  49. package/cpp/api/JsiSkRuntimeShaderBuilder.h +28 -30
  50. package/cpp/api/JsiSkSVG.h +15 -15
  51. package/cpp/api/JsiSkSVGFactory.h +17 -20
  52. package/cpp/api/JsiSkShader.h +15 -8
  53. package/cpp/api/JsiSkShaderFactory.h +159 -238
  54. package/cpp/api/JsiSkSkottie.h +131 -143
  55. package/cpp/api/JsiSkSurface.h +29 -32
  56. package/cpp/api/JsiSkSurfaceFactory.h +18 -20
  57. package/cpp/api/JsiSkTextBlob.h +15 -8
  58. package/cpp/api/JsiSkTextBlobFactory.h +40 -66
  59. package/cpp/api/JsiSkTypeface.h +25 -22
  60. package/cpp/api/JsiSkTypefaceFactory.h +17 -15
  61. package/cpp/api/JsiSkTypefaceFontProvider.h +43 -39
  62. package/cpp/api/JsiSkTypefaceFontProviderFactory.h +13 -12
  63. package/cpp/api/JsiSkVertices.h +23 -22
  64. package/cpp/api/JsiSkiaContext.h +22 -23
  65. package/cpp/api/JsiSkottieFactory.h +16 -17
  66. package/cpp/api/JsiVideo.h +43 -81
  67. package/cpp/api/recorder/Convertor.h +31 -61
  68. package/cpp/api/recorder/DataTypes.h +8 -16
  69. package/cpp/api/recorder/JsiRecorder.h +83 -55
  70. package/cpp/api/recorder/RNRecorder.h +1 -1
  71. package/cpp/jsi/BoxedNativeObject.h +146 -0
  72. package/cpp/{jsi2 → jsi}/EnumMapper.h +4 -1
  73. package/cpp/{jsi2 → jsi}/JSIConverter.h +0 -31
  74. package/cpp/{jsi2 → jsi}/NativeObject.h +131 -152
  75. package/cpp/jsi/RuntimeAwareCache.cpp +1 -1
  76. package/cpp/jsi/RuntimeAwareCache.h +26 -8
  77. package/cpp/jsi/ViewProperty.h +5 -11
  78. package/cpp/rnskia/RNDawnContext.h +18 -2
  79. package/cpp/rnskia/RNDawnInterop.cpp +19 -0
  80. package/cpp/rnskia/RNDawnUtils.h +18 -1
  81. package/cpp/rnskia/RNSkJsiViewApi.h +20 -11
  82. package/cpp/rnskia/RNSkManager.cpp +9 -168
  83. package/cpp/rnskia/RNSkPictureView.h +1 -1
  84. package/cpp/skia/include/gpu/ganesh/GrDriverBugWorkaroundsAutogen.h +2 -0
  85. package/lib/commonjs/external/reanimated/renderHelpers.d.ts +15 -0
  86. package/lib/commonjs/external/reanimated/renderHelpers.js +30 -1
  87. package/lib/commonjs/external/reanimated/renderHelpers.js.map +1 -1
  88. package/lib/commonjs/mock/index.js +0 -1
  89. package/lib/commonjs/mock/index.js.map +1 -1
  90. package/lib/commonjs/skia/NativeSetup.js +4 -0
  91. package/lib/commonjs/skia/NativeSetup.js.map +1 -1
  92. package/lib/commonjs/skia/SkiaWorkletSerialization.d.ts +1 -0
  93. package/lib/commonjs/skia/SkiaWorkletSerialization.js +66 -0
  94. package/lib/commonjs/skia/SkiaWorkletSerialization.js.map +1 -0
  95. package/lib/commonjs/skia/types/Image/ImageFactory.d.ts +15 -6
  96. package/lib/commonjs/skia/types/Image/ImageFactory.js.map +1 -1
  97. package/lib/commonjs/skia/types/Skia.d.ts +5 -15
  98. package/lib/commonjs/skia/types/Skia.js.map +1 -1
  99. package/lib/commonjs/skia/types/index.d.ts +0 -1
  100. package/lib/commonjs/skia/types/index.js +0 -11
  101. package/lib/commonjs/skia/types/index.js.map +1 -1
  102. package/lib/commonjs/skia/web/JsiSkImageFactory.d.ts +2 -2
  103. package/lib/commonjs/skia/web/JsiSkImageFactory.js +2 -2
  104. package/lib/commonjs/skia/web/JsiSkImageFactory.js.map +1 -1
  105. package/lib/commonjs/skia/web/JsiSkia.js +1 -4
  106. package/lib/commonjs/skia/web/JsiSkia.js.map +1 -1
  107. package/lib/commonjs/sksg/Container.native.js +20 -1
  108. package/lib/commonjs/sksg/Container.native.js.map +1 -1
  109. package/lib/commonjs/views/index.d.ts +0 -1
  110. package/lib/commonjs/views/index.js +0 -11
  111. package/lib/commonjs/views/index.js.map +1 -1
  112. package/lib/module/external/reanimated/renderHelpers.d.ts +15 -0
  113. package/lib/module/external/reanimated/renderHelpers.js +29 -0
  114. package/lib/module/external/reanimated/renderHelpers.js.map +1 -1
  115. package/lib/module/mock/index.js +0 -1
  116. package/lib/module/mock/index.js.map +1 -1
  117. package/lib/module/skia/NativeSetup.js +4 -0
  118. package/lib/module/skia/NativeSetup.js.map +1 -1
  119. package/lib/module/skia/SkiaWorkletSerialization.d.ts +1 -0
  120. package/lib/module/skia/SkiaWorkletSerialization.js +59 -0
  121. package/lib/module/skia/SkiaWorkletSerialization.js.map +1 -0
  122. package/lib/module/skia/types/Image/ImageFactory.d.ts +15 -6
  123. package/lib/module/skia/types/Image/ImageFactory.js.map +1 -1
  124. package/lib/module/skia/types/Skia.d.ts +5 -15
  125. package/lib/module/skia/types/Skia.js.map +1 -1
  126. package/lib/module/skia/types/index.d.ts +0 -1
  127. package/lib/module/skia/types/index.js +0 -1
  128. package/lib/module/skia/types/index.js.map +1 -1
  129. package/lib/module/skia/web/JsiSkImageFactory.d.ts +2 -2
  130. package/lib/module/skia/web/JsiSkImageFactory.js +2 -2
  131. package/lib/module/skia/web/JsiSkImageFactory.js.map +1 -1
  132. package/lib/module/skia/web/JsiSkia.js +1 -4
  133. package/lib/module/skia/web/JsiSkia.js.map +1 -1
  134. package/lib/module/sksg/Container.native.js +21 -2
  135. package/lib/module/sksg/Container.native.js.map +1 -1
  136. package/lib/module/views/index.d.ts +0 -1
  137. package/lib/module/views/index.js +0 -1
  138. package/lib/module/views/index.js.map +1 -1
  139. package/lib/typescript/lib/commonjs/external/reanimated/renderHelpers.d.ts +2 -0
  140. package/lib/typescript/lib/commonjs/mock/index.d.ts +0 -1
  141. package/lib/typescript/lib/commonjs/skia/SkiaWorkletSerialization.d.ts +2 -0
  142. package/lib/typescript/lib/commonjs/skia/web/JsiSkImageFactory.d.ts +2 -2
  143. package/lib/typescript/lib/commonjs/skia/web/JsiSkia.d.ts +1 -2
  144. package/lib/typescript/lib/module/external/reanimated/renderHelpers.d.ts +15 -0
  145. package/lib/typescript/lib/module/mock/index.d.ts +0 -2
  146. package/lib/typescript/lib/module/skia/Skia.web.d.ts +1 -2
  147. package/lib/typescript/lib/module/skia/SkiaWorkletSerialization.d.ts +1 -0
  148. package/lib/typescript/lib/module/skia/types/index.d.ts +0 -1
  149. package/lib/typescript/lib/module/skia/web/JsiSkImageFactory.d.ts +2 -2
  150. package/lib/typescript/lib/module/skia/web/JsiSkia.d.ts +1 -2
  151. package/lib/typescript/lib/module/views/index.d.ts +0 -1
  152. package/lib/typescript/src/external/reanimated/renderHelpers.d.ts +15 -0
  153. package/lib/typescript/src/skia/SkiaWorkletSerialization.d.ts +1 -0
  154. package/lib/typescript/src/skia/types/Image/ImageFactory.d.ts +15 -6
  155. package/lib/typescript/src/skia/types/Skia.d.ts +5 -15
  156. package/lib/typescript/src/skia/types/index.d.ts +0 -1
  157. package/lib/typescript/src/skia/web/JsiSkImageFactory.d.ts +2 -2
  158. package/lib/typescript/src/views/index.d.ts +0 -1
  159. package/package.json +8 -5
  160. package/react-native-skia.podspec +38 -5
  161. package/src/external/reanimated/renderHelpers.ts +30 -0
  162. package/src/mock/index.ts +0 -1
  163. package/src/skia/NativeSetup.ts +5 -0
  164. package/src/skia/SkiaWorkletSerialization.ts +67 -0
  165. package/src/skia/types/Image/ImageFactory.ts +15 -6
  166. package/src/skia/types/Skia.ts +5 -15
  167. package/src/skia/types/index.ts +0 -1
  168. package/src/skia/web/JsiSkImageFactory.ts +3 -3
  169. package/src/skia/web/JsiSkia.ts +2 -5
  170. package/src/sksg/Container.native.ts +40 -2
  171. package/src/views/index.ts +0 -1
  172. package/android/cpp/jni/JniWebGPUView.cpp +0 -112
  173. package/android/cpp/rnskia-android/SkiaPlatformContext.h +0 -26
  174. package/android/src/main/java/com/shopify/reactnative/skia/WebGPUSurfaceView.java +0 -43
  175. package/android/src/main/java/com/shopify/reactnative/skia/WebGPUTextureView.java +0 -50
  176. package/android/src/main/java/com/shopify/reactnative/skia/WebGPUView.java +0 -98
  177. package/android/src/main/java/com/shopify/reactnative/skia/WebGPUViewAPI.java +0 -19
  178. package/android/src/main/java/com/shopify/reactnative/skia/WebGPUViewManager.java +0 -58
  179. package/apple/RNWebGPUAppleNativeBuffer.mm +0 -33
  180. package/apple/SkiaPlatformContext.h +0 -20
  181. package/apple/SkiaPlatformContext.mm +0 -21
  182. package/apple/SkiaWebGPUView.mm +0 -81
  183. package/apple/WebGPUMetalView.mm +0 -136
  184. package/cpp/api/JsiSkHostObjects.h +0 -257
  185. package/cpp/jsi/JsiHostObject.cpp +0 -137
  186. package/cpp/jsi/JsiHostObject.h +0 -385
  187. package/cpp/rnwgpu/ArrayBuffer.h +0 -117
  188. package/cpp/rnwgpu/Canvas.h +0 -50
  189. package/cpp/rnwgpu/PlatformContext.h +0 -18
  190. package/cpp/rnwgpu/SurfaceRegistry.h +0 -605
  191. package/cpp/rnwgpu/api/AppleNativeBuffer.h +0 -22
  192. package/cpp/rnwgpu/api/Convertors.h +0 -783
  193. package/cpp/rnwgpu/api/External.h +0 -12
  194. package/cpp/rnwgpu/api/GPU.cpp +0 -162
  195. package/cpp/rnwgpu/api/GPU.h +0 -60
  196. package/cpp/rnwgpu/api/GPUAdapter.cpp +0 -240
  197. package/cpp/rnwgpu/api/GPUAdapter.h +0 -60
  198. package/cpp/rnwgpu/api/GPUAdapterInfo.h +0 -57
  199. package/cpp/rnwgpu/api/GPUBindGroup.cpp +0 -3
  200. package/cpp/rnwgpu/api/GPUBindGroup.h +0 -51
  201. package/cpp/rnwgpu/api/GPUBindGroupLayout.h +0 -52
  202. package/cpp/rnwgpu/api/GPUBuffer.cpp +0 -107
  203. package/cpp/rnwgpu/api/GPUBuffer.h +0 -88
  204. package/cpp/rnwgpu/api/GPUCanvasContext.cpp +0 -75
  205. package/cpp/rnwgpu/api/GPUCanvasContext.h +0 -70
  206. package/cpp/rnwgpu/api/GPUCommandBuffer.h +0 -45
  207. package/cpp/rnwgpu/api/GPUCommandEncoder.cpp +0 -179
  208. package/cpp/rnwgpu/api/GPUCommandEncoder.h +0 -111
  209. package/cpp/rnwgpu/api/GPUCompilationInfo.h +0 -79
  210. package/cpp/rnwgpu/api/GPUCompilationMessage.h +0 -36
  211. package/cpp/rnwgpu/api/GPUComputePassEncoder.cpp +0 -60
  212. package/cpp/rnwgpu/api/GPUComputePassEncoder.h +0 -85
  213. package/cpp/rnwgpu/api/GPUComputePipeline.cpp +0 -12
  214. package/cpp/rnwgpu/api/GPUComputePipeline.h +0 -60
  215. package/cpp/rnwgpu/api/GPUDevice.cpp +0 -614
  216. package/cpp/rnwgpu/api/GPUDevice.h +0 -258
  217. package/cpp/rnwgpu/api/GPUDeviceLostInfo.cpp +0 -7
  218. package/cpp/rnwgpu/api/GPUDeviceLostInfo.h +0 -40
  219. package/cpp/rnwgpu/api/GPUError.h +0 -35
  220. package/cpp/rnwgpu/api/GPUExtent3D.h +0 -66
  221. package/cpp/rnwgpu/api/GPUExternalTexture.cpp +0 -139
  222. package/cpp/rnwgpu/api/GPUExternalTexture.h +0 -95
  223. package/cpp/rnwgpu/api/GPUFeatures.h +0 -203
  224. package/cpp/rnwgpu/api/GPUInternalError.h +0 -31
  225. package/cpp/rnwgpu/api/GPUOrigin2D.h +0 -55
  226. package/cpp/rnwgpu/api/GPUOrigin3D.h +0 -62
  227. package/cpp/rnwgpu/api/GPUOutOfMemoryError.h +0 -33
  228. package/cpp/rnwgpu/api/GPUPipelineLayout.h +0 -45
  229. package/cpp/rnwgpu/api/GPUQuerySet.cpp +0 -11
  230. package/cpp/rnwgpu/api/GPUQuerySet.h +0 -73
  231. package/cpp/rnwgpu/api/GPUQueue.cpp +0 -179
  232. package/cpp/rnwgpu/api/GPUQueue.h +0 -84
  233. package/cpp/rnwgpu/api/GPURenderBundle.h +0 -44
  234. package/cpp/rnwgpu/api/GPURenderBundleEncoder.cpp +0 -131
  235. package/cpp/rnwgpu/api/GPURenderBundleEncoder.h +0 -110
  236. package/cpp/rnwgpu/api/GPURenderPassEncoder.cpp +0 -165
  237. package/cpp/rnwgpu/api/GPURenderPassEncoder.h +0 -130
  238. package/cpp/rnwgpu/api/GPURenderPipeline.cpp +0 -13
  239. package/cpp/rnwgpu/api/GPURenderPipeline.h +0 -61
  240. package/cpp/rnwgpu/api/GPUSampler.h +0 -44
  241. package/cpp/rnwgpu/api/GPUShaderModule.cpp +0 -56
  242. package/cpp/rnwgpu/api/GPUShaderModule.h +0 -66
  243. package/cpp/rnwgpu/api/GPUSharedFence.cpp +0 -80
  244. package/cpp/rnwgpu/api/GPUSharedFence.h +0 -53
  245. package/cpp/rnwgpu/api/GPUSharedTextureMemory.cpp +0 -135
  246. package/cpp/rnwgpu/api/GPUSharedTextureMemory.h +0 -75
  247. package/cpp/rnwgpu/api/GPUSupportedLimits.cpp +0 -129
  248. package/cpp/rnwgpu/api/GPUSupportedLimits.h +0 -131
  249. package/cpp/rnwgpu/api/GPUTexture.cpp +0 -47
  250. package/cpp/rnwgpu/api/GPUTexture.h +0 -162
  251. package/cpp/rnwgpu/api/GPUTextureView.h +0 -44
  252. package/cpp/rnwgpu/api/GPUUncapturedErrorEvent.h +0 -60
  253. package/cpp/rnwgpu/api/GPUValidationError.h +0 -32
  254. package/cpp/rnwgpu/api/ImageBitmap.h +0 -62
  255. package/cpp/rnwgpu/api/NativeBufferUtils.h +0 -87
  256. package/cpp/rnwgpu/api/RNWebGPU.h +0 -82
  257. package/cpp/rnwgpu/api/WebGPUConstants.h +0 -36
  258. package/cpp/rnwgpu/api/descriptors/GPUBindGroupDescriptor.h +0 -64
  259. package/cpp/rnwgpu/api/descriptors/GPUBindGroupEntry.h +0 -78
  260. package/cpp/rnwgpu/api/descriptors/GPUBindGroupLayoutDescriptor.h +0 -56
  261. package/cpp/rnwgpu/api/descriptors/GPUBindGroupLayoutEntry.h +0 -97
  262. package/cpp/rnwgpu/api/descriptors/GPUBlendComponent.h +0 -57
  263. package/cpp/rnwgpu/api/descriptors/GPUBlendState.h +0 -52
  264. package/cpp/rnwgpu/api/descriptors/GPUBufferBinding.h +0 -56
  265. package/cpp/rnwgpu/api/descriptors/GPUBufferBindingLayout.h +0 -56
  266. package/cpp/rnwgpu/api/descriptors/GPUBufferDescriptor.h +0 -59
  267. package/cpp/rnwgpu/api/descriptors/GPUBufferUsage.h +0 -39
  268. package/cpp/rnwgpu/api/descriptors/GPUCanvasConfiguration.h +0 -76
  269. package/cpp/rnwgpu/api/descriptors/GPUColor.h +0 -66
  270. package/cpp/rnwgpu/api/descriptors/GPUColorTargetState.h +0 -58
  271. package/cpp/rnwgpu/api/descriptors/GPUColorWrite.h +0 -29
  272. package/cpp/rnwgpu/api/descriptors/GPUCommandBufferDescriptor.h +0 -45
  273. package/cpp/rnwgpu/api/descriptors/GPUCommandEncoderDescriptor.h +0 -45
  274. package/cpp/rnwgpu/api/descriptors/GPUComputePassDescriptor.h +0 -56
  275. package/cpp/rnwgpu/api/descriptors/GPUComputePassTimestampWrites.h +0 -58
  276. package/cpp/rnwgpu/api/descriptors/GPUComputePipelineDescriptor.h +0 -67
  277. package/cpp/rnwgpu/api/descriptors/GPUDawnTogglesDescriptor.h +0 -56
  278. package/cpp/rnwgpu/api/descriptors/GPUDepthStencilState.h +0 -103
  279. package/cpp/rnwgpu/api/descriptors/GPUDeviceDescriptor.h +0 -109
  280. package/cpp/rnwgpu/api/descriptors/GPUExternalTextureBindingLayout.h +0 -38
  281. package/cpp/rnwgpu/api/descriptors/GPUExternalTextureDescriptor.h +0 -90
  282. package/cpp/rnwgpu/api/descriptors/GPUFragmentState.h +0 -73
  283. package/cpp/rnwgpu/api/descriptors/GPUImageCopyBuffer.h +0 -62
  284. package/cpp/rnwgpu/api/descriptors/GPUImageCopyExternalImage.h +0 -63
  285. package/cpp/rnwgpu/api/descriptors/GPUImageCopyTexture.h +0 -65
  286. package/cpp/rnwgpu/api/descriptors/GPUImageCopyTextureTagged.h +0 -81
  287. package/cpp/rnwgpu/api/descriptors/GPUImageDataLayout.h +0 -54
  288. package/cpp/rnwgpu/api/descriptors/GPUMapMode.h +0 -22
  289. package/cpp/rnwgpu/api/descriptors/GPUMultisampleState.h +0 -54
  290. package/cpp/rnwgpu/api/descriptors/GPUPipelineLayoutDescriptor.h +0 -57
  291. package/cpp/rnwgpu/api/descriptors/GPUPrimitiveState.h +0 -69
  292. package/cpp/rnwgpu/api/descriptors/GPUProgrammableStage.h +0 -61
  293. package/cpp/rnwgpu/api/descriptors/GPUQuerySetDescriptor.h +0 -55
  294. package/cpp/rnwgpu/api/descriptors/GPUQueueDescriptor.h +0 -43
  295. package/cpp/rnwgpu/api/descriptors/GPURenderBundleDescriptor.h +0 -45
  296. package/cpp/rnwgpu/api/descriptors/GPURenderBundleEncoderDescriptor.h +0 -80
  297. package/cpp/rnwgpu/api/descriptors/GPURenderPassColorAttachment.h +0 -81
  298. package/cpp/rnwgpu/api/descriptors/GPURenderPassDepthStencilAttachment.h +0 -101
  299. package/cpp/rnwgpu/api/descriptors/GPURenderPassDescriptor.h +0 -92
  300. package/cpp/rnwgpu/api/descriptors/GPURenderPassTimestampWrites.h +0 -58
  301. package/cpp/rnwgpu/api/descriptors/GPURenderPipelineDescriptor.h +0 -103
  302. package/cpp/rnwgpu/api/descriptors/GPURequestAdapterOptions.h +0 -51
  303. package/cpp/rnwgpu/api/descriptors/GPUSamplerBindingLayout.h +0 -45
  304. package/cpp/rnwgpu/api/descriptors/GPUSamplerDescriptor.h +0 -110
  305. package/cpp/rnwgpu/api/descriptors/GPUShaderModuleCompilationHint.h +0 -60
  306. package/cpp/rnwgpu/api/descriptors/GPUShaderModuleDescriptor.h +0 -62
  307. package/cpp/rnwgpu/api/descriptors/GPUShaderStage.h +0 -25
  308. package/cpp/rnwgpu/api/descriptors/GPUSharedFenceDescriptor.h +0 -58
  309. package/cpp/rnwgpu/api/descriptors/GPUSharedFenceState.h +0 -51
  310. package/cpp/rnwgpu/api/descriptors/GPUSharedTextureMemoryDescriptor.h +0 -73
  311. package/cpp/rnwgpu/api/descriptors/GPUStencilFaceState.h +0 -64
  312. package/cpp/rnwgpu/api/descriptors/GPUStorageTextureBindingLayout.h +0 -59
  313. package/cpp/rnwgpu/api/descriptors/GPUTextureBindingLayout.h +0 -59
  314. package/cpp/rnwgpu/api/descriptors/GPUTextureDescriptor.h +0 -91
  315. package/cpp/rnwgpu/api/descriptors/GPUTextureUsage.h +0 -29
  316. package/cpp/rnwgpu/api/descriptors/GPUTextureViewDescriptor.h +0 -91
  317. package/cpp/rnwgpu/api/descriptors/GPUUncapturedErrorEventInit.h +0 -64
  318. package/cpp/rnwgpu/api/descriptors/GPUVertexAttribute.h +0 -53
  319. package/cpp/rnwgpu/api/descriptors/GPUVertexBufferLayout.h +0 -62
  320. package/cpp/rnwgpu/api/descriptors/GPUVertexState.h +0 -73
  321. package/cpp/rnwgpu/api/descriptors/Unions.h +0 -1969
  322. package/cpp/rnwgpu/async/AsyncTaskHandle.cpp +0 -214
  323. package/cpp/rnwgpu/async/AsyncTaskHandle.h +0 -58
  324. package/cpp/rnwgpu/async/RuntimeContext.cpp +0 -199
  325. package/cpp/rnwgpu/async/RuntimeContext.h +0 -134
  326. package/lib/commonjs/skia/types/WebGPU.d.ts +0 -184
  327. package/lib/commonjs/skia/types/WebGPU.js +0 -105
  328. package/lib/commonjs/skia/types/WebGPU.js.map +0 -1
  329. package/lib/commonjs/specs/WebGPUViewNativeComponent.d.ts +0 -8
  330. package/lib/commonjs/specs/WebGPUViewNativeComponent.js +0 -10
  331. package/lib/commonjs/specs/WebGPUViewNativeComponent.js.map +0 -1
  332. package/lib/commonjs/specs/WebGPUViewNativeComponent.web.d.ts +0 -8
  333. package/lib/commonjs/specs/WebGPUViewNativeComponent.web.js +0 -103
  334. package/lib/commonjs/specs/WebGPUViewNativeComponent.web.js.map +0 -1
  335. package/lib/commonjs/specs/utils.d.ts +0 -1
  336. package/lib/commonjs/specs/utils.js +0 -11
  337. package/lib/commonjs/specs/utils.js.map +0 -1
  338. package/lib/commonjs/views/WebGPUCanvas.d.ts +0 -33
  339. package/lib/commonjs/views/WebGPUCanvas.js +0 -79
  340. package/lib/commonjs/views/WebGPUCanvas.js.map +0 -1
  341. package/lib/commonjs/views/WebGPUCanvas.web.d.ts +0 -23
  342. package/lib/commonjs/views/WebGPUCanvas.web.js +0 -20
  343. package/lib/commonjs/views/WebGPUCanvas.web.js.map +0 -1
  344. package/lib/module/skia/types/WebGPU.d.ts +0 -184
  345. package/lib/module/skia/types/WebGPU.js +0 -99
  346. package/lib/module/skia/types/WebGPU.js.map +0 -1
  347. package/lib/module/specs/WebGPUViewNativeComponent.d.ts +0 -8
  348. package/lib/module/specs/WebGPUViewNativeComponent.js +0 -4
  349. package/lib/module/specs/WebGPUViewNativeComponent.js.map +0 -1
  350. package/lib/module/specs/WebGPUViewNativeComponent.web.d.ts +0 -8
  351. package/lib/module/specs/WebGPUViewNativeComponent.web.js +0 -96
  352. package/lib/module/specs/WebGPUViewNativeComponent.web.js.map +0 -1
  353. package/lib/module/specs/utils.d.ts +0 -1
  354. package/lib/module/specs/utils.js +0 -5
  355. package/lib/module/specs/utils.js.map +0 -1
  356. package/lib/module/views/WebGPUCanvas.d.ts +0 -33
  357. package/lib/module/views/WebGPUCanvas.js +0 -70
  358. package/lib/module/views/WebGPUCanvas.js.map +0 -1
  359. package/lib/module/views/WebGPUCanvas.web.d.ts +0 -23
  360. package/lib/module/views/WebGPUCanvas.web.js +0 -12
  361. package/lib/module/views/WebGPUCanvas.web.js.map +0 -1
  362. package/lib/typescript/lib/commonjs/skia/types/WebGPU.d.ts +0 -2
  363. package/lib/typescript/lib/commonjs/specs/WebGPUViewNativeComponent.d.ts +0 -4
  364. package/lib/typescript/lib/commonjs/specs/WebGPUViewNativeComponent.web.d.ts +0 -3
  365. package/lib/typescript/lib/commonjs/specs/utils.d.ts +0 -2
  366. package/lib/typescript/lib/commonjs/views/WebGPUCanvas.d.ts +0 -6
  367. package/lib/typescript/lib/commonjs/views/WebGPUCanvas.web.d.ts +0 -6
  368. package/lib/typescript/lib/module/skia/types/WebGPU.d.ts +0 -31
  369. package/lib/typescript/lib/module/specs/WebGPUViewNativeComponent.d.ts +0 -2
  370. package/lib/typescript/lib/module/specs/WebGPUViewNativeComponent.web.d.ts +0 -2
  371. package/lib/typescript/lib/module/specs/utils.d.ts +0 -1
  372. package/lib/typescript/lib/module/views/WebGPUCanvas.d.ts +0 -7
  373. package/lib/typescript/lib/module/views/WebGPUCanvas.web.d.ts +0 -8
  374. package/lib/typescript/src/skia/types/WebGPU.d.ts +0 -184
  375. package/lib/typescript/src/specs/WebGPUViewNativeComponent.d.ts +0 -8
  376. package/lib/typescript/src/specs/WebGPUViewNativeComponent.web.d.ts +0 -8
  377. package/lib/typescript/src/specs/utils.d.ts +0 -1
  378. package/lib/typescript/src/views/WebGPUCanvas.d.ts +0 -33
  379. package/lib/typescript/src/views/WebGPUCanvas.web.d.ts +0 -23
  380. package/src/skia/types/WebGPU.ts +0 -226
  381. package/src/specs/WebGPUViewNativeComponent.ts +0 -11
  382. package/src/specs/WebGPUViewNativeComponent.web.ts +0 -110
  383. package/src/specs/utils.ts +0 -4
  384. package/src/views/WebGPUCanvas.tsx +0 -125
  385. package/src/views/WebGPUCanvas.web.tsx +0 -36
  386. /package/cpp/{jsi2 → jsi}/Promise.cpp +0 -0
  387. /package/cpp/{jsi2 → jsi}/Promise.h +0 -0
@@ -5,8 +5,8 @@ export class JsiSkImageFactory extends Host {
5
5
  MakeImageFromEncoded(encoded: any): JsiSkImage | null;
6
6
  MakeImageFromNativeTextureUnstable(): jest.Mock<any, any, any>;
7
7
  MakeImage(info: any, data: any, bytesPerRow: any): JsiSkImage | null;
8
- MakeImageFromTexture(_texture: any): jest.Mock<any, any, any>;
9
- MakeTextureFromImage(_image: any): jest.Mock<any, any, any>;
8
+ MakeImageFromNativeTexture(_pointer: any): jest.Mock<any, any, any>;
9
+ MakeNativeTextureFromImage(_image: any): jest.Mock<any, any, any>;
10
10
  }
11
11
  import { Host } from "./Host";
12
12
  import { JsiSkImage } from "./JsiSkImage";
@@ -36,8 +36,7 @@ export function JsiSkApi(CanvasKit: any): {
36
36
  Video: (url?: any) => Promise<any>;
37
37
  Context: (_surface: any, _width: any, _height: any) => jest.Mock<any, any, any>;
38
38
  Recorder: () => jest.Mock<any, any, any>;
39
- getDevice: () => jest.Mock<any, any, any>;
40
- hasDevice: () => boolean;
39
+ getNativeDevice: () => jest.Mock<any, any, any>;
41
40
  };
42
41
  import { JsiSkPoint } from "./JsiSkPoint";
43
42
  import { JsiSkRRect } from "./JsiSkRRect";
@@ -1,4 +1,3 @@
1
1
  export * from "./SkiaPictureView";
2
2
  export * from "./types";
3
- export * from "./WebGPUCanvas";
4
3
  export * from "./formats";
@@ -1 +1,16 @@
1
1
  export declare let HAS_REANIMATED_3: boolean;
2
+ /**
3
+ * True when the worklets-based Reanimated integration is available
4
+ * (Reanimated 4 with react-native-worklets providing
5
+ * registerCustomSerializable). Skia objects use the JSI NativeState pattern
6
+ * and can only be transferred to worklet runtimes through a custom
7
+ * serializer, so on native the Reanimated integration requires Reanimated 4 —
8
+ * Reanimated 3 is not supported.
9
+ */
10
+ export declare let HAS_REANIMATED_4: boolean;
11
+ /**
12
+ * Major version of the installed react-native-reanimated package, or null if
13
+ * it is not installed. Used to give actionable diagnostics when the
14
+ * integration cannot be enabled.
15
+ */
16
+ export declare let REANIMATED_VERSION_MAJOR: number | null;
@@ -0,0 +1 @@
1
+ export declare const registerSkiaWorkletSerialization: () => void;
@@ -80,22 +80,31 @@ export interface ImageFactory {
80
80
  MakeImage(info: ImageInfo, data: SkData, bytesPerRow: number): SkImage | null;
81
81
  /**
82
82
  * Creates an SkImage from a WebGPU texture.
83
- * This allows using textures rendered by WebGPU in Skia drawings.
83
+ * This allows using textures rendered by WebGPU in Skia drawings. The
84
+ * texture crosses the package boundary as a raw pointer: pass
85
+ * `texture.nativePointer` from a react-native-webgpu GPUTexture created on
86
+ * the shared device (importDevice(Skia.getNativeDevice())). The native side
87
+ * takes its own reference, so the handle stays valid even if the JS
88
+ * GPUTexture is garbage collected — but do not call texture.destroy()
89
+ * while the image is in use: destroy() releases the underlying GPU
90
+ * resource regardless of reference counts.
84
91
  *
85
92
  * Note: This method is only available when the Graphite backend is enabled.
86
93
  *
87
- * @param texture - A GPUTexture object from the WebGPU API
94
+ * @param pointer - The WGPUTexture pointer (texture.nativePointer)
88
95
  * @returns An SkImage wrapping the texture, or throws if the texture is invalid
89
96
  */
90
- MakeImageFromTexture(texture: GPUTexture): SkImage;
97
+ MakeImageFromNativeTexture(pointer: bigint): SkImage;
91
98
  /**
92
99
  * Creates a WebGPU texture from an SkImage.
93
- * This allows using Skia images in WebGPU rendering pipelines.
100
+ * This allows using Skia images in WebGPU rendering pipelines. The
101
+ * returned pointer carries one reference and must be adopted exactly once
102
+ * with react-native-webgpu's adoptTexture(), which owns it from then on.
94
103
  *
95
104
  * Note: This method is only available when the Graphite backend is enabled.
96
105
  *
97
106
  * @param image - An SkImage to convert to a texture
98
- * @returns A GPUTexture containing the image data, or throws if conversion fails
107
+ * @returns A WGPUTexture pointer for adoptTexture(), or throws on failure
99
108
  */
100
- MakeTextureFromImage(image: SkImage): GPUTexture;
109
+ MakeNativeTextureFromImage(image: SkImage): bigint;
101
110
  }
@@ -86,20 +86,10 @@ export interface Skia {
86
86
  NativeBuffer: NativeBufferFactory;
87
87
  Recorder(): JsiRecorder;
88
88
  /**
89
- * Returns whether the Graphite backend is enabled and WebGPU is available.
90
- *
91
- * @returns true if Graphite/WebGPU is available, false otherwise
89
+ * Raw WGPUDevice pointer of Skia's Graphite device, as a BigInt. Pass it to
90
+ * react-native-webgpu's importDevice() to get a GPUDevice sharing Skia's
91
+ * device (zero-copy interop). Only available on Graphite builds; throws
92
+ * otherwise.
92
93
  */
93
- hasDevice(): boolean;
94
- /**
95
- * Returns the shared WebGPU device used by Skia's Graphite backend.
96
- * This allows direct access to the GPU device for WebGPU operations.
97
- *
98
- * Note: This method is only available when the Graphite backend is enabled.
99
- * Use hasDevice() to check availability before calling this method.
100
- *
101
- * @returns The GPUDevice used by Skia
102
- * @throws Error if Graphite backend is not enabled
103
- */
104
- getDevice(): GPUDevice;
94
+ getNativeDevice(): bigint;
105
95
  }
@@ -30,7 +30,6 @@ export * from "./Size";
30
30
  export * from "./Paragraph";
31
31
  export * from "./Matrix4";
32
32
  export * from "./NativeBuffer";
33
- export * from "./WebGPU";
34
33
  export * from "./Recorder";
35
34
  export * from "./Video";
36
35
  export * from "./Skottie";
@@ -11,6 +11,6 @@ export declare class JsiSkImageFactory extends Host implements ImageFactory {
11
11
  MakeImageFromEncoded(encoded: SkData): JsiSkImage | null;
12
12
  MakeImageFromNativeTextureUnstable(): SkImage;
13
13
  MakeImage(info: ImageInfo, data: SkData, bytesPerRow: number): JsiSkImage | null;
14
- MakeImageFromTexture(_texture: GPUTexture): SkImage;
15
- MakeTextureFromImage(_image: SkImage): GPUTexture;
14
+ MakeImageFromNativeTexture(_pointer: bigint): SkImage;
15
+ MakeNativeTextureFromImage(_image: SkImage): bigint;
16
16
  }
@@ -1,4 +1,3 @@
1
1
  export * from "./SkiaPictureView";
2
2
  export * from "./types";
3
- export * from "./WebGPUCanvas";
4
3
  export * from "./formats";
package/package.json CHANGED
@@ -8,7 +8,7 @@
8
8
  "setup-skia-web": "scripts/setup-canvaskit.js"
9
9
  },
10
10
  "title": "React Native Skia",
11
- "version": "2.9.1",
11
+ "version": "2.10.1",
12
12
  "description": "High-performance React Native Graphics using Skia",
13
13
  "main": "lib/module/index.js",
14
14
  "react-native": "src/index.ts",
@@ -79,7 +79,8 @@
79
79
  "peerDependencies": {
80
80
  "react": ">=19.0",
81
81
  "react-native": ">=0.78",
82
- "react-native-reanimated": ">=3.19.1"
82
+ "react-native-reanimated": ">=4.0.0",
83
+ "react-native-worklets": ">=0.7.0"
83
84
  },
84
85
  "peerDependenciesMeta": {
85
86
  "react-native": {
@@ -87,6 +88,9 @@
87
88
  },
88
89
  "react-native-reanimated": {
89
90
  "optional": true
91
+ },
92
+ "react-native-worklets": {
93
+ "optional": true
90
94
  }
91
95
  },
92
96
  "devDependencies": {
@@ -127,7 +131,7 @@
127
131
  "rimraf": "3.0.2",
128
132
  "semantic-release": "^24.1.0",
129
133
  "semantic-release-yarn": "^3.0.2",
130
- "tar": "^7.5.19",
134
+ "tar": "^7.5.21",
131
135
  "ts-jest": "29.4.3",
132
136
  "tsx": "^4.21.0",
133
137
  "typescript": "^5.2.2",
@@ -159,8 +163,7 @@
159
163
  },
160
164
  "ios": {
161
165
  "componentProvider": {
162
- "SkiaPictureView": "SkiaPictureView",
163
- "SkiaWebGPUView": "SkiaWebGPUView"
166
+ "SkiaPictureView": "SkiaPictureView"
164
167
  }
165
168
  }
166
169
  },
@@ -75,8 +75,42 @@ framework_names = ['libskia', 'libsvg', 'libskshaper', 'libskparagraph',
75
75
  'libskunicode_core', 'libskunicode_libgrapheme',
76
76
  'libskottie', 'libsksg']
77
77
 
78
- # Add Dawn library for Graphite builds (contains dawn::native symbols)
79
- framework_names += ['libdawn_combined'] if use_graphite
78
+ # Add Dawn library for Graphite builds (contains dawn::native symbols).
79
+ # libwebgpu_dawn is the same artifact react-native-webgpu vendors. When
80
+ # react-native-webgpu is installed, it provides Dawn for the whole app and
81
+ # vendoring the framework here as well would fail CocoaPods'
82
+ # duplicate-framework-name check, so Skia only vendors it when alone. The
83
+ # skia pod's dawn::native references resolve from webgpu's copy at app link.
84
+ webgpu_pkg_dir = resolve_node_package.call('react-native-webgpu', __dir__)
85
+ has_webgpu_pkg = !webgpu_pkg_dir.nil?
86
+ if use_graphite && has_webgpu_pkg
87
+ Pod::UI.puts 'react-native-skia: react-native-webgpu detected, Dawn is provided by its libwebgpu_dawn'
88
+
89
+ # Both packages must link the exact same Dawn artifact. Compare the release
90
+ # tag this Graphite build was installed with (libs/.dawn-version) against
91
+ # the tag react-native-webgpu declares in its package.json `dawn` field.
92
+ dawn_marker = File.join(__dir__, 'libs', '.dawn-version')
93
+ if File.exist?(dawn_marker)
94
+ skia_dawn = File.read(dawn_marker).strip
95
+ webgpu_pkg = JSON.parse(File.read(File.join(webgpu_pkg_dir, 'package.json')))
96
+ webgpu_dawn_field = webgpu_pkg['dawn'].to_s
97
+ if webgpu_dawn_field.empty?
98
+ raise "react-native-skia: the installed react-native-webgpu " \
99
+ "(#{webgpu_pkg['version']}) does not declare a `dawn` field in its " \
100
+ "package.json, so it predates shared-Dawn support and cannot be " \
101
+ "paired with this Graphite build (which links #{skia_dawn}). " \
102
+ "Upgrade react-native-webgpu."
103
+ end
104
+ webgpu_dawn = "dawn-#{webgpu_dawn_field.tr('/', '-')}"
105
+ unless skia_dawn == webgpu_dawn
106
+ raise "react-native-skia: Dawn version mismatch. This Graphite build " \
107
+ "links #{skia_dawn} but react-native-webgpu links #{webgpu_dawn}. " \
108
+ "Align the two packages so the app contains exactly one Dawn."
109
+ end
110
+ Pod::UI.puts "react-native-skia: Dawn versions match (#{skia_dawn})"
111
+ end
112
+ end
113
+ framework_names += ['libwebgpu_dawn'] if use_graphite && !has_webgpu_pkg
80
114
 
81
115
  # Verify that the prebuilt binaries are available (copied in above from the npm
82
116
  # packages, or downloaded by install-skia-graphite for in-repo Graphite builds).
@@ -154,9 +188,8 @@ Pod::Spec.new do |s|
154
188
  'cpp/rnskia/RNMetalLayerColorSpace.h',
155
189
  'cpp/rnskia/RNDawnWindowContext.h',
156
190
  'cpp/rnskia/RNDawnWindowContext.cpp',
157
- 'cpp/rnskia/RNImageProvider.h',
158
- 'cpp/rnwgpu/**/*.{h,cpp}',
159
- 'cpp/jsi2/**/*.{h,cpp}'
191
+ 'cpp/rnskia/RNDawnInterop.cpp',
192
+ 'cpp/rnskia/RNImageProvider.h'
160
193
  ]
161
194
  s.exclude_files = graphite_exclusions unless use_graphite
162
195
 
@@ -1,5 +1,22 @@
1
1
  export let HAS_REANIMATED_3 = false;
2
2
 
3
+ /**
4
+ * True when the worklets-based Reanimated integration is available
5
+ * (Reanimated 4 with react-native-worklets providing
6
+ * registerCustomSerializable). Skia objects use the JSI NativeState pattern
7
+ * and can only be transferred to worklet runtimes through a custom
8
+ * serializer, so on native the Reanimated integration requires Reanimated 4 —
9
+ * Reanimated 3 is not supported.
10
+ */
11
+ export let HAS_REANIMATED_4 = false;
12
+
13
+ /**
14
+ * Major version of the installed react-native-reanimated package, or null if
15
+ * it is not installed. Used to give actionable diagnostics when the
16
+ * integration cannot be enabled.
17
+ */
18
+ export let REANIMATED_VERSION_MAJOR: number | null = null;
19
+
3
20
  try {
4
21
  // This logic is convoluted but necessary
5
22
  // In most systems, `require("react-native-reanimated")` throws an error, all is well.
@@ -14,6 +31,19 @@ try {
14
31
  ) {
15
32
  HAS_REANIMATED_3 = true;
16
33
  }
34
+ const majorVersion = parseInt(reanimatedVersion.split(".")[0], 10);
35
+ if (!isNaN(majorVersion)) {
36
+ REANIMATED_VERSION_MAJOR = majorVersion;
37
+ }
38
+ if (majorVersion >= 4) {
39
+ try {
40
+ const worklets = require("react-native-worklets");
41
+ HAS_REANIMATED_4 =
42
+ typeof worklets.registerCustomSerializable === "function";
43
+ } catch (e) {
44
+ // react-native-worklets not installed
45
+ }
46
+ }
17
47
  } catch (e) {
18
48
  // do nothing
19
49
  }
package/src/mock/index.ts CHANGED
@@ -23,7 +23,6 @@ export const Mock = (CanvasKit: CanvasKit) => {
23
23
  ...require("../dom/types"),
24
24
  ...require("../dom/nodes"),
25
25
  Canvas: require("react-native").View,
26
- WebGPUCanvas: require("react-native").View,
27
26
  getPreferredHighBitDepthCanvasFormat: () => "rgba16float",
28
27
  SkiaPictureView: require("react-native").View,
29
28
  JsiSkImage: JsiSkImage,
@@ -1,6 +1,8 @@
1
1
  import { Platform } from "../Platform";
2
2
  import NativeSkiaModule from "../specs/NativeSkiaModule";
3
3
 
4
+ import { registerSkiaWorkletSerialization } from "./SkiaWorkletSerialization";
5
+
4
6
  if (Platform.OS !== "web" && global.SkiaApi == null) {
5
7
  // Initialize RN Skia
6
8
  const SkiaModule = NativeSkiaModule;
@@ -16,4 +18,7 @@ if (Platform.OS !== "web" && global.SkiaApi == null) {
16
18
  `Native Skia Module failed to correctly install JSI Bindings! Result: ${result}`
17
19
  );
18
20
  }
21
+ // Skia objects use the JSI NativeState pattern and need a custom
22
+ // serializer to be transferable to worklet runtimes (Reanimated).
23
+ registerSkiaWorkletSerialization();
19
24
  }
@@ -0,0 +1,67 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+
3
+ /**
4
+ * Skia and WebGPU API objects are implemented with the JSI NativeState
5
+ * pattern: plain JS objects with a shared prototype and native state
6
+ * attached. Worklets cannot serialize such objects by default (the prototype
7
+ * would be lost when moving them to another runtime), so we register a
8
+ * Custom Serializable that:
9
+ *
10
+ * - determine: detects native objects via the `__box` method installed on
11
+ * every Skia and WebGPU prototype (plain objects never reach the
12
+ * custom-serializable path, so this cannot misfire on user data).
13
+ * - pack: boxes the object into a HostObject wrapper that carries the native
14
+ * state and the class brand. HostObjects are transferred by reference.
15
+ * - unpack: unboxes on the target runtime, re-installing the class prototype
16
+ * there and re-attaching the same native state.
17
+ *
18
+ * See cpp/jsi/BoxedNativeObject.h for the native side.
19
+ *
20
+ * `react-native-worklets` (Reanimated 4) is required for this to work —
21
+ * without it, Skia and WebGPU objects cannot be captured in worklets or
22
+ * stored in shared values.
23
+ */
24
+
25
+ interface BoxedNativeObject {
26
+ unbox: () => object;
27
+ __boxedNativeObject: true;
28
+ }
29
+
30
+ const determine = (value: object): value is object => {
31
+ "worklet";
32
+ return typeof (value as any).__box === "function";
33
+ };
34
+
35
+ const pack = (value: object): BoxedNativeObject => {
36
+ "worklet";
37
+ return (value as any).__box();
38
+ };
39
+
40
+ const unpack = (packed: BoxedNativeObject): object => {
41
+ "worklet";
42
+ return packed.unbox();
43
+ };
44
+
45
+ export const registerSkiaWorkletSerialization = () => {
46
+ try {
47
+ const worklets = require("react-native-worklets");
48
+ if (typeof worklets.registerCustomSerializable === "function") {
49
+ worklets.registerCustomSerializable({
50
+ name: "ReactNativeSkia",
51
+ determine,
52
+ pack,
53
+ unpack,
54
+ });
55
+ } else {
56
+ console.error(
57
+ "React Native Skia requires react-native-worklets >= 0.7.0 " +
58
+ "(registerCustomSerializable) to use Skia objects inside worklets. " +
59
+ "Please upgrade react-native-worklets and react-native-reanimated."
60
+ );
61
+ }
62
+ } catch (e) {
63
+ // react-native-worklets is not installed. This is fine for apps that do
64
+ // not use Reanimated: Skia objects simply cannot be used inside worklets
65
+ // or shared values in this configuration.
66
+ }
67
+ };
@@ -97,23 +97,32 @@ export interface ImageFactory {
97
97
 
98
98
  /**
99
99
  * Creates an SkImage from a WebGPU texture.
100
- * This allows using textures rendered by WebGPU in Skia drawings.
100
+ * This allows using textures rendered by WebGPU in Skia drawings. The
101
+ * texture crosses the package boundary as a raw pointer: pass
102
+ * `texture.nativePointer` from a react-native-webgpu GPUTexture created on
103
+ * the shared device (importDevice(Skia.getNativeDevice())). The native side
104
+ * takes its own reference, so the handle stays valid even if the JS
105
+ * GPUTexture is garbage collected — but do not call texture.destroy()
106
+ * while the image is in use: destroy() releases the underlying GPU
107
+ * resource regardless of reference counts.
101
108
  *
102
109
  * Note: This method is only available when the Graphite backend is enabled.
103
110
  *
104
- * @param texture - A GPUTexture object from the WebGPU API
111
+ * @param pointer - The WGPUTexture pointer (texture.nativePointer)
105
112
  * @returns An SkImage wrapping the texture, or throws if the texture is invalid
106
113
  */
107
- MakeImageFromTexture(texture: GPUTexture): SkImage;
114
+ MakeImageFromNativeTexture(pointer: bigint): SkImage;
108
115
 
109
116
  /**
110
117
  * Creates a WebGPU texture from an SkImage.
111
- * This allows using Skia images in WebGPU rendering pipelines.
118
+ * This allows using Skia images in WebGPU rendering pipelines. The
119
+ * returned pointer carries one reference and must be adopted exactly once
120
+ * with react-native-webgpu's adoptTexture(), which owns it from then on.
112
121
  *
113
122
  * Note: This method is only available when the Graphite backend is enabled.
114
123
  *
115
124
  * @param image - An SkImage to convert to a texture
116
- * @returns A GPUTexture containing the image data, or throws if conversion fails
125
+ * @returns A WGPUTexture pointer for adoptTexture(), or throws on failure
117
126
  */
118
- MakeTextureFromImage(image: SkImage): GPUTexture;
127
+ MakeNativeTextureFromImage(image: SkImage): bigint;
119
128
  }
@@ -110,20 +110,10 @@ export interface Skia {
110
110
  NativeBuffer: NativeBufferFactory;
111
111
  Recorder(): JsiRecorder;
112
112
  /**
113
- * Returns whether the Graphite backend is enabled and WebGPU is available.
114
- *
115
- * @returns true if Graphite/WebGPU is available, false otherwise
113
+ * Raw WGPUDevice pointer of Skia's Graphite device, as a BigInt. Pass it to
114
+ * react-native-webgpu's importDevice() to get a GPUDevice sharing Skia's
115
+ * device (zero-copy interop). Only available on Graphite builds; throws
116
+ * otherwise.
116
117
  */
117
- hasDevice(): boolean;
118
- /**
119
- * Returns the shared WebGPU device used by Skia's Graphite backend.
120
- * This allows direct access to the GPU device for WebGPU operations.
121
- *
122
- * Note: This method is only available when the Graphite backend is enabled.
123
- * Use hasDevice() to check availability before calling this method.
124
- *
125
- * @returns The GPUDevice used by Skia
126
- * @throws Error if Graphite backend is not enabled
127
- */
128
- getDevice(): GPUDevice;
118
+ getNativeDevice(): bigint;
129
119
  }
@@ -30,7 +30,6 @@ export * from "./Size";
30
30
  export * from "./Paragraph";
31
31
  export * from "./Matrix4";
32
32
  export * from "./NativeBuffer";
33
- export * from "./WebGPU";
34
33
  export * from "./Recorder";
35
34
  export * from "./Video";
36
35
  export * from "./Skottie";
@@ -102,11 +102,11 @@ export class JsiSkImageFactory extends Host implements ImageFactory {
102
102
  return new JsiSkImage(this.CanvasKit, image);
103
103
  }
104
104
 
105
- MakeImageFromTexture(_texture: GPUTexture): SkImage {
105
+ MakeImageFromNativeTexture(_pointer: bigint): SkImage {
106
106
  return throwNotImplementedOnRNWeb<SkImage>();
107
107
  }
108
108
 
109
- MakeTextureFromImage(_image: SkImage): GPUTexture {
110
- return throwNotImplementedOnRNWeb<GPUTexture>();
109
+ MakeNativeTextureFromImage(_image: SkImage): bigint {
110
+ return throwNotImplementedOnRNWeb<bigint>();
111
111
  }
112
112
  }
@@ -143,10 +143,7 @@ export const JsiSkApi = (CanvasKit: CanvasKit): Skia => ({
143
143
  Recorder: () => {
144
144
  return throwNotImplementedOnRNWeb<JsiRecorder>();
145
145
  },
146
- getDevice: () => {
147
- return throwNotImplementedOnRNWeb<GPUDevice>();
148
- },
149
- hasDevice: () => {
150
- return false;
146
+ getNativeDevice: () => {
147
+ return throwNotImplementedOnRNWeb<bigint>();
151
148
  },
152
149
  });
@@ -1,6 +1,10 @@
1
1
  import Rea from "../external/reanimated/ReanimatedProxy";
2
2
  import type { Skia, SkPicture } from "../skia/types";
3
- import { HAS_REANIMATED_3 } from "../external/reanimated/renderHelpers";
3
+ import {
4
+ HAS_REANIMATED_3,
5
+ HAS_REANIMATED_4,
6
+ REANIMATED_VERSION_MAJOR,
7
+ } from "../external/reanimated/renderHelpers";
4
8
  import type { JsiRecorder } from "../skia/types/Recorder";
5
9
 
6
10
  import { ReanimatedRecorder } from "./Recorder/ReanimatedRecorder";
@@ -79,10 +83,44 @@ class NativeReanimatedContainer extends Container {
79
83
  }
80
84
  }
81
85
 
86
+ let hasWarnedAboutReanimatedSupport = false;
87
+
88
+ const reanimatedSupportError = () => {
89
+ if (REANIMATED_VERSION_MAJOR !== null && REANIMATED_VERSION_MAJOR >= 4) {
90
+ return (
91
+ "React Native Skia requires react-native-worklets >= 0.7.0 for its " +
92
+ "Reanimated integration on native platforms. Reanimated 4 is " +
93
+ "installed, but react-native-worklets is missing or too old. " +
94
+ "Please install or upgrade react-native-worklets."
95
+ );
96
+ }
97
+ return (
98
+ "React Native Skia requires Reanimated 4 (react-native-worklets >= " +
99
+ "0.7.0) for its Reanimated integration on native platforms. " +
100
+ "Reanimated 3 is not supported anymore: Skia objects cannot be used " +
101
+ "inside worklets or shared values with it. " +
102
+ "Please upgrade to react-native-reanimated >= 4.0.0."
103
+ );
104
+ };
105
+
82
106
  export const createContainer = (Skia: Skia, nativeId: number) => {
83
- if (HAS_REANIMATED_3 && nativeId !== -1) {
107
+ if (HAS_REANIMATED_4 && nativeId !== -1) {
84
108
  return new NativeReanimatedContainer(Skia, nativeId);
85
109
  } else {
110
+ if (HAS_REANIMATED_3 && !HAS_REANIMATED_4) {
111
+ const message = reanimatedSupportError();
112
+ if (__DEV__) {
113
+ // Fail loudly in development — a silent fallback to static rendering
114
+ // would only be noticed as frozen animations.
115
+ throw new Error(message);
116
+ }
117
+ if (!hasWarnedAboutReanimatedSupport) {
118
+ hasWarnedAboutReanimatedSupport = true;
119
+ console.error(
120
+ `${message} Falling back to static rendering (animations will not run).`
121
+ );
122
+ }
123
+ }
86
124
  return new StaticContainer(Skia, nativeId);
87
125
  }
88
126
  };
@@ -1,4 +1,3 @@
1
1
  export * from "./SkiaPictureView";
2
2
  export * from "./types";
3
- export * from "./WebGPUCanvas";
4
3
  export * from "./formats";