@shopify/react-native-skia 0.1.188 → 0.1.190

Sign up to get free protection for your applications and to get access to all the features.
Files changed (98) hide show
  1. package/cpp/api/JsiSkMatrix.h +6 -6
  2. package/ios/RNSkia-iOS/ViewScreenshotService.mm +13 -1
  3. package/jestSetup.js +17 -3
  4. package/lib/commonjs/Platform/IPlatform.d.ts +12 -0
  5. package/lib/commonjs/Platform/IPlatform.js +6 -0
  6. package/lib/commonjs/Platform/IPlatform.js.map +1 -0
  7. package/lib/commonjs/Platform/Platform.d.ts +2 -0
  8. package/lib/commonjs/Platform/Platform.js +24 -0
  9. package/lib/commonjs/Platform/Platform.js.map +1 -0
  10. package/lib/commonjs/Platform/Platform.web.d.ts +2 -0
  11. package/lib/commonjs/Platform/Platform.web.js +157 -0
  12. package/lib/commonjs/Platform/Platform.web.js.map +1 -0
  13. package/lib/commonjs/Platform/index.d.ts +1 -0
  14. package/lib/commonjs/Platform/index.js +19 -0
  15. package/lib/commonjs/Platform/index.js.map +1 -0
  16. package/lib/commonjs/skia/NativeSetup.js +3 -3
  17. package/lib/commonjs/skia/NativeSetup.js.map +1 -1
  18. package/lib/commonjs/skia/core/Data.js +2 -8
  19. package/lib/commonjs/skia/core/Data.js.map +1 -1
  20. package/lib/commonjs/skia/core/Image.js +3 -3
  21. package/lib/commonjs/skia/core/Image.js.map +1 -1
  22. package/lib/commonjs/skia/types/Matrix.d.ts +6 -6
  23. package/lib/commonjs/skia/types/Matrix.js.map +1 -1
  24. package/lib/commonjs/skia/web/JsiSkMatrix.d.ts +6 -6
  25. package/lib/commonjs/skia/web/JsiSkMatrix.js +6 -0
  26. package/lib/commonjs/skia/web/JsiSkMatrix.js.map +1 -1
  27. package/lib/commonjs/views/SkiaBaseWebView.d.ts +6 -1
  28. package/lib/commonjs/views/SkiaBaseWebView.js +32 -25
  29. package/lib/commonjs/views/SkiaBaseWebView.js.map +1 -1
  30. package/lib/commonjs/views/SkiaDomView.js +2 -2
  31. package/lib/commonjs/views/SkiaDomView.js.map +1 -1
  32. package/lib/commonjs/views/SkiaPictureView.js +2 -2
  33. package/lib/commonjs/views/SkiaPictureView.js.map +1 -1
  34. package/lib/commonjs/views/SkiaView.js +3 -2
  35. package/lib/commonjs/views/SkiaView.js.map +1 -1
  36. package/lib/commonjs/views/useTouchHandler.js +3 -3
  37. package/lib/commonjs/views/useTouchHandler.js.map +1 -1
  38. package/lib/commonjs/web/WithSkiaWeb.js +2 -2
  39. package/lib/commonjs/web/WithSkiaWeb.js.map +1 -1
  40. package/lib/module/Platform/IPlatform.d.ts +12 -0
  41. package/lib/module/Platform/IPlatform.js +2 -0
  42. package/lib/module/Platform/IPlatform.js.map +1 -0
  43. package/lib/module/Platform/Platform.d.ts +2 -0
  44. package/lib/module/Platform/Platform.js +14 -0
  45. package/lib/module/Platform/Platform.js.map +1 -0
  46. package/lib/module/Platform/Platform.web.d.ts +2 -0
  47. package/lib/module/Platform/Platform.web.js +143 -0
  48. package/lib/module/Platform/Platform.web.js.map +1 -0
  49. package/lib/module/Platform/index.d.ts +1 -0
  50. package/lib/module/Platform/index.js +2 -0
  51. package/lib/module/Platform/index.js.map +1 -0
  52. package/lib/module/skia/NativeSetup.js +2 -2
  53. package/lib/module/skia/NativeSetup.js.map +1 -1
  54. package/lib/module/skia/core/Data.js +2 -7
  55. package/lib/module/skia/core/Data.js.map +1 -1
  56. package/lib/module/skia/core/Image.js +2 -2
  57. package/lib/module/skia/core/Image.js.map +1 -1
  58. package/lib/module/skia/types/Matrix.d.ts +6 -6
  59. package/lib/module/skia/types/Matrix.js.map +1 -1
  60. package/lib/module/skia/web/JsiSkMatrix.d.ts +6 -6
  61. package/lib/module/skia/web/JsiSkMatrix.js +6 -0
  62. package/lib/module/skia/web/JsiSkMatrix.js.map +1 -1
  63. package/lib/module/views/SkiaBaseWebView.d.ts +6 -1
  64. package/lib/module/views/SkiaBaseWebView.js +31 -24
  65. package/lib/module/views/SkiaBaseWebView.js.map +1 -1
  66. package/lib/module/views/SkiaDomView.js +2 -2
  67. package/lib/module/views/SkiaDomView.js.map +1 -1
  68. package/lib/module/views/SkiaPictureView.js +2 -2
  69. package/lib/module/views/SkiaPictureView.js.map +1 -1
  70. package/lib/module/views/SkiaView.js +2 -2
  71. package/lib/module/views/SkiaView.js.map +1 -1
  72. package/lib/module/views/useTouchHandler.js +3 -3
  73. package/lib/module/views/useTouchHandler.js.map +1 -1
  74. package/lib/module/web/WithSkiaWeb.js +1 -1
  75. package/lib/module/web/WithSkiaWeb.js.map +1 -1
  76. package/lib/typescript/src/Platform/IPlatform.d.ts +12 -0
  77. package/lib/typescript/src/Platform/Platform.d.ts +2 -0
  78. package/lib/typescript/src/Platform/Platform.web.d.ts +2 -0
  79. package/lib/typescript/src/Platform/index.d.ts +1 -0
  80. package/lib/typescript/src/skia/types/Matrix.d.ts +6 -6
  81. package/lib/typescript/src/skia/web/JsiSkMatrix.d.ts +6 -6
  82. package/lib/typescript/src/views/SkiaBaseWebView.d.ts +6 -1
  83. package/package.json +9 -9
  84. package/src/Platform/IPlatform.ts +20 -0
  85. package/src/Platform/Platform.ts +28 -0
  86. package/src/Platform/Platform.web.tsx +136 -0
  87. package/src/Platform/index.ts +1 -0
  88. package/src/skia/NativeSetup.ts +2 -2
  89. package/src/skia/core/Data.ts +4 -15
  90. package/src/skia/core/Image.ts +2 -3
  91. package/src/skia/types/Matrix.ts +6 -6
  92. package/src/skia/web/JsiSkMatrix.ts +6 -0
  93. package/src/views/SkiaBaseWebView.tsx +24 -19
  94. package/src/views/SkiaDomView.tsx +2 -2
  95. package/src/views/SkiaPictureView.tsx +2 -2
  96. package/src/views/SkiaView.tsx +2 -2
  97. package/src/views/useTouchHandler.ts +3 -3
  98. package/src/web/WithSkiaWeb.tsx +2 -1
@@ -1 +1 @@
1
- {"version":3,"names":["useCallback","useRef","PixelRatio","TouchType","useInternalTouchHandler","handlers","deps","multiTouch","prevTouchInfoRef","prevVelocityRef","history","forEach","touches","i","length","touch","prevTouch","current","id","timeDiffseconds","timestamp","distX","x","distY","y","type","Start","End","Cancelled","get","extendedTouchInfo","velocityX","velocityY","onStart","Active","onActive","onEnd","useTouchHandler","useMultiTouchHandler"],"sources":["useTouchHandler.ts"],"sourcesContent":["import type { DependencyList } from \"react\";\nimport { useCallback, useRef } from \"react\";\nimport { PixelRatio } from \"react-native\";\n\nimport type { Vector } from \"../skia/types\";\n\nimport type {\n ExtendedTouchInfo,\n TouchHandlers,\n TouchHandler,\n TouchInfo,\n} from \"./types\";\nimport { TouchType } from \"./types\";\n\nconst useInternalTouchHandler = (\n handlers: TouchHandlers,\n deps: DependencyList = [],\n multiTouch = false\n): TouchHandler => {\n const prevTouchInfoRef = useRef<{ [key: number]: TouchInfo | undefined }>({});\n const prevVelocityRef = useRef<{ [key: number]: Vector | undefined }>({});\n\n return useCallback((history: Array<Array<TouchInfo>>) => {\n // Process all items in the current touch history\n history.forEach((touches) => {\n // Enumerate touches\n for (let i = 0; i < touches.length; i++) {\n if (!multiTouch && i > 0) {\n break;\n }\n\n const touch = touches[i];\n const prevTouch = prevTouchInfoRef.current[touch.id];\n // Calculate the velocity from the previous touch.\n const timeDiffseconds =\n touch.timestamp -\n (prevTouchInfoRef.current[touch.id]?.timestamp ?? touch.timestamp);\n\n const distX = touch.x - (prevTouch?.x ?? touch.x);\n const distY = touch.y - (prevTouch?.y ?? touch.y);\n\n if (\n touch.type !== TouchType.Start &&\n touch.type !== TouchType.End &&\n touch.type !== TouchType.Cancelled &&\n timeDiffseconds > 0\n ) {\n prevVelocityRef.current[touch.id] = {\n x: distX / timeDiffseconds / PixelRatio.get(),\n y: distY / timeDiffseconds / PixelRatio.get(),\n };\n }\n\n const extendedTouchInfo: ExtendedTouchInfo = {\n ...touch,\n velocityX: prevVelocityRef.current[touch.id]?.x ?? 0,\n velocityY: prevVelocityRef.current[touch.id]?.y ?? 0,\n };\n\n // Save previous touch\n prevTouchInfoRef.current[touch.id] = touch;\n\n if (touch.type === TouchType.Start) {\n delete prevVelocityRef.current[touch.id];\n handlers.onStart && handlers.onStart(touch);\n } else if (touch.type === TouchType.Active) {\n handlers.onActive && handlers.onActive(extendedTouchInfo);\n } else {\n handlers.onEnd && handlers.onEnd(extendedTouchInfo);\n }\n }\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, deps);\n};\n\n/**\n * Provides a callback for handling touch events in the Skia View.\n * This touch handler only handles single touches.\n * @param handlers Callbacks for the different touch states\n * @param deps optional Dependency array to update the handlers\n * @returns A function that can be used from within the onDraw callback to\n * update and handle touch events. Call it with the touches property from\n * the info object.\n */\nexport const useTouchHandler = (\n handlers: TouchHandlers,\n deps: DependencyList = []\n): TouchHandler => {\n return useInternalTouchHandler(handlers, deps, false);\n};\n\n/**\n * Provides a callback for handling touch events in the Skia View.\n * This touch handler handles multiple touches.\n * @param handlers Callbacks for the different touch states\n * @param deps optional Dependency array to update the handlers\n * @returns A function that can be used from within the onDraw callback to\n * update and handle touch events. Call it with the touches property from\n * the info object.\n */\nexport const useMultiTouchHandler = (\n handlers: TouchHandlers,\n deps: DependencyList = []\n): TouchHandler => {\n return useInternalTouchHandler(handlers, deps, true);\n};\n"],"mappings":"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"}
1
+ {"version":3,"names":["useCallback","useRef","Platform","TouchType","useInternalTouchHandler","handlers","deps","multiTouch","prevTouchInfoRef","prevVelocityRef","history","forEach","touches","i","length","touch","prevTouch","current","id","timeDiffseconds","timestamp","distX","x","distY","y","type","Start","End","Cancelled","PixelRatio","extendedTouchInfo","velocityX","velocityY","onStart","Active","onActive","onEnd","useTouchHandler","useMultiTouchHandler"],"sources":["useTouchHandler.ts"],"sourcesContent":["import type { DependencyList } from \"react\";\nimport { useCallback, useRef } from \"react\";\n\nimport type { Vector } from \"../skia/types\";\nimport { Platform } from \"../Platform\";\n\nimport type {\n ExtendedTouchInfo,\n TouchHandlers,\n TouchHandler,\n TouchInfo,\n} from \"./types\";\nimport { TouchType } from \"./types\";\n\nconst useInternalTouchHandler = (\n handlers: TouchHandlers,\n deps: DependencyList = [],\n multiTouch = false\n): TouchHandler => {\n const prevTouchInfoRef = useRef<{ [key: number]: TouchInfo | undefined }>({});\n const prevVelocityRef = useRef<{ [key: number]: Vector | undefined }>({});\n\n return useCallback((history: Array<Array<TouchInfo>>) => {\n // Process all items in the current touch history\n history.forEach((touches) => {\n // Enumerate touches\n for (let i = 0; i < touches.length; i++) {\n if (!multiTouch && i > 0) {\n break;\n }\n\n const touch = touches[i];\n const prevTouch = prevTouchInfoRef.current[touch.id];\n // Calculate the velocity from the previous touch.\n const timeDiffseconds =\n touch.timestamp -\n (prevTouchInfoRef.current[touch.id]?.timestamp ?? touch.timestamp);\n\n const distX = touch.x - (prevTouch?.x ?? touch.x);\n const distY = touch.y - (prevTouch?.y ?? touch.y);\n\n if (\n touch.type !== TouchType.Start &&\n touch.type !== TouchType.End &&\n touch.type !== TouchType.Cancelled &&\n timeDiffseconds > 0\n ) {\n prevVelocityRef.current[touch.id] = {\n x: distX / timeDiffseconds / Platform.PixelRatio,\n y: distY / timeDiffseconds / Platform.PixelRatio,\n };\n }\n\n const extendedTouchInfo: ExtendedTouchInfo = {\n ...touch,\n velocityX: prevVelocityRef.current[touch.id]?.x ?? 0,\n velocityY: prevVelocityRef.current[touch.id]?.y ?? 0,\n };\n\n // Save previous touch\n prevTouchInfoRef.current[touch.id] = touch;\n\n if (touch.type === TouchType.Start) {\n delete prevVelocityRef.current[touch.id];\n handlers.onStart && handlers.onStart(touch);\n } else if (touch.type === TouchType.Active) {\n handlers.onActive && handlers.onActive(extendedTouchInfo);\n } else {\n handlers.onEnd && handlers.onEnd(extendedTouchInfo);\n }\n }\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, deps);\n};\n\n/**\n * Provides a callback for handling touch events in the Skia View.\n * This touch handler only handles single touches.\n * @param handlers Callbacks for the different touch states\n * @param deps optional Dependency array to update the handlers\n * @returns A function that can be used from within the onDraw callback to\n * update and handle touch events. Call it with the touches property from\n * the info object.\n */\nexport const useTouchHandler = (\n handlers: TouchHandlers,\n deps: DependencyList = []\n): TouchHandler => {\n return useInternalTouchHandler(handlers, deps, false);\n};\n\n/**\n * Provides a callback for handling touch events in the Skia View.\n * This touch handler handles multiple touches.\n * @param handlers Callbacks for the different touch states\n * @param deps optional Dependency array to update the handlers\n * @returns A function that can be used from within the onDraw callback to\n * update and handle touch events. Call it with the touches property from\n * the info object.\n */\nexport const useMultiTouchHandler = (\n handlers: TouchHandlers,\n deps: DependencyList = []\n): TouchHandler => {\n return useInternalTouchHandler(handlers, deps, true);\n};\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import React, { useMemo, lazy, Suspense } from "react";
2
- import { Platform } from "react-native";
2
+ import { Platform } from "../Platform";
3
3
  import { LoadSkiaWeb } from "./LoadSkiaWeb";
4
4
  export const WithSkiaWeb = _ref => {
5
5
  let {
@@ -1 +1 @@
1
- {"version":3,"names":["React","useMemo","lazy","Suspense","Platform","LoadSkiaWeb","WithSkiaWeb","getComponent","fallback","opts","Inner","OS","console","warn"],"sources":["WithSkiaWeb.tsx"],"sourcesContent":["import type { ComponentProps, ComponentType } from \"react\";\nimport React, { useMemo, lazy, Suspense } from \"react\";\nimport { Platform } from \"react-native\";\n\nimport { LoadSkiaWeb } from \"./LoadSkiaWeb\";\n\ninterface WithSkiaProps {\n fallback?: ComponentProps<typeof Suspense>[\"fallback\"];\n getComponent: () => Promise<{ default: ComponentType }>;\n opts?: Parameters<typeof LoadSkiaWeb>[0];\n}\n\nexport const WithSkiaWeb = ({\n getComponent,\n fallback,\n opts,\n}: WithSkiaProps) => {\n const Inner = useMemo(\n // TODO: investigate\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (): any =>\n lazy(async () => {\n if (Platform.OS === \"web\") {\n await LoadSkiaWeb(opts);\n } else {\n console.warn(\n \"<WithSkiaWeb /> is only necessary on web. Consider not using on native.\"\n );\n }\n return getComponent();\n }),\n [getComponent, opts]\n );\n return (\n <Suspense fallback={fallback ?? null}>\n <Inner />\n </Suspense>\n );\n};\n"],"mappings":"AACA,OAAOA,KAAP,IAAgBC,OAAhB,EAAyBC,IAAzB,EAA+BC,QAA/B,QAA+C,OAA/C;AACA,SAASC,QAAT,QAAyB,cAAzB;AAEA,SAASC,WAAT,QAA4B,eAA5B;AAQA,OAAO,MAAMC,WAAW,GAAG,QAIN;EAAA,IAJO;IAC1BC,YAD0B;IAE1BC,QAF0B;IAG1BC;EAH0B,CAIP;EACnB,MAAMC,KAAK,GAAGT,OAAO,EACnB;EACA;EACA,mBACEC,IAAI,CAAC,YAAY;IACf,IAAIE,QAAQ,CAACO,EAAT,KAAgB,KAApB,EAA2B;MACzB,MAAMN,WAAW,CAACI,IAAD,CAAjB;IACD,CAFD,MAEO;MACLG,OAAO,CAACC,IAAR,CACE,yEADF;IAGD;;IACD,OAAON,YAAY,EAAnB;EACD,CATG,CAJa,EAcnB,CAACA,YAAD,EAAeE,IAAf,CAdmB,CAArB;EAgBA,oBACE,oBAAC,QAAD;IAAU,QAAQ,EAAED,QAAF,aAAEA,QAAF,cAAEA,QAAF,GAAc;EAAhC,gBACE,oBAAC,KAAD,OADF,CADF;AAKD,CA1BM"}
1
+ {"version":3,"names":["React","useMemo","lazy","Suspense","Platform","LoadSkiaWeb","WithSkiaWeb","getComponent","fallback","opts","Inner","OS","console","warn"],"sources":["WithSkiaWeb.tsx"],"sourcesContent":["import type { ComponentProps, ComponentType } from \"react\";\nimport React, { useMemo, lazy, Suspense } from \"react\";\n\nimport { Platform } from \"../Platform\";\n\nimport { LoadSkiaWeb } from \"./LoadSkiaWeb\";\n\ninterface WithSkiaProps {\n fallback?: ComponentProps<typeof Suspense>[\"fallback\"];\n getComponent: () => Promise<{ default: ComponentType }>;\n opts?: Parameters<typeof LoadSkiaWeb>[0];\n}\n\nexport const WithSkiaWeb = ({\n getComponent,\n fallback,\n opts,\n}: WithSkiaProps) => {\n const Inner = useMemo(\n // TODO: investigate\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (): any =>\n lazy(async () => {\n if (Platform.OS === \"web\") {\n await LoadSkiaWeb(opts);\n } else {\n console.warn(\n \"<WithSkiaWeb /> is only necessary on web. Consider not using on native.\"\n );\n }\n return getComponent();\n }),\n [getComponent, opts]\n );\n return (\n <Suspense fallback={fallback ?? null}>\n <Inner />\n </Suspense>\n );\n};\n"],"mappings":"AACA,OAAOA,KAAP,IAAgBC,OAAhB,EAAyBC,IAAzB,EAA+BC,QAA/B,QAA+C,OAA/C;AAEA,SAASC,QAAT,QAAyB,aAAzB;AAEA,SAASC,WAAT,QAA4B,eAA5B;AAQA,OAAO,MAAMC,WAAW,GAAG,QAIN;EAAA,IAJO;IAC1BC,YAD0B;IAE1BC,QAF0B;IAG1BC;EAH0B,CAIP;EACnB,MAAMC,KAAK,GAAGT,OAAO,EACnB;EACA;EACA,mBACEC,IAAI,CAAC,YAAY;IACf,IAAIE,QAAQ,CAACO,EAAT,KAAgB,KAApB,EAA2B;MACzB,MAAMN,WAAW,CAACI,IAAD,CAAjB;IACD,CAFD,MAEO;MACLG,OAAO,CAACC,IAAR,CACE,yEADF;IAGD;;IACD,OAAON,YAAY,EAAnB;EACD,CATG,CAJa,EAcnB,CAACA,YAAD,EAAeE,IAAf,CAdmB,CAArB;EAgBA,oBACE,oBAAC,QAAD;IAAU,QAAQ,EAAED,QAAF,aAAEA,QAAF,cAAEA,QAAF,GAAc;EAAhC,gBACE,oBAAC,KAAD,OADF,CADF;AAKD,CA1BM"}
@@ -0,0 +1,12 @@
1
+ /// <reference types="react" />
2
+ import type { HostComponent, NodeHandle, ViewComponent } from "react-native";
3
+ import type { DataModule } from "../skia/types";
4
+ export interface IPlatform {
5
+ OS: string;
6
+ requireNativeComponent: <T>(viewName: string) => HostComponent<T>;
7
+ PixelRatio: number;
8
+ NativeModules: Record<string, any>;
9
+ findNodeHandle: (componentOrHandle: null | number | React.Component<any, any> | React.ComponentClass<any>) => null | NodeHandle;
10
+ resolveAsset: (source: DataModule) => string;
11
+ View: typeof ViewComponent;
12
+ }
@@ -0,0 +1,2 @@
1
+ import type { IPlatform } from "./IPlatform";
2
+ export declare const Platform: IPlatform;
@@ -0,0 +1,2 @@
1
+ import type { IPlatform } from "./IPlatform";
2
+ export declare const Platform: IPlatform;
@@ -0,0 +1 @@
1
+ export * from "./Platform";
@@ -13,12 +13,12 @@ export declare enum MatrixIndex {
13
13
  }
14
14
  export declare const isMatrix: (obj: unknown) => obj is SkMatrix;
15
15
  export interface SkMatrix extends SkJSIInstance<"Matrix"> {
16
- concat: (matrix: SkMatrix) => void;
17
- translate: (x: number, y: number) => void;
18
- scale: (x: number, y?: number) => void;
19
- skew: (x: number, y: number) => void;
20
- rotate: (theta: number) => void;
21
- identity: () => void;
16
+ concat: (matrix: SkMatrix) => SkMatrix;
17
+ translate: (x: number, y: number) => SkMatrix;
18
+ scale: (x: number, y?: number) => SkMatrix;
19
+ skew: (x: number, y: number) => SkMatrix;
20
+ rotate: (theta: number) => SkMatrix;
21
+ identity: () => SkMatrix;
22
22
  get: () => number[];
23
23
  }
24
24
  declare type Transform2dName = "translateX" | "translateY" | "scale" | "skewX" | "skewY" | "scaleX" | "scaleY" | "rotateZ" | "rotate";
@@ -3,11 +3,11 @@ import type { SkMatrix } from "../types";
3
3
  import { HostObject } from "./Host";
4
4
  export declare class JsiSkMatrix extends HostObject<Matrix3x3, "Matrix"> implements SkMatrix {
5
5
  constructor(CanvasKit: CanvasKit, ref: Matrix3x3);
6
- concat(matrix: SkMatrix): void;
7
- translate(x: number, y: number): void;
8
- scale(x: number, y?: number): void;
9
- skew(x: number, y: number): void;
10
- rotate(value: number): void;
11
- identity(): void;
6
+ concat(matrix: SkMatrix): this;
7
+ translate(x: number, y: number): this;
8
+ scale(x: number, y?: number): this;
9
+ skew(x: number, y: number): this;
10
+ rotate(value: number): this;
11
+ identity(): this;
12
12
  get(): number[];
13
13
  }
@@ -17,7 +17,7 @@ export declare abstract class SkiaBaseWebView<TProps extends SkiaBaseViewProps>
17
17
  protected width: number;
18
18
  protected height: number;
19
19
  private unsubscribeAll;
20
- private onLayout;
20
+ private onLayoutEvent;
21
21
  protected getSize(): {
22
22
  width: number;
23
23
  height: number;
@@ -58,5 +58,10 @@ export declare abstract class SkiaBaseWebView<TProps extends SkiaBaseViewProps>
58
58
  registerValues(_values: SkiaValue<unknown>[]): void;
59
59
  private handleTouchEvent;
60
60
  createTouchHandler(touchType: TouchType): (evt: PointerEvent) => void;
61
+ private onStart;
62
+ private onActive;
63
+ private onCancel;
64
+ private onEnd;
65
+ private onLayout;
61
66
  render(): JSX.Element;
62
67
  }
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": "0.1.188",
10
+ "version": "0.1.190",
11
11
  "description": "High-performance React Native Graphics using Skia",
12
12
  "main": "lib/module/index.js",
13
13
  "files": [
@@ -81,28 +81,28 @@
81
81
  "devDependencies": {
82
82
  "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6",
83
83
  "@types/jest": "^28.1.6",
84
+ "@types/pixelmatch": "^5.2.4",
85
+ "@types/pngjs": "^6.0.1",
84
86
  "@types/react-native": "0.70.6",
85
87
  "@types/react-reconciler": "^0.26.7",
88
+ "@types/ws": "^8.5.3",
86
89
  "eslint": "8.21.0",
87
90
  "eslint-config-react-native-wcandillon": "3.9.0",
88
91
  "eslint-plugin-reanimated": "2.0.0",
89
92
  "jest": "28.1.3",
90
93
  "merge-dirs": "^0.2.1",
94
+ "pixelmatch": "^5.3.0",
95
+ "pngjs": "^6.0.0",
91
96
  "react": "18.1.0",
92
97
  "react-native": "0.71.7",
93
98
  "react-native-builder-bob": "^0.18.2",
94
99
  "ts-jest": "^28.0.7",
95
- "typescript": "4.8.3"
100
+ "typescript": "4.8.3",
101
+ "ws": "^8.11.0"
96
102
  },
97
103
  "dependencies": {
98
- "@types/pixelmatch": "^5.2.4",
99
- "@types/pngjs": "^6.0.1",
100
- "@types/ws": "^8.5.3",
101
104
  "canvaskit-wasm": "0.38.0",
102
- "pixelmatch": "^5.3.0",
103
- "pngjs": "^6.0.0",
104
- "react-reconciler": "^0.27.0",
105
- "ws": "^8.11.0"
105
+ "react-reconciler": "^0.27.0"
106
106
  },
107
107
  "eslintIgnore": [
108
108
  "node_modules/",
@@ -0,0 +1,20 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ import type { HostComponent, NodeHandle, ViewComponent } from "react-native";
3
+
4
+ import type { DataModule } from "../skia/types";
5
+
6
+ export interface IPlatform {
7
+ OS: string;
8
+ requireNativeComponent: <T>(viewName: string) => HostComponent<T>;
9
+ PixelRatio: number;
10
+ NativeModules: Record<string, any>;
11
+ findNodeHandle: (
12
+ componentOrHandle:
13
+ | null
14
+ | number
15
+ | React.Component<any, any>
16
+ | React.ComponentClass<any>
17
+ ) => null | NodeHandle;
18
+ resolveAsset: (source: DataModule) => string;
19
+ View: typeof ViewComponent;
20
+ }
@@ -0,0 +1,28 @@
1
+ import {
2
+ Image,
3
+ PixelRatio,
4
+ requireNativeComponent,
5
+ Platform as RNPlatform,
6
+ findNodeHandle,
7
+ NativeModules,
8
+ View,
9
+ } from "react-native";
10
+
11
+ import type { DataModule } from "../skia/types";
12
+ import { isRNModule } from "../skia/types";
13
+
14
+ import type { IPlatform } from "./IPlatform";
15
+
16
+ export const Platform: IPlatform = {
17
+ OS: RNPlatform.OS,
18
+ PixelRatio: PixelRatio.get(),
19
+ requireNativeComponent,
20
+ resolveAsset: (source: DataModule) => {
21
+ return isRNModule(source)
22
+ ? Image.resolveAssetSource(source).uri
23
+ : source.default;
24
+ },
25
+ findNodeHandle,
26
+ NativeModules,
27
+ View,
28
+ };
@@ -0,0 +1,136 @@
1
+ import type { RefObject, CSSProperties } from "react";
2
+ import React, { useLayoutEffect, useMemo, useRef } from "react";
3
+ import type { LayoutChangeEvent, ViewComponent, ViewProps } from "react-native";
4
+
5
+ import type { DataModule } from "../skia/types";
6
+ import { isRNModule } from "../skia/types";
7
+
8
+ import type { IPlatform } from "./IPlatform";
9
+
10
+ // eslint-disable-next-line max-len
11
+ // https://github.com/necolas/react-native-web/blob/master/packages/react-native-web/src/modules/useElementLayout/index.js
12
+ const DOM_LAYOUT_HANDLER_NAME = "__reactLayoutHandler";
13
+ type OnLayout = ((event: LayoutChangeEvent) => void) | undefined;
14
+ type Div = HTMLDivElement & {
15
+ __reactLayoutHandler: OnLayout;
16
+ };
17
+
18
+ let resizeObserver: ResizeObserver | null = null;
19
+
20
+ const getObserver = () => {
21
+ if (resizeObserver == null) {
22
+ resizeObserver = new window.ResizeObserver(function (entries) {
23
+ entries.forEach((entry) => {
24
+ const node = entry.target as Div;
25
+ const { left, top, width, height } = entry.contentRect;
26
+ const onLayout = node[DOM_LAYOUT_HANDLER_NAME];
27
+ if (typeof onLayout === "function") {
28
+ // setTimeout 0 is taken from react-native-web (UIManager)
29
+ setTimeout(
30
+ () =>
31
+ onLayout({
32
+ timeStamp: Date.now(),
33
+ nativeEvent: { layout: { x: left, y: top, width, height } },
34
+ currentTarget: 0,
35
+ target: 0,
36
+ bubbles: false,
37
+ cancelable: false,
38
+ defaultPrevented: false,
39
+ eventPhase: 0,
40
+ isDefaultPrevented() {
41
+ throw new Error("Method not supported on web.");
42
+ },
43
+ isPropagationStopped() {
44
+ throw new Error("Method not supported on web.");
45
+ },
46
+ persist() {
47
+ throw new Error("Method not supported on web.");
48
+ },
49
+ preventDefault() {
50
+ throw new Error("Method not supported on web.");
51
+ },
52
+ stopPropagation() {
53
+ throw new Error("Method not supported on web.");
54
+ },
55
+ isTrusted: true,
56
+ type: "",
57
+ }),
58
+ 0
59
+ );
60
+ }
61
+ });
62
+ });
63
+ }
64
+ return resizeObserver;
65
+ };
66
+
67
+ const useElementLayout = (ref: RefObject<Div>, onLayout: OnLayout) => {
68
+ const observer = getObserver();
69
+
70
+ useLayoutEffect(() => {
71
+ const node = ref.current;
72
+ if (node !== null) {
73
+ node[DOM_LAYOUT_HANDLER_NAME] = onLayout;
74
+ }
75
+ }, [ref, onLayout]);
76
+
77
+ useLayoutEffect(() => {
78
+ const node = ref.current;
79
+ if (node != null && observer != null) {
80
+ if (typeof node[DOM_LAYOUT_HANDLER_NAME] === "function") {
81
+ observer.observe(node);
82
+ } else {
83
+ observer.unobserve(node);
84
+ }
85
+ }
86
+ return () => {
87
+ if (node != null && observer != null) {
88
+ observer.unobserve(node);
89
+ }
90
+ };
91
+ }, [observer, ref]);
92
+ };
93
+
94
+ const View = (({ children, onLayout, style: rawStyle }: ViewProps) => {
95
+ const style = useMemo(() => (rawStyle ?? {}) as CSSProperties, [rawStyle]);
96
+ const ref = useRef<Div>(null);
97
+ useElementLayout(ref, onLayout);
98
+ const cssStyles = useMemo(() => {
99
+ return {
100
+ ...style,
101
+ display: "flex",
102
+ flexDirection: style.flexDirection || "column",
103
+ flexWrap: style.flexWrap || "nowrap",
104
+ justifyContent: style.justifyContent || "flex-start",
105
+ alignItems: style.alignItems || "stretch",
106
+ alignContent: style.alignContent || "stretch",
107
+ };
108
+ }, [style]);
109
+
110
+ return (
111
+ <div ref={ref} style={cssStyles}>
112
+ {children}
113
+ </div>
114
+ );
115
+ }) as unknown as typeof ViewComponent;
116
+
117
+ export const Platform: IPlatform = {
118
+ OS: "web",
119
+ PixelRatio: window.devicePixelRatio,
120
+ requireNativeComponent: () => {
121
+ throw new Error("requireNativeComponent is not supported on the web");
122
+ },
123
+ resolveAsset: (source: DataModule) => {
124
+ if (isRNModule(source)) {
125
+ throw new Error(
126
+ "Image source is a number - this is not supported on the web"
127
+ );
128
+ }
129
+ return source.default;
130
+ },
131
+ findNodeHandle: () => {
132
+ throw new Error("findNodeHandle is not supported on the web");
133
+ },
134
+ NativeModules: {},
135
+ View,
136
+ };
@@ -0,0 +1 @@
1
+ export * from "./Platform";
@@ -1,8 +1,8 @@
1
- import { NativeModules, Platform } from "react-native";
1
+ import { Platform } from "../Platform";
2
2
 
3
3
  if (Platform.OS !== "web" && global.SkiaApi == null) {
4
4
  // Initialize RN Skia
5
- const SkiaModule = NativeModules.RNSkia;
5
+ const SkiaModule = Platform.NativeModules.RNSkia;
6
6
  if (SkiaModule == null || typeof SkiaModule.install !== "function") {
7
7
  throw new Error(
8
8
  "Native RNSkia Module cannot be found! Make sure you correctly " +
@@ -1,20 +1,8 @@
1
1
  import { useEffect, useRef, useState } from "react";
2
- import { Image } from "react-native";
3
2
 
4
3
  import { Skia } from "../Skia";
5
- import { isRNModule } from "../types";
6
- import type {
7
- SkData,
8
- DataModule,
9
- DataSourceParam,
10
- JsiDisposable,
11
- } from "../types";
12
-
13
- const resolveAsset = (source: DataModule) => {
14
- return isRNModule(source)
15
- ? Image.resolveAssetSource(source).uri
16
- : source.default;
17
- };
4
+ import type { SkData, DataSourceParam, JsiDisposable } from "../types";
5
+ import { Platform } from "../../Platform";
18
6
 
19
7
  const factoryWrapper = <T>(
20
8
  data2: SkData,
@@ -42,7 +30,8 @@ const loadData = <T>(
42
30
  resolve(factoryWrapper(Skia.Data.fromBytes(source), factory, onError))
43
31
  );
44
32
  } else {
45
- const uri = typeof source === "string" ? source : resolveAsset(source);
33
+ const uri =
34
+ typeof source === "string" ? source : Platform.resolveAsset(source);
46
35
  return Skia.Data.fromURI(uri).then((d) =>
47
36
  factoryWrapper(d, factory, onError)
48
37
  );
@@ -1,5 +1,4 @@
1
- import { findNodeHandle, Platform } from "react-native";
2
-
1
+ import { Platform } from "../../Platform";
3
2
  import { Skia } from "../Skia";
4
3
  import type { DataSourceParam, SkImage } from "../types";
5
4
 
@@ -48,7 +47,7 @@ export const makeImageFromView = <
48
47
  );
49
48
  }
50
49
  }
51
- const viewTag = findNodeHandle(viewRef.current);
50
+ const viewTag = Platform.findNodeHandle(viewRef.current);
52
51
  if (viewTag !== null && viewTag !== 0) {
53
52
  return Skia.Image.MakeImageFromViewTag(viewTag);
54
53
  }
@@ -16,12 +16,12 @@ export const isMatrix = (obj: unknown): obj is SkMatrix =>
16
16
  obj !== null && (obj as SkJSIInstance<string>).__typename__ === "Matrix";
17
17
 
18
18
  export interface SkMatrix extends SkJSIInstance<"Matrix"> {
19
- concat: (matrix: SkMatrix) => void;
20
- translate: (x: number, y: number) => void;
21
- scale: (x: number, y?: number) => void;
22
- skew: (x: number, y: number) => void;
23
- rotate: (theta: number) => void;
24
- identity: () => void;
19
+ concat: (matrix: SkMatrix) => SkMatrix;
20
+ translate: (x: number, y: number) => SkMatrix;
21
+ scale: (x: number, y?: number) => SkMatrix;
22
+ skew: (x: number, y: number) => SkMatrix;
23
+ rotate: (theta: number) => SkMatrix;
24
+ identity: () => SkMatrix;
25
25
  get: () => number[];
26
26
  }
27
27
 
@@ -16,6 +16,7 @@ export class JsiSkMatrix
16
16
  this.ref.set(
17
17
  this.CanvasKit.Matrix.multiply(this.ref, JsiSkMatrix.fromValue(matrix))
18
18
  );
19
+ return this;
19
20
  }
20
21
 
21
22
  translate(x: number, y: number) {
@@ -25,6 +26,7 @@ export class JsiSkMatrix
25
26
  Float32Array.of(...this.CanvasKit.Matrix.translated(x, y))
26
27
  )
27
28
  );
29
+ return this;
28
30
  }
29
31
 
30
32
  scale(x: number, y?: number) {
@@ -34,6 +36,7 @@ export class JsiSkMatrix
34
36
  Float32Array.of(...this.CanvasKit.Matrix.scaled(x, y ?? x))
35
37
  )
36
38
  );
39
+ return this;
37
40
  }
38
41
 
39
42
  skew(x: number, y: number) {
@@ -43,6 +46,7 @@ export class JsiSkMatrix
43
46
  Float32Array.of(...this.CanvasKit.Matrix.skewed(x, y))
44
47
  )
45
48
  );
49
+ return this;
46
50
  }
47
51
 
48
52
  rotate(value: number) {
@@ -52,10 +56,12 @@ export class JsiSkMatrix
52
56
  Float32Array.of(...this.CanvasKit.Matrix.rotated(value))
53
57
  )
54
58
  );
59
+ return this;
55
60
  }
56
61
 
57
62
  identity() {
58
63
  this.ref.set(this.CanvasKit.Matrix.identity());
64
+ return this;
59
65
  }
60
66
 
61
67
  get() {
@@ -2,16 +2,16 @@
2
2
  import React from "react";
3
3
  import type { PointerEvent } from "react";
4
4
  import type { LayoutChangeEvent } from "react-native";
5
- import { PixelRatio, View } from "react-native";
6
5
 
7
6
  import type { SkRect, SkCanvas } from "../skia/types";
8
7
  import type { SkiaValue } from "../values";
9
8
  import { JsiSkSurface } from "../skia/web/JsiSkSurface";
9
+ import { Platform } from "../Platform";
10
10
 
11
11
  import type { DrawMode, SkiaBaseViewProps, TouchInfo } from "./types";
12
12
  import { TouchType } from "./types";
13
13
 
14
- const pd = PixelRatio.get();
14
+ const pd = Platform.PixelRatio;
15
15
 
16
16
  export abstract class SkiaBaseWebView<
17
17
  TProps extends SkiaBaseViewProps
@@ -38,17 +38,16 @@ export abstract class SkiaBaseWebView<
38
38
  this._unsubscriptions = [];
39
39
  }
40
40
 
41
- private onLayout(evt: LayoutChangeEvent) {
41
+ private onLayoutEvent(evt: LayoutChangeEvent) {
42
42
  const { CanvasKit } = global;
43
- const { width, height } = evt.nativeEvent.layout;
44
- this.width = width;
45
- this.height = height;
46
43
  // Reset canvas / surface on layout change
47
- if (this._canvasRef.current) {
48
- const canvas = this._canvasRef.current;
49
- canvas.width = width * pd;
50
- canvas.height = height * pd;
51
- const surface = CanvasKit.MakeWebGLCanvasSurface(this._canvasRef.current);
44
+ const canvas = this._canvasRef.current;
45
+ if (canvas) {
46
+ this.width = canvas.clientWidth;
47
+ this.height = canvas.clientHeight;
48
+ canvas.width = this.width * pd;
49
+ canvas.height = this.height * pd;
50
+ const surface = CanvasKit.MakeWebGLCanvasSurface(canvas);
52
51
  if (!surface) {
53
52
  throw new Error("Could not create surface");
54
53
  }
@@ -178,21 +177,27 @@ export abstract class SkiaBaseWebView<
178
177
  return (evt: PointerEvent) => this.handleTouchEvent(evt, touchType);
179
178
  }
180
179
 
180
+ private onStart = this.createTouchHandler(TouchType.Start);
181
+ private onActive = this.createTouchHandler(TouchType.Active);
182
+ private onCancel = this.createTouchHandler(TouchType.Cancelled);
183
+ private onEnd = this.createTouchHandler(TouchType.End);
184
+ private onLayout = this.onLayoutEvent.bind(this);
185
+
181
186
  render() {
182
187
  const { mode, debug = false, ...viewProps } = this.props;
183
188
  return (
184
- <View {...viewProps} onLayout={this.onLayout.bind(this)}>
189
+ <Platform.View {...viewProps} onLayout={this.onLayout}>
185
190
  <canvas
186
191
  ref={this._canvasRef}
187
192
  style={{ display: "flex", flex: 1 }}
188
- onPointerDown={this.createTouchHandler(TouchType.Start)}
189
- onPointerMove={this.createTouchHandler(TouchType.Active)}
190
- onPointerUp={this.createTouchHandler(TouchType.End)}
191
- onPointerCancel={this.createTouchHandler(TouchType.Cancelled)}
192
- onPointerLeave={this.createTouchHandler(TouchType.End)}
193
- onPointerOut={this.createTouchHandler(TouchType.End)}
193
+ onPointerDown={this.onStart}
194
+ onPointerMove={this.onActive}
195
+ onPointerUp={this.onEnd}
196
+ onPointerCancel={this.onCancel}
197
+ onPointerLeave={this.onEnd}
198
+ onPointerOut={this.onEnd}
194
199
  />
195
- </View>
200
+ </Platform.View>
196
201
  );
197
202
  }
198
203
  }
@@ -1,9 +1,9 @@
1
1
  import React from "react";
2
- import { requireNativeComponent, Platform } from "react-native";
3
2
  import type { HostComponent } from "react-native";
4
3
 
5
4
  import type { SkRect } from "../skia/types";
6
5
  import type { SkiaValue } from "../values";
6
+ import { Platform } from "../Platform";
7
7
 
8
8
  import { SkiaViewApi } from "./api";
9
9
  import { SkiaViewNativeId } from "./SkiaView";
@@ -11,7 +11,7 @@ import type { NativeSkiaViewProps, SkiaDomViewProps } from "./types";
11
11
 
12
12
  const NativeSkiaDomView: HostComponent<SkiaDomViewProps> =
13
13
  Platform.OS !== "web"
14
- ? requireNativeComponent<NativeSkiaViewProps>("SkiaDomView")
14
+ ? Platform.requireNativeComponent<NativeSkiaViewProps>("SkiaDomView")
15
15
  : // eslint-disable-next-line @typescript-eslint/no-explicit-any
16
16
  (null as any);
17
17
 
@@ -1,15 +1,15 @@
1
1
  import React from "react";
2
- import { requireNativeComponent } from "react-native";
3
2
 
4
3
  import type { SkRect } from "../skia/types";
5
4
  import type { SkiaValue } from "../values";
5
+ import { Platform } from "../Platform";
6
6
 
7
7
  import { SkiaViewApi } from "./api";
8
8
  import { SkiaViewNativeId } from "./SkiaView";
9
9
  import type { NativeSkiaViewProps, SkiaPictureViewProps } from "./types";
10
10
 
11
11
  const NativeSkiaPictureView =
12
- requireNativeComponent<NativeSkiaViewProps>("SkiaPictureView");
12
+ Platform.requireNativeComponent<NativeSkiaViewProps>("SkiaPictureView");
13
13
 
14
14
  export class SkiaPictureView extends React.Component<SkiaPictureViewProps> {
15
15
  constructor(props: SkiaPictureViewProps) {
@@ -1,8 +1,8 @@
1
1
  import React from "react";
2
- import { requireNativeComponent } from "react-native";
3
2
 
4
3
  import type { SkRect } from "../skia/types";
5
4
  import type { SkiaValue } from "../values";
5
+ import { Platform } from "../Platform";
6
6
 
7
7
  import { SkiaViewApi } from "./api";
8
8
  import type { NativeSkiaViewProps, SkiaDrawViewProps } from "./types";
@@ -10,7 +10,7 @@ import type { NativeSkiaViewProps, SkiaDrawViewProps } from "./types";
10
10
  export const SkiaViewNativeId = { current: 1000 };
11
11
 
12
12
  const NativeSkiaView =
13
- requireNativeComponent<NativeSkiaViewProps>("SkiaDrawView");
13
+ Platform.requireNativeComponent<NativeSkiaViewProps>("SkiaDrawView");
14
14
 
15
15
  export class SkiaView extends React.Component<SkiaDrawViewProps> {
16
16
  constructor(props: SkiaDrawViewProps) {