@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.
- package/apple/MetalWindowContext.mm +10 -0
- package/cpp/api/JsiSkImage.h +5 -9
- package/cpp/api/JsiSkSurface.h +4 -7
- package/cpp/api/JsiSkThreadSafeDeletion.h +9 -9
- package/cpp/api/recorder/Convertor.h +16 -0
- package/jestSetup.js +3 -2
- package/jestSetup.mjs +4 -27
- package/lib/commonjs/__tests__/globalSetup.d.ts +1 -1
- package/lib/commonjs/mock/__tests__/mock.spec.d.ts +1 -0
- package/lib/commonjs/mock/index.js +18 -0
- package/lib/commonjs/mock/index.js.map +1 -1
- package/lib/commonjs/renderer/Canvas.d.ts +1 -1
- package/lib/commonjs/renderer/Canvas.js +7 -22
- package/lib/commonjs/renderer/Canvas.js.map +1 -1
- package/lib/commonjs/renderer/__tests__/setup.d.ts +1 -1
- package/lib/module/__tests__/globalSetup.d.ts +1 -1
- package/lib/module/mock/__tests__/mock.spec.d.ts +1 -0
- package/lib/module/mock/index.js +18 -0
- package/lib/module/mock/index.js.map +1 -1
- package/lib/module/renderer/Canvas.d.ts +1 -1
- package/lib/module/renderer/Canvas.js +7 -22
- package/lib/module/renderer/Canvas.js.map +1 -1
- package/lib/module/renderer/__tests__/setup.d.ts +1 -1
- package/lib/typescript/lib/commonjs/mock/index.d.ts +20 -0
- package/lib/typescript/lib/module/mock/index.d.ts +39 -26
- package/lib/typescript/src/__tests__/globalSetup.d.ts +1 -1
- package/lib/typescript/src/mock/__tests__/mock.spec.d.ts +1 -0
- package/lib/typescript/src/renderer/Canvas.d.ts +1 -1
- package/lib/typescript/src/renderer/__tests__/setup.d.ts +1 -1
- package/package.json +1 -1
- package/src/__tests__/globalSetup.ts +5 -3
- package/src/mock/__tests__/mock.spec.ts +47 -0
- package/src/mock/index.ts +18 -0
- package/src/renderer/Canvas.tsx +10 -22
- package/src/renderer/__tests__/setup.tsx +1 -1
- package/jestEnv.mjs +0 -23
- /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 =
|
package/cpp/api/JsiSkImage.h
CHANGED
@@ -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
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
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 {
|
package/cpp/api/JsiSkSurface.h
CHANGED
@@ -44,13 +44,10 @@ public:
|
|
44
44
|
|
45
45
|
~JsiSkSurface() override {
|
46
46
|
// Handle thread-safe deletion
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
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.
|
36
|
-
*
|
35
|
+
* queues it for later deletion. Otherwise, allows immediate deletion.
|
36
|
+
* The object is always considered handled after this call.
|
37
37
|
*/
|
38
|
-
|
38
|
+
void handleDeletion(sk_sp<T> object) {
|
39
39
|
if (!object) {
|
40
|
-
return
|
40
|
+
return;
|
41
41
|
}
|
42
42
|
|
43
43
|
#ifdef DISABLE_THREAD_SAFE_DELETION
|
44
|
-
// When disabled,
|
44
|
+
// When disabled, allow immediate deletion
|
45
45
|
// This will likely cause crashes when objects are deleted on wrong thread
|
46
|
-
return
|
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
|
56
|
+
return;
|
57
57
|
}
|
58
58
|
|
59
|
-
// We're on the correct thread,
|
60
|
-
return
|
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/
|
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
|
-
|
2
|
-
|
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
|
-
|
9
|
-
|
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,
|
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 {
|
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
|
-
|
75
|
-
|
76
|
-
|
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
|
-
|
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
|
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":";;;;;;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,SAAAG,yBAAAH,CAAA,6BAAAI,OAAA,mBAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAD,wBAAA,YAAAA,CAAAH,CAAA,WAAAA,CAAA,GAAAM,CAAA,GAAAD,CAAA,KAAAL,CAAA;AAAA,SAAAX,wBAAAW,CAAA,EAAAK,CAAA,SAAAA,CAAA,IAAAL,CAAA,IAAAA,CAAA,CAAAC,UAAA,SAAAD,CAAA,eAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,WAAAE,OAAA,EAAAF,CAAA,QAAAM,CAAA,GAAAH,wBAAA,CAAAE,CAAA,OAAAC,CAAA,IAAAA,CAAA,CAAAC,GAAA,CAAAP,CAAA,UAAAM,CAAA,CAAAE,GAAA,CAAAR,CAAA,OAAAS,CAAA,KAAAC,SAAA,UAAAC,CAAA,GAAAC,MAAA,CAAAC,cAAA,IAAAD,MAAA,CAAAE,wBAAA,WAAAC,CAAA,IAAAf,CAAA,oBAAAe,CAAA,OAAAC,cAAA,CAAAC,IAAA,CAAAjB,CAAA,EAAAe,CAAA,SAAAG,CAAA,GAAAP,CAAA,GAAAC,MAAA,CAAAE,wBAAA,CAAAd,CAAA,EAAAe,CAAA,UAAAG,CAAA,KAAAA,CAAA,CAAAV,GAAA,IAAAU,CAAA,CAAAC,GAAA,IAAAP,MAAA,CAAAC,cAAA,CAAAJ,CAAA,EAAAM,CAAA,EAAAG,CAAA,IAAAT,CAAA,CAAAM,CAAA,IAAAf,CAAA,CAAAe,CAAA,YAAAN,CAAA,CAAAP,OAAA,GAAAF,CAAA,EAAAM,CAAA,IAAAA,CAAA,CAAAa,GAAA,CAAAnB,CAAA,EAAAS,CAAA,GAAAA,CAAA;AAAA,SAAAW,SAAA,WAAAA,QAAA,GAAAR,MAAA,CAAAS,MAAA,GAAAT,MAAA,CAAAS,MAAA,CAAAC,IAAA,eAAAb,CAAA,aAAAT,CAAA,MAAAA,CAAA,GAAAuB,SAAA,CAAAC,MAAA,EAAAxB,CAAA,UAAAM,CAAA,GAAAiB,SAAA,CAAAvB,CAAA,YAAAK,CAAA,IAAAC,CAAA,OAAAU,cAAA,CAAAC,IAAA,CAAAX,CAAA,EAAAD,CAAA,MAAAI,CAAA,CAAAJ,CAAA,IAAAC,CAAA,CAAAD,CAAA,aAAAI,CAAA,KAAAW,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;AAEvE,MAAMC,aAAa,GAAIC,OAAqC,IAAK;EACtE,MAAMC,MAAM,GAAGT,YAAY,CAAC,CAAC;EAC7B,MAAMU,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,CAACC,OAAO,CAAC,CAACC,EAAE,EAAEC,EAAE,EAAEN,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;AAAAT,OAAA,CAAAK,aAAA,GAAAA,aAAA;AACO,MAAMc,QAAQ,GAAAnB,OAAA,CAAAmB,QAAA,GAAGC,OAAO,EAAAjD,OAAA,GAAEkD,MAAM,cAAAlD,OAAA,uBAAPA,OAAA,CAAiBmD,qBAAqB,CAAC;AAWhE,MAAMC,MAAM,GAAGA,CAAC;EACrBC,KAAK;EACLC,MAAM;EACNC,QAAQ;EACRC,MAAM;EACNC,UAAU,GAAG,IAAI;EACjBpB,GAAG;EACH;EACA;EACA;EACAqB,QAAQ;EACR,GAAGC;AACQ,CAAC,KAAK;EACjB,IAAID,QAAQ,IAAIV,QAAQ,EAAE;IACxBY,OAAO,CAACC,KAAK;IACX;IACA,2LACF,CAAC;EACH;EACA,MAAMC,OAAO,GAAG,IAAAlC,aAAM,EAAO,IAAI,CAAC;EAClC;EACA,MAAMmC,QAAQ,GAAG,IAAAC,cAAO,EAAC,MAAM;IAC7B,OAAOC,kCAAgB,CAACrB,OAAO,EAAE;EACnC,CAAC,EAAE,EAAE,CAAC;;EAEN;EACA,MAAMsB,IAAI,GAAG,IAAAF,cAAO,EAAC,MAAM,IAAIG,sBAAU,CAACC,UAAI,EAAEL,QAAQ,CAAC,EAAE,CAACA,QAAQ,CAAC,CAAC;EAEtEjC,kBAAkB,CAAC,MAAM;IACvB,SAAS;EACX,CAAC,EAAE,CAAC,CAAC0B,MAAM,CAAC;EACZ,IAAAa,gBAAS,EAAC,MAAM;IACd,IAAIb,MAAM,EAAE;MACVxB,wBAAG,CAACsC,OAAO,CAAC,MAAM;QACfpB,MAAM,CAA6B,YAAYa,QAAQ,EAAE,CAAC,GAAGP,MAAM;MACtE,CAAC,CAAC,CAAC,CAAC;MACJ,OAAO,MAAM;QACXxB,wBAAG,CAACsC,OAAO,CAAC,MAAM;UAChB,OAAQpB,MAAM,CAA6B,YAAYa,QAAQ,EAAE,CAAC;QACpE,CAAC,CAAC,CAAC,CAAC;MACN,CAAC;IACH;IACA,OAAOQ,SAAS;EAClB,CAAC,EAAE,CAACf,MAAM,EAAEO,QAAQ,CAAC,CAAC;;EAEtB;EACA,IAAApB,sBAAe,EAAC,MAAM;IACpBuB,IAAI,CAACM,MAAM,CAACjB,QAAQ,CAAC;EACvB,CAAC,EAAE,CAACA,QAAQ,EAAEW,IAAI,EAAEH,QAAQ,CAAC,CAAC;EAE9B,IAAAM,gBAAS,EAAC,MAAM;IACd,OAAO,MAAM;MACXH,IAAI,CAACO,OAAO,CAAC,CAAC;IAChB,CAAC;EACH,CAAC,EAAE,CAACP,IAAI,CAAC,CAAC;;EAEV;EACA,IAAAQ,0BAAmB,EACjBrC,GAAG,EACH,OACG;IACCsC,iBAAiB,EAAGC,IAAa,IAAK;MACpC,OAAOC,WAAW,CAACF,iBAAiB,CAACZ,QAAQ,EAAEa,IAAI,CAAC;IACtD,CAAC;IACDE,sBAAsB,EAAGF,IAAa,IAAK;MACzC,OAAOC,WAAW,CAACC,sBAAsB,CAACf,QAAQ,EAAEa,IAAI,CAAC;IAC3D,CAAC;IACDG,MAAM,EAAEA,CAAA,KAAM;MACZF,WAAW,CAACG,aAAa,CAACjB,QAAQ,CAAC;IACrC,CAAC;IACDkB,WAAW,EAAEA,CAAA,KAAM;MACjB,OAAOlB,QAAQ;IACjB,CAAC;IACDlB,OAAO,EAAGqC,QAAQ,IAAK;MAAA,IAAAC,gBAAA;MACrB,CAAAA,gBAAA,GAAArB,OAAO,CAAClB,OAAO,cAAAuC,gBAAA,eAAfA,gBAAA,CAAiBtC,OAAO,CAACqC,QAAQ,CAAC;IACpC,CAAC;IACDE,eAAe,EAAGF,QAAQ,IAAK;MAAA,IAAAG,iBAAA;MAC7B,CAAAA,iBAAA,GAAAvB,OAAO,CAAClB,OAAO,cAAAyC,iBAAA,eAAfA,iBAAA,CAAiBD,eAAe,CAACF,QAAQ,CAAC;IAC5C;EACF,CAAC,CACL,CAAC;EAED,MAAMI,WAAW,GAAG,IAAAC,kBAAW,EAC5BtF,CAAoB,IAAK;IACxB,IAAIyD,QAAQ,EAAE;MACZA,QAAQ,CAACzD,CAAC,CAAC;IACb;IACA,IAAIuF,kBAAQ,CAACC,EAAE,KAAK,KAAK,IAAIjC,MAAM,EAAE;MACnC,MAAM;QAAEf,KAAK;QAAEC;MAAO,CAAC,GAAGzC,CAAC,CAACyF,WAAW,CAACC,MAAM;MAC9CnC,MAAM,CAACoC,KAAK,GAAG;QAAEnD,KAAK;QAAEC;MAAO,CAAC;IAClC;EACF,CAAC,EACD,CAACgB,QAAQ,EAAEF,MAAM,CACnB,CAAC;EAED,oBACEnE,MAAA,CAAAc,OAAA,CAAA0F,aAAA,CAAClG,+BAAA,CAAAQ,OAA8B,EAAAkB,QAAA;IAC7BgB,GAAG,EAAEyB,OAAQ;IACbgC,WAAW,EAAE,KAAM;IACnBC,QAAQ,EAAE,GAAGhC,QAAQ,EAAG;IACxBV,KAAK,EAAEA,KAAM;IACbC,MAAM,EAAEA,MAAO;IACfG,UAAU,EAAEA,UAAW;IACvBC,QAAQ,EAAE4B;EAAY,GAClB3B,SAAS,CACd,CAAC;AAEN,CAAC;AAAC9B,OAAA,CAAAuB,MAAA,GAAAA,MAAA","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 {};
|
package/lib/module/mock/index.js
CHANGED
@@ -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;;
|
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 {
|
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
|
-
|
64
|
-
|
65
|
-
|
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
|
-
|
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
|
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,
|
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: (
|
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,
|
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,
|
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,
|
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: (
|
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: (
|
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: (
|
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: (
|
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: (
|
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: (
|
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: (
|
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: (
|
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: (
|
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,
|
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 {
|
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.
|
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 = (
|
12
|
-
|
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,
|
package/src/renderer/Canvas.tsx
CHANGED
@@ -15,7 +15,7 @@ import type {
|
|
15
15
|
View,
|
16
16
|
ViewProps,
|
17
17
|
} from "react-native";
|
18
|
-
import {
|
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
|
-
|
95
|
-
|
96
|
-
|
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
|
-
|
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
|
-
|
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
|
112
|
+
}, [onSize, nativeId]);
|
125
113
|
|
126
114
|
// Render effects
|
127
115
|
useLayoutEffect(() => {
|
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
|