@shopify/react-native-skia 2.12.0 → 2.13.0

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 (103) hide show
  1. package/LICENSE.md +2 -1
  2. package/Package.swift +4 -4
  3. package/android/CMakeLists.txt +22 -177
  4. package/android/build.gradle +40 -209
  5. package/android/cpp/jni/JniSkiaManager.cpp +3 -45
  6. package/android/cpp/jni/include/JniPlatformContext.h +1 -1
  7. package/android/cpp/jni/include/JniSkiaBaseView.h +18 -11
  8. package/android/cpp/jni/include/JniSkiaManager.h +3 -4
  9. package/android/cpp/jni/include/JniSkiaPictureView.h +5 -5
  10. package/android/cpp/rnskia-android/RNSkAndroidView.h +6 -6
  11. package/android/cpp/rnskia-android/RNSkOpenGLCanvasProvider.cpp +4 -4
  12. package/android/cpp/rnskia-android/RNSkOpenGLCanvasProvider.h +2 -2
  13. package/android/src/main/AndroidManifest.xml +1 -1
  14. package/android/src/main/java/com/{shopify/reactnative → reactnative}/skia/PlatformContext.java +1 -1
  15. package/android/src/main/java/com/{shopify/reactnative → reactnative}/skia/RNSkVideo.java +1 -1
  16. package/android/src/main/java/com/{shopify/reactnative → reactnative}/skia/RNSkiaModule.java +1 -8
  17. package/android/src/main/java/com/reactnative/skia/RNSkiaPackage.java +57 -0
  18. package/android/src/main/java/com/reactnative/skia/SkiaBaseView.java +185 -0
  19. package/android/src/main/java/com/{shopify/reactnative → reactnative}/skia/SkiaBaseViewManager.java +20 -1
  20. package/android/src/main/java/com/{shopify/reactnative → reactnative}/skia/SkiaManager.java +11 -6
  21. package/android/src/main/java/com/{shopify/reactnative → reactnative}/skia/SkiaPictureView.java +3 -3
  22. package/android/src/main/java/com/{shopify/reactnative → reactnative}/skia/SkiaPictureViewManager.java +1 -1
  23. package/android/src/main/java/com/{shopify/reactnative → reactnative}/skia/SkiaSurfaceView.java +13 -3
  24. package/android/src/main/java/com/{shopify/reactnative → reactnative}/skia/SkiaTextureView.java +5 -3
  25. package/android/src/main/java/com/{shopify/reactnative → reactnative}/skia/SkiaViewAPI.java +1 -1
  26. package/android/src/main/java/com/{shopify/reactnative → reactnative}/skia/ViewScreenshotService.java +1 -1
  27. package/apple/MetalContext.mm +1 -1
  28. package/apple/RNSkiaModule.h +1 -10
  29. package/apple/RNSkiaModule.mm +2 -10
  30. package/apple/SkiaManager.h +0 -2
  31. package/apple/SkiaManager.mm +4 -6
  32. package/apple/SkiaPictureView.h +2 -2
  33. package/apple/SkiaPictureView.mm +0 -4
  34. package/apple/SkiaUIView.h +3 -18
  35. package/apple/SkiaUIView.mm +0 -30
  36. package/cpp/api/CustomBlendModes.h +17 -0
  37. package/cpp/api/JsiSkCanvas.h +19 -10
  38. package/cpp/jsi/ViewProperty.h +0 -4
  39. package/lib/commonjs/mock/index.js +0 -1
  40. package/lib/commonjs/mock/index.js.map +1 -1
  41. package/lib/commonjs/renderer/Canvas.d.ts +11 -3
  42. package/lib/commonjs/renderer/Canvas.js +8 -6
  43. package/lib/commonjs/renderer/Canvas.js.map +1 -1
  44. package/lib/commonjs/skia/web/JsiSkCanvas.js +9 -4
  45. package/lib/commonjs/skia/web/JsiSkCanvas.js.map +1 -1
  46. package/lib/commonjs/specs/SkiaPictureViewNativeComponent.d.ts +2 -0
  47. package/lib/commonjs/specs/SkiaPictureViewNativeComponent.js.map +1 -1
  48. package/lib/commonjs/specs/SkiaPictureViewNativeComponent.web.d.ts +3 -1
  49. package/lib/commonjs/specs/SkiaPictureViewNativeComponent.web.js +3 -0
  50. package/lib/commonjs/specs/SkiaPictureViewNativeComponent.web.js.map +1 -1
  51. package/lib/commonjs/views/SkiaPictureView.js +2 -12
  52. package/lib/commonjs/views/SkiaPictureView.js.map +1 -1
  53. package/lib/commonjs/views/types.d.ts +19 -8
  54. package/lib/commonjs/views/types.js.map +1 -1
  55. package/lib/module/mock/index.js +0 -1
  56. package/lib/module/mock/index.js.map +1 -1
  57. package/lib/module/renderer/Canvas.d.ts +11 -3
  58. package/lib/module/renderer/Canvas.js +7 -5
  59. package/lib/module/renderer/Canvas.js.map +1 -1
  60. package/lib/module/skia/web/JsiSkCanvas.js +9 -4
  61. package/lib/module/skia/web/JsiSkCanvas.js.map +1 -1
  62. package/lib/module/specs/SkiaPictureViewNativeComponent.d.ts +2 -0
  63. package/lib/module/specs/SkiaPictureViewNativeComponent.js.map +1 -1
  64. package/lib/module/specs/SkiaPictureViewNativeComponent.web.d.ts +3 -1
  65. package/lib/module/specs/SkiaPictureViewNativeComponent.web.js +3 -0
  66. package/lib/module/specs/SkiaPictureViewNativeComponent.web.js.map +1 -1
  67. package/lib/module/views/SkiaPictureView.js +2 -12
  68. package/lib/module/views/SkiaPictureView.js.map +1 -1
  69. package/lib/module/views/types.d.ts +19 -8
  70. package/lib/module/views/types.js.map +1 -1
  71. package/lib/typescript/lib/commonjs/mock/index.d.ts +0 -1
  72. package/lib/typescript/lib/commonjs/renderer/Canvas.d.ts +2 -2
  73. package/lib/typescript/lib/commonjs/specs/SkiaPictureViewNativeComponent.web.d.ts +3 -1
  74. package/lib/typescript/lib/module/mock/index.d.ts +0 -1
  75. package/lib/typescript/lib/module/renderer/Canvas.d.ts +2 -2
  76. package/lib/typescript/lib/module/specs/SkiaPictureViewNativeComponent.web.d.ts +3 -1
  77. package/lib/typescript/src/renderer/Canvas.d.ts +11 -3
  78. package/lib/typescript/src/specs/SkiaPictureViewNativeComponent.d.ts +2 -0
  79. package/lib/typescript/src/specs/SkiaPictureViewNativeComponent.web.d.ts +3 -1
  80. package/lib/typescript/src/views/types.d.ts +19 -8
  81. package/package.json +3 -3
  82. package/react-native-skia.podspec +4 -10
  83. package/src/mock/index.ts +0 -1
  84. package/src/renderer/Canvas.tsx +23 -5
  85. package/src/skia/web/JsiSkCanvas.ts +14 -9
  86. package/src/specs/SkiaPictureViewNativeComponent.ts +5 -0
  87. package/src/specs/SkiaPictureViewNativeComponent.web.ts +5 -0
  88. package/src/views/SkiaPictureView.tsx +2 -10
  89. package/src/views/types.ts +23 -10
  90. package/android/src/latest/java/com/shopify/reactnative/skia/ReactNativeCompatible.java +0 -11
  91. package/android/src/main/java/com/shopify/reactnative/skia/RNSkiaPackage.java +0 -79
  92. package/android/src/main/java/com/shopify/reactnative/skia/SkiaAHBView.java +0 -113
  93. package/android/src/main/java/com/shopify/reactnative/skia/SkiaBaseView.java +0 -136
  94. package/android/src/paper/java/com/facebook/react/viewmanagers/SkiaPictureViewManagerDelegate.java +0 -41
  95. package/android/src/paper/java/com/facebook/react/viewmanagers/SkiaPictureViewManagerInterface.java +0 -20
  96. package/android/src/paper/java/com/facebook/react/viewmanagers/SkiaWebGPUViewManagerDelegate.java +0 -35
  97. package/android/src/paper/java/com/facebook/react/viewmanagers/SkiaWebGPUViewManagerInterface.java +0 -17
  98. package/android/src/paper/java/com/shopify/reactnative/skia/NativeSkiaModuleSpec.java +0 -38
  99. package/android/src/reactnative74/java/com/shopify/reactnative/skia/ReactNativeCompatible.java +0 -14
  100. package/apple/SkiaPictureViewManager.h +0 -8
  101. package/apple/SkiaPictureViewManager.mm +0 -60
  102. package/apple/SkiaWebGPUView.h +0 -20
  103. package/apple/WebGPUMetalView.h +0 -12
@@ -1,4 +1,4 @@
1
- package com.shopify.reactnative.skia;
1
+ package com.reactnative.skia;
2
2
 
3
3
  import android.annotation.SuppressLint;
4
4
  import android.content.Context;
@@ -16,11 +16,13 @@ public class SkiaTextureView extends TextureView implements TextureView.SurfaceT
16
16
  SkiaViewAPI mApi;
17
17
  boolean mDebug;
18
18
 
19
- public SkiaTextureView(Context context, SkiaViewAPI api, boolean debug) {
19
+ public SkiaTextureView(Context context, SkiaViewAPI api, boolean debug, boolean opaque) {
20
20
  super(context);
21
21
  mApi = api;
22
22
  mDebug = debug;
23
- setOpaque(false);
23
+ // An opaque TextureView lets the UI toolkit skip blending it; it can be
24
+ // toggled on a live view.
25
+ setOpaque(opaque);
24
26
  setSurfaceTextureListener(this);
25
27
  }
26
28
 
@@ -1,4 +1,4 @@
1
- package com.shopify.reactnative.skia;
1
+ package com.reactnative.skia;
2
2
 
3
3
  import android.graphics.SurfaceTexture;
4
4
  import android.view.Surface;
@@ -1,4 +1,4 @@
1
- package com.shopify.reactnative.skia;
1
+ package com.reactnative.skia;
2
2
 
3
3
  import android.graphics.Bitmap;
4
4
  import android.graphics.Canvas;
@@ -31,7 +31,7 @@ MetalContext::MetalContext() {
31
31
  GrContextOptions grContextOptions; // set different options here.
32
32
 
33
33
  // Create the Skia Direct Context
34
- _directContext = GrDirectContexts::MakeMetal(backendContext);
34
+ _directContext = GrDirectContexts::MakeMetal(backendContext, grContextOptions);
35
35
  if (_directContext == nullptr) {
36
36
  RNSkia::RNSkLogger::logToConsole("Couldn't create a Skia Metal Context");
37
37
  }
@@ -1,19 +1,10 @@
1
1
  #pragma once
2
2
 
3
- #ifdef RCT_NEW_ARCH_ENABLED
4
3
  #import <rnskia/rnskia.h>
5
- #else
6
- #import <React/RCTBridgeModule.h>
7
- #endif
8
4
 
9
5
  #include "SkiaManager.h"
10
6
 
11
- @interface RNSkiaModule : NSObject
12
- #ifdef RCT_NEW_ARCH_ENABLED
13
- <NativeSkiaModuleSpec>
14
- #else
15
- <RCTBridgeModule>
16
- #endif
7
+ @interface RNSkiaModule : NSObject <NativeSkiaModuleSpec>
17
8
 
18
9
  - (SkiaManager *)manager;
19
10
 
@@ -1,6 +1,5 @@
1
1
 
2
2
  #import "RNSkiaModule.h"
3
- #import <React/RCTBridge+Private.h>
4
3
  #import <ReactCommon/RCTTurboModule.h>
5
4
 
6
5
  @implementation RNSkiaModule {
@@ -35,14 +34,9 @@ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(install) {
35
34
  // Already initialized, ignore call.
36
35
  return @true;
37
36
  }
38
- #ifndef RCT_REMOVE_LEGACY_ARCH
39
37
  if (!jsInvoker) {
40
- RCTCxxBridge *cxxBridge = (RCTCxxBridge *)self.bridge;
41
- jsInvoker = cxxBridge.jsCallInvoker;
42
- }
43
- #endif
44
- if (!jsInvoker) {
45
- NSLog(@"[RNSkiaModule] Failed to install SkiaManager: jsInvoker is not initialized.");
38
+ NSLog(@"[RNSkiaModule] Failed to install SkiaManager: jsInvoker is not "
39
+ @"initialized.");
46
40
  return @false;
47
41
  }
48
42
  skiaManager = [[SkiaManager alloc] initWithBridge:self.bridge
@@ -50,12 +44,10 @@ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(install) {
50
44
  return @true;
51
45
  }
52
46
 
53
- #ifdef RCT_NEW_ARCH_ENABLED
54
47
  - (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:
55
48
  (const facebook::react::ObjCTurboModule::InitParams &)params {
56
49
  jsInvoker = params.jsInvoker;
57
50
  return std::make_shared<facebook::react::NativeSkiaModuleSpecJSI>(params);
58
51
  }
59
- #endif
60
52
 
61
53
  @end
@@ -16,10 +16,8 @@
16
16
  jsInvoker:(std::shared_ptr<facebook::react::CallInvoker>)
17
17
  jsInvoker;
18
18
 
19
- #ifdef RCT_NEW_ARCH_ENABLED
20
19
  // Fabric components do not have a better way to interact with TurboModules.
21
20
  // Workaround to get the SkManager instance from singleton.
22
21
  + (std::shared_ptr<RNSkia::RNSkManager>)latestActiveSkManager;
23
- #endif // RCT_NEW_ARCH_ENABLED
24
22
 
25
23
  @end
@@ -7,10 +7,9 @@
7
7
 
8
8
  #import "RNSkApplePlatformContext.h"
9
9
 
10
- // Forward-declared runtime accessor that is satisfied by RCTCxxBridge
11
- // (legacy/transitional) and RCTBridgeProxy (bridgeless). Avoids referencing
12
- // RCTCxxBridge directly, which is compiled out when RCT_REMOVE_LEGACY_ARCH
13
- // is set (React Native 0.82+).
10
+ // Forward-declared runtime accessor satisfied by RCTBridgeProxy (bridgeless).
11
+ // Avoids referencing RCTCxxBridge, which is compiled out when
12
+ // RCT_REMOVE_LEGACY_ARCH is set (React Native 0.82+).
14
13
  @interface RCTBridge (RNSkiaRuntime)
15
14
  - (void *)runtime;
16
15
  @end
@@ -54,12 +53,11 @@ static __weak SkiaManager *sharedInstance = nil;
54
53
  sharedInstance = nil;
55
54
  }
56
55
 
57
- #ifdef RCT_NEW_ARCH_ENABLED
58
56
  + (std::shared_ptr<RNSkia::RNSkManager>)latestActiveSkManager {
59
57
  if (sharedInstance != nil) {
60
58
  return [sharedInstance skManager];
61
59
  }
62
60
  return nullptr;
63
61
  }
64
- #endif // RCT_NEW_ARCH_ENABLED
62
+
65
63
  @end
@@ -1,7 +1,7 @@
1
- #ifdef RCT_NEW_ARCH_ENABLED
1
+ #pragma once
2
+
2
3
  #import "SkiaUIView.h"
3
4
 
4
5
  @interface SkiaPictureView : SkiaUIView
5
6
 
6
7
  @end
7
- #endif // RCT_NEW_ARCH_ENABLED
@@ -1,4 +1,3 @@
1
- #ifdef RCT_NEW_ARCH_ENABLED
2
1
  #import "SkiaPictureView.h"
3
2
 
4
3
  #import "RNSkAppleView.h"
@@ -9,7 +8,6 @@
9
8
  #import "SkiaManager.h"
10
9
  #import "SkiaUIView.h"
11
10
 
12
- #import <React/RCTBridge+Private.h>
13
11
  #import <React/RCTConversions.h>
14
12
  #import <React/RCTFabricComponentsPlugins.h>
15
13
 
@@ -70,5 +68,3 @@ using namespace facebook::react;
70
68
  Class<RCTComponentViewProtocol> SkiaPictureViewCls(void) {
71
69
  return SkiaPictureView.class;
72
70
  }
73
-
74
- #endif // RCT_NEW_ARCH_ENABLED
@@ -10,29 +10,14 @@
10
10
  #import <React/RCTUIKit.h>
11
11
  #endif // !TARGET_OS_OSX
12
12
 
13
+ #import <React/RCTViewComponentView.h>
14
+
13
15
  #import "RNSkAppleView.h"
14
16
  #import "RNSkManager.h"
15
17
  #import "SkiaManager.h"
16
18
 
17
- #if RCT_NEW_ARCH_ENABLED
18
- #import <React/RCTViewComponentView.h>
19
- #endif // RCT_NEW_ARCH_ENABLED
20
-
21
- @interface SkiaUIView :
22
- #if RCT_NEW_ARCH_ENABLED
23
- RCTViewComponentView
24
- #else
25
- #if !TARGET_OS_OSX
26
- UIView
27
- #else
28
- RCTUIView
29
- #endif // !TARGET_OS_OSX
30
- #endif // RCT_NEW_ARCH_ENABLED
19
+ @interface SkiaUIView : RCTViewComponentView
31
20
 
32
- - (instancetype)
33
- initWithManager:(RNSkia::RNSkManager *)manager
34
- factory:(std::function<std::shared_ptr<RNSkBaseAppleView>(
35
- std::shared_ptr<RNSkia::RNSkPlatformContext>)>)factory;
36
21
  - (void)initCommon:(RNSkia::RNSkManager *)manager
37
22
  factory:(std::function<std::shared_ptr<RNSkBaseAppleView>(
38
23
  std::shared_ptr<RNSkia::RNSkPlatformContext>)>)factory;
@@ -1,5 +1,4 @@
1
1
  #import <QuartzCore/CATransaction.h>
2
- #import <React/RCTBridge.h>
3
2
 
4
3
  #import "RNSkiaModule.h"
5
4
  #import "SkiaUIView.h"
@@ -24,24 +23,6 @@
24
23
 
25
24
  #pragma mark Initialization and destruction
26
25
 
27
- - (instancetype)initWithManager:(RNSkia::RNSkManager *)manager
28
- factory:
29
- (std::function<std::shared_ptr<RNSkBaseAppleView>(
30
- std::shared_ptr<RNSkia::RNSkPlatformContext>)>)
31
- factory {
32
- self = [super init];
33
- if (self) {
34
- [self initCommon:manager factory:factory];
35
- }
36
- // Listen to notifications about module invalidation
37
- [[NSNotificationCenter defaultCenter]
38
- addObserver:self
39
- selector:@selector(willInvalidateModules)
40
- name:RCTBridgeWillInvalidateModulesNotification
41
- object:nil];
42
- return self;
43
- }
44
-
45
26
  - (void)initCommon:(RNSkia::RNSkManager *)manager
46
27
  factory:(std::function<std::shared_ptr<RNSkBaseAppleView>(
47
28
  std::shared_ptr<RNSkia::RNSkPlatformContext>)>)factory {
@@ -51,11 +32,6 @@
51
32
  _factory = factory;
52
33
  }
53
34
 
54
- - (void)willInvalidateModules {
55
- _impl = nullptr;
56
- _manager = nullptr;
57
- }
58
-
59
35
  #pragma mark Lifecycle
60
36
 
61
37
  #if !TARGET_OS_OSX
@@ -99,13 +75,8 @@
99
75
 
100
76
  - (void)dealloc {
101
77
  [self unregisterView];
102
- [[NSNotificationCenter defaultCenter]
103
- removeObserver:self
104
- name:RCTBridgeWillInvalidateModulesNotification
105
- object:nil];
106
78
  }
107
79
 
108
- #ifdef RCT_NEW_ARCH_ENABLED
109
80
  - (void)prepareForRecycle {
110
81
  [super prepareForRecycle];
111
82
  [self unregisterView];
@@ -120,7 +91,6 @@
120
91
  _manager = [SkiaManager latestActiveSkManager].get();
121
92
  }
122
93
  }
123
- #endif // RCT_NEW_ARCH_ENABLED
124
94
 
125
95
  - (void)unregisterView {
126
96
  if (_manager != nullptr && _nativeId != 0) {
@@ -1,5 +1,8 @@
1
1
  #pragma once
2
2
 
3
+ #include <stdexcept>
4
+ #include <string>
5
+
3
6
  #include "include/core/SkBlender.h"
4
7
  #include "include/core/SkPaint.h"
5
8
  #include "include/core/SkString.h"
@@ -94,4 +97,18 @@ inline void applyBlendMode(SkPaint &paint, int blendModeValue) {
94
97
  }
95
98
  }
96
99
 
100
+ // Converts a JS blend mode value to an SkBlendMode for the Skia entry points
101
+ // that take a plain SkBlendMode rather than a paint (drawPatch, drawVertices,
102
+ // drawAtlas, drawColor). The custom blend modes above are implemented as
103
+ // blenders on an SkPaint and have no SkBlendMode equivalent, so they - and any
104
+ // other out of range value - are rejected instead of being cast blindly.
105
+ inline SkBlendMode toBlendMode(double blendModeValue) {
106
+ auto value = static_cast<int>(blendModeValue);
107
+ if (value < 0 || value > static_cast<int>(SkBlendMode::kLastMode)) {
108
+ throw std::invalid_argument("Unsupported blend mode: " +
109
+ std::to_string(value));
110
+ }
111
+ return static_cast<SkBlendMode>(value);
112
+ }
113
+
97
114
  } // namespace RNSkia
@@ -5,6 +5,7 @@
5
5
  #include <utility>
6
6
  #include <vector>
7
7
 
8
+ #include "CustomBlendModes.h"
8
9
  #include "JsiSkConverters.h"
9
10
  #include "JsiSkFont.h"
10
11
  #include "JsiSkImage.h"
@@ -226,8 +227,7 @@ public:
226
227
 
227
228
  void drawVertices(sk_sp<SkVertices> vertices, double blendMode,
228
229
  std::shared_ptr<SkPaint> paint) {
229
- _canvas->drawVertices(vertices, static_cast<SkBlendMode>(blendMode),
230
- *paint);
230
+ _canvas->drawVertices(vertices, toBlendMode(blendMode), *paint);
231
231
  }
232
232
 
233
233
  JSI_HOST_FUNCTION(drawPatch) {
@@ -287,11 +287,19 @@ public:
287
287
  }
288
288
  }
289
289
 
290
- auto paint =
291
- count >= 4 ? JsiSkPaint::fromValue(runtime, arguments[4]) : nullptr;
292
- auto blendMode = static_cast<SkBlendMode>(arguments[3].asNumber());
290
+ auto blendMode =
291
+ count >= 4 && !arguments[3].isNull() && !arguments[3].isUndefined()
292
+ ? toBlendMode(arguments[3].asNumber())
293
+ : SkBlendMode::kModulate;
294
+
295
+ std::shared_ptr<SkPaint> paint;
296
+ if (count >= 5 && !arguments[4].isNull() && !arguments[4].isUndefined()) {
297
+ paint = JsiSkPaint::fromValue(runtime, arguments[4]);
298
+ }
299
+ SkPaint defaultPaint;
293
300
  _canvas->drawPatch(cubics.data(), colors.empty() ? nullptr : colors.data(),
294
- texs.empty() ? nullptr : texs.data(), blendMode, *paint);
301
+ texs.empty() ? nullptr : texs.data(), blendMode,
302
+ paint ? *paint : defaultPaint);
295
303
  return jsi::Value::undefined();
296
304
  }
297
305
 
@@ -392,7 +400,7 @@ public:
392
400
 
393
401
  void drawColor(JsiColor cl, JsiOptional<double> mode) {
394
402
  if (mode.has_value()) {
395
- _canvas->drawColor(cl, static_cast<SkBlendMode>(*mode));
403
+ _canvas->drawColor(cl, toBlendMode(*mode));
396
404
  } else {
397
405
  _canvas->drawColor(cl);
398
406
  }
@@ -411,9 +419,10 @@ public:
411
419
  auto rects = arguments[1].asObject(runtime).asArray(runtime);
412
420
  auto transforms = arguments[2].asObject(runtime).asArray(runtime);
413
421
  auto paint = JsiSkPaint::fromValue(runtime, arguments[3]);
414
- auto blendMode = count > 5 && !arguments[4].isUndefined()
415
- ? static_cast<SkBlendMode>(arguments[4].asNumber())
416
- : SkBlendMode::kDstOver;
422
+ auto blendMode =
423
+ count > 4 && !arguments[4].isNull() && !arguments[4].isUndefined()
424
+ ? toBlendMode(arguments[4].asNumber())
425
+ : SkBlendMode::kDstOver;
417
426
 
418
427
  std::vector<SkRSXform> xforms;
419
428
  int xformsSize = static_cast<int>(transforms.size(runtime));
@@ -21,10 +21,6 @@ public:
21
21
  }
22
22
  }
23
23
 
24
- template <typename PlatformContext>
25
- ViewProperty(jsi::Runtime &runtime, const jsi::Value &value,
26
- PlatformContext platformContext, size_t nativeId) {}
27
-
28
24
  bool isNull() { return std::holds_alternative<std::nullptr_t>(_value); }
29
25
 
30
26
  sk_sp<SkPicture> getPicture() { return std::get<sk_sp<SkPicture>>(_value); }
@@ -55,7 +55,6 @@ const Mock = CanvasKit => {
55
55
  useValueEffect: Noop,
56
56
  // Reanimated hooks
57
57
  isOnMainThread: () => true,
58
- isFabric: true,
59
58
  useClock: NoopSharedValue,
60
59
  usePathInterpolation: NoopSharedValue,
61
60
  useImageAsTexture: NoopSharedValue,
@@ -1 +1 @@
1
- {"version":3,"names":["_web","require","_JsiSkImage","Noop","undefined","NoopValue","current","NoopSharedValue","value","Mock","CanvasKit","global","SkiaApi","JsiSkApi","Skia","Canvas","View","getPreferredHighBitDepthCanvasFormat","SkiaPictureView","JsiSkImage","drawAsPicture","drawAsImage","drawAsImageFromPicture","useCanvasRef","useCanvasSize","ref","size","width","height","useValue","useComputedValue","useTiming","useLoop","useSpring","useClockValue","useValueEffect","isOnMainThread","isFabric","useClock","usePathInterpolation","useImageAsTexture","useTextureValue","useTextureValueFromPicture","useRSXformBuffer","usePointBuffer","useColorBuffer","useRectBuffer","useBuffer","useRawData","useData","useFont","Font","useFonts","useTypeface","useImage","useSVG","useVideo","exports"],"sources":["index.ts"],"sourcesContent":["import type { CanvasKit } from \"canvaskit-wasm\";\n\nimport { JsiSkApi } from \"../skia/web\";\nimport { JsiSkImage } from \"../skia/web/JsiSkImage\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst Noop: () => any = () => undefined;\nconst NoopValue = () => ({ current: 0 });\nconst NoopSharedValue = () => ({ value: 0 });\n\nexport const Mock = (CanvasKit: CanvasKit) => {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n global.SkiaApi = JsiSkApi(CanvasKit);\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const Skia = global.SkiaApi;\n return {\n Skia,\n ...require(\"../renderer/components\"),\n ...require(\"../skia\"),\n ...require(\"../animation\"),\n ...require(\"../dom/types\"),\n ...require(\"../dom/nodes\"),\n Canvas: require(\"react-native\").View,\n getPreferredHighBitDepthCanvasFormat: () => \"rgba16float\",\n SkiaPictureView: require(\"react-native\").View,\n JsiSkImage: JsiSkImage,\n drawAsPicture: Noop,\n drawAsImage: Noop,\n drawAsImageFromPicture: Noop,\n useCanvasRef: NoopValue,\n useCanvasSize: () => ({\n ref: {\n current: 0,\n },\n size: {\n width: 0,\n height: 0,\n },\n }),\n // Skia Animations\n useValue: NoopValue,\n useComputedValue: NoopValue,\n useTiming: NoopValue,\n useLoop: NoopValue,\n useSpring: NoopValue,\n useClockValue: NoopValue,\n useValueEffect: Noop,\n // Reanimated hooks\n isOnMainThread: () => true,\n isFabric: true,\n useClock: NoopSharedValue,\n usePathInterpolation: NoopSharedValue,\n useImageAsTexture: NoopSharedValue,\n useTextureValue: NoopSharedValue,\n useTextureValueFromPicture: NoopSharedValue,\n useRSXformBuffer: NoopSharedValue,\n usePointBuffer: NoopSharedValue,\n useColorBuffer: NoopSharedValue,\n useRectBuffer: NoopSharedValue,\n useBuffer: NoopSharedValue,\n useRawData: Noop,\n useData: Noop,\n useFont: () => Skia.Font(undefined, 0),\n useFonts: Noop,\n useTypeface: () => null,\n useImage: () => null,\n useSVG: () => null,\n useVideo: () => null,\n };\n};\n"],"mappings":";;;;;;AAEA,IAAAA,IAAA,GAAAC,OAAA;AACA,IAAAC,WAAA,GAAAD,OAAA;AAEA;AACA,MAAME,IAAe,GAAGA,CAAA,KAAMC,SAAS;AACvC,MAAMC,SAAS,GAAGA,CAAA,MAAO;EAAEC,OAAO,EAAE;AAAE,CAAC,CAAC;AACxC,MAAMC,eAAe,GAAGA,CAAA,MAAO;EAAEC,KAAK,EAAE;AAAE,CAAC,CAAC;AAErC,MAAMC,IAAI,GAAIC,SAAoB,IAAK;EAC5C;EACA;EACAC,MAAM,CAACC,OAAO,GAAG,IAAAC,aAAQ,EAACH,SAAS,CAAC;EACpC;EACA;EACA,MAAMI,IAAI,GAAGH,MAAM,CAACC,OAAO;EAC3B,OAAO;IACLE,IAAI;IACJ,GAAGb,OAAO,CAAC,wBAAwB,CAAC;IACpC,GAAGA,OAAO,CAAC,SAAS,CAAC;IACrB,GAAGA,OAAO,CAAC,cAAc,CAAC;IAC1B,GAAGA,OAAO,CAAC,cAAc,CAAC;IAC1B,GAAGA,OAAO,CAAC,cAAc,CAAC;IAC1Bc,MAAM,EAAEd,OAAO,CAAC,cAAc,CAAC,CAACe,IAAI;IACpCC,oCAAoC,EAAEA,CAAA,KAAM,aAAa;IACzDC,eAAe,EAAEjB,OAAO,CAAC,cAAc,CAAC,CAACe,IAAI;IAC7CG,UAAU,EAAEA,sBAAU;IACtBC,aAAa,EAAEjB,IAAI;IACnBkB,WAAW,EAAElB,IAAI;IACjBmB,sBAAsB,EAAEnB,IAAI;IAC5BoB,YAAY,EAAElB,SAAS;IACvBmB,aAAa,EAAEA,CAAA,MAAO;MACpBC,GAAG,EAAE;QACHnB,OAAO,EAAE;MACX,CAAC;MACDoB,IAAI,EAAE;QACJC,KAAK,EAAE,CAAC;QACRC,MAAM,EAAE;MACV;IACF,CAAC,CAAC;IACF;IACAC,QAAQ,EAAExB,SAAS;IACnByB,gBAAgB,EAAEzB,SAAS;IAC3B0B,SAAS,EAAE1B,SAAS;IACpB2B,OAAO,EAAE3B,SAAS;IAClB4B,SAAS,EAAE5B,SAAS;IACpB6B,aAAa,EAAE7B,SAAS;IACxB8B,cAAc,EAAEhC,IAAI;IACpB;IACAiC,cAAc,EAAEA,CAAA,KAAM,IAAI;IAC1BC,QAAQ,EAAE,IAAI;IACdC,QAAQ,EAAE/B,eAAe;IACzBgC,oBAAoB,EAAEhC,eAAe;IACrCiC,iBAAiB,EAAEjC,eAAe;IAClCkC,eAAe,EAAElC,eAAe;IAChCmC,0BAA0B,EAAEnC,eAAe;IAC3CoC,gBAAgB,EAAEpC,eAAe;IACjCqC,cAAc,EAAErC,eAAe;IAC/BsC,cAAc,EAAEtC,eAAe;IAC/BuC,aAAa,EAAEvC,eAAe;IAC9BwC,SAAS,EAAExC,eAAe;IAC1ByC,UAAU,EAAE7C,IAAI;IAChB8C,OAAO,EAAE9C,IAAI;IACb+C,OAAO,EAAEA,CAAA,KAAMpC,IAAI,CAACqC,IAAI,CAAC/C,SAAS,EAAE,CAAC,CAAC;IACtCgD,QAAQ,EAAEjD,IAAI;IACdkD,WAAW,EAAEA,CAAA,KAAM,IAAI;IACvBC,QAAQ,EAAEA,CAAA,KAAM,IAAI;IACpBC,MAAM,EAAEA,CAAA,KAAM,IAAI;IAClBC,QAAQ,EAAEA,CAAA,KAAM;EAClB,CAAC;AACH,CAAC;AAACC,OAAA,CAAAhD,IAAA,GAAAA,IAAA","ignoreList":[]}
1
+ {"version":3,"names":["_web","require","_JsiSkImage","Noop","undefined","NoopValue","current","NoopSharedValue","value","Mock","CanvasKit","global","SkiaApi","JsiSkApi","Skia","Canvas","View","getPreferredHighBitDepthCanvasFormat","SkiaPictureView","JsiSkImage","drawAsPicture","drawAsImage","drawAsImageFromPicture","useCanvasRef","useCanvasSize","ref","size","width","height","useValue","useComputedValue","useTiming","useLoop","useSpring","useClockValue","useValueEffect","isOnMainThread","useClock","usePathInterpolation","useImageAsTexture","useTextureValue","useTextureValueFromPicture","useRSXformBuffer","usePointBuffer","useColorBuffer","useRectBuffer","useBuffer","useRawData","useData","useFont","Font","useFonts","useTypeface","useImage","useSVG","useVideo","exports"],"sources":["index.ts"],"sourcesContent":["import type { CanvasKit } from \"canvaskit-wasm\";\n\nimport { JsiSkApi } from \"../skia/web\";\nimport { JsiSkImage } from \"../skia/web/JsiSkImage\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst Noop: () => any = () => undefined;\nconst NoopValue = () => ({ current: 0 });\nconst NoopSharedValue = () => ({ value: 0 });\n\nexport const Mock = (CanvasKit: CanvasKit) => {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n global.SkiaApi = JsiSkApi(CanvasKit);\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const Skia = global.SkiaApi;\n return {\n Skia,\n ...require(\"../renderer/components\"),\n ...require(\"../skia\"),\n ...require(\"../animation\"),\n ...require(\"../dom/types\"),\n ...require(\"../dom/nodes\"),\n Canvas: require(\"react-native\").View,\n getPreferredHighBitDepthCanvasFormat: () => \"rgba16float\",\n SkiaPictureView: require(\"react-native\").View,\n JsiSkImage: JsiSkImage,\n drawAsPicture: Noop,\n drawAsImage: Noop,\n drawAsImageFromPicture: Noop,\n useCanvasRef: NoopValue,\n useCanvasSize: () => ({\n ref: {\n current: 0,\n },\n size: {\n width: 0,\n height: 0,\n },\n }),\n // Skia Animations\n useValue: NoopValue,\n useComputedValue: NoopValue,\n useTiming: NoopValue,\n useLoop: NoopValue,\n useSpring: NoopValue,\n useClockValue: NoopValue,\n useValueEffect: Noop,\n // Reanimated hooks\n isOnMainThread: () => true,\n useClock: NoopSharedValue,\n usePathInterpolation: NoopSharedValue,\n useImageAsTexture: NoopSharedValue,\n useTextureValue: NoopSharedValue,\n useTextureValueFromPicture: NoopSharedValue,\n useRSXformBuffer: NoopSharedValue,\n usePointBuffer: NoopSharedValue,\n useColorBuffer: NoopSharedValue,\n useRectBuffer: NoopSharedValue,\n useBuffer: NoopSharedValue,\n useRawData: Noop,\n useData: Noop,\n useFont: () => Skia.Font(undefined, 0),\n useFonts: Noop,\n useTypeface: () => null,\n useImage: () => null,\n useSVG: () => null,\n useVideo: () => null,\n };\n};\n"],"mappings":";;;;;;AAEA,IAAAA,IAAA,GAAAC,OAAA;AACA,IAAAC,WAAA,GAAAD,OAAA;AAEA;AACA,MAAME,IAAe,GAAGA,CAAA,KAAMC,SAAS;AACvC,MAAMC,SAAS,GAAGA,CAAA,MAAO;EAAEC,OAAO,EAAE;AAAE,CAAC,CAAC;AACxC,MAAMC,eAAe,GAAGA,CAAA,MAAO;EAAEC,KAAK,EAAE;AAAE,CAAC,CAAC;AAErC,MAAMC,IAAI,GAAIC,SAAoB,IAAK;EAC5C;EACA;EACAC,MAAM,CAACC,OAAO,GAAG,IAAAC,aAAQ,EAACH,SAAS,CAAC;EACpC;EACA;EACA,MAAMI,IAAI,GAAGH,MAAM,CAACC,OAAO;EAC3B,OAAO;IACLE,IAAI;IACJ,GAAGb,OAAO,CAAC,wBAAwB,CAAC;IACpC,GAAGA,OAAO,CAAC,SAAS,CAAC;IACrB,GAAGA,OAAO,CAAC,cAAc,CAAC;IAC1B,GAAGA,OAAO,CAAC,cAAc,CAAC;IAC1B,GAAGA,OAAO,CAAC,cAAc,CAAC;IAC1Bc,MAAM,EAAEd,OAAO,CAAC,cAAc,CAAC,CAACe,IAAI;IACpCC,oCAAoC,EAAEA,CAAA,KAAM,aAAa;IACzDC,eAAe,EAAEjB,OAAO,CAAC,cAAc,CAAC,CAACe,IAAI;IAC7CG,UAAU,EAAEA,sBAAU;IACtBC,aAAa,EAAEjB,IAAI;IACnBkB,WAAW,EAAElB,IAAI;IACjBmB,sBAAsB,EAAEnB,IAAI;IAC5BoB,YAAY,EAAElB,SAAS;IACvBmB,aAAa,EAAEA,CAAA,MAAO;MACpBC,GAAG,EAAE;QACHnB,OAAO,EAAE;MACX,CAAC;MACDoB,IAAI,EAAE;QACJC,KAAK,EAAE,CAAC;QACRC,MAAM,EAAE;MACV;IACF,CAAC,CAAC;IACF;IACAC,QAAQ,EAAExB,SAAS;IACnByB,gBAAgB,EAAEzB,SAAS;IAC3B0B,SAAS,EAAE1B,SAAS;IACpB2B,OAAO,EAAE3B,SAAS;IAClB4B,SAAS,EAAE5B,SAAS;IACpB6B,aAAa,EAAE7B,SAAS;IACxB8B,cAAc,EAAEhC,IAAI;IACpB;IACAiC,cAAc,EAAEA,CAAA,KAAM,IAAI;IAC1BC,QAAQ,EAAE9B,eAAe;IACzB+B,oBAAoB,EAAE/B,eAAe;IACrCgC,iBAAiB,EAAEhC,eAAe;IAClCiC,eAAe,EAAEjC,eAAe;IAChCkC,0BAA0B,EAAElC,eAAe;IAC3CmC,gBAAgB,EAAEnC,eAAe;IACjCoC,cAAc,EAAEpC,eAAe;IAC/BqC,cAAc,EAAErC,eAAe;IAC/BsC,aAAa,EAAEtC,eAAe;IAC9BuC,SAAS,EAAEvC,eAAe;IAC1BwC,UAAU,EAAE5C,IAAI;IAChB6C,OAAO,EAAE7C,IAAI;IACb8C,OAAO,EAAEA,CAAA,KAAMnC,IAAI,CAACoC,IAAI,CAAC9C,SAAS,EAAE,CAAC,CAAC;IACtC+C,QAAQ,EAAEhD,IAAI;IACdiD,WAAW,EAAEA,CAAA,KAAM,IAAI;IACvBC,QAAQ,EAAEA,CAAA,KAAM,IAAI;IACpBC,MAAM,EAAEA,CAAA,KAAM,IAAI;IAClBC,QAAQ,EAAEA,CAAA,KAAM;EAClB,CAAC;AACH,CAAC;AAACC,OAAA,CAAA/C,IAAA,GAAAA,IAAA","ignoreList":[]}
@@ -2,6 +2,7 @@ import type { FC, RefObject } from "react";
2
2
  import React from "react";
3
3
  import type { MeasureInWindowOnSuccessCallback, MeasureOnSuccessCallback, ViewProps } from "react-native";
4
4
  import type { SharedValue } from "react-native-reanimated";
5
+ import type { AndroidCanvasProps } from "../views/types";
5
6
  import type { SkImage, SkRect, SkSize } from "../skia/types";
6
7
  export interface CanvasRef extends FC<CanvasProps> {
7
8
  makeImageSnapshot(rect?: SkRect): SkImage;
@@ -16,11 +17,16 @@ export declare const useCanvasSize: (userRef?: RefObject<CanvasRef | null>) => {
16
17
  ref: RefObject<CanvasRef | null>;
17
18
  size: SkSize;
18
19
  };
19
- export declare const isFabric: boolean;
20
20
  export interface CanvasProps extends Omit<ViewProps, "onLayout"> {
21
21
  debug?: boolean;
22
- /** @deprecated Not supported on Fabric. Use `onSize` or `useCanvasSize()` instead. */
22
+ /** @deprecated Not supported on native. Use `onSize` or `useCanvasSize()` instead. */
23
23
  onLayout?: ViewProps["onLayout"];
24
+ /**
25
+ * Declares that the canvas covers every pixel of its bounds, so nothing
26
+ * behind it needs to show through. On Android an opaque canvas is backed by
27
+ * a `SurfaceView` by default, the cheapest path (see `android.surfaceType`).
28
+ * Defaults to false.
29
+ */
24
30
  opaque?: boolean;
25
31
  onSize?: SharedValue<SkSize>;
26
32
  colorSpace?: "p3" | "srgb";
@@ -33,8 +39,10 @@ export interface CanvasProps extends Omit<ViewProps, "onLayout"> {
33
39
  * before the canvas is mounted.
34
40
  */
35
41
  highBitDepth?: boolean;
42
+ /** Android-only rendering options. Ignored on iOS and web. */
43
+ android?: AndroidCanvasProps;
36
44
  ref?: React.Ref<CanvasRef>;
37
45
  androidWarmup?: boolean;
38
46
  __destroyWebGLContextAfterRender?: boolean;
39
47
  }
40
- export declare const Canvas: ({ debug, opaque, children, onSize, colorSpace, highBitDepth, androidWarmup, ref, onLayout, ...viewProps }: CanvasProps) => React.JSX.Element;
48
+ export declare const Canvas: ({ debug, opaque, children, onSize, colorSpace, highBitDepth, androidWarmup, android, ref, onLayout, ...viewProps }: CanvasProps) => React.JSX.Element;
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.useCanvasSize = exports.useCanvasRef = exports.isFabric = exports.Canvas = void 0;
6
+ exports.useCanvasSize = exports.useCanvasRef = exports.Canvas = void 0;
7
7
  var _react = _interopRequireWildcard(require("react"));
8
8
  var _ReanimatedProxy = _interopRequireDefault(require("../external/reanimated/ReanimatedProxy"));
9
9
  var _SkiaViewNativeId = require("../views/SkiaViewNativeId");
@@ -12,7 +12,6 @@ var _Reconciler = require("../sksg/Reconciler");
12
12
  var _skia = require("../skia");
13
13
  var _Platform = require("../Platform");
14
14
  var _external = require("../external");
15
- var _global;
16
15
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
17
16
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
18
17
  function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
@@ -44,10 +43,10 @@ const useCanvasSize = userRef => {
44
43
  size
45
44
  };
46
45
  };
47
-
48
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
49
46
  exports.useCanvasSize = useCanvasSize;
50
- const isFabric = exports.isFabric = Boolean((_global = global) === null || _global === void 0 ? void 0 : _global.nativeFabricUIManager);
47
+ // Anything else reaching the native component would hit the generated
48
+ // string-enum parser, which aborts on unknown values.
49
+ const resolveSurfaceType = surfaceType => surfaceType === "SurfaceView" || surfaceType === "TextureView" ? surfaceType : "auto";
51
50
  const Canvas = ({
52
51
  debug,
53
52
  opaque,
@@ -56,11 +55,12 @@ const Canvas = ({
56
55
  colorSpace = "p3",
57
56
  highBitDepth = false,
58
57
  androidWarmup = false,
58
+ android,
59
59
  ref,
60
60
  onLayout,
61
61
  ...viewProps
62
62
  }) => {
63
- if (onLayout && isFabric) {
63
+ if (onLayout && _Platform.Platform.OS !== "web") {
64
64
  console.error("<Canvas onLayout={onLayout} /> is not supported on the new architecture, to fix the issue, see: https://shopify.github.io/react-native-skia/docs/canvas/overview/#getting-the-canvas-size");
65
65
  }
66
66
  const viewRef = useCanvasRefPriv(null);
@@ -162,6 +162,8 @@ const Canvas = ({
162
162
  colorSpace: colorSpace,
163
163
  highBitDepth: highBitDepth,
164
164
  androidWarmup: androidWarmup,
165
+ androidSurfaceType: resolveSurfaceType(android === null || android === void 0 ? void 0 : android.surfaceType),
166
+ androidZOrderOnTop: !!(android !== null && android !== void 0 && android.zOrderOnTop),
165
167
  onLayout: _Platform.Platform.OS === "web" && (onSize || onLayout) ? onLayoutWeb : onLayout
166
168
  }, viewProps));
167
169
  };
@@ -1 +1 @@
1
- {"version":3,"names":["_react","_interopRequireWildcard","require","_ReanimatedProxy","_interopRequireDefault","_SkiaViewNativeId","_SkiaPictureViewNativeComponent","_Reconciler","_skia","_Platform","_external","_global","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","_extends","assign","bind","arguments","length","apply","useCanvasRef","useRef","exports","useReanimatedFrame","HAS_REANIMATED_3","Rea","useFrameCallback","measure","useCanvasRefPriv","useAnimatedRef","useCanvasSize","userRef","ourRef","ref","size","setSize","useState","width","height","useLayoutEffect","current","_x","_y","isFabric","Boolean","global","nativeFabricUIManager","Canvas","debug","opaque","children","onSize","colorSpace","highBitDepth","androidWarmup","onLayout","viewProps","console","error","viewRef","nativeId","useMemo","SkiaViewNativeId","root","SkiaSGRoot","Skia","_viewRef$current","result","Platform","OS","canvasRef","value","render","useEffect","unmount","useImperativeHandle","makeImageSnapshot","rect","SkiaViewApi","makeImageSnapshotAsync","redraw","requestRedraw","getNativeId","callback","_viewRef$current2","measureInWindow","_viewRef$current3","onLayoutWeb","useCallback","nativeEvent","layout","createElement","collapsable","nativeID"],"sources":["Canvas.tsx"],"sourcesContent":["import type { FC, RefObject } from \"react\";\nimport React, {\n useCallback,\n useEffect,\n useImperativeHandle,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type {\n LayoutChangeEvent,\n MeasureInWindowOnSuccessCallback,\n MeasureOnSuccessCallback,\n View,\n ViewProps,\n} from \"react-native\";\nimport type { SharedValue } from \"react-native-reanimated\";\n\nimport Rea from \"../external/reanimated/ReanimatedProxy\";\nimport { SkiaViewNativeId } from \"../views/SkiaViewNativeId\";\nimport SkiaPictureViewNativeComponent from \"../specs/SkiaPictureViewNativeComponent\";\nimport type { SkImage, SkRect, SkSize } from \"../skia/types\";\nimport { SkiaSGRoot } from \"../sksg/Reconciler\";\nimport { Skia } from \"../skia\";\nimport { Platform } from \"../Platform\";\nimport { HAS_REANIMATED_3 } from \"../external\";\n\nexport interface CanvasRef extends FC<CanvasProps> {\n makeImageSnapshot(rect?: SkRect): SkImage;\n makeImageSnapshotAsync(rect?: SkRect): Promise<SkImage>;\n redraw(): void;\n getNativeId(): number;\n measure(callback: MeasureOnSuccessCallback): void;\n measureInWindow(callback: MeasureInWindowOnSuccessCallback): void;\n}\n\nexport const useCanvasRef = () => useRef<CanvasRef>(null);\n\nconst useReanimatedFrame = !HAS_REANIMATED_3 ? () => {} : Rea.useFrameCallback;\nconst measure = !HAS_REANIMATED_3 ? null : Rea.measure;\n\nconst useCanvasRefPriv: typeof useRef<View> = !HAS_REANIMATED_3\n ? useRef\n : Rea.useAnimatedRef;\n\nexport const useCanvasSize = (userRef?: RefObject<CanvasRef | null>) => {\n const ourRef = useCanvasRef();\n const ref = userRef ?? ourRef;\n const [size, setSize] = useState<SkSize>({ width: 0, height: 0 });\n useLayoutEffect(() => {\n if (ref.current) {\n ref.current.measure((_x, _y, width, height) => {\n setSize({ width, height });\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n return { ref, size };\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const isFabric = Boolean((global as any)?.nativeFabricUIManager);\n\nexport interface CanvasProps extends Omit<ViewProps, \"onLayout\"> {\n debug?: boolean;\n /** @deprecated Not supported on Fabric. Use `onSize` or `useCanvasSize()` instead. */\n onLayout?: ViewProps[\"onLayout\"];\n opaque?: boolean;\n onSize?: SharedValue<SkSize>;\n colorSpace?: \"p3\" | \"srgb\";\n /**\n * Renders into a surface with more than 8 bits per channel (16-bit float on\n * iOS, 10-bit on Android) to avoid banding in subtle gradients. Colors are\n * identical to the default 8-bit surface, only with more precision (this is\n * about bit depth, not HDR). On Android the extra precision survives\n * composition only when combined with `opaque`, and the prop must be set\n * before the canvas is mounted.\n */\n highBitDepth?: boolean;\n ref?: React.Ref<CanvasRef>;\n androidWarmup?: boolean;\n __destroyWebGLContextAfterRender?: boolean;\n}\n\nexport const Canvas = ({\n debug,\n opaque,\n children,\n onSize,\n colorSpace = \"p3\",\n highBitDepth = false,\n androidWarmup = false,\n ref,\n onLayout,\n ...viewProps\n}: CanvasProps) => {\n if (onLayout && isFabric) {\n console.error(\n \"<Canvas onLayout={onLayout} /> is not supported on the new architecture, to fix the issue, see: https://shopify.github.io/react-native-skia/docs/canvas/overview/#getting-the-canvas-size\"\n );\n }\n const viewRef = useCanvasRefPriv(null);\n // Native ID\n const nativeId = useMemo(() => {\n return SkiaViewNativeId.current++;\n }, []);\n\n // Root\n const root = useMemo(() => new SkiaSGRoot(Skia, nativeId), [nativeId]);\n\n useReanimatedFrame(() => {\n \"worklet\";\n if (onSize && measure) {\n const result =\n // eslint-disable-next-line no-nested-ternary\n Platform.OS === \"web\"\n ? // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n viewRef.current?.canvasRef\n ? // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n measure(viewRef.current.canvasRef)\n : { width: 0, height: 0 }\n : // eslint-disable-next-line @typescript-eslint/no-explicit-any\n measure(viewRef as any);\n if (result) {\n const { width, height } = result;\n if (onSize.value.width !== width || onSize.value.height !== height) {\n onSize.value = { width, height };\n }\n }\n }\n }, !!onSize);\n\n // Render effects\n useLayoutEffect(() => {\n root.render(children);\n }, [children, root, nativeId]);\n\n useEffect(() => {\n return () => {\n root.unmount();\n };\n }, [root]);\n\n // Component methods\n useImperativeHandle(\n ref,\n () =>\n ({\n makeImageSnapshot: (rect?: SkRect) => {\n return SkiaViewApi.makeImageSnapshot(nativeId, rect);\n },\n makeImageSnapshotAsync: (rect?: SkRect) => {\n return SkiaViewApi.makeImageSnapshotAsync(nativeId, rect);\n },\n redraw: () => {\n SkiaViewApi.requestRedraw(nativeId);\n },\n getNativeId: () => {\n return nativeId;\n },\n measure: (callback) => {\n viewRef.current?.measure(callback);\n },\n measureInWindow: (callback) => {\n viewRef.current?.measureInWindow(callback);\n },\n }) as CanvasRef\n );\n\n const onLayoutWeb = useCallback(\n (e: LayoutChangeEvent) => {\n if (onLayout) {\n onLayout(e);\n }\n if (Platform.OS === \"web\" && onSize) {\n const { width, height } = e.nativeEvent.layout;\n onSize.value = { width, height };\n }\n },\n [onLayout, onSize]\n );\n return (\n <SkiaPictureViewNativeComponent\n ref={viewRef}\n collapsable={false}\n nativeID={`${nativeId}`}\n debug={debug}\n opaque={opaque}\n colorSpace={colorSpace}\n highBitDepth={highBitDepth}\n androidWarmup={androidWarmup}\n onLayout={\n Platform.OS === \"web\" && (onSize || onLayout) ? onLayoutWeb : onLayout\n }\n {...viewProps}\n />\n );\n};\n"],"mappings":";;;;;;AACA,IAAAA,MAAA,GAAAC,uBAAA,CAAAC,OAAA;AAkBA,IAAAC,gBAAA,GAAAC,sBAAA,CAAAF,OAAA;AACA,IAAAG,iBAAA,GAAAH,OAAA;AACA,IAAAI,+BAAA,GAAAF,sBAAA,CAAAF,OAAA;AAEA,IAAAK,WAAA,GAAAL,OAAA;AACA,IAAAM,KAAA,GAAAN,OAAA;AACA,IAAAO,SAAA,GAAAP,OAAA;AACA,IAAAQ,SAAA,GAAAR,OAAA;AAA+C,IAAAS,OAAA;AAAA,SAAAP,uBAAAQ,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAAA,SAAAX,wBAAAW,CAAA,EAAAG,CAAA,6BAAAC,OAAA,MAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAf,uBAAA,YAAAA,CAAAW,CAAA,EAAAG,CAAA,SAAAA,CAAA,IAAAH,CAAA,IAAAA,CAAA,CAAAC,UAAA,SAAAD,CAAA,MAAAO,CAAA,EAAAC,CAAA,EAAAC,CAAA,KAAAC,SAAA,QAAAR,OAAA,EAAAF,CAAA,iBAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,SAAAS,CAAA,MAAAF,CAAA,GAAAJ,CAAA,GAAAG,CAAA,GAAAD,CAAA,QAAAE,CAAA,CAAAI,GAAA,CAAAX,CAAA,UAAAO,CAAA,CAAAK,GAAA,CAAAZ,CAAA,GAAAO,CAAA,CAAAM,GAAA,CAAAb,CAAA,EAAAS,CAAA,gBAAAN,CAAA,IAAAH,CAAA,gBAAAG,CAAA,OAAAW,cAAA,CAAAC,IAAA,CAAAf,CAAA,EAAAG,CAAA,OAAAK,CAAA,IAAAD,CAAA,GAAAS,MAAA,CAAAC,cAAA,KAAAD,MAAA,CAAAE,wBAAA,CAAAlB,CAAA,EAAAG,CAAA,OAAAK,CAAA,CAAAI,GAAA,IAAAJ,CAAA,CAAAK,GAAA,IAAAN,CAAA,CAAAE,CAAA,EAAAN,CAAA,EAAAK,CAAA,IAAAC,CAAA,CAAAN,CAAA,IAAAH,CAAA,CAAAG,CAAA,WAAAM,CAAA,KAAAT,CAAA,EAAAG,CAAA;AAAA,SAAAgB,SAAA,WAAAA,QAAA,GAAAH,MAAA,CAAAI,MAAA,GAAAJ,MAAA,CAAAI,MAAA,CAAAC,IAAA,eAAAf,CAAA,aAAAN,CAAA,MAAAA,CAAA,GAAAsB,SAAA,CAAAC,MAAA,EAAAvB,CAAA,UAAAG,CAAA,GAAAmB,SAAA,CAAAtB,CAAA,YAAAK,CAAA,IAAAF,CAAA,OAAAW,cAAA,CAAAC,IAAA,CAAAZ,CAAA,EAAAE,CAAA,MAAAC,CAAA,CAAAD,CAAA,IAAAF,CAAA,CAAAE,CAAA,aAAAC,CAAA,KAAAa,QAAA,CAAAK,KAAA,OAAAF,SAAA;AAWxC,MAAMG,YAAY,GAAGA,CAAA,KAAM,IAAAC,aAAM,EAAY,IAAI,CAAC;AAACC,OAAA,CAAAF,YAAA,GAAAA,YAAA;AAE1D,MAAMG,kBAAkB,GAAG,CAACC,0BAAgB,GAAG,MAAM,CAAC,CAAC,GAAGC,wBAAG,CAACC,gBAAgB;AAC9E,MAAMC,OAAO,GAAG,CAACH,0BAAgB,GAAG,IAAI,GAAGC,wBAAG,CAACE,OAAO;AAEtD,MAAMC,gBAAqC,GAAG,CAACJ,0BAAgB,GAC3DH,aAAM,GACNI,wBAAG,CAACI,cAAc;AAEf,MAAMC,aAAa,GAAIC,OAAqC,IAAK;EACtE,MAAMC,MAAM,GAAGZ,YAAY,CAAC,CAAC;EAC7B,MAAMa,GAAG,GAAGF,OAAO,aAAPA,OAAO,cAAPA,OAAO,GAAIC,MAAM;EAC7B,MAAM,CAACE,IAAI,EAAEC,OAAO,CAAC,GAAG,IAAAC,eAAQ,EAAS;IAAEC,KAAK,EAAE,CAAC;IAAEC,MAAM,EAAE;EAAE,CAAC,CAAC;EACjE,IAAAC,sBAAe,EAAC,MAAM;IACpB,IAAIN,GAAG,CAACO,OAAO,EAAE;MACfP,GAAG,CAACO,OAAO,CAACb,OAAO,CAAC,CAACc,EAAE,EAAEC,EAAE,EAAEL,KAAK,EAAEC,MAAM,KAAK;QAC7CH,OAAO,CAAC;UAAEE,KAAK;UAAEC;QAAO,CAAC,CAAC;MAC5B,CAAC,CAAC;IACJ;IACA;EACF,CAAC,EAAE,EAAE,CAAC;EACN,OAAO;IAAEL,GAAG;IAAEC;EAAK,CAAC;AACtB,CAAC;;AAED;AAAAZ,OAAA,CAAAQ,aAAA,GAAAA,aAAA;AACO,MAAMa,QAAQ,GAAArB,OAAA,CAAAqB,QAAA,GAAGC,OAAO,EAAAlD,OAAA,GAAEmD,MAAM,cAAAnD,OAAA,uBAAPA,OAAA,CAAiBoD,qBAAqB,CAAC;AAuBhE,MAAMC,MAAM,GAAGA,CAAC;EACrBC,KAAK;EACLC,MAAM;EACNC,QAAQ;EACRC,MAAM;EACNC,UAAU,GAAG,IAAI;EACjBC,YAAY,GAAG,KAAK;EACpBC,aAAa,GAAG,KAAK;EACrBrB,GAAG;EACHsB,QAAQ;EACR,GAAGC;AACQ,CAAC,KAAK;EACjB,IAAID,QAAQ,IAAIZ,QAAQ,EAAE;IACxBc,OAAO,CAACC,KAAK,CACX,2LACF,CAAC;EACH;EACA,MAAMC,OAAO,GAAG/B,gBAAgB,CAAC,IAAI,CAAC;EACtC;EACA,MAAMgC,QAAQ,GAAG,IAAAC,cAAO,EAAC,MAAM;IAC7B,OAAOC,kCAAgB,CAACtB,OAAO,EAAE;EACnC,CAAC,EAAE,EAAE,CAAC;;EAEN;EACA,MAAMuB,IAAI,GAAG,IAAAF,cAAO,EAAC,MAAM,IAAIG,sBAAU,CAACC,UAAI,EAAEL,QAAQ,CAAC,EAAE,CAACA,QAAQ,CAAC,CAAC;EAEtErC,kBAAkB,CAAC,MAAM;IACvB,SAAS;;IACT,IAAI4B,MAAM,IAAIxB,OAAO,EAAE;MAAA,IAAAuC,gBAAA;MACrB,MAAMC,MAAM;MACV;MACAC,kBAAQ,CAACC,EAAE,KAAK,KAAK;MACjB;MACA;MACA,CAAAH,gBAAA,GAAAP,OAAO,CAACnB,OAAO,cAAA0B,gBAAA,eAAfA,gBAAA,CAAiBI,SAAS;MACxB;MACA;MACA3C,OAAO,CAACgC,OAAO,CAACnB,OAAO,CAAC8B,SAAS,CAAC,GAClC;QAAEjC,KAAK,EAAE,CAAC;QAAEC,MAAM,EAAE;MAAE,CAAC;MACzB;MACAX,OAAO,CAACgC,OAAc,CAAC;MAC7B,IAAIQ,MAAM,EAAE;QACV,MAAM;UAAE9B,KAAK;UAAEC;QAAO,CAAC,GAAG6B,MAAM;QAChC,IAAIhB,MAAM,CAACoB,KAAK,CAAClC,KAAK,KAAKA,KAAK,IAAIc,MAAM,CAACoB,KAAK,CAACjC,MAAM,KAAKA,MAAM,EAAE;UAClEa,MAAM,CAACoB,KAAK,GAAG;YAAElC,KAAK;YAAEC;UAAO,CAAC;QAClC;MACF;IACF;EACF,CAAC,EAAE,CAAC,CAACa,MAAM,CAAC;;EAEZ;EACA,IAAAZ,sBAAe,EAAC,MAAM;IACpBwB,IAAI,CAACS,MAAM,CAACtB,QAAQ,CAAC;EACvB,CAAC,EAAE,CAACA,QAAQ,EAAEa,IAAI,EAAEH,QAAQ,CAAC,CAAC;EAE9B,IAAAa,gBAAS,EAAC,MAAM;IACd,OAAO,MAAM;MACXV,IAAI,CAACW,OAAO,CAAC,CAAC;IAChB,CAAC;EACH,CAAC,EAAE,CAACX,IAAI,CAAC,CAAC;;EAEV;EACA,IAAAY,0BAAmB,EACjB1C,GAAG,EACH,OACG;IACC2C,iBAAiB,EAAGC,IAAa,IAAK;MACpC,OAAOC,WAAW,CAACF,iBAAiB,CAAChB,QAAQ,EAAEiB,IAAI,CAAC;IACtD,CAAC;IACDE,sBAAsB,EAAGF,IAAa,IAAK;MACzC,OAAOC,WAAW,CAACC,sBAAsB,CAACnB,QAAQ,EAAEiB,IAAI,CAAC;IAC3D,CAAC;IACDG,MAAM,EAAEA,CAAA,KAAM;MACZF,WAAW,CAACG,aAAa,CAACrB,QAAQ,CAAC;IACrC,CAAC;IACDsB,WAAW,EAAEA,CAAA,KAAM;MACjB,OAAOtB,QAAQ;IACjB,CAAC;IACDjC,OAAO,EAAGwD,QAAQ,IAAK;MAAA,IAAAC,iBAAA;MACrB,CAAAA,iBAAA,GAAAzB,OAAO,CAACnB,OAAO,cAAA4C,iBAAA,eAAfA,iBAAA,CAAiBzD,OAAO,CAACwD,QAAQ,CAAC;IACpC,CAAC;IACDE,eAAe,EAAGF,QAAQ,IAAK;MAAA,IAAAG,iBAAA;MAC7B,CAAAA,iBAAA,GAAA3B,OAAO,CAACnB,OAAO,cAAA8C,iBAAA,eAAfA,iBAAA,CAAiBD,eAAe,CAACF,QAAQ,CAAC;IAC5C;EACF,CAAC,CACL,CAAC;EAED,MAAMI,WAAW,GAAG,IAAAC,kBAAW,EAC5B7F,CAAoB,IAAK;IACxB,IAAI4D,QAAQ,EAAE;MACZA,QAAQ,CAAC5D,CAAC,CAAC;IACb;IACA,IAAIyE,kBAAQ,CAACC,EAAE,KAAK,KAAK,IAAIlB,MAAM,EAAE;MACnC,MAAM;QAAEd,KAAK;QAAEC;MAAO,CAAC,GAAG3C,CAAC,CAAC8F,WAAW,CAACC,MAAM;MAC9CvC,MAAM,CAACoB,KAAK,GAAG;QAAElC,KAAK;QAAEC;MAAO,CAAC;IAClC;EACF,CAAC,EACD,CAACiB,QAAQ,EAAEJ,MAAM,CACnB,CAAC;EACD,oBACEpE,MAAA,CAAAc,OAAA,CAAA8F,aAAA,CAACtG,+BAAA,CAAAQ,OAA8B,EAAAiB,QAAA;IAC7BmB,GAAG,EAAE0B,OAAQ;IACbiC,WAAW,EAAE,KAAM;IACnBC,QAAQ,EAAE,GAAGjC,QAAQ,EAAG;IACxBZ,KAAK,EAAEA,KAAM;IACbC,MAAM,EAAEA,MAAO;IACfG,UAAU,EAAEA,UAAW;IACvBC,YAAY,EAAEA,YAAa;IAC3BC,aAAa,EAAEA,aAAc;IAC7BC,QAAQ,EACNa,kBAAQ,CAACC,EAAE,KAAK,KAAK,KAAKlB,MAAM,IAAII,QAAQ,CAAC,GAAGgC,WAAW,GAAGhC;EAC/D,GACGC,SAAS,CACd,CAAC;AAEN,CAAC;AAAClC,OAAA,CAAAyB,MAAA,GAAAA,MAAA","ignoreList":[]}
1
+ {"version":3,"names":["_react","_interopRequireWildcard","require","_ReanimatedProxy","_interopRequireDefault","_SkiaViewNativeId","_SkiaPictureViewNativeComponent","_Reconciler","_skia","_Platform","_external","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","_extends","assign","bind","arguments","length","apply","useCanvasRef","useRef","exports","useReanimatedFrame","HAS_REANIMATED_3","Rea","useFrameCallback","measure","useCanvasRefPriv","useAnimatedRef","useCanvasSize","userRef","ourRef","ref","size","setSize","useState","width","height","useLayoutEffect","current","_x","_y","resolveSurfaceType","surfaceType","Canvas","debug","opaque","children","onSize","colorSpace","highBitDepth","androidWarmup","android","onLayout","viewProps","Platform","OS","console","error","viewRef","nativeId","useMemo","SkiaViewNativeId","root","SkiaSGRoot","Skia","_viewRef$current","result","canvasRef","value","render","useEffect","unmount","useImperativeHandle","makeImageSnapshot","rect","SkiaViewApi","makeImageSnapshotAsync","redraw","requestRedraw","getNativeId","callback","_viewRef$current2","measureInWindow","_viewRef$current3","onLayoutWeb","useCallback","nativeEvent","layout","createElement","collapsable","nativeID","androidSurfaceType","androidZOrderOnTop","zOrderOnTop"],"sources":["Canvas.tsx"],"sourcesContent":["import type { FC, RefObject } from \"react\";\nimport React, {\n useCallback,\n useEffect,\n useImperativeHandle,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type {\n LayoutChangeEvent,\n MeasureInWindowOnSuccessCallback,\n MeasureOnSuccessCallback,\n View,\n ViewProps,\n} from \"react-native\";\nimport type { SharedValue } from \"react-native-reanimated\";\n\nimport Rea from \"../external/reanimated/ReanimatedProxy\";\nimport { SkiaViewNativeId } from \"../views/SkiaViewNativeId\";\nimport type { AndroidCanvasProps, AndroidSurfaceType } from \"../views/types\";\nimport SkiaPictureViewNativeComponent from \"../specs/SkiaPictureViewNativeComponent\";\nimport type { SkImage, SkRect, SkSize } from \"../skia/types\";\nimport { SkiaSGRoot } from \"../sksg/Reconciler\";\nimport { Skia } from \"../skia\";\nimport { Platform } from \"../Platform\";\nimport { HAS_REANIMATED_3 } from \"../external\";\n\nexport interface CanvasRef extends FC<CanvasProps> {\n makeImageSnapshot(rect?: SkRect): SkImage;\n makeImageSnapshotAsync(rect?: SkRect): Promise<SkImage>;\n redraw(): void;\n getNativeId(): number;\n measure(callback: MeasureOnSuccessCallback): void;\n measureInWindow(callback: MeasureInWindowOnSuccessCallback): void;\n}\n\nexport const useCanvasRef = () => useRef<CanvasRef>(null);\n\nconst useReanimatedFrame = !HAS_REANIMATED_3 ? () => {} : Rea.useFrameCallback;\nconst measure = !HAS_REANIMATED_3 ? null : Rea.measure;\n\nconst useCanvasRefPriv: typeof useRef<View> = !HAS_REANIMATED_3\n ? useRef\n : Rea.useAnimatedRef;\n\nexport const useCanvasSize = (userRef?: RefObject<CanvasRef | null>) => {\n const ourRef = useCanvasRef();\n const ref = userRef ?? ourRef;\n const [size, setSize] = useState<SkSize>({ width: 0, height: 0 });\n useLayoutEffect(() => {\n if (ref.current) {\n ref.current.measure((_x, _y, width, height) => {\n setSize({ width, height });\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n return { ref, size };\n};\n\nexport interface CanvasProps extends Omit<ViewProps, \"onLayout\"> {\n debug?: boolean;\n /** @deprecated Not supported on native. Use `onSize` or `useCanvasSize()` instead. */\n onLayout?: ViewProps[\"onLayout\"];\n /**\n * Declares that the canvas covers every pixel of its bounds, so nothing\n * behind it needs to show through. On Android an opaque canvas is backed by\n * a `SurfaceView` by default, the cheapest path (see `android.surfaceType`).\n * Defaults to false.\n */\n opaque?: boolean;\n onSize?: SharedValue<SkSize>;\n colorSpace?: \"p3\" | \"srgb\";\n /**\n * Renders into a surface with more than 8 bits per channel (16-bit float on\n * iOS, 10-bit on Android) to avoid banding in subtle gradients. Colors are\n * identical to the default 8-bit surface, only with more precision (this is\n * about bit depth, not HDR). On Android the extra precision survives\n * composition only when combined with `opaque`, and the prop must be set\n * before the canvas is mounted.\n */\n highBitDepth?: boolean;\n /** Android-only rendering options. Ignored on iOS and web. */\n android?: AndroidCanvasProps;\n ref?: React.Ref<CanvasRef>;\n androidWarmup?: boolean;\n __destroyWebGLContextAfterRender?: boolean;\n}\n\n// Anything else reaching the native component would hit the generated\n// string-enum parser, which aborts on unknown values.\nconst resolveSurfaceType = (\n surfaceType: AndroidSurfaceType | undefined\n): \"auto\" | AndroidSurfaceType =>\n surfaceType === \"SurfaceView\" || surfaceType === \"TextureView\"\n ? surfaceType\n : \"auto\";\n\nexport const Canvas = ({\n debug,\n opaque,\n children,\n onSize,\n colorSpace = \"p3\",\n highBitDepth = false,\n androidWarmup = false,\n android,\n ref,\n onLayout,\n ...viewProps\n}: CanvasProps) => {\n if (onLayout && Platform.OS !== \"web\") {\n console.error(\n \"<Canvas onLayout={onLayout} /> is not supported on the new architecture, to fix the issue, see: https://shopify.github.io/react-native-skia/docs/canvas/overview/#getting-the-canvas-size\"\n );\n }\n const viewRef = useCanvasRefPriv(null);\n // Native ID\n const nativeId = useMemo(() => {\n return SkiaViewNativeId.current++;\n }, []);\n\n // Root\n const root = useMemo(() => new SkiaSGRoot(Skia, nativeId), [nativeId]);\n\n useReanimatedFrame(() => {\n \"worklet\";\n if (onSize && measure) {\n const result =\n // eslint-disable-next-line no-nested-ternary\n Platform.OS === \"web\"\n ? // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n viewRef.current?.canvasRef\n ? // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n measure(viewRef.current.canvasRef)\n : { width: 0, height: 0 }\n : // eslint-disable-next-line @typescript-eslint/no-explicit-any\n measure(viewRef as any);\n if (result) {\n const { width, height } = result;\n if (onSize.value.width !== width || onSize.value.height !== height) {\n onSize.value = { width, height };\n }\n }\n }\n }, !!onSize);\n\n // Render effects\n useLayoutEffect(() => {\n root.render(children);\n }, [children, root, nativeId]);\n\n useEffect(() => {\n return () => {\n root.unmount();\n };\n }, [root]);\n\n // Component methods\n useImperativeHandle(\n ref,\n () =>\n ({\n makeImageSnapshot: (rect?: SkRect) => {\n return SkiaViewApi.makeImageSnapshot(nativeId, rect);\n },\n makeImageSnapshotAsync: (rect?: SkRect) => {\n return SkiaViewApi.makeImageSnapshotAsync(nativeId, rect);\n },\n redraw: () => {\n SkiaViewApi.requestRedraw(nativeId);\n },\n getNativeId: () => {\n return nativeId;\n },\n measure: (callback) => {\n viewRef.current?.measure(callback);\n },\n measureInWindow: (callback) => {\n viewRef.current?.measureInWindow(callback);\n },\n }) as CanvasRef\n );\n\n const onLayoutWeb = useCallback(\n (e: LayoutChangeEvent) => {\n if (onLayout) {\n onLayout(e);\n }\n if (Platform.OS === \"web\" && onSize) {\n const { width, height } = e.nativeEvent.layout;\n onSize.value = { width, height };\n }\n },\n [onLayout, onSize]\n );\n return (\n <SkiaPictureViewNativeComponent\n ref={viewRef}\n collapsable={false}\n nativeID={`${nativeId}`}\n debug={debug}\n opaque={opaque}\n colorSpace={colorSpace}\n highBitDepth={highBitDepth}\n androidWarmup={androidWarmup}\n androidSurfaceType={resolveSurfaceType(android?.surfaceType)}\n androidZOrderOnTop={!!android?.zOrderOnTop}\n onLayout={\n Platform.OS === \"web\" && (onSize || onLayout) ? onLayoutWeb : onLayout\n }\n {...viewProps}\n />\n );\n};\n"],"mappings":"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","ignoreList":[]}
@@ -60,10 +60,15 @@ class JsiSkCanvas extends _Host.HostObject {
60
60
  this.ref.drawVertices(_JsiSkVertices.JsiSkVertices.fromValue(verts), (0, _Host.getEnum)(this.CanvasKit, "BlendMode", mode), _JsiSkPaint.JsiSkPaint.fromValue(paint));
61
61
  }
62
62
  drawPatch(cubics, colors, texs, mode, paint) {
63
- this.ref.drawPatch(cubics.map(({
64
- x,
65
- y
66
- }) => [x, y]).flat(), colors, texs ? texs.flatMap(p => Array.from(_JsiSkPoint.JsiSkPoint.fromValue(p))) : texs, mode !== undefined && mode !== null ? (0, _Host.getEnum)(this.CanvasKit, "BlendMode", mode) : null, paint ? _JsiSkPaint.JsiSkPaint.fromValue(paint) : undefined);
63
+ const defaultPaint = paint ? null : new this.CanvasKit.Paint();
64
+ try {
65
+ this.ref.drawPatch(cubics.map(({
66
+ x,
67
+ y
68
+ }) => [x, y]).flat(), colors, texs ? texs.flatMap(p => Array.from(_JsiSkPoint.JsiSkPoint.fromValue(p))) : texs, mode !== undefined && mode !== null ? (0, _Host.getEnum)(this.CanvasKit, "BlendMode", mode) : null, paint ? _JsiSkPaint.JsiSkPaint.fromValue(paint) : defaultPaint);
69
+ } finally {
70
+ defaultPaint === null || defaultPaint === void 0 || defaultPaint.delete();
71
+ }
67
72
  }
68
73
  restoreToCount(saveCount) {
69
74
  this.ref.restoreToCount(saveCount);