@shopify/react-native-skia 0.1.232 → 0.1.234
Sign up to get free protection for your applications and to get access to all the features.
- package/android/CMakeLists.txt +0 -1
- package/android/cpp/jni/JniSkiaManager.cpp +0 -1
- package/android/cpp/rnskia-android/RNSkAndroidView.h +0 -1
- package/android/cpp/rnskia-android/RNSkOpenGLCanvasProvider.cpp +1 -1
- package/android/cpp/rnskia-android/RNSkOpenGLCanvasProvider.h +1 -2
- package/lib/commonjs/external/reanimated/interpolators.js +3 -1
- package/lib/commonjs/external/reanimated/interpolators.js.map +1 -1
- package/lib/commonjs/renderer/Canvas.js +10 -4
- package/lib/commonjs/renderer/Canvas.js.map +1 -1
- package/lib/commonjs/renderer/HostConfig.js +1 -1
- package/lib/commonjs/renderer/HostConfig.js.map +1 -1
- package/lib/commonjs/renderer/Reconciler.d.ts +1 -0
- package/lib/commonjs/renderer/Reconciler.js +4 -0
- package/lib/commonjs/renderer/Reconciler.js.map +1 -1
- package/lib/commonjs/skia/types/Shader/Shader.js +1 -1
- package/lib/commonjs/skia/types/Shader/Shader.js.map +1 -1
- package/lib/commonjs/skia/web/JsiSkPath.d.ts +2 -2
- package/lib/commonjs/skia/web/JsiSkPath.js +10 -2
- package/lib/commonjs/skia/web/JsiSkPath.js.map +1 -1
- package/lib/commonjs/views/SkiaJSDomView.d.ts +31 -0
- package/lib/commonjs/views/SkiaJSDomView.js +161 -0
- package/lib/commonjs/views/SkiaJSDomView.js.map +1 -0
- package/lib/commonjs/views/SkiaJSDomView.web.d.ts +1 -0
- package/lib/commonjs/views/SkiaJSDomView.web.js +14 -0
- package/lib/commonjs/views/SkiaJSDomView.web.js.map +1 -0
- package/lib/module/external/reanimated/interpolators.js +2 -1
- package/lib/module/external/reanimated/interpolators.js.map +1 -1
- package/lib/module/renderer/Canvas.js +9 -3
- package/lib/module/renderer/Canvas.js.map +1 -1
- package/lib/module/renderer/HostConfig.js +1 -1
- package/lib/module/renderer/HostConfig.js.map +1 -1
- package/lib/module/renderer/Reconciler.d.ts +1 -0
- package/lib/module/renderer/Reconciler.js +4 -0
- package/lib/module/renderer/Reconciler.js.map +1 -1
- package/lib/module/skia/types/Shader/Shader.js +1 -1
- package/lib/module/skia/types/Shader/Shader.js.map +1 -1
- package/lib/module/skia/web/JsiSkPath.d.ts +2 -2
- package/lib/module/skia/web/JsiSkPath.js +10 -2
- package/lib/module/skia/web/JsiSkPath.js.map +1 -1
- package/lib/module/views/SkiaJSDomView.d.ts +31 -0
- package/lib/module/views/SkiaJSDomView.js +136 -0
- package/lib/module/views/SkiaJSDomView.js.map +1 -0
- package/lib/module/views/SkiaJSDomView.web.d.ts +1 -0
- package/lib/module/views/SkiaJSDomView.web.js +2 -0
- package/lib/module/views/SkiaJSDomView.web.js.map +1 -0
- package/lib/typescript/src/renderer/Reconciler.d.ts +1 -0
- package/lib/typescript/src/skia/web/JsiSkPath.d.ts +2 -2
- package/lib/typescript/src/views/SkiaJSDomView.d.ts +31 -0
- package/lib/typescript/src/views/SkiaJSDomView.web.d.ts +1 -0
- package/package.json +1 -1
- package/src/external/reanimated/interpolators.ts +2 -1
- package/src/renderer/Canvas.tsx +9 -2
- package/src/renderer/HostConfig.ts +1 -1
- package/src/renderer/Reconciler.tsx +4 -0
- package/src/skia/types/Shader/Shader.ts +1 -1
- package/src/skia/web/JsiSkPath.ts +23 -3
- package/src/views/SkiaJSDomView.tsx +126 -0
- package/src/views/SkiaJSDomView.web.tsx +1 -0
- package/android/cpp/jni/include/JniSkiaDrawView.h +0 -90
- package/cpp/rnskia/RNSkJsView.cpp +0 -236
- package/cpp/rnskia/RNSkJsView.h +0 -121
@@ -0,0 +1,31 @@
|
|
1
|
+
import React from "react";
|
2
|
+
import type { Skia, SkRect } from "../skia/types";
|
3
|
+
import type { SkiaDomViewProps } from "./types";
|
4
|
+
export declare class SkiaJSDomView extends React.Component<SkiaDomViewProps & {
|
5
|
+
Skia: Skia;
|
6
|
+
}> {
|
7
|
+
constructor(props: SkiaDomViewProps & {
|
8
|
+
Skia: Skia;
|
9
|
+
});
|
10
|
+
private _nativeId;
|
11
|
+
get nativeId(): number;
|
12
|
+
componentDidUpdate(prevProps: SkiaDomViewProps & {
|
13
|
+
Skia: Skia;
|
14
|
+
}): void;
|
15
|
+
/**
|
16
|
+
* Creates a snapshot from the canvas in the surface
|
17
|
+
* @param rect Rect to use as bounds. Optional.
|
18
|
+
* @returns An Image object.
|
19
|
+
*/
|
20
|
+
makeImageSnapshot(rect?: SkRect): import("../skia/types").SkImage;
|
21
|
+
/**
|
22
|
+
* Sends a redraw request to the native SkiaView.
|
23
|
+
*/
|
24
|
+
redraw(): void;
|
25
|
+
private draw;
|
26
|
+
/**
|
27
|
+
* Clear up the dom node when unmounting to release resources.
|
28
|
+
*/
|
29
|
+
componentWillUnmount(): void;
|
30
|
+
render(): React.JSX.Element;
|
31
|
+
}
|
@@ -0,0 +1,136 @@
|
|
1
|
+
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
2
|
+
|
3
|
+
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
4
|
+
|
5
|
+
import React from "react";
|
6
|
+
import { Platform } from "../Platform";
|
7
|
+
import SkiaPictureViewNativeComponent from "../specs/SkiaPictureViewNativeComponent";
|
8
|
+
import { JsiDrawingContext } from "../dom/types";
|
9
|
+
import { SkiaViewApi } from "./api";
|
10
|
+
import { SkiaViewNativeId } from "./SkiaViewNativeId";
|
11
|
+
const NativeSkiaPictureView = Platform.OS !== "web" ? SkiaPictureViewNativeComponent : // eslint-disable-next-line @typescript-eslint/no-explicit-any
|
12
|
+
null;
|
13
|
+
export class SkiaJSDomView extends React.Component {
|
14
|
+
constructor(props) {
|
15
|
+
super(props);
|
16
|
+
|
17
|
+
_defineProperty(this, "_nativeId", void 0);
|
18
|
+
|
19
|
+
this._nativeId = SkiaViewNativeId.current++;
|
20
|
+
const {
|
21
|
+
root,
|
22
|
+
onTouch,
|
23
|
+
onSize
|
24
|
+
} = props;
|
25
|
+
|
26
|
+
if (root) {
|
27
|
+
assertSkiaViewApi();
|
28
|
+
SkiaViewApi.setJsiProperty(this._nativeId, "root", root);
|
29
|
+
}
|
30
|
+
|
31
|
+
if (onTouch) {
|
32
|
+
assertSkiaViewApi();
|
33
|
+
SkiaViewApi.setJsiProperty(this._nativeId, "onTouch", onTouch);
|
34
|
+
}
|
35
|
+
|
36
|
+
if (onSize) {
|
37
|
+
assertSkiaViewApi();
|
38
|
+
SkiaViewApi.setJsiProperty(this._nativeId, "onSize", onSize);
|
39
|
+
}
|
40
|
+
}
|
41
|
+
|
42
|
+
get nativeId() {
|
43
|
+
return this._nativeId;
|
44
|
+
}
|
45
|
+
|
46
|
+
componentDidUpdate(prevProps) {
|
47
|
+
const {
|
48
|
+
root,
|
49
|
+
onTouch,
|
50
|
+
onSize
|
51
|
+
} = this.props;
|
52
|
+
|
53
|
+
if (root !== prevProps.root && root !== undefined) {
|
54
|
+
assertSkiaViewApi();
|
55
|
+
this.draw();
|
56
|
+
}
|
57
|
+
|
58
|
+
if (onTouch !== prevProps.onTouch) {
|
59
|
+
assertSkiaViewApi();
|
60
|
+
SkiaViewApi.setJsiProperty(this._nativeId, "onTouch", onTouch);
|
61
|
+
}
|
62
|
+
|
63
|
+
if (onSize !== prevProps.onSize) {
|
64
|
+
assertSkiaViewApi();
|
65
|
+
SkiaViewApi.setJsiProperty(this._nativeId, "onSize", onSize);
|
66
|
+
}
|
67
|
+
}
|
68
|
+
/**
|
69
|
+
* Creates a snapshot from the canvas in the surface
|
70
|
+
* @param rect Rect to use as bounds. Optional.
|
71
|
+
* @returns An Image object.
|
72
|
+
*/
|
73
|
+
|
74
|
+
|
75
|
+
makeImageSnapshot(rect) {
|
76
|
+
assertSkiaViewApi();
|
77
|
+
return SkiaViewApi.makeImageSnapshot(this._nativeId, rect);
|
78
|
+
}
|
79
|
+
/**
|
80
|
+
* Sends a redraw request to the native SkiaView.
|
81
|
+
*/
|
82
|
+
|
83
|
+
|
84
|
+
redraw() {
|
85
|
+
assertSkiaViewApi();
|
86
|
+
this.draw(); //SkiaViewApi.requestRedraw(this._nativeId);
|
87
|
+
}
|
88
|
+
|
89
|
+
draw() {
|
90
|
+
const {
|
91
|
+
root,
|
92
|
+
Skia
|
93
|
+
} = this.props;
|
94
|
+
|
95
|
+
if (root !== undefined) {
|
96
|
+
assertSkiaViewApi();
|
97
|
+
const rec = Skia.PictureRecorder();
|
98
|
+
const canvas = rec.beginRecording();
|
99
|
+
const ctx = new JsiDrawingContext(Skia, canvas);
|
100
|
+
root.render(ctx);
|
101
|
+
const picture = rec.finishRecordingAsPicture();
|
102
|
+
SkiaViewApi.setJsiProperty(this._nativeId, "picture", picture);
|
103
|
+
}
|
104
|
+
}
|
105
|
+
/**
|
106
|
+
* Clear up the dom node when unmounting to release resources.
|
107
|
+
*/
|
108
|
+
|
109
|
+
|
110
|
+
componentWillUnmount() {
|
111
|
+
assertSkiaViewApi();
|
112
|
+
SkiaViewApi.setJsiProperty(this._nativeId, "picture", null);
|
113
|
+
}
|
114
|
+
|
115
|
+
render() {
|
116
|
+
const {
|
117
|
+
mode,
|
118
|
+
debug = false,
|
119
|
+
...viewProps
|
120
|
+
} = this.props;
|
121
|
+
return /*#__PURE__*/React.createElement(NativeSkiaPictureView, _extends({
|
122
|
+
collapsable: false,
|
123
|
+
nativeID: `${this._nativeId}`,
|
124
|
+
mode: mode,
|
125
|
+
debug: debug
|
126
|
+
}, viewProps));
|
127
|
+
}
|
128
|
+
|
129
|
+
}
|
130
|
+
|
131
|
+
const assertSkiaViewApi = () => {
|
132
|
+
if (SkiaViewApi === null || SkiaViewApi.setJsiProperty === null || SkiaViewApi.callJsiMethod === null || SkiaViewApi.requestRedraw === null || SkiaViewApi.makeImageSnapshot === null) {
|
133
|
+
throw Error("Skia View Api was not found.");
|
134
|
+
}
|
135
|
+
};
|
136
|
+
//# sourceMappingURL=SkiaJSDomView.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"names":["React","Platform","SkiaPictureViewNativeComponent","JsiDrawingContext","SkiaViewApi","SkiaViewNativeId","NativeSkiaPictureView","OS","SkiaJSDomView","Component","constructor","props","_nativeId","current","root","onTouch","onSize","assertSkiaViewApi","setJsiProperty","nativeId","componentDidUpdate","prevProps","undefined","draw","makeImageSnapshot","rect","redraw","Skia","rec","PictureRecorder","canvas","beginRecording","ctx","render","picture","finishRecordingAsPicture","componentWillUnmount","mode","debug","viewProps","callJsiMethod","requestRedraw","Error"],"sources":["SkiaJSDomView.tsx"],"sourcesContent":["import React from \"react\";\nimport type { HostComponent } from \"react-native\";\n\nimport type { Skia, SkRect } from \"../skia/types\";\nimport { Platform } from \"../Platform\";\nimport SkiaPictureViewNativeComponent from \"../specs/SkiaPictureViewNativeComponent\";\nimport { JsiDrawingContext } from \"../dom/types\";\n\nimport { SkiaViewApi } from \"./api\";\nimport type { SkiaPictureViewProps, SkiaDomViewProps } from \"./types\";\nimport { SkiaViewNativeId } from \"./SkiaViewNativeId\";\n\nconst NativeSkiaPictureView: HostComponent<SkiaPictureViewProps> =\n Platform.OS !== \"web\"\n ? SkiaPictureViewNativeComponent\n : // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (null as any);\n\nexport class SkiaJSDomView extends React.Component<\n SkiaDomViewProps & { Skia: Skia }\n> {\n constructor(props: SkiaDomViewProps & { Skia: Skia }) {\n super(props);\n this._nativeId = SkiaViewNativeId.current++;\n const { root, onTouch, onSize } = props;\n if (root) {\n assertSkiaViewApi();\n SkiaViewApi.setJsiProperty(this._nativeId, \"root\", root);\n }\n if (onTouch) {\n assertSkiaViewApi();\n SkiaViewApi.setJsiProperty(this._nativeId, \"onTouch\", onTouch);\n }\n if (onSize) {\n assertSkiaViewApi();\n SkiaViewApi.setJsiProperty(this._nativeId, \"onSize\", onSize);\n }\n }\n\n private _nativeId: number;\n\n public get nativeId() {\n return this._nativeId;\n }\n\n componentDidUpdate(prevProps: SkiaDomViewProps & { Skia: Skia }) {\n const { root, onTouch, onSize } = this.props;\n if (root !== prevProps.root && root !== undefined) {\n assertSkiaViewApi();\n this.draw();\n }\n if (onTouch !== prevProps.onTouch) {\n assertSkiaViewApi();\n SkiaViewApi.setJsiProperty(this._nativeId, \"onTouch\", onTouch);\n }\n if (onSize !== prevProps.onSize) {\n assertSkiaViewApi();\n SkiaViewApi.setJsiProperty(this._nativeId, \"onSize\", onSize);\n }\n }\n\n /**\n * Creates a snapshot from the canvas in the surface\n * @param rect Rect to use as bounds. Optional.\n * @returns An Image object.\n */\n public makeImageSnapshot(rect?: SkRect) {\n assertSkiaViewApi();\n return SkiaViewApi.makeImageSnapshot(this._nativeId, rect);\n }\n\n /**\n * Sends a redraw request to the native SkiaView.\n */\n public redraw() {\n assertSkiaViewApi();\n this.draw();\n //SkiaViewApi.requestRedraw(this._nativeId);\n }\n\n private draw() {\n const { root, Skia } = this.props;\n if (root !== undefined) {\n assertSkiaViewApi();\n const rec = Skia.PictureRecorder();\n const canvas = rec.beginRecording();\n const ctx = new JsiDrawingContext(Skia, canvas);\n root.render(ctx);\n const picture = rec.finishRecordingAsPicture();\n SkiaViewApi.setJsiProperty(this._nativeId, \"picture\", picture);\n }\n }\n\n /**\n * Clear up the dom node when unmounting to release resources.\n */\n componentWillUnmount(): void {\n assertSkiaViewApi();\n SkiaViewApi.setJsiProperty(this._nativeId, \"picture\", null);\n }\n\n render() {\n const { mode, debug = false, ...viewProps } = this.props;\n return (\n <NativeSkiaPictureView\n collapsable={false}\n nativeID={`${this._nativeId}`}\n mode={mode}\n debug={debug}\n {...viewProps}\n />\n );\n }\n}\n\nconst assertSkiaViewApi = () => {\n if (\n SkiaViewApi === null ||\n SkiaViewApi.setJsiProperty === null ||\n SkiaViewApi.callJsiMethod === null ||\n SkiaViewApi.requestRedraw === null ||\n SkiaViewApi.makeImageSnapshot === null\n ) {\n throw Error(\"Skia View Api was not found.\");\n }\n};\n"],"mappings":";;;;AAAA,OAAOA,KAAP,MAAkB,OAAlB;AAIA,SAASC,QAAT,QAAyB,aAAzB;AACA,OAAOC,8BAAP,MAA2C,yCAA3C;AACA,SAASC,iBAAT,QAAkC,cAAlC;AAEA,SAASC,WAAT,QAA4B,OAA5B;AAEA,SAASC,gBAAT,QAAiC,oBAAjC;AAEA,MAAMC,qBAA0D,GAC9DL,QAAQ,CAACM,EAAT,KAAgB,KAAhB,GACIL,8BADJ,GAEI;AACC,IAJP;AAMA,OAAO,MAAMM,aAAN,SAA4BR,KAAK,CAACS,SAAlC,CAEL;EACAC,WAAW,CAACC,KAAD,EAA2C;IACpD,MAAMA,KAAN;;IADoD;;IAEpD,KAAKC,SAAL,GAAiBP,gBAAgB,CAACQ,OAAjB,EAAjB;IACA,MAAM;MAAEC,IAAF;MAAQC,OAAR;MAAiBC;IAAjB,IAA4BL,KAAlC;;IACA,IAAIG,IAAJ,EAAU;MACRG,iBAAiB;MACjBb,WAAW,CAACc,cAAZ,CAA2B,KAAKN,SAAhC,EAA2C,MAA3C,EAAmDE,IAAnD;IACD;;IACD,IAAIC,OAAJ,EAAa;MACXE,iBAAiB;MACjBb,WAAW,CAACc,cAAZ,CAA2B,KAAKN,SAAhC,EAA2C,SAA3C,EAAsDG,OAAtD;IACD;;IACD,IAAIC,MAAJ,EAAY;MACVC,iBAAiB;MACjBb,WAAW,CAACc,cAAZ,CAA2B,KAAKN,SAAhC,EAA2C,QAA3C,EAAqDI,MAArD;IACD;EACF;;EAIkB,IAARG,QAAQ,GAAG;IACpB,OAAO,KAAKP,SAAZ;EACD;;EAEDQ,kBAAkB,CAACC,SAAD,EAA+C;IAC/D,MAAM;MAAEP,IAAF;MAAQC,OAAR;MAAiBC;IAAjB,IAA4B,KAAKL,KAAvC;;IACA,IAAIG,IAAI,KAAKO,SAAS,CAACP,IAAnB,IAA2BA,IAAI,KAAKQ,SAAxC,EAAmD;MACjDL,iBAAiB;MACjB,KAAKM,IAAL;IACD;;IACD,IAAIR,OAAO,KAAKM,SAAS,CAACN,OAA1B,EAAmC;MACjCE,iBAAiB;MACjBb,WAAW,CAACc,cAAZ,CAA2B,KAAKN,SAAhC,EAA2C,SAA3C,EAAsDG,OAAtD;IACD;;IACD,IAAIC,MAAM,KAAKK,SAAS,CAACL,MAAzB,EAAiC;MAC/BC,iBAAiB;MACjBb,WAAW,CAACc,cAAZ,CAA2B,KAAKN,SAAhC,EAA2C,QAA3C,EAAqDI,MAArD;IACD;EACF;EAED;AACF;AACA;AACA;AACA;;;EACSQ,iBAAiB,CAACC,IAAD,EAAgB;IACtCR,iBAAiB;IACjB,OAAOb,WAAW,CAACoB,iBAAZ,CAA8B,KAAKZ,SAAnC,EAA8Ca,IAA9C,CAAP;EACD;EAED;AACF;AACA;;;EACSC,MAAM,GAAG;IACdT,iBAAiB;IACjB,KAAKM,IAAL,GAFc,CAGd;EACD;;EAEOA,IAAI,GAAG;IACb,MAAM;MAAET,IAAF;MAAQa;IAAR,IAAiB,KAAKhB,KAA5B;;IACA,IAAIG,IAAI,KAAKQ,SAAb,EAAwB;MACtBL,iBAAiB;MACjB,MAAMW,GAAG,GAAGD,IAAI,CAACE,eAAL,EAAZ;MACA,MAAMC,MAAM,GAAGF,GAAG,CAACG,cAAJ,EAAf;MACA,MAAMC,GAAG,GAAG,IAAI7B,iBAAJ,CAAsBwB,IAAtB,EAA4BG,MAA5B,CAAZ;MACAhB,IAAI,CAACmB,MAAL,CAAYD,GAAZ;MACA,MAAME,OAAO,GAAGN,GAAG,CAACO,wBAAJ,EAAhB;MACA/B,WAAW,CAACc,cAAZ,CAA2B,KAAKN,SAAhC,EAA2C,SAA3C,EAAsDsB,OAAtD;IACD;EACF;EAED;AACF;AACA;;;EACEE,oBAAoB,GAAS;IAC3BnB,iBAAiB;IACjBb,WAAW,CAACc,cAAZ,CAA2B,KAAKN,SAAhC,EAA2C,SAA3C,EAAsD,IAAtD;EACD;;EAEDqB,MAAM,GAAG;IACP,MAAM;MAAEI,IAAF;MAAQC,KAAK,GAAG,KAAhB;MAAuB,GAAGC;IAA1B,IAAwC,KAAK5B,KAAnD;IACA,oBACE,oBAAC,qBAAD;MACE,WAAW,EAAE,KADf;MAEE,QAAQ,EAAG,GAAE,KAAKC,SAAU,EAF9B;MAGE,IAAI,EAAEyB,IAHR;MAIE,KAAK,EAAEC;IAJT,GAKMC,SALN,EADF;EASD;;AA5FD;;AA+FF,MAAMtB,iBAAiB,GAAG,MAAM;EAC9B,IACEb,WAAW,KAAK,IAAhB,IACAA,WAAW,CAACc,cAAZ,KAA+B,IAD/B,IAEAd,WAAW,CAACoC,aAAZ,KAA8B,IAF9B,IAGApC,WAAW,CAACqC,aAAZ,KAA8B,IAH9B,IAIArC,WAAW,CAACoB,iBAAZ,KAAkC,IALpC,EAME;IACA,MAAMkB,KAAK,CAAC,8BAAD,CAAX;EACD;AACF,CAVD"}
|
@@ -0,0 +1 @@
|
|
1
|
+
export { SkiaDomView as SkiaJSDomView } from "./SkiaDomView";
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"names":["SkiaDomView","SkiaJSDomView"],"sources":["SkiaJSDomView.web.tsx"],"sourcesContent":["export { SkiaDomView as SkiaJSDomView } from \"./SkiaDomView\";\n"],"mappings":"AAAA,SAASA,WAAW,IAAIC,aAAxB,QAA6C,eAA7C"}
|
@@ -1,5 +1,5 @@
|
|
1
1
|
import type { CanvasKit, Path } from "canvaskit-wasm";
|
2
|
-
import type { FillType, PathCommand, PathOp, SkMatrix, SkPath, SkPoint, SkRect, InputRRect, StrokeOpts } from "../types";
|
2
|
+
import type { FillType, PathCommand, PathOp, SkMatrix, SkPath, SkPoint, SkRect, InputRRect, StrokeOpts, InputMatrix } from "../types";
|
3
3
|
import { HostObject } from "./Host";
|
4
4
|
import { JsiSkPoint } from "./JsiSkPoint";
|
5
5
|
import { JsiSkRect } from "./JsiSkRect";
|
@@ -51,7 +51,7 @@ export declare class JsiSkPath extends HostObject<Path, "Path"> implements SkPat
|
|
51
51
|
simplify(): boolean;
|
52
52
|
toSVGString(): string;
|
53
53
|
trim(start: number, stop: number, isComplement: boolean): this | null;
|
54
|
-
transform(
|
54
|
+
transform(m: InputMatrix): this;
|
55
55
|
interpolate(end: SkPath, t: number, output?: SkPath): SkPath | JsiSkPath | null;
|
56
56
|
isInterpolatable(path2: SkPath): boolean;
|
57
57
|
toCmds(): PathCommand[];
|
@@ -0,0 +1,31 @@
|
|
1
|
+
import React from "react";
|
2
|
+
import type { Skia, SkRect } from "../skia/types";
|
3
|
+
import type { SkiaDomViewProps } from "./types";
|
4
|
+
export declare class SkiaJSDomView extends React.Component<SkiaDomViewProps & {
|
5
|
+
Skia: Skia;
|
6
|
+
}> {
|
7
|
+
constructor(props: SkiaDomViewProps & {
|
8
|
+
Skia: Skia;
|
9
|
+
});
|
10
|
+
private _nativeId;
|
11
|
+
get nativeId(): number;
|
12
|
+
componentDidUpdate(prevProps: SkiaDomViewProps & {
|
13
|
+
Skia: Skia;
|
14
|
+
}): void;
|
15
|
+
/**
|
16
|
+
* Creates a snapshot from the canvas in the surface
|
17
|
+
* @param rect Rect to use as bounds. Optional.
|
18
|
+
* @returns An Image object.
|
19
|
+
*/
|
20
|
+
makeImageSnapshot(rect?: SkRect): import("../skia/types").SkImage;
|
21
|
+
/**
|
22
|
+
* Sends a redraw request to the native SkiaView.
|
23
|
+
*/
|
24
|
+
redraw(): void;
|
25
|
+
private draw;
|
26
|
+
/**
|
27
|
+
* Clear up the dom node when unmounting to release resources.
|
28
|
+
*/
|
29
|
+
componentWillUnmount(): void;
|
30
|
+
render(): React.JSX.Element;
|
31
|
+
}
|
@@ -0,0 +1 @@
|
|
1
|
+
export { SkiaDomView as SkiaJSDomView } from "./SkiaDomView";
|
package/package.json
CHANGED
@@ -8,6 +8,7 @@ import { useCallback, useMemo } from "react";
|
|
8
8
|
import type { SkPath, SkPoint } from "../../skia/types";
|
9
9
|
import { interpolatePaths, interpolateVector } from "../../animation";
|
10
10
|
import { Skia } from "../../skia";
|
11
|
+
import { Platform } from "../../Platform";
|
11
12
|
|
12
13
|
import {
|
13
14
|
useAnimatedReaction,
|
@@ -18,7 +19,7 @@ import {
|
|
18
19
|
|
19
20
|
export const notifyChange = (value: SharedValue<unknown>) => {
|
20
21
|
"worklet";
|
21
|
-
if (_WORKLET) {
|
22
|
+
if (_WORKLET || Platform.OS === "web") {
|
22
23
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
23
24
|
(value as any)._value = value.value;
|
24
25
|
}
|
package/src/renderer/Canvas.tsx
CHANGED
@@ -15,9 +15,9 @@ import type {
|
|
15
15
|
import type { LayoutChangeEvent } from "react-native";
|
16
16
|
|
17
17
|
import { SkiaDomView } from "../views";
|
18
|
-
import { SkiaDomView as SkiaDomViewWeb } from "../views/SkiaDomView.web";
|
19
18
|
import { Skia } from "../skia/Skia";
|
20
19
|
import type { TouchHandler, SkiaBaseViewProps } from "../views";
|
20
|
+
import { SkiaJSDomView } from "../views/SkiaJSDomView";
|
21
21
|
|
22
22
|
import { SkiaRoot } from "./Reconciler";
|
23
23
|
import { NATIVE_DOM } from "./HostComponents";
|
@@ -84,6 +84,12 @@ export const Canvas = forwardRef<SkiaDomView, CanvasProps>(
|
|
84
84
|
root.render(children);
|
85
85
|
}, [children, root, redraw]);
|
86
86
|
|
87
|
+
useEffect(() => {
|
88
|
+
return () => {
|
89
|
+
root.unmount();
|
90
|
+
};
|
91
|
+
}, [root]);
|
92
|
+
|
87
93
|
if (NATIVE_DOM) {
|
88
94
|
return (
|
89
95
|
<SkiaDomView
|
@@ -99,7 +105,8 @@ export const Canvas = forwardRef<SkiaDomView, CanvasProps>(
|
|
99
105
|
);
|
100
106
|
} else {
|
101
107
|
return (
|
102
|
-
<
|
108
|
+
<SkiaJSDomView
|
109
|
+
Skia={Skia}
|
103
110
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
104
111
|
ref={ref as any}
|
105
112
|
style={style}
|
@@ -40,7 +40,7 @@ export const processUniforms = (
|
|
40
40
|
for (let i = 0; i < uniformsCount; i++) {
|
41
41
|
const name = source.getUniformName(i);
|
42
42
|
const value = uniforms[name];
|
43
|
-
if (
|
43
|
+
if (value === undefined) {
|
44
44
|
throw new Error(
|
45
45
|
// eslint-disable-next-line max-len
|
46
46
|
`The runtime effect has the uniform value "${name}" declared, but it is missing from the uniforms property of the Runtime effect.`
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import type { CanvasKit, Path } from "canvaskit-wasm";
|
1
|
+
import type { CanvasKit, Matrix3x3, Path } from "canvaskit-wasm";
|
2
2
|
|
3
3
|
import { PathVerb } from "../types";
|
4
4
|
import type {
|
@@ -11,6 +11,7 @@ import type {
|
|
11
11
|
SkRect,
|
12
12
|
InputRRect,
|
13
13
|
StrokeOpts,
|
14
|
+
InputMatrix,
|
14
15
|
} from "../types";
|
15
16
|
|
16
17
|
import { getEnum, HostObject, optEnum } from "./Host";
|
@@ -339,8 +340,27 @@ export class JsiSkPath extends HostObject<Path, "Path"> implements SkPath {
|
|
339
340
|
return result === null ? result : this;
|
340
341
|
}
|
341
342
|
|
342
|
-
transform(
|
343
|
-
|
343
|
+
transform(m: InputMatrix) {
|
344
|
+
let matrix =
|
345
|
+
m instanceof JsiSkMatrix
|
346
|
+
? Array.from(JsiSkMatrix.fromValue<Matrix3x3>(m))
|
347
|
+
: (m as Exclude<InputMatrix, SkMatrix>);
|
348
|
+
if (matrix.length === 16) {
|
349
|
+
matrix = [
|
350
|
+
matrix[0],
|
351
|
+
matrix[1],
|
352
|
+
matrix[3],
|
353
|
+
matrix[4],
|
354
|
+
matrix[5],
|
355
|
+
matrix[7],
|
356
|
+
matrix[12],
|
357
|
+
matrix[13],
|
358
|
+
matrix[15],
|
359
|
+
];
|
360
|
+
} else if (matrix.length !== 9) {
|
361
|
+
throw new Error(`Invalid matrix length: ${matrix.length}`);
|
362
|
+
}
|
363
|
+
this.ref.transform(matrix);
|
344
364
|
return this;
|
345
365
|
}
|
346
366
|
|
@@ -0,0 +1,126 @@
|
|
1
|
+
import React from "react";
|
2
|
+
import type { HostComponent } from "react-native";
|
3
|
+
|
4
|
+
import type { Skia, SkRect } from "../skia/types";
|
5
|
+
import { Platform } from "../Platform";
|
6
|
+
import SkiaPictureViewNativeComponent from "../specs/SkiaPictureViewNativeComponent";
|
7
|
+
import { JsiDrawingContext } from "../dom/types";
|
8
|
+
|
9
|
+
import { SkiaViewApi } from "./api";
|
10
|
+
import type { SkiaPictureViewProps, SkiaDomViewProps } from "./types";
|
11
|
+
import { SkiaViewNativeId } from "./SkiaViewNativeId";
|
12
|
+
|
13
|
+
const NativeSkiaPictureView: HostComponent<SkiaPictureViewProps> =
|
14
|
+
Platform.OS !== "web"
|
15
|
+
? SkiaPictureViewNativeComponent
|
16
|
+
: // eslint-disable-next-line @typescript-eslint/no-explicit-any
|
17
|
+
(null as any);
|
18
|
+
|
19
|
+
export class SkiaJSDomView extends React.Component<
|
20
|
+
SkiaDomViewProps & { Skia: Skia }
|
21
|
+
> {
|
22
|
+
constructor(props: SkiaDomViewProps & { Skia: Skia }) {
|
23
|
+
super(props);
|
24
|
+
this._nativeId = SkiaViewNativeId.current++;
|
25
|
+
const { root, onTouch, onSize } = props;
|
26
|
+
if (root) {
|
27
|
+
assertSkiaViewApi();
|
28
|
+
SkiaViewApi.setJsiProperty(this._nativeId, "root", root);
|
29
|
+
}
|
30
|
+
if (onTouch) {
|
31
|
+
assertSkiaViewApi();
|
32
|
+
SkiaViewApi.setJsiProperty(this._nativeId, "onTouch", onTouch);
|
33
|
+
}
|
34
|
+
if (onSize) {
|
35
|
+
assertSkiaViewApi();
|
36
|
+
SkiaViewApi.setJsiProperty(this._nativeId, "onSize", onSize);
|
37
|
+
}
|
38
|
+
}
|
39
|
+
|
40
|
+
private _nativeId: number;
|
41
|
+
|
42
|
+
public get nativeId() {
|
43
|
+
return this._nativeId;
|
44
|
+
}
|
45
|
+
|
46
|
+
componentDidUpdate(prevProps: SkiaDomViewProps & { Skia: Skia }) {
|
47
|
+
const { root, onTouch, onSize } = this.props;
|
48
|
+
if (root !== prevProps.root && root !== undefined) {
|
49
|
+
assertSkiaViewApi();
|
50
|
+
this.draw();
|
51
|
+
}
|
52
|
+
if (onTouch !== prevProps.onTouch) {
|
53
|
+
assertSkiaViewApi();
|
54
|
+
SkiaViewApi.setJsiProperty(this._nativeId, "onTouch", onTouch);
|
55
|
+
}
|
56
|
+
if (onSize !== prevProps.onSize) {
|
57
|
+
assertSkiaViewApi();
|
58
|
+
SkiaViewApi.setJsiProperty(this._nativeId, "onSize", onSize);
|
59
|
+
}
|
60
|
+
}
|
61
|
+
|
62
|
+
/**
|
63
|
+
* Creates a snapshot from the canvas in the surface
|
64
|
+
* @param rect Rect to use as bounds. Optional.
|
65
|
+
* @returns An Image object.
|
66
|
+
*/
|
67
|
+
public makeImageSnapshot(rect?: SkRect) {
|
68
|
+
assertSkiaViewApi();
|
69
|
+
return SkiaViewApi.makeImageSnapshot(this._nativeId, rect);
|
70
|
+
}
|
71
|
+
|
72
|
+
/**
|
73
|
+
* Sends a redraw request to the native SkiaView.
|
74
|
+
*/
|
75
|
+
public redraw() {
|
76
|
+
assertSkiaViewApi();
|
77
|
+
this.draw();
|
78
|
+
//SkiaViewApi.requestRedraw(this._nativeId);
|
79
|
+
}
|
80
|
+
|
81
|
+
private draw() {
|
82
|
+
const { root, Skia } = this.props;
|
83
|
+
if (root !== undefined) {
|
84
|
+
assertSkiaViewApi();
|
85
|
+
const rec = Skia.PictureRecorder();
|
86
|
+
const canvas = rec.beginRecording();
|
87
|
+
const ctx = new JsiDrawingContext(Skia, canvas);
|
88
|
+
root.render(ctx);
|
89
|
+
const picture = rec.finishRecordingAsPicture();
|
90
|
+
SkiaViewApi.setJsiProperty(this._nativeId, "picture", picture);
|
91
|
+
}
|
92
|
+
}
|
93
|
+
|
94
|
+
/**
|
95
|
+
* Clear up the dom node when unmounting to release resources.
|
96
|
+
*/
|
97
|
+
componentWillUnmount(): void {
|
98
|
+
assertSkiaViewApi();
|
99
|
+
SkiaViewApi.setJsiProperty(this._nativeId, "picture", null);
|
100
|
+
}
|
101
|
+
|
102
|
+
render() {
|
103
|
+
const { mode, debug = false, ...viewProps } = this.props;
|
104
|
+
return (
|
105
|
+
<NativeSkiaPictureView
|
106
|
+
collapsable={false}
|
107
|
+
nativeID={`${this._nativeId}`}
|
108
|
+
mode={mode}
|
109
|
+
debug={debug}
|
110
|
+
{...viewProps}
|
111
|
+
/>
|
112
|
+
);
|
113
|
+
}
|
114
|
+
}
|
115
|
+
|
116
|
+
const assertSkiaViewApi = () => {
|
117
|
+
if (
|
118
|
+
SkiaViewApi === null ||
|
119
|
+
SkiaViewApi.setJsiProperty === null ||
|
120
|
+
SkiaViewApi.callJsiMethod === null ||
|
121
|
+
SkiaViewApi.requestRedraw === null ||
|
122
|
+
SkiaViewApi.makeImageSnapshot === null
|
123
|
+
) {
|
124
|
+
throw Error("Skia View Api was not found.");
|
125
|
+
}
|
126
|
+
};
|
@@ -0,0 +1 @@
|
|
1
|
+
export { SkiaDomView as SkiaJSDomView } from "./SkiaDomView";
|
@@ -1,90 +0,0 @@
|
|
1
|
-
#pragma once
|
2
|
-
|
3
|
-
#include <memory>
|
4
|
-
#include <string>
|
5
|
-
|
6
|
-
#include <fbjni/fbjni.h>
|
7
|
-
#include <jni.h>
|
8
|
-
#include <jsi/jsi.h>
|
9
|
-
|
10
|
-
#include <JniSkiaBaseView.h>
|
11
|
-
#include <JniSkiaManager.h>
|
12
|
-
#include <RNSkAndroidView.h>
|
13
|
-
#include <RNSkJsView.h>
|
14
|
-
|
15
|
-
#include <android/native_window.h>
|
16
|
-
#include <android/native_window_jni.h>
|
17
|
-
#include <fbjni/detail/Hybrid.h>
|
18
|
-
|
19
|
-
namespace RNSkia {
|
20
|
-
namespace jsi = facebook::jsi;
|
21
|
-
namespace jni = facebook::jni;
|
22
|
-
|
23
|
-
class JniSkiaDrawView : public jni::HybridClass<JniSkiaDrawView>,
|
24
|
-
public JniSkiaBaseView {
|
25
|
-
public:
|
26
|
-
static auto constexpr kJavaDescriptor =
|
27
|
-
"Lcom/shopify/reactnative/skia/SkiaDrawView;";
|
28
|
-
|
29
|
-
static jni::local_ref<jhybriddata>
|
30
|
-
initHybrid(jni::alias_ref<jhybridobject> jThis,
|
31
|
-
jni::alias_ref<JniSkiaManager::javaobject> skiaManager) {
|
32
|
-
return makeCxxInstance(jThis, skiaManager);
|
33
|
-
}
|
34
|
-
|
35
|
-
static void registerNatives() {
|
36
|
-
registerHybrid(
|
37
|
-
{makeNativeMethod("initHybrid", JniSkiaDrawView::initHybrid),
|
38
|
-
makeNativeMethod("surfaceAvailable",
|
39
|
-
JniSkiaDrawView::surfaceAvailable),
|
40
|
-
makeNativeMethod("surfaceDestroyed",
|
41
|
-
JniSkiaDrawView::surfaceDestroyed),
|
42
|
-
makeNativeMethod("surfaceSizeChanged",
|
43
|
-
JniSkiaDrawView::surfaceSizeChanged),
|
44
|
-
makeNativeMethod("setMode", JniSkiaDrawView::setMode),
|
45
|
-
makeNativeMethod("setDebugMode", JniSkiaDrawView::setDebugMode),
|
46
|
-
makeNativeMethod("updateTouchPoints",
|
47
|
-
JniSkiaDrawView::updateTouchPoints),
|
48
|
-
makeNativeMethod("registerView", JniSkiaDrawView::registerView),
|
49
|
-
makeNativeMethod("unregisterView", JniSkiaDrawView::unregisterView)});
|
50
|
-
}
|
51
|
-
|
52
|
-
protected:
|
53
|
-
void updateTouchPoints(jni::JArrayDouble touches) override {
|
54
|
-
JniSkiaBaseView::updateTouchPoints(touches);
|
55
|
-
}
|
56
|
-
|
57
|
-
void surfaceAvailable(jobject surface, int width, int height) override {
|
58
|
-
JniSkiaBaseView::surfaceAvailable(surface, width, height);
|
59
|
-
}
|
60
|
-
|
61
|
-
void surfaceSizeChanged(int width, int height) override {
|
62
|
-
JniSkiaBaseView::surfaceSizeChanged(width, height);
|
63
|
-
}
|
64
|
-
|
65
|
-
void surfaceDestroyed() override { JniSkiaBaseView::surfaceDestroyed(); }
|
66
|
-
|
67
|
-
void setMode(std::string mode) override { JniSkiaBaseView::setMode(mode); }
|
68
|
-
|
69
|
-
void setDebugMode(bool show) override { JniSkiaBaseView::setDebugMode(show); }
|
70
|
-
|
71
|
-
void registerView(int nativeId) override {
|
72
|
-
JniSkiaBaseView::registerView(nativeId);
|
73
|
-
}
|
74
|
-
|
75
|
-
void unregisterView() override { JniSkiaBaseView::unregisterView(); }
|
76
|
-
|
77
|
-
private:
|
78
|
-
friend HybridBase;
|
79
|
-
|
80
|
-
explicit JniSkiaDrawView(
|
81
|
-
jni::alias_ref<jhybridobject> jThis,
|
82
|
-
jni::alias_ref<JniSkiaManager::javaobject> skiaManager)
|
83
|
-
: JniSkiaBaseView(skiaManager,
|
84
|
-
std::make_shared<RNSkAndroidView<RNSkia::RNSkJsView>>(
|
85
|
-
skiaManager->cthis()->getPlatformContext())) {}
|
86
|
-
|
87
|
-
jni::global_ref<javaobject> javaPart_;
|
88
|
-
};
|
89
|
-
|
90
|
-
} // namespace RNSkia
|