@shopify/react-native-skia 1.3.3 → 1.3.5
Sign up to get free protection for your applications and to get access to all the features.
- package/android/cpp/jni/JniPlatformContext.cpp +4 -3
- package/cpp/rnskia/RNSkJsiViewApi.h +25 -67
- package/cpp/rnskia/RNSkManager.cpp +1 -1
- package/cpp/rnskia/RNSkView.h +0 -11
- package/lib/commonjs/external/reanimated/useAnimatedImageValue.d.ts +1 -1
- package/lib/commonjs/external/reanimated/useAnimatedImageValue.js.map +1 -1
- package/lib/commonjs/external/reanimated/useVideo.js +22 -9
- package/lib/commonjs/external/reanimated/useVideo.js.map +1 -1
- package/lib/commonjs/external/reanimated/useVideoLoading.d.ts +4 -0
- package/lib/commonjs/external/reanimated/useVideoLoading.js +28 -0
- package/lib/commonjs/external/reanimated/useVideoLoading.js.map +1 -0
- package/lib/commonjs/external/reanimated/useVideoLoading.web.d.ts +4 -0
- package/lib/commonjs/external/reanimated/useVideoLoading.web.js +20 -0
- package/lib/commonjs/external/reanimated/useVideoLoading.web.js.map +1 -0
- package/lib/commonjs/skia/types/NativeBuffer/NativeBufferFactory.d.ts +3 -1
- package/lib/commonjs/skia/types/NativeBuffer/NativeBufferFactory.js +4 -2
- package/lib/commonjs/skia/types/NativeBuffer/NativeBufferFactory.js.map +1 -1
- package/lib/commonjs/skia/types/Skia.d.ts +1 -1
- package/lib/commonjs/skia/types/Skia.js.map +1 -1
- package/lib/commonjs/skia/web/CanvasKitWebGLBufferImpl.d.ts +9 -0
- package/lib/commonjs/skia/web/CanvasKitWebGLBufferImpl.js +30 -0
- package/lib/commonjs/skia/web/CanvasKitWebGLBufferImpl.js.map +1 -0
- package/lib/commonjs/skia/web/JsiSkImageFactory.js +8 -2
- package/lib/commonjs/skia/web/JsiSkImageFactory.js.map +1 -1
- package/lib/commonjs/skia/web/JsiSkia.js +2 -3
- package/lib/commonjs/skia/web/JsiSkia.js.map +1 -1
- package/lib/commonjs/skia/web/JsiVideo.d.ts +24 -0
- package/lib/commonjs/skia/web/JsiVideo.js +83 -0
- package/lib/commonjs/skia/web/JsiVideo.js.map +1 -0
- package/lib/commonjs/views/SkiaDomView.js +3 -1
- package/lib/commonjs/views/SkiaDomView.js.map +1 -1
- package/lib/commonjs/views/SkiaDomView.web.js +2 -0
- package/lib/commonjs/views/SkiaDomView.web.js.map +1 -1
- package/lib/commonjs/views/SkiaJSDomView.js +3 -1
- package/lib/commonjs/views/SkiaJSDomView.js.map +1 -1
- package/lib/commonjs/views/SkiaPictureView.js +1 -1
- package/lib/commonjs/views/SkiaPictureView.js.map +1 -1
- package/lib/commonjs/views/types.d.ts +0 -8
- package/lib/commonjs/views/types.js +0 -3
- package/lib/commonjs/views/types.js.map +1 -1
- package/lib/module/external/reanimated/useAnimatedImageValue.d.ts +1 -1
- package/lib/module/external/reanimated/useAnimatedImageValue.js.map +1 -1
- package/lib/module/external/reanimated/useVideo.js +22 -9
- package/lib/module/external/reanimated/useVideo.js.map +1 -1
- package/lib/module/external/reanimated/useVideoLoading.d.ts +4 -0
- package/lib/module/external/reanimated/useVideoLoading.js +20 -0
- package/lib/module/external/reanimated/useVideoLoading.js.map +1 -0
- package/lib/module/external/reanimated/useVideoLoading.web.d.ts +4 -0
- package/lib/module/external/reanimated/useVideoLoading.web.js +13 -0
- package/lib/module/external/reanimated/useVideoLoading.web.js.map +1 -0
- package/lib/module/skia/types/NativeBuffer/NativeBufferFactory.d.ts +3 -1
- package/lib/module/skia/types/NativeBuffer/NativeBufferFactory.js +2 -1
- package/lib/module/skia/types/NativeBuffer/NativeBufferFactory.js.map +1 -1
- package/lib/module/skia/types/Skia.d.ts +1 -1
- package/lib/module/skia/types/Skia.js.map +1 -1
- package/lib/module/skia/web/CanvasKitWebGLBufferImpl.d.ts +9 -0
- package/lib/module/skia/web/CanvasKitWebGLBufferImpl.js +23 -0
- package/lib/module/skia/web/CanvasKitWebGLBufferImpl.js.map +1 -0
- package/lib/module/skia/web/JsiSkImageFactory.js +9 -3
- package/lib/module/skia/web/JsiSkImageFactory.js.map +1 -1
- package/lib/module/skia/web/JsiSkia.js +2 -3
- package/lib/module/skia/web/JsiSkia.js.map +1 -1
- package/lib/module/skia/web/JsiVideo.d.ts +24 -0
- package/lib/module/skia/web/JsiVideo.js +75 -0
- package/lib/module/skia/web/JsiVideo.js.map +1 -0
- package/lib/module/views/SkiaDomView.js +3 -1
- package/lib/module/views/SkiaDomView.js.map +1 -1
- package/lib/module/views/SkiaDomView.web.js +2 -0
- package/lib/module/views/SkiaDomView.web.js.map +1 -1
- package/lib/module/views/SkiaJSDomView.js +3 -1
- package/lib/module/views/SkiaJSDomView.js.map +1 -1
- package/lib/module/views/SkiaPictureView.js +1 -1
- package/lib/module/views/SkiaPictureView.js.map +1 -1
- package/lib/module/views/types.d.ts +0 -8
- package/lib/module/views/types.js +0 -4
- package/lib/module/views/types.js.map +1 -1
- package/lib/typescript/src/external/reanimated/useAnimatedImageValue.d.ts +1 -1
- package/lib/typescript/src/external/reanimated/useVideoLoading.d.ts +4 -0
- package/lib/typescript/src/external/reanimated/useVideoLoading.web.d.ts +4 -0
- package/lib/typescript/src/skia/types/NativeBuffer/NativeBufferFactory.d.ts +3 -1
- package/lib/typescript/src/skia/types/Skia.d.ts +1 -1
- package/lib/typescript/src/skia/web/CanvasKitWebGLBufferImpl.d.ts +9 -0
- package/lib/typescript/src/skia/web/JsiVideo.d.ts +24 -0
- package/lib/typescript/src/views/types.d.ts +0 -8
- package/package.json +1 -1
- package/src/external/reanimated/useAnimatedImageValue.ts +1 -1
- package/src/external/reanimated/useVideo.ts +25 -9
- package/src/external/reanimated/useVideoLoading.ts +25 -0
- package/src/external/reanimated/useVideoLoading.web.ts +17 -0
- package/src/skia/types/NativeBuffer/NativeBufferFactory.ts +10 -2
- package/src/skia/types/Skia.ts +1 -1
- package/src/skia/web/CanvasKitWebGLBufferImpl.ts +22 -0
- package/src/skia/web/JsiSkImageFactory.ts +16 -3
- package/src/skia/web/JsiSkia.ts +2 -3
- package/src/skia/web/JsiVideo.ts +96 -0
- package/src/views/SkiaDomView.tsx +4 -1
- package/src/views/SkiaDomView.web.tsx +4 -0
- package/src/views/SkiaJSDomView.tsx +4 -1
- package/src/views/SkiaPictureView.tsx +0 -1
- package/src/views/types.ts +0 -13
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"names":["React","Platform","SkiaPictureViewNativeComponent","JsiDrawingContext","SkiaViewApi","SkiaViewNativeId","NativeSkiaPictureView","OS","SkiaJSDomView","Component","constructor","props","_defineProperty","_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","createElement","_extends","collapsable","nativeID","
|
1
|
+
{"version":3,"names":["React","Platform","SkiaPictureViewNativeComponent","JsiDrawingContext","SkiaViewApi","SkiaViewNativeId","NativeSkiaPictureView","OS","SkiaJSDomView","Component","constructor","props","_defineProperty","_nativeId","current","root","onTouch","onSize","assertSkiaViewApi","setJsiProperty","console","warn","nativeId","componentDidUpdate","prevProps","undefined","draw","makeImageSnapshot","rect","redraw","Skia","rec","PictureRecorder","canvas","beginRecording","ctx","render","picture","finishRecordingAsPicture","componentWillUnmount","mode","debug","viewProps","createElement","_extends","collapsable","nativeID","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 console.warn(\n `The onTouch property is deprecated and will be removed in the next Skia release.\nSee: https://shopify.github.io/react-native-skia/docs/animations/gestures`\n );\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.requestRedraw === null ||\n SkiaViewApi.makeImageSnapshot === null\n ) {\n throw Error(\"Skia View Api was not found.\");\n }\n};\n"],"mappings":"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"}
|
@@ -75,7 +75,7 @@ export class SkiaPictureView extends React.Component {
|
|
75
75
|
}
|
76
76
|
}
|
77
77
|
const assertSkiaViewApi = () => {
|
78
|
-
if (SkiaViewApi === null || SkiaViewApi.setJsiProperty === null || SkiaViewApi.
|
78
|
+
if (SkiaViewApi === null || SkiaViewApi.setJsiProperty === null || SkiaViewApi.requestRedraw === null || SkiaViewApi.makeImageSnapshot === null) {
|
79
79
|
throw Error("Skia View Api was not found.");
|
80
80
|
}
|
81
81
|
};
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"names":["React","SkiaPictureViewNativeComponent","SkiaViewApi","SkiaViewNativeId","NativeSkiaPictureView","SkiaPictureView","Component","constructor","props","_defineProperty","_nativeId","current","picture","onSize","assertSkiaViewApi","setJsiProperty","nativeId","componentDidUpdate","prevProps","makeImageSnapshot","rect","redraw","requestRedraw","render","mode","debug","viewProps","createElement","_extends","collapsable","nativeID","
|
1
|
+
{"version":3,"names":["React","SkiaPictureViewNativeComponent","SkiaViewApi","SkiaViewNativeId","NativeSkiaPictureView","SkiaPictureView","Component","constructor","props","_defineProperty","_nativeId","current","picture","onSize","assertSkiaViewApi","setJsiProperty","nativeId","componentDidUpdate","prevProps","makeImageSnapshot","rect","redraw","requestRedraw","render","mode","debug","viewProps","createElement","_extends","collapsable","nativeID","Error"],"sources":["SkiaPictureView.tsx"],"sourcesContent":["import React from \"react\";\n\nimport type { SkRect } from \"../skia/types\";\nimport SkiaPictureViewNativeComponent from \"../specs/SkiaPictureViewNativeComponent\";\n\nimport { SkiaViewApi } from \"./api\";\nimport type { SkiaPictureViewProps } from \"./types\";\nimport { SkiaViewNativeId } from \"./SkiaViewNativeId\";\n\nconst NativeSkiaPictureView = SkiaPictureViewNativeComponent;\n\nexport class SkiaPictureView extends React.Component<SkiaPictureViewProps> {\n constructor(props: SkiaPictureViewProps) {\n super(props);\n this._nativeId = SkiaViewNativeId.current++;\n const { picture, onSize } = props;\n if (picture) {\n assertSkiaViewApi();\n SkiaViewApi.setJsiProperty(this._nativeId, \"picture\", picture);\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: SkiaPictureViewProps) {\n const { picture, onSize } = this.props;\n if (picture !== prevProps.picture) {\n assertSkiaViewApi();\n SkiaViewApi.setJsiProperty(this._nativeId, \"picture\", picture);\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 SkiaViewApi.requestRedraw(this._nativeId);\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 ?? \"default\"}\n debug={debug}\n {...viewProps}\n />\n );\n }\n}\n\nconst assertSkiaViewApi = () => {\n if (\n SkiaViewApi === null ||\n SkiaViewApi.setJsiProperty === 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,KAAK,MAAM,OAAO;AAGzB,OAAOC,8BAA8B,MAAM,yCAAyC;AAEpF,SAASC,WAAW,QAAQ,OAAO;AAEnC,SAASC,gBAAgB,QAAQ,oBAAoB;AAErD,MAAMC,qBAAqB,GAAGH,8BAA8B;AAE5D,OAAO,MAAMI,eAAe,SAASL,KAAK,CAACM,SAAS,CAAuB;EACzEC,WAAWA,CAACC,KAA2B,EAAE;IACvC,KAAK,CAACA,KAAK,CAAC;IAACC,eAAA;IACb,IAAI,CAACC,SAAS,GAAGP,gBAAgB,CAACQ,OAAO,EAAE;IAC3C,MAAM;MAAEC,OAAO;MAAEC;IAAO,CAAC,GAAGL,KAAK;IACjC,IAAII,OAAO,EAAE;MACXE,iBAAiB,CAAC,CAAC;MACnBZ,WAAW,CAACa,cAAc,CAAC,IAAI,CAACL,SAAS,EAAE,SAAS,EAAEE,OAAO,CAAC;IAChE;IACA,IAAIC,MAAM,EAAE;MACVC,iBAAiB,CAAC,CAAC;MACnBZ,WAAW,CAACa,cAAc,CAAC,IAAI,CAACL,SAAS,EAAE,QAAQ,EAAEG,MAAM,CAAC;IAC9D;EACF;EAIA,IAAWG,QAAQA,CAAA,EAAG;IACpB,OAAO,IAAI,CAACN,SAAS;EACvB;EAEAO,kBAAkBA,CAACC,SAA+B,EAAE;IAClD,MAAM;MAAEN,OAAO;MAAEC;IAAO,CAAC,GAAG,IAAI,CAACL,KAAK;IACtC,IAAII,OAAO,KAAKM,SAAS,CAACN,OAAO,EAAE;MACjCE,iBAAiB,CAAC,CAAC;MACnBZ,WAAW,CAACa,cAAc,CAAC,IAAI,CAACL,SAAS,EAAE,SAAS,EAAEE,OAAO,CAAC;IAChE;IACA,IAAIC,MAAM,KAAKK,SAAS,CAACL,MAAM,EAAE;MAC/BC,iBAAiB,CAAC,CAAC;MACnBZ,WAAW,CAACa,cAAc,CAAC,IAAI,CAACL,SAAS,EAAE,QAAQ,EAAEG,MAAM,CAAC;IAC9D;EACF;;EAEA;AACF;AACA;AACA;AACA;EACSM,iBAAiBA,CAACC,IAAa,EAAE;IACtCN,iBAAiB,CAAC,CAAC;IACnB,OAAOZ,WAAW,CAACiB,iBAAiB,CAAC,IAAI,CAACT,SAAS,EAAEU,IAAI,CAAC;EAC5D;;EAEA;AACF;AACA;EACSC,MAAMA,CAAA,EAAG;IACdP,iBAAiB,CAAC,CAAC;IACnBZ,WAAW,CAACoB,aAAa,CAAC,IAAI,CAACZ,SAAS,CAAC;EAC3C;EAEAa,MAAMA,CAAA,EAAG;IACP,MAAM;MAAEC,IAAI;MAAEC,KAAK,GAAG,KAAK;MAAE,GAAGC;IAAU,CAAC,GAAG,IAAI,CAAClB,KAAK;IACxD,oBACER,KAAA,CAAA2B,aAAA,CAACvB,qBAAqB,EAAAwB,QAAA;MACpBC,WAAW,EAAE,KAAM;MACnBC,QAAQ,EAAG,GAAE,IAAI,CAACpB,SAAU,EAAE;MAC9Bc,IAAI,EAAEA,IAAI,aAAJA,IAAI,cAAJA,IAAI,GAAI,SAAU;MACxBC,KAAK,EAAEA;IAAM,GACTC,SAAS,CACd,CAAC;EAEN;AACF;AAEA,MAAMZ,iBAAiB,GAAGA,CAAA,KAAM;EAC9B,IACEZ,WAAW,KAAK,IAAI,IACpBA,WAAW,CAACa,cAAc,KAAK,IAAI,IACnCb,WAAW,CAACoB,aAAa,KAAK,IAAI,IAClCpB,WAAW,CAACiB,iBAAiB,KAAK,IAAI,EACtC;IACA,MAAMY,KAAK,CAAC,8BAA8B,CAAC;EAC7C;AACF,CAAC"}
|
@@ -37,16 +37,8 @@ export type TouchHandlers = {
|
|
37
37
|
onEnd?: (touchInfo: ExtendedTouchInfo) => void;
|
38
38
|
};
|
39
39
|
export type TouchHandler = (touchInfo: Array<Array<TouchInfo>>) => void;
|
40
|
-
/**
|
41
|
-
* Listener interface for value changes
|
42
|
-
*/
|
43
|
-
export interface ValueListener {
|
44
|
-
addListener: (callback: () => void) => number;
|
45
|
-
removeListener: (id: number) => void;
|
46
|
-
}
|
47
40
|
export interface ISkiaViewApi {
|
48
41
|
setJsiProperty: <T>(nativeId: number, name: string, value: T) => void;
|
49
|
-
callJsiMethod: <T extends Array<unknown>>(nativeId: number, name: string, ...args: T) => void;
|
50
42
|
requestRedraw: (nativeId: number) => void;
|
51
43
|
makeImageSnapshot: (nativeId: number, rect?: SkRect) => SkImage;
|
52
44
|
makeImageSnapshotAsync: (nativeId: number, rect?: SkRect) => Promise<SkImage>;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"names":["TouchType"],"sources":["types.ts"],"sourcesContent":["import type { ViewProps } from \"react-native\";\n\nimport type { GroupProps, RenderNode } from \"../dom/types\";\nimport type { SkImage, SkPicture, SkRect, SkSize } from \"../skia/types\";\nimport type { SharedValueType } from \"../renderer/processors/Animations/Animations\";\n\nexport type DrawMode = \"continuous\" | \"default\";\n\nexport type NativeSkiaViewProps = ViewProps & {\n mode?: DrawMode;\n debug?: boolean;\n};\n\nexport enum TouchType {\n Start,\n Active,\n End,\n Cancelled,\n}\n\nexport interface TouchInfo {\n x: number;\n y: number;\n force: number;\n type: TouchType;\n id: number;\n timestamp: number;\n}\n\nexport interface DrawingInfo {\n width: number;\n height: number;\n timestamp: number;\n touches: Array<Array<TouchInfo>>;\n}\n\nexport type ExtendedTouchInfo = TouchInfo & {\n // points per second\n velocityX: number;\n velocityY: number;\n};\n\nexport type TouchHandlers = {\n onStart?: (touchInfo: TouchInfo) => void;\n onActive?: (touchInfo: ExtendedTouchInfo) => void;\n onEnd?: (touchInfo: ExtendedTouchInfo) => void;\n};\n\nexport type TouchHandler = (touchInfo: Array<Array<TouchInfo>>) => void;\n\
|
1
|
+
{"version":3,"names":["TouchType"],"sources":["types.ts"],"sourcesContent":["import type { ViewProps } from \"react-native\";\n\nimport type { GroupProps, RenderNode } from \"../dom/types\";\nimport type { SkImage, SkPicture, SkRect, SkSize } from \"../skia/types\";\nimport type { SharedValueType } from \"../renderer/processors/Animations/Animations\";\n\nexport type DrawMode = \"continuous\" | \"default\";\n\nexport type NativeSkiaViewProps = ViewProps & {\n mode?: DrawMode;\n debug?: boolean;\n};\n\nexport enum TouchType {\n Start,\n Active,\n End,\n Cancelled,\n}\n\nexport interface TouchInfo {\n x: number;\n y: number;\n force: number;\n type: TouchType;\n id: number;\n timestamp: number;\n}\n\nexport interface DrawingInfo {\n width: number;\n height: number;\n timestamp: number;\n touches: Array<Array<TouchInfo>>;\n}\n\nexport type ExtendedTouchInfo = TouchInfo & {\n // points per second\n velocityX: number;\n velocityY: number;\n};\n\nexport type TouchHandlers = {\n onStart?: (touchInfo: TouchInfo) => void;\n onActive?: (touchInfo: ExtendedTouchInfo) => void;\n onEnd?: (touchInfo: ExtendedTouchInfo) => void;\n};\n\nexport type TouchHandler = (touchInfo: Array<Array<TouchInfo>>) => void;\n\nexport interface ISkiaViewApi {\n setJsiProperty: <T>(nativeId: number, name: string, value: T) => void;\n requestRedraw: (nativeId: number) => void;\n makeImageSnapshot: (nativeId: number, rect?: SkRect) => SkImage;\n makeImageSnapshotAsync: (nativeId: number, rect?: SkRect) => Promise<SkImage>;\n}\n\nexport interface SkiaBaseViewProps extends ViewProps {\n /**\n * Sets the drawing mode for the skia view. There are two drawing\n * modes, \"continuous\" and \"default\", where the continuous mode will\n * continuously redraw the view, and the default mode will only\n * redraw when any of the regular react properties are changed like\n * sizes and margins.\n */\n mode?: DrawMode;\n /**\n * When set to true the view will display information about the\n * average time it takes to render.\n */\n debug?: boolean;\n /**\n * Pass an animated value to the onSize property to get updates when\n * the Skia view is resized.\n */\n onSize?: SharedValueType<SkSize>;\n}\n\nexport interface SkiaPictureViewProps extends SkiaBaseViewProps {\n picture?: SkPicture;\n}\n\nexport interface SkiaDomViewProps extends SkiaBaseViewProps {\n root?: RenderNode<GroupProps>;\n onTouch?: TouchHandler;\n}\n"],"mappings":"AAaA,WAAYA,SAAS,0BAATA,SAAS;EAATA,SAAS,CAATA,SAAS;EAATA,SAAS,CAATA,SAAS;EAATA,SAAS,CAATA,SAAS;EAATA,SAAS,CAATA,SAAS;EAAA,OAATA,SAAS;AAAA"}
|
@@ -1,3 +1,3 @@
|
|
1
|
-
import {
|
1
|
+
import type { SharedValue } from "react-native-reanimated";
|
2
2
|
import type { DataSourceParam, SkImage } from "../../skia/types";
|
3
3
|
export declare const useAnimatedImageValue: (source: DataSourceParam, paused?: SharedValue<boolean>) => SharedValue<SkImage | null>;
|
@@ -1,5 +1,7 @@
|
|
1
1
|
import type { SkImage } from "../Image";
|
2
|
-
export
|
2
|
+
export declare abstract class CanvasKitWebGLBuffer {
|
3
|
+
}
|
4
|
+
export type NativeBuffer<T extends bigint | ArrayBuffer | CanvasImageSource | CanvasKitWebGLBuffer | unknown = unknown> = T;
|
3
5
|
export type NativeBufferAddr = NativeBuffer<bigint>;
|
4
6
|
export type NativeBufferWeb = NativeBuffer<CanvasImageSource>;
|
5
7
|
export type NativeBufferNode = NativeBuffer<ArrayBuffer>;
|
@@ -0,0 +1,9 @@
|
|
1
|
+
import type { Surface, TextureSource, Image } from "canvaskit-wasm";
|
2
|
+
import { CanvasKitWebGLBuffer } from "../types";
|
3
|
+
export declare class CanvasKitWebGLBufferImpl extends CanvasKitWebGLBuffer {
|
4
|
+
surface: Surface;
|
5
|
+
private source;
|
6
|
+
image: Image | null;
|
7
|
+
constructor(surface: Surface, source: TextureSource);
|
8
|
+
toImage(): Image;
|
9
|
+
}
|
@@ -0,0 +1,24 @@
|
|
1
|
+
import type { CanvasKit, Surface } from "canvaskit-wasm";
|
2
|
+
import type { Video, ImageFactory } from "../types";
|
3
|
+
export declare const createVideo: (CanvasKit: CanvasKit, url: string) => Promise<Video>;
|
4
|
+
export declare class JsiVideo implements Video {
|
5
|
+
private ImageFactory;
|
6
|
+
private videoElement;
|
7
|
+
__typename__: "Video";
|
8
|
+
private webglBuffer;
|
9
|
+
constructor(ImageFactory: ImageFactory, videoElement: HTMLVideoElement);
|
10
|
+
duration(): number;
|
11
|
+
framerate(): number;
|
12
|
+
setSurface(surface: Surface): void;
|
13
|
+
nextImage(): import("../types").SkImage;
|
14
|
+
seek(time: number): void;
|
15
|
+
rotation(): 0;
|
16
|
+
size(): {
|
17
|
+
width: number;
|
18
|
+
height: number;
|
19
|
+
};
|
20
|
+
pause(): void;
|
21
|
+
play(): void;
|
22
|
+
setVolume(volume: number): void;
|
23
|
+
dispose(): void;
|
24
|
+
}
|
@@ -37,16 +37,8 @@ export type TouchHandlers = {
|
|
37
37
|
onEnd?: (touchInfo: ExtendedTouchInfo) => void;
|
38
38
|
};
|
39
39
|
export type TouchHandler = (touchInfo: Array<Array<TouchInfo>>) => void;
|
40
|
-
/**
|
41
|
-
* Listener interface for value changes
|
42
|
-
*/
|
43
|
-
export interface ValueListener {
|
44
|
-
addListener: (callback: () => void) => number;
|
45
|
-
removeListener: (id: number) => void;
|
46
|
-
}
|
47
40
|
export interface ISkiaViewApi {
|
48
41
|
setJsiProperty: <T>(nativeId: number, name: string, value: T) => void;
|
49
|
-
callJsiMethod: <T extends Array<unknown>>(nativeId: number, name: string, ...args: T) => void;
|
50
42
|
requestRedraw: (nativeId: number) => void;
|
51
43
|
makeImageSnapshot: (nativeId: number, rect?: SkRect) => SkImage;
|
52
44
|
makeImageSnapshotAsync: (nativeId: number, rect?: SkRect) => Promise<SkImage>;
|
package/package.json
CHANGED
@@ -7,7 +7,7 @@
|
|
7
7
|
"setup-skia-web": "./scripts/setup-canvaskit.js"
|
8
8
|
},
|
9
9
|
"title": "React Native Skia",
|
10
|
-
"version": "1.3.
|
10
|
+
"version": "1.3.5",
|
11
11
|
"description": "High-performance React Native Graphics using Skia",
|
12
12
|
"main": "lib/module/index.js",
|
13
13
|
"react-native": "src/index.ts",
|
@@ -1,5 +1,5 @@
|
|
1
1
|
import { useEffect } from "react";
|
2
|
-
import {
|
2
|
+
import type { FrameInfo, SharedValue } from "react-native-reanimated";
|
3
3
|
|
4
4
|
import { useAnimatedImage } from "../../skia/core/AnimatedImage";
|
5
5
|
import type { DataSourceParam, SkImage } from "../../skia/types";
|
@@ -1,11 +1,11 @@
|
|
1
1
|
import type { SharedValue, FrameInfo } from "react-native-reanimated";
|
2
2
|
import { useEffect, useMemo } from "react";
|
3
3
|
|
4
|
-
import { Skia } from "../../skia/Skia";
|
5
4
|
import type { SkImage, Video } from "../../skia/types";
|
6
5
|
import { Platform } from "../../Platform";
|
7
6
|
|
8
7
|
import Rea from "./ReanimatedProxy";
|
8
|
+
import { useVideoLoading } from "./useVideoLoading";
|
9
9
|
|
10
10
|
type Animated<T> = SharedValue<T> | T;
|
11
11
|
|
@@ -16,6 +16,18 @@ interface PlaybackOptions {
|
|
16
16
|
volume: Animated<number>;
|
17
17
|
}
|
18
18
|
|
19
|
+
const copyFrameOnAndroid = (currentFrame: SharedValue<SkImage | null>) => {
|
20
|
+
"worklet";
|
21
|
+
// on android we need to copy the texture before it's invalidated
|
22
|
+
if (Platform.OS === "android") {
|
23
|
+
const tex = currentFrame.value;
|
24
|
+
if (tex) {
|
25
|
+
currentFrame.value = tex.makeNonTextureImage();
|
26
|
+
tex.dispose();
|
27
|
+
}
|
28
|
+
}
|
29
|
+
};
|
30
|
+
|
19
31
|
const setFrame = (video: Video, currentFrame: SharedValue<SkImage | null>) => {
|
20
32
|
"worklet";
|
21
33
|
const img = video.nextImage();
|
@@ -23,11 +35,9 @@ const setFrame = (video: Video, currentFrame: SharedValue<SkImage | null>) => {
|
|
23
35
|
if (currentFrame.value) {
|
24
36
|
currentFrame.value.dispose();
|
25
37
|
}
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
currentFrame.value = img;
|
30
|
-
}
|
38
|
+
currentFrame.value = img;
|
39
|
+
} else {
|
40
|
+
copyFrameOnAndroid(currentFrame);
|
31
41
|
}
|
32
42
|
};
|
33
43
|
|
@@ -57,7 +67,7 @@ export const useVideo = (
|
|
57
67
|
source: string | null,
|
58
68
|
userOptions?: Partial<PlaybackOptions>
|
59
69
|
) => {
|
60
|
-
const video =
|
70
|
+
const video = useVideoLoading(source);
|
61
71
|
const isPaused = useOption(userOptions?.paused ?? defaultOptions.paused);
|
62
72
|
const looping = useOption(userOptions?.looping ?? defaultOptions.looping);
|
63
73
|
const seek = useOption(userOptions?.seek ?? defaultOptions.seek);
|
@@ -66,7 +76,10 @@ export const useVideo = (
|
|
66
76
|
const currentTime = Rea.useSharedValue(0);
|
67
77
|
const lastTimestamp = Rea.useSharedValue(-1);
|
68
78
|
const duration = useMemo(() => video?.duration() ?? 0, [video]);
|
69
|
-
const framerate = useMemo(
|
79
|
+
const framerate = useMemo(
|
80
|
+
() => (Platform.OS === "web" ? -1 : video?.framerate() ?? 0),
|
81
|
+
[video]
|
82
|
+
);
|
70
83
|
const size = useMemo(() => video?.size() ?? { width: 0, height: 0 }, [video]);
|
71
84
|
const rotation = useMemo(() => video?.rotation() ?? 0, [video]);
|
72
85
|
const frameDuration = 1000 / framerate;
|
@@ -86,6 +99,7 @@ export const useVideo = (
|
|
86
99
|
() => seek.value,
|
87
100
|
(value) => {
|
88
101
|
if (value !== null) {
|
102
|
+
copyFrameOnAndroid(currentFrame);
|
89
103
|
video?.seek(value);
|
90
104
|
currentTime.value = value;
|
91
105
|
seek.value = null;
|
@@ -118,7 +132,9 @@ export const useVideo = (
|
|
118
132
|
currentTime.value = seek.value;
|
119
133
|
lastTimestamp.value = currentTimestamp;
|
120
134
|
}
|
121
|
-
|
135
|
+
// On Web the framerate is uknown.
|
136
|
+
// This could be optimized by using requestVideoFrameCallback (Chrome only)
|
137
|
+
if ((delta >= currentFrameDuration && !isOver) || Platform.OS === "web") {
|
122
138
|
setFrame(video, currentFrame);
|
123
139
|
currentTime.value += delta;
|
124
140
|
lastTimestamp.value = currentTimestamp;
|
@@ -0,0 +1,25 @@
|
|
1
|
+
import { useEffect, useState } from "react";
|
2
|
+
|
3
|
+
import type { Video } from "../../skia/types";
|
4
|
+
import { Skia } from "../../skia";
|
5
|
+
|
6
|
+
import Rea from "./ReanimatedProxy";
|
7
|
+
|
8
|
+
const runtime = Rea.createWorkletRuntime("video-metadata-runtime");
|
9
|
+
|
10
|
+
type VideoSource = string | null;
|
11
|
+
|
12
|
+
export const useVideoLoading = (source: VideoSource) => {
|
13
|
+
const [video, setVideo] = useState<Video | null>(null);
|
14
|
+
const cb = (src: string) => {
|
15
|
+
"worklet";
|
16
|
+
const vid = Skia.Video(src) as Video;
|
17
|
+
Rea.runOnJS(setVideo)(vid);
|
18
|
+
};
|
19
|
+
useEffect(() => {
|
20
|
+
if (source) {
|
21
|
+
Rea.runOnRuntime(runtime, cb)(source);
|
22
|
+
}
|
23
|
+
}, [source]);
|
24
|
+
return video;
|
25
|
+
};
|
@@ -0,0 +1,17 @@
|
|
1
|
+
import { useEffect, useState } from "react";
|
2
|
+
|
3
|
+
import type { Video } from "../../skia/types";
|
4
|
+
import { Skia } from "../../skia";
|
5
|
+
|
6
|
+
type VideoSource = string | null;
|
7
|
+
|
8
|
+
export const useVideoLoading = (source: VideoSource) => {
|
9
|
+
const [video, setVideo] = useState<Video | null>(null);
|
10
|
+
useEffect(() => {
|
11
|
+
if (source) {
|
12
|
+
const vid = Skia.Video(source) as Promise<Video>;
|
13
|
+
vid.then((v) => setVideo(v));
|
14
|
+
}
|
15
|
+
}, [source]);
|
16
|
+
return video;
|
17
|
+
};
|
@@ -1,7 +1,14 @@
|
|
1
1
|
import type { SkImage } from "../Image";
|
2
2
|
|
3
|
+
export abstract class CanvasKitWebGLBuffer {}
|
4
|
+
|
3
5
|
export type NativeBuffer<
|
4
|
-
T extends
|
6
|
+
T extends
|
7
|
+
| bigint
|
8
|
+
| ArrayBuffer
|
9
|
+
| CanvasImageSource
|
10
|
+
| CanvasKitWebGLBuffer
|
11
|
+
| unknown = unknown
|
5
12
|
> = T;
|
6
13
|
|
7
14
|
export type NativeBufferAddr = NativeBuffer<bigint>;
|
@@ -20,7 +27,8 @@ export const isNativeBufferWeb = (
|
|
20
27
|
buffer instanceof OffscreenCanvas ||
|
21
28
|
buffer instanceof VideoFrame ||
|
22
29
|
buffer instanceof HTMLImageElement ||
|
23
|
-
buffer instanceof SVGImageElement
|
30
|
+
buffer instanceof SVGImageElement ||
|
31
|
+
buffer instanceof CanvasKitWebGLBuffer;
|
24
32
|
|
25
33
|
export const isNativeBufferNode = (
|
26
34
|
buffer: NativeBuffer
|
package/src/skia/types/Skia.ts
CHANGED
@@ -0,0 +1,22 @@
|
|
1
|
+
import type { Surface, TextureSource, Image } from "canvaskit-wasm";
|
2
|
+
|
3
|
+
import { CanvasKitWebGLBuffer } from "../types";
|
4
|
+
|
5
|
+
export class CanvasKitWebGLBufferImpl extends CanvasKitWebGLBuffer {
|
6
|
+
public image: Image | null = null;
|
7
|
+
|
8
|
+
constructor(public surface: Surface, private source: TextureSource) {
|
9
|
+
super();
|
10
|
+
}
|
11
|
+
|
12
|
+
toImage() {
|
13
|
+
if (this.image === null) {
|
14
|
+
this.image = this.surface.makeImageFromTextureSource(this.source);
|
15
|
+
}
|
16
|
+
if (this.image === null) {
|
17
|
+
throw new Error("Failed to create image from texture source");
|
18
|
+
}
|
19
|
+
this.surface.updateTextureFromSource(this.image, this.source);
|
20
|
+
return this.image;
|
21
|
+
}
|
22
|
+
}
|
@@ -1,6 +1,6 @@
|
|
1
1
|
import type { CanvasKit, Image } from "canvaskit-wasm";
|
2
2
|
|
3
|
-
import { isNativeBufferWeb } from "../types";
|
3
|
+
import { CanvasKitWebGLBuffer, isNativeBufferWeb } from "../types";
|
4
4
|
import type {
|
5
5
|
SkData,
|
6
6
|
ImageInfo,
|
@@ -13,6 +13,7 @@ import { Host, getEnum } from "./Host";
|
|
13
13
|
import { JsiSkImage } from "./JsiSkImage";
|
14
14
|
import { JsiSkData } from "./JsiSkData";
|
15
15
|
import type { JsiSkSurface } from "./JsiSkSurface";
|
16
|
+
import type { CanvasKitWebGLBufferImpl } from "./CanvasKitWebGLBufferImpl";
|
16
17
|
|
17
18
|
export class JsiSkImageFactory extends Host implements ImageFactory {
|
18
19
|
constructor(CanvasKit: CanvasKit) {
|
@@ -35,8 +36,20 @@ export class JsiSkImageFactory extends Host implements ImageFactory {
|
|
35
36
|
throw new Error("Invalid NativeBuffer");
|
36
37
|
}
|
37
38
|
if (!surface) {
|
38
|
-
|
39
|
-
|
39
|
+
let img: Image;
|
40
|
+
if (
|
41
|
+
buffer instanceof HTMLImageElement ||
|
42
|
+
buffer instanceof HTMLVideoElement ||
|
43
|
+
buffer instanceof ImageBitmap
|
44
|
+
) {
|
45
|
+
img = this.CanvasKit.MakeLazyImageFromTextureSource(buffer);
|
46
|
+
} else if (buffer instanceof CanvasKitWebGLBuffer) {
|
47
|
+
img = (
|
48
|
+
buffer as CanvasKitWebGLBuffer as CanvasKitWebGLBufferImpl
|
49
|
+
).toImage();
|
50
|
+
} else {
|
51
|
+
img = this.CanvasKit.MakeImageFromCanvasImageSource(buffer);
|
52
|
+
}
|
40
53
|
return new JsiSkImage(this.CanvasKit, img);
|
41
54
|
} else if (!image) {
|
42
55
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
package/src/skia/web/JsiSkia.ts
CHANGED
@@ -42,6 +42,7 @@ import { JsiSkFontMgrFactory } from "./JsiSkFontMgrFactory";
|
|
42
42
|
import { JsiSkAnimatedImageFactory } from "./JsiSkAnimatedImageFactory";
|
43
43
|
import { JsiSkParagraphBuilderFactory } from "./JsiSkParagraphBuilderFactory";
|
44
44
|
import { JsiSkNativeBufferFactory } from "./JsiSkNativeBufferFactory";
|
45
|
+
import { createVideo } from "./JsiVideo";
|
45
46
|
|
46
47
|
export const JsiSkApi = (CanvasKit: CanvasKit): Skia => ({
|
47
48
|
Point: (x: number, y: number) =>
|
@@ -127,7 +128,5 @@ export const JsiSkApi = (CanvasKit: CanvasKit): Skia => ({
|
|
127
128
|
FontMgr: new JsiSkFontMgrFactory(CanvasKit),
|
128
129
|
ParagraphBuilder: new JsiSkParagraphBuilderFactory(CanvasKit),
|
129
130
|
NativeBuffer: new JsiSkNativeBufferFactory(CanvasKit),
|
130
|
-
Video: (
|
131
|
-
throw new Error("Not implemented on React Native Web");
|
132
|
-
},
|
131
|
+
Video: createVideo.bind(null, CanvasKit),
|
133
132
|
});
|
@@ -0,0 +1,96 @@
|
|
1
|
+
import type { CanvasKit, Surface } from "canvaskit-wasm";
|
2
|
+
|
3
|
+
import type { CanvasKitWebGLBuffer, Video, ImageFactory } from "../types";
|
4
|
+
|
5
|
+
import { CanvasKitWebGLBufferImpl } from "./CanvasKitWebGLBufferImpl";
|
6
|
+
import { JsiSkImageFactory } from "./JsiSkImageFactory";
|
7
|
+
|
8
|
+
export const createVideo = async (
|
9
|
+
CanvasKit: CanvasKit,
|
10
|
+
url: string
|
11
|
+
): Promise<Video> => {
|
12
|
+
const video = document.createElement("video");
|
13
|
+
return new Promise((resolve, reject) => {
|
14
|
+
video.src = url;
|
15
|
+
video.style.display = "none";
|
16
|
+
video.crossOrigin = "anonymous";
|
17
|
+
video.volume = 0;
|
18
|
+
video.addEventListener("loadedmetadata", () => {
|
19
|
+
document.body.appendChild(video);
|
20
|
+
resolve(new JsiVideo(new JsiSkImageFactory(CanvasKit), video));
|
21
|
+
});
|
22
|
+
video.addEventListener("error", () => {
|
23
|
+
reject(new Error(`Failed to load video from URL: ${url}`));
|
24
|
+
});
|
25
|
+
});
|
26
|
+
};
|
27
|
+
|
28
|
+
export class JsiVideo implements Video {
|
29
|
+
__typename__ = "Video" as const;
|
30
|
+
|
31
|
+
private webglBuffer: CanvasKitWebGLBuffer | null = null;
|
32
|
+
|
33
|
+
constructor(
|
34
|
+
private ImageFactory: ImageFactory,
|
35
|
+
private videoElement: HTMLVideoElement
|
36
|
+
) {
|
37
|
+
document.body.appendChild(this.videoElement);
|
38
|
+
}
|
39
|
+
|
40
|
+
duration() {
|
41
|
+
return this.videoElement.duration * 1000;
|
42
|
+
}
|
43
|
+
|
44
|
+
framerate(): number {
|
45
|
+
throw new Error("Video.frame is not available on React Native Web");
|
46
|
+
}
|
47
|
+
|
48
|
+
setSurface(surface: Surface) {
|
49
|
+
// If we have the surface, we can use the WebGL buffer which is slightly faster
|
50
|
+
// This is because WebGL cannot be shared across contextes.
|
51
|
+
// This can be removed with WebGPU
|
52
|
+
this.webglBuffer = new CanvasKitWebGLBufferImpl(surface, this.videoElement);
|
53
|
+
}
|
54
|
+
|
55
|
+
nextImage() {
|
56
|
+
return this.ImageFactory.MakeImageFromNativeBuffer(
|
57
|
+
this.webglBuffer ? this.webglBuffer : this.videoElement
|
58
|
+
);
|
59
|
+
}
|
60
|
+
|
61
|
+
seek(time: number) {
|
62
|
+
if (isNaN(time)) {
|
63
|
+
throw new Error(`Invalid time: ${time}`);
|
64
|
+
}
|
65
|
+
this.videoElement.currentTime = time / 1000;
|
66
|
+
}
|
67
|
+
|
68
|
+
rotation() {
|
69
|
+
return 0 as const;
|
70
|
+
}
|
71
|
+
|
72
|
+
size() {
|
73
|
+
return {
|
74
|
+
width: this.videoElement.videoWidth,
|
75
|
+
height: this.videoElement.videoHeight,
|
76
|
+
};
|
77
|
+
}
|
78
|
+
|
79
|
+
pause() {
|
80
|
+
this.videoElement.pause();
|
81
|
+
}
|
82
|
+
|
83
|
+
play() {
|
84
|
+
this.videoElement.play();
|
85
|
+
}
|
86
|
+
|
87
|
+
setVolume(volume: number) {
|
88
|
+
this.videoElement.volume = volume;
|
89
|
+
}
|
90
|
+
|
91
|
+
dispose() {
|
92
|
+
if (this.videoElement.parentNode) {
|
93
|
+
this.videoElement.parentNode.removeChild(this.videoElement);
|
94
|
+
}
|
95
|
+
}
|
96
|
+
}
|
@@ -26,6 +26,10 @@ export class SkiaDomView extends React.Component<SkiaDomViewProps> {
|
|
26
26
|
}
|
27
27
|
if (onTouch) {
|
28
28
|
assertSkiaViewApi();
|
29
|
+
console.warn(
|
30
|
+
`The onTouch property is deprecated and will be removed in the next Skia release.
|
31
|
+
See: https://shopify.github.io/react-native-skia/docs/animations/gestures`
|
32
|
+
);
|
29
33
|
SkiaViewApi.setJsiProperty(this._nativeId, "onTouch", onTouch);
|
30
34
|
}
|
31
35
|
if (onSize) {
|
@@ -110,7 +114,6 @@ const assertSkiaViewApi = () => {
|
|
110
114
|
if (
|
111
115
|
SkiaViewApi === null ||
|
112
116
|
SkiaViewApi.setJsiProperty === null ||
|
113
|
-
SkiaViewApi.callJsiMethod === null ||
|
114
117
|
SkiaViewApi.requestRedraw === null ||
|
115
118
|
SkiaViewApi.makeImageSnapshot === null
|
116
119
|
) {
|
@@ -12,6 +12,10 @@ export class SkiaDomView extends SkiaBaseWebView<SkiaDomViewProps> {
|
|
12
12
|
|
13
13
|
protected renderInCanvas(canvas: SkCanvas, touches: TouchInfo[]): void {
|
14
14
|
if (this.props.onTouch) {
|
15
|
+
console.warn(
|
16
|
+
`The onTouch property is deprecated and will be removed in the next Skia release.
|
17
|
+
See: https://shopify.github.io/react-native-skia/docs/animations/gestures`
|
18
|
+
);
|
15
19
|
this.props.onTouch([touches]);
|
16
20
|
}
|
17
21
|
if (this.props.onSize) {
|
@@ -29,6 +29,10 @@ export class SkiaJSDomView extends React.Component<
|
|
29
29
|
}
|
30
30
|
if (onTouch) {
|
31
31
|
assertSkiaViewApi();
|
32
|
+
console.warn(
|
33
|
+
`The onTouch property is deprecated and will be removed in the next Skia release.
|
34
|
+
See: https://shopify.github.io/react-native-skia/docs/animations/gestures`
|
35
|
+
);
|
32
36
|
SkiaViewApi.setJsiProperty(this._nativeId, "onTouch", onTouch);
|
33
37
|
}
|
34
38
|
if (onSize) {
|
@@ -117,7 +121,6 @@ const assertSkiaViewApi = () => {
|
|
117
121
|
if (
|
118
122
|
SkiaViewApi === null ||
|
119
123
|
SkiaViewApi.setJsiProperty === null ||
|
120
|
-
SkiaViewApi.callJsiMethod === null ||
|
121
124
|
SkiaViewApi.requestRedraw === null ||
|
122
125
|
SkiaViewApi.makeImageSnapshot === null
|
123
126
|
) {
|