@shopify/react-native-skia 2.2.15 → 2.2.17

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 (37) hide show
  1. package/apple/MetalWindowContext.mm +10 -0
  2. package/cpp/api/JsiSkImage.h +5 -9
  3. package/cpp/api/JsiSkSurface.h +4 -7
  4. package/cpp/api/JsiSkThreadSafeDeletion.h +9 -9
  5. package/cpp/api/recorder/Convertor.h +16 -0
  6. package/jestSetup.js +3 -2
  7. package/jestSetup.mjs +4 -27
  8. package/lib/commonjs/__tests__/globalSetup.d.ts +1 -1
  9. package/lib/commonjs/mock/__tests__/mock.spec.d.ts +1 -0
  10. package/lib/commonjs/mock/index.js +18 -0
  11. package/lib/commonjs/mock/index.js.map +1 -1
  12. package/lib/commonjs/renderer/Canvas.d.ts +1 -1
  13. package/lib/commonjs/renderer/Canvas.js +7 -22
  14. package/lib/commonjs/renderer/Canvas.js.map +1 -1
  15. package/lib/commonjs/renderer/__tests__/setup.d.ts +1 -1
  16. package/lib/module/__tests__/globalSetup.d.ts +1 -1
  17. package/lib/module/mock/__tests__/mock.spec.d.ts +1 -0
  18. package/lib/module/mock/index.js +18 -0
  19. package/lib/module/mock/index.js.map +1 -1
  20. package/lib/module/renderer/Canvas.d.ts +1 -1
  21. package/lib/module/renderer/Canvas.js +7 -22
  22. package/lib/module/renderer/Canvas.js.map +1 -1
  23. package/lib/module/renderer/__tests__/setup.d.ts +1 -1
  24. package/lib/typescript/lib/commonjs/mock/index.d.ts +20 -0
  25. package/lib/typescript/lib/module/mock/index.d.ts +39 -26
  26. package/lib/typescript/src/__tests__/globalSetup.d.ts +1 -1
  27. package/lib/typescript/src/mock/__tests__/mock.spec.d.ts +1 -0
  28. package/lib/typescript/src/renderer/Canvas.d.ts +1 -1
  29. package/lib/typescript/src/renderer/__tests__/setup.d.ts +1 -1
  30. package/package.json +1 -1
  31. package/src/__tests__/globalSetup.ts +5 -3
  32. package/src/mock/__tests__/mock.spec.ts +47 -0
  33. package/src/mock/index.ts +18 -0
  34. package/src/renderer/Canvas.tsx +10 -22
  35. package/src/renderer/__tests__/setup.tsx +1 -1
  36. package/jestEnv.mjs +0 -23
  37. /package/lib/typescript/{jestEnv.d.mts → jestEnv.d.ts} +0 -0
@@ -26,10 +26,20 @@ MetalWindowContext::MetalWindowContext(GrDirectContext *directContext,
26
26
  _layer.drawableSize = CGSizeMake(width, height);
27
27
  BOOL supportsWideColor = NO;
28
28
  if (useP3ColorSpace) {
29
+ #if !TARGET_OS_OSX
29
30
  if (@available(iOS 10.0, *)) {
30
31
  supportsWideColor = [UIScreen mainScreen].traitCollection.displayGamut ==
31
32
  UIDisplayGamutP3;
32
33
  }
34
+ #else
35
+ if (@available(macOS 10.12, *)) {
36
+ NSScreen *screen = [NSScreen mainScreen];
37
+ NSColorSpace *displayP3 = [NSColorSpace displayP3ColorSpace];
38
+ if (screen.colorSpace && displayP3) {
39
+ supportsWideColor = [screen.colorSpace isEqual:displayP3];
40
+ }
41
+ }
42
+ #endif // !TARGET_OS_OSX
33
43
  }
34
44
  if (supportsWideColor) {
35
45
  CGColorSpaceRef colorSpace =
@@ -275,21 +275,17 @@ public:
275
275
  JsiSkImage(std::shared_ptr<RNSkPlatformContext> context,
276
276
  const sk_sp<SkImage> image)
277
277
  : JsiSkWrappingSkPtrHostObject<SkImage>(std::move(context),
278
- std::move(image)),
279
- _deletionHandler() {
278
+ std::move(image)) {
280
279
  // Drain any pending deletions when creating new images
281
280
  ThreadSafeDeletion<SkImage>::drainDeletionQueue();
282
281
  }
283
282
 
284
283
  ~JsiSkImage() override {
285
284
  // Handle thread-safe deletion
286
- auto objectToDelete = _deletionHandler.handleDeletion(getObject());
287
- if (!objectToDelete) {
288
- // Object was queued for deletion on another thread
289
- // Clear it to prevent base class destructor from deleting it
290
- setObject(nullptr);
291
- }
292
- // If objectToDelete is not null, base destructor will handle cleanup
285
+ _deletionHandler.handleDeletion(getObject());
286
+ // Always clear the object to prevent base class destructor from deleting it
287
+ // handleDeletion takes full responsibility for the object's lifetime
288
+ setObject(nullptr);
293
289
  }
294
290
 
295
291
  size_t getMemoryPressure() const override {
@@ -44,13 +44,10 @@ public:
44
44
 
45
45
  ~JsiSkSurface() override {
46
46
  // Handle thread-safe deletion
47
- auto objectToDelete = _deletionHandler.handleDeletion(getObject());
48
- if (!objectToDelete) {
49
- // Object was queued for deletion on another thread
50
- // Clear it to prevent base class destructor from deleting it
51
- setObject(nullptr);
52
- }
53
- // If objectToDelete is not null, base destructor will handle cleanup
47
+ _deletionHandler.handleDeletion(getObject());
48
+ // Always clear the object to prevent base class destructor from deleting it
49
+ // handleDeletion takes full responsibility for the object's lifetime
50
+ setObject(nullptr);
54
51
  }
55
52
 
56
53
  EXPORT_JSI_API_TYPENAME(JsiSkSurface, Surface)
@@ -32,18 +32,18 @@ public:
32
32
 
33
33
  /**
34
34
  * Handles deletion of the object. If we're on the wrong thread,
35
- * queues it for later deletion. Returns nullptr if object was queued,
36
- * or the object itself if it should be deleted immediately.
35
+ * queues it for later deletion. Otherwise, allows immediate deletion.
36
+ * The object is always considered handled after this call.
37
37
  */
38
- sk_sp<T> handleDeletion(sk_sp<T> object) {
38
+ void handleDeletion(sk_sp<T> object) {
39
39
  if (!object) {
40
- return nullptr;
40
+ return;
41
41
  }
42
42
 
43
43
  #ifdef DISABLE_THREAD_SAFE_DELETION
44
- // When disabled, always return the object for immediate deletion
44
+ // When disabled, allow immediate deletion
45
45
  // This will likely cause crashes when objects are deleted on wrong thread
46
- return object;
46
+ return;
47
47
  #else
48
48
  // Always try to drain the queue when handling deletions
49
49
  drainDeletionQueue();
@@ -53,11 +53,11 @@ public:
53
53
  // Queue for deletion on the correct thread
54
54
  std::lock_guard<std::mutex> lock(_queueMutex);
55
55
  _deletionQueue.push({object, _creationThreadId});
56
- return nullptr; // Signal that object was queued
56
+ return;
57
57
  }
58
58
 
59
- // We're on the correct thread, return object for immediate deletion
60
- return object;
59
+ // We're on the correct thread, allow immediate deletion via destructor
60
+ return;
61
61
  #endif
62
62
  }
63
63
 
@@ -160,6 +160,22 @@ SkColor getPropertyValue(jsi::Runtime &runtime, const jsi::Value &value) {
160
160
  auto a = array.getValueAtIndex(runtime, 3).asNumber();
161
161
  return SkColorSetARGB(a * 255, r * 255, g * 255, b * 255);
162
162
  }
163
+
164
+ // Check for properties "0", "1", "2", "3" (even if not an array)
165
+ auto prop0 = jsi::PropNameID::forAscii(runtime, "0");
166
+ auto prop1 = jsi::PropNameID::forAscii(runtime, "1");
167
+ auto prop2 = jsi::PropNameID::forAscii(runtime, "2");
168
+ auto prop3 = jsi::PropNameID::forAscii(runtime, "3");
169
+ if (object.hasProperty(runtime, prop0) &&
170
+ object.hasProperty(runtime, prop1) &&
171
+ object.hasProperty(runtime, prop2) &&
172
+ object.hasProperty(runtime, prop3)) {
173
+ auto r = object.getProperty(runtime, prop0).asNumber();
174
+ auto g = object.getProperty(runtime, prop1).asNumber();
175
+ auto b = object.getProperty(runtime, prop2).asNumber();
176
+ auto a = object.getProperty(runtime, prop3).asNumber();
177
+ return SkColorSetARGB(a * 255, r * 255, g * 255, b * 255);
178
+ }
163
179
  jsi::ArrayBuffer buffer =
164
180
  object
165
181
  .getProperty(runtime, jsi::PropNameID::forAscii(runtime, "buffer"))
package/jestSetup.js CHANGED
@@ -1,4 +1,5 @@
1
1
  /* globals jest */
2
+ /* eslint-disable import/no-extraneous-dependencies */
2
3
  jest.mock("@shopify/react-native-skia", () => {
3
4
  jest.mock("@shopify/react-native-skia/lib/commonjs/Platform", () => {
4
5
  const Noop = () => undefined;
@@ -18,9 +19,9 @@ jest.mock("@shopify/react-native-skia", () => {
18
19
  matchFont: () => null,
19
20
  listFontFamilies: () => [],
20
21
  useFonts: () => null,
21
- }
22
+ };
22
23
  });
23
- return require("@shopify/react-native-skia/lib/commonjs/mock").Mock(
24
+ return require("@shopify/react-native-skia/lib/module/mock").Mock(
24
25
  global.CanvasKit
25
26
  );
26
27
  });
package/jestSetup.mjs CHANGED
@@ -1,30 +1,7 @@
1
- /* eslint-disable import/no-extraneous-dependencies */
2
- import { jest } from "@jest/globals";
1
+ // Note- This can be removed entirely once users adopt adding our jestEnv to their jest configs.
2
+ // This is left for compatibility with the older versions of skia but is not needed anymore.
3
3
  import CanvasKitInit from "canvaskit-wasm/bin/full/canvaskit";
4
- import { Mock } from "@shopify/react-native-skia/lib/module/mock";
5
-
6
4
  global.CanvasKit = await CanvasKitInit({});
7
5
 
8
- jest.mock("@shopify/react-native-skia", () => {
9
- jest.mock("@shopify/react-native-skia/lib/commonjs/Platform", () => {
10
- const Noop = () => undefined;
11
- return {
12
- OS: "web",
13
- PixelRatio: 1,
14
- requireNativeComponent: Noop,
15
- resolveAsset: Noop,
16
- findNodeHandle: Noop,
17
- NativeModules: Noop,
18
- View: Noop,
19
- };
20
- });
21
- jest.mock("@shopify/react-native-skia/lib/commonjs/skia/core/Font", () => {
22
- return {
23
- useFont: () => null,
24
- matchFont: () => null,
25
- listFontFamilies: () => [],
26
- useFonts: () => null,
27
- }
28
- });
29
- return Mock(global.CanvasKit);
30
- });
6
+ /* eslint-disable-next-line import/extensions */
7
+ import "./jestSetup.js";
@@ -2,7 +2,7 @@ import type { Server, WebSocket } from "ws";
2
2
  declare global {
3
3
  var testServer: Server;
4
4
  var testClient: WebSocket;
5
- var testOS: "ios" | "android" | "web" | "node";
5
+ var testOS: "ios" | "android" | "web" | "node" | "macos";
6
6
  var testArch: "paper" | "fabric";
7
7
  }
8
8
  declare const globalSetup: () => Promise<void>;
@@ -0,0 +1 @@
1
+ export {};
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.Mock = void 0;
7
7
  var _web = require("../skia/web");
8
+ var _JsiSkImage = require("../skia/web/JsiSkImage");
8
9
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
9
10
  const Noop = () => undefined;
10
11
  const NoopValue = () => ({
@@ -28,6 +29,21 @@ const Mock = CanvasKit => {
28
29
  ...require("../dom/types"),
29
30
  ...require("../dom/nodes"),
30
31
  Canvas: require("react-native").View,
32
+ SkiaPictureView: require("react-native").View,
33
+ JsiSkImage: _JsiSkImage.JsiSkImage,
34
+ drawAsPicture: Noop,
35
+ drawAsImage: Noop,
36
+ drawAsImageFromPicture: Noop,
37
+ useCanvasRef: NoopValue,
38
+ useCanvasSize: () => ({
39
+ ref: {
40
+ current: 0
41
+ },
42
+ size: {
43
+ width: 0,
44
+ height: 0
45
+ }
46
+ }),
31
47
  // Skia Animations
32
48
  useValue: NoopValue,
33
49
  useComputedValue: NoopValue,
@@ -37,6 +53,8 @@ const Mock = CanvasKit => {
37
53
  useClockValue: NoopValue,
38
54
  useValueEffect: Noop,
39
55
  // Reanimated hooks
56
+ isOnMainThread: () => true,
57
+ isFabric: true,
40
58
  useClock: NoopSharedValue,
41
59
  usePathInterpolation: NoopSharedValue,
42
60
  useImageAsTexture: NoopSharedValue,
@@ -1 +1 @@
1
- {"version":3,"names":["_web","require","Noop","undefined","NoopValue","current","NoopSharedValue","value","Mock","CanvasKit","global","SkiaApi","JsiSkApi","Skia","Canvas","View","useValue","useComputedValue","useTiming","useLoop","useSpring","useClockValue","useValueEffect","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\";\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 // 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 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;AAEA;AACA,MAAMC,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,GAAGZ,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;IAC1Ba,MAAM,EAAEb,OAAO,CAAC,cAAc,CAAC,CAACc,IAAI;IACpC;IACAC,QAAQ,EAAEZ,SAAS;IACnBa,gBAAgB,EAAEb,SAAS;IAC3Bc,SAAS,EAAEd,SAAS;IACpBe,OAAO,EAAEf,SAAS;IAClBgB,SAAS,EAAEhB,SAAS;IACpBiB,aAAa,EAAEjB,SAAS;IACxBkB,cAAc,EAAEpB,IAAI;IACpB;IACAqB,QAAQ,EAAEjB,eAAe;IACzBkB,oBAAoB,EAAElB,eAAe;IACrCmB,iBAAiB,EAAEnB,eAAe;IAClCoB,eAAe,EAAEpB,eAAe;IAChCqB,0BAA0B,EAAErB,eAAe;IAC3CsB,gBAAgB,EAAEtB,eAAe;IACjCuB,cAAc,EAAEvB,eAAe;IAC/BwB,cAAc,EAAExB,eAAe;IAC/ByB,aAAa,EAAEzB,eAAe;IAC9B0B,SAAS,EAAE1B,eAAe;IAC1B2B,UAAU,EAAE/B,IAAI;IAChBgC,OAAO,EAAEhC,IAAI;IACbiC,OAAO,EAAEA,CAAA,KAAMtB,IAAI,CAACuB,IAAI,CAACjC,SAAS,EAAE,CAAC,CAAC;IACtCkC,QAAQ,EAAEnC,IAAI;IACdoC,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,CAAAlC,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","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 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,eAAe,EAAEhB,OAAO,CAAC,cAAc,CAAC,CAACe,IAAI;IAC7CE,UAAU,EAAEA,sBAAU;IACtBC,aAAa,EAAEhB,IAAI;IACnBiB,WAAW,EAAEjB,IAAI;IACjBkB,sBAAsB,EAAElB,IAAI;IAC5BmB,YAAY,EAAEjB,SAAS;IACvBkB,aAAa,EAAEA,CAAA,MAAO;MACpBC,GAAG,EAAE;QACHlB,OAAO,EAAE;MACX,CAAC;MACDmB,IAAI,EAAE;QACJC,KAAK,EAAE,CAAC;QACRC,MAAM,EAAE;MACV;IACF,CAAC,CAAC;IACF;IACAC,QAAQ,EAAEvB,SAAS;IACnBwB,gBAAgB,EAAExB,SAAS;IAC3ByB,SAAS,EAAEzB,SAAS;IACpB0B,OAAO,EAAE1B,SAAS;IAClB2B,SAAS,EAAE3B,SAAS;IACpB4B,aAAa,EAAE5B,SAAS;IACxB6B,cAAc,EAAE/B,IAAI;IACpB;IACAgC,cAAc,EAAEA,CAAA,KAAM,IAAI;IAC1BC,QAAQ,EAAE,IAAI;IACdC,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":[]}
@@ -1,7 +1,7 @@
1
1
  import type { FC, RefObject } from "react";
2
2
  import React from "react";
3
3
  import type { MeasureInWindowOnSuccessCallback, MeasureOnSuccessCallback, ViewProps } from "react-native";
4
- import { type SharedValue } from "react-native-reanimated";
4
+ import type { SharedValue } from "react-native-reanimated";
5
5
  import type { SkImage, SkRect, SkSize } from "../skia/types";
6
6
  export interface CanvasRef extends FC<CanvasProps> {
7
7
  makeImageSnapshot(rect?: SkRect): SkImage;
@@ -11,6 +11,7 @@ var _SkiaPictureViewNativeComponent = _interopRequireDefault(require("../specs/S
11
11
  var _Reconciler = require("../sksg/Reconciler");
12
12
  var _skia = require("../skia");
13
13
  var _Platform = require("../Platform");
14
+ var _external = require("../external");
14
15
  var _global;
15
16
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
16
17
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
@@ -18,6 +19,7 @@ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e;
18
19
  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); }
19
20
  const useCanvasRef = () => (0, _react.useRef)(null);
20
21
  exports.useCanvasRef = useCanvasRef;
22
+ const useReanimatedFrame = !_external.HAS_REANIMATED_3 ? () => {} : _ReanimatedProxy.default.useFrameCallback;
21
23
  const useCanvasSize = userRef => {
22
24
  const ourRef = useCanvasRef();
23
25
  const ref = userRef !== null && userRef !== void 0 ? userRef : ourRef;
@@ -71,39 +73,22 @@ const Canvas = ({
71
73
 
72
74
  // Root
73
75
  const root = (0, _react.useMemo)(() => new _Reconciler.SkiaSGRoot(_skia.Skia, nativeId), [nativeId]);
74
- const updateSize = (0, _react.useCallback)(value => {
75
- if (onSize) {
76
- onSize.value = value;
77
- }
78
- }, [onSize]);
76
+ useReanimatedFrame(() => {
77
+ "worklet";
78
+ }, !!onSize);
79
79
  (0, _react.useEffect)(() => {
80
80
  if (onSize) {
81
- const {
82
- runOnJS
83
- } = _ReanimatedProxy.default;
84
- const uiOnSize = _ReanimatedProxy.default.makeMutable({
85
- width: 0,
86
- height: 0
87
- });
88
81
  _ReanimatedProxy.default.runOnUI(() => {
89
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
90
- // @ts-expect-error
91
- global[`__onSize_${nativeId}`] = uiOnSize;
92
- uiOnSize.addListener(nativeId, value => {
93
- runOnJS(updateSize)(value);
94
- });
82
+ global[`__onSize_${nativeId}`] = onSize;
95
83
  })();
96
84
  return () => {
97
85
  _ReanimatedProxy.default.runOnUI(() => {
98
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
99
- // @ts-expect-error
100
86
  delete global[`__onSize_${nativeId}`];
101
- uiOnSize.removeListener(nativeId);
102
87
  })();
103
88
  };
104
89
  }
105
90
  return undefined;
106
- }, [onSize, nativeId, updateSize]);
91
+ }, [onSize, nativeId]);
107
92
 
108
93
  // Render effects
109
94
  (0, _react.useLayoutEffect)(() => {
@@ -1 +1 @@
1
- {"version":3,"names":["_react","_interopRequireWildcard","require","_ReanimatedProxy","_interopRequireDefault","_SkiaViewNativeId","_SkiaPictureViewNativeComponent","_Reconciler","_skia","_Platform","_global","e","__esModule","default","_getRequireWildcardCache","WeakMap","r","t","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","_extends","assign","bind","arguments","length","apply","useCanvasRef","useRef","exports","useCanvasSize","userRef","ourRef","ref","size","setSize","useState","width","height","useLayoutEffect","current","measure","_x","_y","isFabric","Boolean","global","nativeFabricUIManager","Canvas","debug","opaque","children","onSize","colorSpace","onLayout","viewProps","console","error","viewRef","nativeId","useMemo","SkiaViewNativeId","root","SkiaSGRoot","Skia","updateSize","useCallback","value","useEffect","runOnJS","Rea","uiOnSize","makeMutable","runOnUI","addListener","removeListener","undefined","render","unmount","useImperativeHandle","makeImageSnapshot","rect","SkiaViewApi","makeImageSnapshotAsync","redraw","requestRedraw","getNativeId","callback","_viewRef$current","measureInWindow","_viewRef$current2","onLayoutWeb","Platform","OS","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\";\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\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 opaque?: boolean;\n onSize?: SharedValue<SkSize>;\n colorSpace?: \"p3\" | \"srgb\";\n ref?: React.Ref<CanvasRef>;\n __destroyWebGLContextAfterRender?: boolean;\n}\n\nexport const Canvas = ({\n debug,\n opaque,\n children,\n onSize,\n colorSpace = \"p3\",\n ref,\n // Here know this is a type error but this is done on purpose to check it at runtime\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n onLayout,\n ...viewProps\n}: CanvasProps) => {\n if (onLayout && isFabric) {\n console.error(\n // eslint-disable-next-line max-len\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 = useRef<View>(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 const updateSize = useCallback(\n (value: SkSize) => {\n if (onSize) {\n onSize.value = value;\n }\n },\n [onSize]\n );\n useEffect(() => {\n if (onSize) {\n const { runOnJS } = Rea;\n const uiOnSize = Rea.makeMutable({ width: 0, height: 0 });\n Rea.runOnUI(() => {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n global[`__onSize_${nativeId}`] = uiOnSize;\n uiOnSize.addListener(nativeId, (value) => {\n runOnJS(updateSize)(value);\n });\n })();\n return () => {\n Rea.runOnUI(() => {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n delete global[`__onSize_${nativeId}`];\n uiOnSize.removeListener(nativeId);\n })();\n };\n }\n return undefined;\n }, [onSize, nativeId, updateSize]);\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\n return (\n <SkiaPictureViewNativeComponent\n ref={viewRef}\n collapsable={false}\n nativeID={`${nativeId}`}\n debug={debug}\n opaque={opaque}\n colorSpace={colorSpace}\n onLayout={onLayoutWeb}\n {...viewProps}\n />\n );\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_react","_interopRequireWildcard","require","_ReanimatedProxy","_interopRequireDefault","_SkiaViewNativeId","_SkiaPictureViewNativeComponent","_Reconciler","_skia","_Platform","_external","_global","e","__esModule","default","_getRequireWildcardCache","WeakMap","r","t","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","_extends","assign","bind","arguments","length","apply","useCanvasRef","useRef","exports","useReanimatedFrame","HAS_REANIMATED_3","Rea","useFrameCallback","useCanvasSize","userRef","ourRef","ref","size","setSize","useState","width","height","useLayoutEffect","current","measure","_x","_y","isFabric","Boolean","global","nativeFabricUIManager","Canvas","debug","opaque","children","onSize","colorSpace","onLayout","viewProps","console","error","viewRef","nativeId","useMemo","SkiaViewNativeId","root","SkiaSGRoot","Skia","useEffect","runOnUI","undefined","render","unmount","useImperativeHandle","makeImageSnapshot","rect","SkiaViewApi","makeImageSnapshotAsync","redraw","requestRedraw","getNativeId","callback","_viewRef$current","measureInWindow","_viewRef$current2","onLayoutWeb","useCallback","Platform","OS","nativeEvent","layout","value","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;\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 opaque?: boolean;\n onSize?: SharedValue<SkSize>;\n colorSpace?: \"p3\" | \"srgb\";\n ref?: React.Ref<CanvasRef>;\n __destroyWebGLContextAfterRender?: boolean;\n}\n\nexport const Canvas = ({\n debug,\n opaque,\n children,\n onSize,\n colorSpace = \"p3\",\n ref,\n // Here know this is a type error but this is done on purpose to check it at runtime\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n onLayout,\n ...viewProps\n}: CanvasProps) => {\n if (onLayout && isFabric) {\n console.error(\n // eslint-disable-next-line max-len\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 = useRef<View>(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 }, !!onSize);\n useEffect(() => {\n if (onSize) {\n Rea.runOnUI(() => {\n (global as Record<string, unknown>)[`__onSize_${nativeId}`] = onSize;\n })();\n return () => {\n Rea.runOnUI(() => {\n delete (global as Record<string, unknown>)[`__onSize_${nativeId}`];\n })();\n };\n }\n return undefined;\n }, [onSize, nativeId]);\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\n return (\n <SkiaPictureViewNativeComponent\n ref={viewRef}\n collapsable={false}\n nativeID={`${nativeId}`}\n debug={debug}\n opaque={opaque}\n colorSpace={colorSpace}\n onLayout={onLayoutWeb}\n {...viewProps}\n />\n );\n};\n"],"mappings":"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","ignoreList":[]}
@@ -3,7 +3,7 @@ import type { Server, WebSocket } from "ws";
3
3
  import type * as SkiaExports from "../../index";
4
4
  import type { SkImage, SkFont, Skia, SkCanvas } from "../../skia/types";
5
5
  import { SkiaSGRoot } from "../../sksg/Reconciler";
6
- type TestOS = "ios" | "android" | "web" | "node";
6
+ type TestOS = "ios" | "android" | "web" | "node" | "macos";
7
7
  declare global {
8
8
  var testServer: Server;
9
9
  var testClient: WebSocket;
@@ -2,7 +2,7 @@ import type { Server, WebSocket } from "ws";
2
2
  declare global {
3
3
  var testServer: Server;
4
4
  var testClient: WebSocket;
5
- var testOS: "ios" | "android" | "web" | "node";
5
+ var testOS: "ios" | "android" | "web" | "node" | "macos";
6
6
  var testArch: "paper" | "fabric";
7
7
  }
8
8
  declare const globalSetup: () => Promise<void>;
@@ -0,0 +1 @@
1
+ export {};
@@ -1,4 +1,5 @@
1
1
  import { JsiSkApi } from "../skia/web";
2
+ import { JsiSkImage } from "../skia/web/JsiSkImage";
2
3
 
3
4
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
4
5
  const Noop = () => undefined;
@@ -23,6 +24,21 @@ export const Mock = CanvasKit => {
23
24
  ...require("../dom/types"),
24
25
  ...require("../dom/nodes"),
25
26
  Canvas: require("react-native").View,
27
+ SkiaPictureView: require("react-native").View,
28
+ JsiSkImage: JsiSkImage,
29
+ drawAsPicture: Noop,
30
+ drawAsImage: Noop,
31
+ drawAsImageFromPicture: Noop,
32
+ useCanvasRef: NoopValue,
33
+ useCanvasSize: () => ({
34
+ ref: {
35
+ current: 0
36
+ },
37
+ size: {
38
+ width: 0,
39
+ height: 0
40
+ }
41
+ }),
26
42
  // Skia Animations
27
43
  useValue: NoopValue,
28
44
  useComputedValue: NoopValue,
@@ -32,6 +48,8 @@ export const Mock = CanvasKit => {
32
48
  useClockValue: NoopValue,
33
49
  useValueEffect: Noop,
34
50
  // Reanimated hooks
51
+ isOnMainThread: () => true,
52
+ isFabric: true,
35
53
  useClock: NoopSharedValue,
36
54
  usePathInterpolation: NoopSharedValue,
37
55
  useImageAsTexture: NoopSharedValue,
@@ -1 +1 @@
1
- {"version":3,"names":["JsiSkApi","Noop","undefined","NoopValue","current","NoopSharedValue","value","Mock","CanvasKit","global","SkiaApi","Skia","require","Canvas","View","useValue","useComputedValue","useTiming","useLoop","useSpring","useClockValue","useValueEffect","useClock","usePathInterpolation","useImageAsTexture","useTextureValue","useTextureValueFromPicture","useRSXformBuffer","usePointBuffer","useColorBuffer","useRectBuffer","useBuffer","useRawData","useData","useFont","Font","useFonts","useTypeface","useImage","useSVG","useVideo"],"sources":["index.ts"],"sourcesContent":["import type { CanvasKit } from \"canvaskit-wasm\";\n\nimport { JsiSkApi } from \"../skia/web\";\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 // 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 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,SAASA,QAAQ,QAAQ,aAAa;;AAEtC;AACA,MAAMC,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;AAE5C,OAAO,MAAMC,IAAI,GAAIC,SAAoB,IAAK;EAC5C;EACA;EACAC,MAAM,CAACC,OAAO,GAAGV,QAAQ,CAACQ,SAAS,CAAC;EACpC;EACA;EACA,MAAMG,IAAI,GAAGF,MAAM,CAACC,OAAO;EAC3B,OAAO;IACLC,IAAI;IACJ,GAAGC,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;IACpC;IACAC,QAAQ,EAAEZ,SAAS;IACnBa,gBAAgB,EAAEb,SAAS;IAC3Bc,SAAS,EAAEd,SAAS;IACpBe,OAAO,EAAEf,SAAS;IAClBgB,SAAS,EAAEhB,SAAS;IACpBiB,aAAa,EAAEjB,SAAS;IACxBkB,cAAc,EAAEpB,IAAI;IACpB;IACAqB,QAAQ,EAAEjB,eAAe;IACzBkB,oBAAoB,EAAElB,eAAe;IACrCmB,iBAAiB,EAAEnB,eAAe;IAClCoB,eAAe,EAAEpB,eAAe;IAChCqB,0BAA0B,EAAErB,eAAe;IAC3CsB,gBAAgB,EAAEtB,eAAe;IACjCuB,cAAc,EAAEvB,eAAe;IAC/BwB,cAAc,EAAExB,eAAe;IAC/ByB,aAAa,EAAEzB,eAAe;IAC9B0B,SAAS,EAAE1B,eAAe;IAC1B2B,UAAU,EAAE/B,IAAI;IAChBgC,OAAO,EAAEhC,IAAI;IACbiC,OAAO,EAAEA,CAAA,KAAMvB,IAAI,CAACwB,IAAI,CAACjC,SAAS,EAAE,CAAC,CAAC;IACtCkC,QAAQ,EAAEnC,IAAI;IACdoC,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","ignoreList":[]}
1
+ {"version":3,"names":["JsiSkApi","JsiSkImage","Noop","undefined","NoopValue","current","NoopSharedValue","value","Mock","CanvasKit","global","SkiaApi","Skia","require","Canvas","View","SkiaPictureView","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"],"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 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,SAASA,QAAQ,QAAQ,aAAa;AACtC,SAASC,UAAU,QAAQ,wBAAwB;;AAEnD;AACA,MAAMC,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;AAE5C,OAAO,MAAMC,IAAI,GAAIC,SAAoB,IAAK;EAC5C;EACA;EACAC,MAAM,CAACC,OAAO,GAAGX,QAAQ,CAACS,SAAS,CAAC;EACpC;EACA;EACA,MAAMG,IAAI,GAAGF,MAAM,CAACC,OAAO;EAC3B,OAAO;IACLC,IAAI;IACJ,GAAGC,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,eAAe,EAAEH,OAAO,CAAC,cAAc,CAAC,CAACE,IAAI;IAC7Cd,UAAU,EAAEA,UAAU;IACtBgB,aAAa,EAAEf,IAAI;IACnBgB,WAAW,EAAEhB,IAAI;IACjBiB,sBAAsB,EAAEjB,IAAI;IAC5BkB,YAAY,EAAEhB,SAAS;IACvBiB,aAAa,EAAEA,CAAA,MAAO;MACpBC,GAAG,EAAE;QACHjB,OAAO,EAAE;MACX,CAAC;MACDkB,IAAI,EAAE;QACJC,KAAK,EAAE,CAAC;QACRC,MAAM,EAAE;MACV;IACF,CAAC,CAAC;IACF;IACAC,QAAQ,EAAEtB,SAAS;IACnBuB,gBAAgB,EAAEvB,SAAS;IAC3BwB,SAAS,EAAExB,SAAS;IACpByB,OAAO,EAAEzB,SAAS;IAClB0B,SAAS,EAAE1B,SAAS;IACpB2B,aAAa,EAAE3B,SAAS;IACxB4B,cAAc,EAAE9B,IAAI;IACpB;IACA+B,cAAc,EAAEA,CAAA,KAAM,IAAI;IAC1BC,QAAQ,EAAE,IAAI;IACdC,QAAQ,EAAE7B,eAAe;IACzB8B,oBAAoB,EAAE9B,eAAe;IACrC+B,iBAAiB,EAAE/B,eAAe;IAClCgC,eAAe,EAAEhC,eAAe;IAChCiC,0BAA0B,EAAEjC,eAAe;IAC3CkC,gBAAgB,EAAElC,eAAe;IACjCmC,cAAc,EAAEnC,eAAe;IAC/BoC,cAAc,EAAEpC,eAAe;IAC/BqC,aAAa,EAAErC,eAAe;IAC9BsC,SAAS,EAAEtC,eAAe;IAC1BuC,UAAU,EAAE3C,IAAI;IAChB4C,OAAO,EAAE5C,IAAI;IACb6C,OAAO,EAAEA,CAAA,KAAMnC,IAAI,CAACoC,IAAI,CAAC7C,SAAS,EAAE,CAAC,CAAC;IACtC8C,QAAQ,EAAE/C,IAAI;IACdgD,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","ignoreList":[]}
@@ -1,7 +1,7 @@
1
1
  import type { FC, RefObject } from "react";
2
2
  import React from "react";
3
3
  import type { MeasureInWindowOnSuccessCallback, MeasureOnSuccessCallback, ViewProps } from "react-native";
4
- import { type SharedValue } from "react-native-reanimated";
4
+ import type { SharedValue } from "react-native-reanimated";
5
5
  import type { SkImage, SkRect, SkSize } from "../skia/types";
6
6
  export interface CanvasRef extends FC<CanvasProps> {
7
7
  makeImageSnapshot(rect?: SkRect): SkImage;
@@ -7,7 +7,9 @@ import SkiaPictureViewNativeComponent from "../specs/SkiaPictureViewNativeCompon
7
7
  import { SkiaSGRoot } from "../sksg/Reconciler";
8
8
  import { Skia } from "../skia";
9
9
  import { Platform } from "../Platform";
10
+ import { HAS_REANIMATED_3 } from "../external";
10
11
  export const useCanvasRef = () => useRef(null);
12
+ const useReanimatedFrame = !HAS_REANIMATED_3 ? () => {} : Rea.useFrameCallback;
11
13
  export const useCanvasSize = userRef => {
12
14
  const ourRef = useCanvasRef();
13
15
  const ref = userRef !== null && userRef !== void 0 ? userRef : ourRef;
@@ -60,39 +62,22 @@ export const Canvas = ({
60
62
 
61
63
  // Root
62
64
  const root = useMemo(() => new SkiaSGRoot(Skia, nativeId), [nativeId]);
63
- const updateSize = useCallback(value => {
64
- if (onSize) {
65
- onSize.value = value;
66
- }
67
- }, [onSize]);
65
+ useReanimatedFrame(() => {
66
+ "worklet";
67
+ }, !!onSize);
68
68
  useEffect(() => {
69
69
  if (onSize) {
70
- const {
71
- runOnJS
72
- } = Rea;
73
- const uiOnSize = Rea.makeMutable({
74
- width: 0,
75
- height: 0
76
- });
77
70
  Rea.runOnUI(() => {
78
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
79
- // @ts-expect-error
80
- global[`__onSize_${nativeId}`] = uiOnSize;
81
- uiOnSize.addListener(nativeId, value => {
82
- runOnJS(updateSize)(value);
83
- });
71
+ global[`__onSize_${nativeId}`] = onSize;
84
72
  })();
85
73
  return () => {
86
74
  Rea.runOnUI(() => {
87
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
88
- // @ts-expect-error
89
75
  delete global[`__onSize_${nativeId}`];
90
- uiOnSize.removeListener(nativeId);
91
76
  })();
92
77
  };
93
78
  }
94
79
  return undefined;
95
- }, [onSize, nativeId, updateSize]);
80
+ }, [onSize, nativeId]);
96
81
 
97
82
  // Render effects
98
83
  useLayoutEffect(() => {
@@ -1 +1 @@
1
- {"version":3,"names":["React","useCallback","useEffect","useImperativeHandle","useLayoutEffect","useMemo","useRef","useState","Rea","SkiaViewNativeId","SkiaPictureViewNativeComponent","SkiaSGRoot","Skia","Platform","useCanvasRef","useCanvasSize","userRef","ourRef","ref","size","setSize","width","height","current","measure","_x","_y","isFabric","Boolean","_global","global","nativeFabricUIManager","Canvas","debug","opaque","children","onSize","colorSpace","onLayout","viewProps","console","error","viewRef","nativeId","root","updateSize","value","runOnJS","uiOnSize","makeMutable","runOnUI","addListener","removeListener","undefined","render","unmount","makeImageSnapshot","rect","SkiaViewApi","makeImageSnapshotAsync","redraw","requestRedraw","getNativeId","callback","_viewRef$current","measureInWindow","_viewRef$current2","onLayoutWeb","e","OS","nativeEvent","layout","createElement","_extends","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\";\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\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 opaque?: boolean;\n onSize?: SharedValue<SkSize>;\n colorSpace?: \"p3\" | \"srgb\";\n ref?: React.Ref<CanvasRef>;\n __destroyWebGLContextAfterRender?: boolean;\n}\n\nexport const Canvas = ({\n debug,\n opaque,\n children,\n onSize,\n colorSpace = \"p3\",\n ref,\n // Here know this is a type error but this is done on purpose to check it at runtime\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n onLayout,\n ...viewProps\n}: CanvasProps) => {\n if (onLayout && isFabric) {\n console.error(\n // eslint-disable-next-line max-len\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 = useRef<View>(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 const updateSize = useCallback(\n (value: SkSize) => {\n if (onSize) {\n onSize.value = value;\n }\n },\n [onSize]\n );\n useEffect(() => {\n if (onSize) {\n const { runOnJS } = Rea;\n const uiOnSize = Rea.makeMutable({ width: 0, height: 0 });\n Rea.runOnUI(() => {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n global[`__onSize_${nativeId}`] = uiOnSize;\n uiOnSize.addListener(nativeId, (value) => {\n runOnJS(updateSize)(value);\n });\n })();\n return () => {\n Rea.runOnUI(() => {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n delete global[`__onSize_${nativeId}`];\n uiOnSize.removeListener(nativeId);\n })();\n };\n }\n return undefined;\n }, [onSize, nativeId, updateSize]);\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\n return (\n <SkiaPictureViewNativeComponent\n ref={viewRef}\n collapsable={false}\n nativeID={`${nativeId}`}\n debug={debug}\n opaque={opaque}\n colorSpace={colorSpace}\n onLayout={onLayoutWeb}\n {...viewProps}\n />\n );\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["React","useCallback","useEffect","useImperativeHandle","useLayoutEffect","useMemo","useRef","useState","Rea","SkiaViewNativeId","SkiaPictureViewNativeComponent","SkiaSGRoot","Skia","Platform","HAS_REANIMATED_3","useCanvasRef","useReanimatedFrame","useFrameCallback","useCanvasSize","userRef","ourRef","ref","size","setSize","width","height","current","measure","_x","_y","isFabric","Boolean","_global","global","nativeFabricUIManager","Canvas","debug","opaque","children","onSize","colorSpace","onLayout","viewProps","console","error","viewRef","nativeId","root","runOnUI","undefined","render","unmount","makeImageSnapshot","rect","SkiaViewApi","makeImageSnapshotAsync","redraw","requestRedraw","getNativeId","callback","_viewRef$current","measureInWindow","_viewRef$current2","onLayoutWeb","e","OS","nativeEvent","layout","value","createElement","_extends","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;\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 opaque?: boolean;\n onSize?: SharedValue<SkSize>;\n colorSpace?: \"p3\" | \"srgb\";\n ref?: React.Ref<CanvasRef>;\n __destroyWebGLContextAfterRender?: boolean;\n}\n\nexport const Canvas = ({\n debug,\n opaque,\n children,\n onSize,\n colorSpace = \"p3\",\n ref,\n // Here know this is a type error but this is done on purpose to check it at runtime\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n onLayout,\n ...viewProps\n}: CanvasProps) => {\n if (onLayout && isFabric) {\n console.error(\n // eslint-disable-next-line max-len\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 = useRef<View>(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 }, !!onSize);\n useEffect(() => {\n if (onSize) {\n Rea.runOnUI(() => {\n (global as Record<string, unknown>)[`__onSize_${nativeId}`] = onSize;\n })();\n return () => {\n Rea.runOnUI(() => {\n delete (global as Record<string, unknown>)[`__onSize_${nativeId}`];\n })();\n };\n }\n return undefined;\n }, [onSize, nativeId]);\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\n return (\n <SkiaPictureViewNativeComponent\n ref={viewRef}\n collapsable={false}\n nativeID={`${nativeId}`}\n debug={debug}\n opaque={opaque}\n colorSpace={colorSpace}\n onLayout={onLayoutWeb}\n {...viewProps}\n />\n );\n};\n"],"mappings":"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","ignoreList":[]}
@@ -3,7 +3,7 @@ import type { Server, WebSocket } from "ws";
3
3
  import type * as SkiaExports from "../../index";
4
4
  import type { SkImage, SkFont, Skia, SkCanvas } from "../../skia/types";
5
5
  import { SkiaSGRoot } from "../../sksg/Reconciler";
6
- type TestOS = "ios" | "android" | "web" | "node";
6
+ type TestOS = "ios" | "android" | "web" | "node" | "macos";
7
7
  declare global {
8
8
  var testServer: Server;
9
9
  var testClient: WebSocket;
@@ -1,6 +1,23 @@
1
1
  export const __esModule: boolean;
2
2
  export function Mock(CanvasKit: any): {
3
3
  Canvas: typeof import("react-native").View;
4
+ SkiaPictureView: typeof import("react-native").View;
5
+ JsiSkImage: typeof _JsiSkImage.JsiSkImage;
6
+ drawAsPicture: () => undefined;
7
+ drawAsImage: () => undefined;
8
+ drawAsImageFromPicture: () => undefined;
9
+ useCanvasRef: () => {
10
+ current: number;
11
+ };
12
+ useCanvasSize: () => {
13
+ ref: {
14
+ current: number;
15
+ };
16
+ size: {
17
+ width: number;
18
+ height: number;
19
+ };
20
+ };
4
21
  useValue: () => {
5
22
  current: number;
6
23
  };
@@ -20,6 +37,8 @@ export function Mock(CanvasKit: any): {
20
37
  current: number;
21
38
  };
22
39
  useValueEffect: () => undefined;
40
+ isOnMainThread: () => boolean;
41
+ isFabric: boolean;
23
42
  useClock: () => {
24
43
  value: number;
25
44
  };
@@ -61,3 +80,4 @@ export function Mock(CanvasKit: any): {
61
80
  readonly __esModule: boolean;
62
81
  readonly Skia: import("../../../src/headless").Skia;
63
82
  };
83
+ import _JsiSkImage = require("../skia/web/JsiSkImage");
@@ -1,5 +1,22 @@
1
1
  export function Mock(CanvasKit: any): {
2
2
  Canvas: typeof import("react-native").View;
3
+ SkiaPictureView: typeof import("react-native").View;
4
+ JsiSkImage: typeof JsiSkImage;
5
+ drawAsPicture: () => undefined;
6
+ drawAsImage: () => undefined;
7
+ drawAsImageFromPicture: () => undefined;
8
+ useCanvasRef: () => {
9
+ current: number;
10
+ };
11
+ useCanvasSize: () => {
12
+ ref: {
13
+ current: number;
14
+ };
15
+ size: {
16
+ width: number;
17
+ height: number;
18
+ };
19
+ };
3
20
  useValue: () => {
4
21
  current: number;
5
22
  };
@@ -19,6 +36,8 @@ export function Mock(CanvasKit: any): {
19
36
  current: number;
20
37
  };
21
38
  useValueEffect: () => undefined;
39
+ isOnMainThread: () => boolean;
40
+ isFabric: boolean;
22
41
  useClock: () => {
23
42
  value: number;
24
43
  };
@@ -61,7 +80,8 @@ export function Mock(CanvasKit: any): {
61
80
  enumKey: (k: any) => any;
62
81
  processPath: (Skia: any, rawPath: any) => any;
63
82
  isPathDef: (def: any) => boolean;
64
- size: (width?: number, height?: number) => {
83
+ size: (width?: number, // eslint-disable-next-line @typescript-eslint/no-explicit-any
84
+ height?: number) => {
65
85
  width: number;
66
86
  height: number;
67
87
  };
@@ -129,7 +149,8 @@ export function Mock(CanvasKit: any): {
129
149
  localMatrix: any;
130
150
  };
131
151
  getRect: (Skia: any, props: any) => any;
132
- processTransformProps: (m3: any, props: any) => void;
152
+ processTransformProps: (// eslint-disable-next-line @typescript-eslint/no-explicit-any
153
+ m3: any, props: any) => void;
133
154
  processTransformProps2: (Skia: any, props: any) => any;
134
155
  validateInterpolationOptions(type: any): {
135
156
  extrapolateLeft: any;
@@ -147,22 +168,19 @@ export function Mock(CanvasKit: any): {
147
168
  x: any;
148
169
  y: any;
149
170
  };
150
- interpolatePaths: (value: any, input: any, // Reanimated hooks
151
- outputRange: any, options: any, output: any) => any;
171
+ interpolatePaths: (value: any, input: any, outputRange: any, options: any, output: any) => any;
152
172
  Skia: import("../../../src/headless").Skia;
153
173
  loadData: (source: any, factory: any, onError: any) => Promise<any>;
154
174
  useCollectionLoading: (source: any, loader: any) => null;
155
175
  matchFont: (inputStyle?: {}, fontMgr?: import("../../..").SkFontMgr) => import("../../..").SkFont;
156
176
  listFontFamilies: (fontMgr?: import("../../..").SkFontMgr) => string[];
157
177
  makeImageFromView: (viewRef: any, callback?: null) => any;
158
- useAnimatedImage: (source: any, // eslint-disable-next-line @typescript-eslint/ban-ts-comment
159
- onError: any) => null;
178
+ useAnimatedImage: (source: any, onError: any) => null;
160
179
  createPicture: (cb: any, rect: any) => import("../../..").SkPicture;
161
180
  vec: (x: number | undefined, y: any) => import("../../..").SkPoint;
162
181
  point: (x: number | undefined, y: any) => import("../../..").SkPoint;
163
182
  neg: (a: any) => import("../../..").SkPoint;
164
- add: (a: any, // eslint-disable-next-line @typescript-eslint/ban-ts-comment
165
- b: any) => import("../../..").SkPoint;
183
+ add: (a: any, b: any) => import("../../..").SkPoint;
166
184
  sub: (a: any, b: any) => import("../../..").SkPoint;
167
185
  dist: (a: any, b: any) => number;
168
186
  rect: (x: any, y: any, width: any, height: any) => import("../../..").SkHostRect;
@@ -251,7 +269,8 @@ export function Mock(CanvasKit: any): {
251
269
  Path1DEffectStyle: {};
252
270
  PointMode: {};
253
271
  isRect: (def: any) => boolean;
254
- isRRect: (def: any) => boolean;
272
+ isRRect: (// eslint-disable-next-line @typescript-eslint/no-explicit-any
273
+ def: any) => boolean;
255
274
  PlaceholderAlignment: {};
256
275
  TextDirection: {};
257
276
  TextAlign: {};
@@ -291,15 +310,13 @@ export function Mock(CanvasKit: any): {
291
310
  RoundedRect: (props: any) => import("react").DOMElement<any, Element>;
292
311
  DiffRect: (props: any) => import("react").DOMElement<any, Element>;
293
312
  Line: (props: any) => import("react").DOMElement<any, Element>;
294
- Path: (// @ts-ignore
295
- { start, end, ...props }: {
313
+ Path: ({ start, end, ...props }: {
296
314
  [x: string]: any;
297
315
  start?: number | undefined;
298
316
  end?: number | undefined;
299
317
  }) => import("react").DOMElement<any, Element>;
300
318
  Oval: (props: any) => import("react").DOMElement<any, Element>;
301
- Points: (// @ts-ignore
302
- { mode, ...props }: {
319
+ Points: ({ mode, ...props }: {
303
320
  [x: string]: any;
304
321
  mode?: string | undefined;
305
322
  }) => import("react").DOMElement<any, Element>;
@@ -359,8 +376,7 @@ export function Mock(CanvasKit: any): {
359
376
  filter: any;
360
377
  children: any;
361
378
  }>;
362
- Image: (// @ts-ignore
363
- { fit, ...props }: {
379
+ Image: ({ fit, ...props }: {
364
380
  [x: string]: any;
365
381
  fit?: string | undefined;
366
382
  }) => import("react").DOMElement<any, Element>;
@@ -389,8 +405,7 @@ export function Mock(CanvasKit: any): {
389
405
  tileWidth?: number | undefined;
390
406
  tileHeight?: number | undefined;
391
407
  }) => import("react").DOMElement<any, Element>;
392
- Shader: (// @ts-ignore
393
- { uniforms, ...props }: {
408
+ Shader: ({ uniforms, ...props }: {
394
409
  [x: string]: any;
395
410
  uniforms?: {} | undefined;
396
411
  }) => import("react").DOMElement<any, Element>;
@@ -398,14 +413,12 @@ export function Mock(CanvasKit: any): {
398
413
  Math: string;
399
414
  Colors: string;
400
415
  };
401
- Text: (// @ts-ignore
402
- { x, y, ...props }: {
416
+ Text: ({ x, y, ...props }: {
403
417
  [x: string]: any;
404
418
  x?: number | undefined;
405
419
  y?: number | undefined;
406
420
  }) => import("react").DOMElement<any, Element>;
407
- Glyphs: (// @ts-ignore
408
- { x, y, ...props }: {
421
+ Glyphs: ({ x, y, ...props }: {
409
422
  [x: string]: any;
410
423
  x?: number | undefined;
411
424
  y?: number | undefined;
@@ -431,13 +444,11 @@ export function Mock(CanvasKit: any): {
431
444
  style?: string | undefined;
432
445
  respectCTM?: boolean | undefined;
433
446
  }) => import("react").DOMElement<any, Element>;
434
- Blur: (// @ts-ignore
435
- { mode, ...props }: {
447
+ Blur: ({ mode, ...props }: {
436
448
  [x: string]: any;
437
449
  mode?: string | undefined;
438
450
  }) => import("react").DOMElement<any, Element>;
439
- Offset: (// @ts-ignore
440
- { x, y, ...props }: {
451
+ Offset: ({ x, y, ...props }: {
441
452
  [x: string]: any;
442
453
  x?: number | undefined;
443
454
  y?: number | undefined;
@@ -486,7 +497,8 @@ export function Mock(CanvasKit: any): {
486
497
  mix: (value: any, x: any, y: any) => number;
487
498
  clamp: (value: any, lowerBound: any, upperBound: any) => number;
488
499
  saturate: (value: any) => number;
489
- rotate: (tr: any, origin: any, rotation: any) => {
500
+ rotate: (tr: any, origin: any, // eslint-disable-next-line @typescript-eslint/no-explicit-any
501
+ rotation: any) => {
490
502
  x: any;
491
503
  y: any;
492
504
  };
@@ -510,3 +522,4 @@ export function Mock(CanvasKit: any): {
510
522
  ImageFilter: (props: any) => import("react").DOMElement<any, Element>;
511
523
  Paragraph: (props: any) => import("react").DOMElement<any, Element>;
512
524
  };
525
+ import { JsiSkImage } from "../skia/web/JsiSkImage";
@@ -2,7 +2,7 @@ import type { Server, WebSocket } from "ws";
2
2
  declare global {
3
3
  var testServer: Server;
4
4
  var testClient: WebSocket;
5
- var testOS: "ios" | "android" | "web" | "node";
5
+ var testOS: "ios" | "android" | "web" | "node" | "macos";
6
6
  var testArch: "paper" | "fabric";
7
7
  }
8
8
  declare const globalSetup: () => Promise<void>;
@@ -0,0 +1 @@
1
+ export {};
@@ -1,7 +1,7 @@
1
1
  import type { FC, RefObject } from "react";
2
2
  import React from "react";
3
3
  import type { MeasureInWindowOnSuccessCallback, MeasureOnSuccessCallback, ViewProps } from "react-native";
4
- import { type SharedValue } from "react-native-reanimated";
4
+ import type { SharedValue } from "react-native-reanimated";
5
5
  import type { SkImage, SkRect, SkSize } from "../skia/types";
6
6
  export interface CanvasRef extends FC<CanvasProps> {
7
7
  makeImageSnapshot(rect?: SkRect): SkImage;
@@ -3,7 +3,7 @@ import type { Server, WebSocket } from "ws";
3
3
  import type * as SkiaExports from "../../index";
4
4
  import type { SkImage, SkFont, Skia, SkCanvas } from "../../skia/types";
5
5
  import { SkiaSGRoot } from "../../sksg/Reconciler";
6
- type TestOS = "ios" | "android" | "web" | "node";
6
+ type TestOS = "ios" | "android" | "web" | "node" | "macos";
7
7
  declare global {
8
8
  var testServer: Server;
9
9
  var testClient: WebSocket;
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.2.15",
11
+ "version": "2.2.17",
12
12
  "description": "High-performance React Native Graphics using Skia",
13
13
  "main": "lib/module/index.js",
14
14
  "react-native": "src/index.ts",
@@ -4,12 +4,14 @@ import { WebSocketServer } from "ws";
4
4
  declare global {
5
5
  var testServer: Server;
6
6
  var testClient: WebSocket;
7
- var testOS: "ios" | "android" | "web" | "node";
7
+ var testOS: "ios" | "android" | "web" | "node" | "macos";
8
8
  var testArch: "paper" | "fabric";
9
9
  }
10
10
 
11
- const isOS = (os: string): os is "android" | "ios" | "web" => {
12
- return ["ios", "android", "web"].indexOf(os) !== -1;
11
+ const isOS = (
12
+ os: string
13
+ ): os is "android" | "ios" | "web" | "node" | "macos" => {
14
+ return ["ios", "android", "web", "node", "macos"].indexOf(os) !== -1;
13
15
  };
14
16
 
15
17
  const isArch = (arc: string): arc is "paper" | "fabric" => {
@@ -0,0 +1,47 @@
1
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
2
+ global.CanvasKit = {} as any;
3
+ import { Mock } from "../index";
4
+
5
+ /**
6
+ * Added mocks to react-native stuff as needed so we can import the skia library
7
+ * without issues just to test that our mocks match up accordingly
8
+ */
9
+ jest.mock("../../skia/NativeSetup", () => ({}));
10
+ jest.mock("../../Platform/Platform", () => ({}));
11
+ jest.mock("react-native", () => ({
12
+ View: jest.fn(),
13
+ }));
14
+ jest.mock("../../specs/SkiaPictureViewNativeComponent", () => {});
15
+ jest.mock("../../external/reanimated/index", () => {});
16
+
17
+ describe("Mocks", () => {
18
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
19
+ const mocked = Mock({} as any);
20
+ const Skia = require("../../index");
21
+
22
+ afterAll(() => {
23
+ jest.clearAllMocks();
24
+ });
25
+
26
+ describe("Mocked module contains all exports", () => {
27
+ test.each(
28
+ Object.keys(Skia).map((k) => ({
29
+ key: k,
30
+ }))
31
+ )("$key should be in mock", ({ key }) => {
32
+ const mockExports = Object.keys(mocked);
33
+ expect(mockExports.includes(key)).toEqual(true);
34
+ expect(typeof mocked[key]).toEqual(typeof Skia[key]);
35
+ });
36
+ });
37
+
38
+ test("Skia mock contains all props", () => {
39
+ // ts-expect-error
40
+ const SkiaExports = Object.keys(Skia["Skia" as keyof typeof Skia]);
41
+ const mockSkia = Object.keys(mocked.Skia);
42
+
43
+ for (const skiaExport of SkiaExports) {
44
+ expect(mockSkia.find((exp) => exp === skiaExport)).toEqual(skiaExport);
45
+ }
46
+ });
47
+ });
package/src/mock/index.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import type { CanvasKit } from "canvaskit-wasm";
2
2
 
3
3
  import { JsiSkApi } from "../skia/web";
4
+ import { JsiSkImage } from "../skia/web/JsiSkImage";
4
5
 
5
6
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
6
7
  const Noop: () => any = () => undefined;
@@ -22,6 +23,21 @@ export const Mock = (CanvasKit: CanvasKit) => {
22
23
  ...require("../dom/types"),
23
24
  ...require("../dom/nodes"),
24
25
  Canvas: require("react-native").View,
26
+ SkiaPictureView: require("react-native").View,
27
+ JsiSkImage: JsiSkImage,
28
+ drawAsPicture: Noop,
29
+ drawAsImage: Noop,
30
+ drawAsImageFromPicture: Noop,
31
+ useCanvasRef: NoopValue,
32
+ useCanvasSize: () => ({
33
+ ref: {
34
+ current: 0,
35
+ },
36
+ size: {
37
+ width: 0,
38
+ height: 0,
39
+ },
40
+ }),
25
41
  // Skia Animations
26
42
  useValue: NoopValue,
27
43
  useComputedValue: NoopValue,
@@ -31,6 +47,8 @@ export const Mock = (CanvasKit: CanvasKit) => {
31
47
  useClockValue: NoopValue,
32
48
  useValueEffect: Noop,
33
49
  // Reanimated hooks
50
+ isOnMainThread: () => true,
51
+ isFabric: true,
34
52
  useClock: NoopSharedValue,
35
53
  usePathInterpolation: NoopSharedValue,
36
54
  useImageAsTexture: NoopSharedValue,
@@ -15,7 +15,7 @@ import type {
15
15
  View,
16
16
  ViewProps,
17
17
  } from "react-native";
18
- import { type SharedValue } from "react-native-reanimated";
18
+ import type { SharedValue } from "react-native-reanimated";
19
19
 
20
20
  import Rea from "../external/reanimated/ReanimatedProxy";
21
21
  import { SkiaViewNativeId } from "../views/SkiaViewNativeId";
@@ -24,6 +24,7 @@ import type { SkImage, SkRect, SkSize } from "../skia/types";
24
24
  import { SkiaSGRoot } from "../sksg/Reconciler";
25
25
  import { Skia } from "../skia";
26
26
  import { Platform } from "../Platform";
27
+ import { HAS_REANIMATED_3 } from "../external";
27
28
 
28
29
  export interface CanvasRef extends FC<CanvasProps> {
29
30
  makeImageSnapshot(rect?: SkRect): SkImage;
@@ -36,6 +37,8 @@ export interface CanvasRef extends FC<CanvasProps> {
36
37
 
37
38
  export const useCanvasRef = () => useRef<CanvasRef>(null);
38
39
 
40
+ const useReanimatedFrame = !HAS_REANIMATED_3 ? () => {} : Rea.useFrameCallback;
41
+
39
42
  export const useCanvasSize = (userRef?: RefObject<CanvasRef | null>) => {
40
43
  const ourRef = useCanvasRef();
41
44
  const ref = userRef ?? ourRef;
@@ -91,37 +94,22 @@ export const Canvas = ({
91
94
  // Root
92
95
  const root = useMemo(() => new SkiaSGRoot(Skia, nativeId), [nativeId]);
93
96
 
94
- const updateSize = useCallback(
95
- (value: SkSize) => {
96
- if (onSize) {
97
- onSize.value = value;
98
- }
99
- },
100
- [onSize]
101
- );
97
+ useReanimatedFrame(() => {
98
+ "worklet";
99
+ }, !!onSize);
102
100
  useEffect(() => {
103
101
  if (onSize) {
104
- const { runOnJS } = Rea;
105
- const uiOnSize = Rea.makeMutable({ width: 0, height: 0 });
106
102
  Rea.runOnUI(() => {
107
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
108
- // @ts-expect-error
109
- global[`__onSize_${nativeId}`] = uiOnSize;
110
- uiOnSize.addListener(nativeId, (value) => {
111
- runOnJS(updateSize)(value);
112
- });
103
+ (global as Record<string, unknown>)[`__onSize_${nativeId}`] = onSize;
113
104
  })();
114
105
  return () => {
115
106
  Rea.runOnUI(() => {
116
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
117
- // @ts-expect-error
118
- delete global[`__onSize_${nativeId}`];
119
- uiOnSize.removeListener(nativeId);
107
+ delete (global as Record<string, unknown>)[`__onSize_${nativeId}`];
120
108
  })();
121
109
  };
122
110
  }
123
111
  return undefined;
124
- }, [onSize, nativeId, updateSize]);
112
+ }, [onSize, nativeId]);
125
113
 
126
114
  // Render effects
127
115
  useLayoutEffect(() => {
@@ -21,7 +21,7 @@ import { SkiaObject } from "./e2e/setup";
21
21
 
22
22
  jest.setTimeout(180 * 1000);
23
23
 
24
- type TestOS = "ios" | "android" | "web" | "node";
24
+ type TestOS = "ios" | "android" | "web" | "node" | "macos";
25
25
 
26
26
  declare global {
27
27
  var testServer: Server;
package/jestEnv.mjs DELETED
@@ -1,23 +0,0 @@
1
- /* eslint-disable import/no-default-export */
2
- // eslint-disable-next-line import/no-extraneous-dependencies
3
- import { TestEnvironment } from "jest-environment-node";
4
- import CanvasKitInit from "canvaskit-wasm/bin/full/canvaskit";
5
-
6
- const CanvasKit = await CanvasKitInit({});
7
-
8
- export default class SkiaEnvironment extends TestEnvironment {
9
- constructor(config, context) {
10
- super(config, context);
11
- }
12
-
13
- async setup() {
14
- await super.setup();
15
- this.global.CanvasKit = CanvasKit;
16
- }
17
-
18
- async teardown() {}
19
-
20
- getVmContext() {
21
- return super.getVmContext();
22
- }
23
- }
File without changes