@shopify/react-native-skia 0.1.115 → 0.1.119

Sign up to get free protection for your applications and to get access to all the features.
Files changed (217) hide show
  1. package/README.md +39 -2
  2. package/cpp/api/JsiSkApi.h +13 -9
  3. package/cpp/api/JsiSkCanvas.h +9 -1
  4. package/cpp/api/JsiSkPicture.h +71 -0
  5. package/cpp/api/JsiSkPictureFactory.h +50 -0
  6. package/cpp/api/JsiSkPictureRecorder.h +53 -0
  7. package/lib/commonjs/renderer/Canvas.js +22 -36
  8. package/lib/commonjs/renderer/Canvas.js.map +1 -1
  9. package/lib/commonjs/renderer/HostConfig.js +3 -25
  10. package/lib/commonjs/renderer/HostConfig.js.map +1 -1
  11. package/lib/commonjs/renderer/components/{Defs.js → Drawing.js} +13 -12
  12. package/lib/commonjs/renderer/components/Drawing.js.map +1 -0
  13. package/lib/commonjs/renderer/components/Group.js +31 -20
  14. package/lib/commonjs/renderer/components/Group.js.map +1 -1
  15. package/lib/commonjs/renderer/components/Paint.js +1 -21
  16. package/lib/commonjs/renderer/components/Paint.js.map +1 -1
  17. package/lib/commonjs/renderer/components/Picture.js +35 -0
  18. package/lib/commonjs/renderer/components/Picture.js.map +1 -0
  19. package/lib/commonjs/renderer/components/imageFilters/InnerShadow.js +5 -34
  20. package/lib/commonjs/renderer/components/imageFilters/InnerShadow.js.map +1 -1
  21. package/lib/commonjs/renderer/components/imageFilters/{DropShadow.js → Shadow.js} +19 -8
  22. package/lib/commonjs/renderer/components/imageFilters/Shadow.js.map +1 -0
  23. package/lib/commonjs/renderer/components/imageFilters/index.js +4 -17
  24. package/lib/commonjs/renderer/components/imageFilters/index.js.map +1 -1
  25. package/lib/commonjs/renderer/components/index.js +17 -4
  26. package/lib/commonjs/renderer/components/index.js.map +1 -1
  27. package/lib/commonjs/renderer/components/maskFilters/Blur.js +1 -1
  28. package/lib/commonjs/renderer/components/maskFilters/Blur.js.map +1 -1
  29. package/lib/commonjs/renderer/components/shapes/Box.js +126 -0
  30. package/lib/commonjs/renderer/components/shapes/Box.js.map +1 -0
  31. package/lib/commonjs/renderer/components/shapes/FitBox.js +9 -5
  32. package/lib/commonjs/renderer/components/shapes/FitBox.js.map +1 -1
  33. package/lib/commonjs/renderer/components/shapes/index.js +13 -0
  34. package/lib/commonjs/renderer/components/shapes/index.js.map +1 -1
  35. package/lib/commonjs/renderer/index.js +13 -0
  36. package/lib/commonjs/renderer/index.js.map +1 -1
  37. package/lib/commonjs/renderer/nodes/Declaration.js +12 -1
  38. package/lib/commonjs/renderer/nodes/Declaration.js.map +1 -1
  39. package/lib/commonjs/renderer/nodes/Drawing.js +9 -24
  40. package/lib/commonjs/renderer/nodes/Drawing.js.map +1 -1
  41. package/lib/commonjs/renderer/nodes/Node.js +9 -16
  42. package/lib/commonjs/renderer/nodes/Node.js.map +1 -1
  43. package/lib/commonjs/renderer/processors/Paint.js +24 -26
  44. package/lib/commonjs/renderer/processors/Paint.js.map +1 -1
  45. package/lib/commonjs/renderer/processors/math/Math.js +19 -1
  46. package/lib/commonjs/renderer/processors/math/Math.js.map +1 -1
  47. package/lib/commonjs/renderer/processors/math/Matrix3.js +11 -5
  48. package/lib/commonjs/renderer/processors/math/Matrix3.js.map +1 -1
  49. package/lib/commonjs/renderer/typeddash.js +26 -2
  50. package/lib/commonjs/renderer/typeddash.js.map +1 -1
  51. package/lib/commonjs/renderer/useContextBridge.js +35 -0
  52. package/lib/commonjs/renderer/useContextBridge.js.map +1 -0
  53. package/lib/commonjs/skia/Canvas.js.map +1 -1
  54. package/lib/commonjs/skia/Picture/Picture.js +6 -0
  55. package/lib/commonjs/skia/Picture/Picture.js.map +1 -0
  56. package/lib/commonjs/skia/Picture/PictureFactory.js +6 -0
  57. package/lib/commonjs/skia/Picture/PictureFactory.js.map +1 -0
  58. package/lib/commonjs/skia/Picture/PictureRecorder.js +6 -0
  59. package/lib/commonjs/skia/Picture/PictureRecorder.js.map +1 -0
  60. package/lib/commonjs/skia/Picture/index.js +58 -0
  61. package/lib/commonjs/skia/Picture/index.js.map +1 -0
  62. package/lib/commonjs/skia/Picture/usePicture.js +30 -0
  63. package/lib/commonjs/skia/Picture/usePicture.js.map +1 -0
  64. package/lib/commonjs/skia/Skia.js +2 -0
  65. package/lib/commonjs/skia/Skia.js.map +1 -1
  66. package/lib/commonjs/skia/index.js +28 -0
  67. package/lib/commonjs/skia/index.js.map +1 -1
  68. package/lib/commonjs/values/hooks/useDerivedValue.js +2 -2
  69. package/lib/commonjs/values/hooks/useDerivedValue.js.map +1 -1
  70. package/lib/commonjs/views/SkiaView.js +6 -44
  71. package/lib/commonjs/views/SkiaView.js.map +1 -1
  72. package/lib/commonjs/views/types.js.map +1 -1
  73. package/lib/module/renderer/Canvas.js +20 -32
  74. package/lib/module/renderer/Canvas.js.map +1 -1
  75. package/lib/module/renderer/HostConfig.js +2 -24
  76. package/lib/module/renderer/HostConfig.js.map +1 -1
  77. package/lib/module/renderer/components/Drawing.js +17 -0
  78. package/lib/module/renderer/components/Drawing.js.map +1 -0
  79. package/lib/module/renderer/components/Group.js +32 -22
  80. package/lib/module/renderer/components/Group.js.map +1 -1
  81. package/lib/module/renderer/components/Paint.js +2 -22
  82. package/lib/module/renderer/components/Paint.js.map +1 -1
  83. package/lib/module/renderer/components/Picture.js +21 -0
  84. package/lib/module/renderer/components/Picture.js.map +1 -0
  85. package/lib/module/renderer/components/imageFilters/InnerShadow.js +4 -26
  86. package/lib/module/renderer/components/imageFilters/InnerShadow.js.map +1 -1
  87. package/lib/module/renderer/components/imageFilters/{DropShadow.js → Shadow.js} +16 -6
  88. package/lib/module/renderer/components/imageFilters/Shadow.js.map +1 -0
  89. package/lib/module/renderer/components/imageFilters/index.js +1 -2
  90. package/lib/module/renderer/components/imageFilters/index.js.map +1 -1
  91. package/lib/module/renderer/components/index.js +2 -1
  92. package/lib/module/renderer/components/index.js.map +1 -1
  93. package/lib/module/renderer/components/maskFilters/Blur.js +1 -1
  94. package/lib/module/renderer/components/maskFilters/Blur.js.map +1 -1
  95. package/lib/module/renderer/components/shapes/Box.js +102 -0
  96. package/lib/module/renderer/components/shapes/Box.js.map +1 -0
  97. package/lib/module/renderer/components/shapes/FitBox.js +5 -4
  98. package/lib/module/renderer/components/shapes/FitBox.js.map +1 -1
  99. package/lib/module/renderer/components/shapes/index.js +1 -0
  100. package/lib/module/renderer/components/shapes/index.js.map +1 -1
  101. package/lib/module/renderer/index.js +1 -0
  102. package/lib/module/renderer/index.js.map +1 -1
  103. package/lib/module/renderer/nodes/Declaration.js +4 -0
  104. package/lib/module/renderer/nodes/Declaration.js.map +1 -1
  105. package/lib/module/renderer/nodes/Drawing.js +8 -21
  106. package/lib/module/renderer/nodes/Drawing.js.map +1 -1
  107. package/lib/module/renderer/nodes/Node.js +9 -15
  108. package/lib/module/renderer/nodes/Node.js.map +1 -1
  109. package/lib/module/renderer/processors/Paint.js +22 -21
  110. package/lib/module/renderer/processors/Paint.js.map +1 -1
  111. package/lib/module/renderer/processors/math/Math.js +15 -0
  112. package/lib/module/renderer/processors/math/Math.js.map +1 -1
  113. package/lib/module/renderer/processors/math/Matrix3.js +6 -2
  114. package/lib/module/renderer/processors/math/Matrix3.js.map +1 -1
  115. package/lib/module/renderer/typeddash.js +21 -0
  116. package/lib/module/renderer/typeddash.js.map +1 -1
  117. package/lib/module/renderer/useContextBridge.js +21 -0
  118. package/lib/module/renderer/useContextBridge.js.map +1 -0
  119. package/lib/module/skia/Canvas.js.map +1 -1
  120. package/lib/module/skia/Picture/Picture.js +2 -0
  121. package/lib/module/skia/Picture/Picture.js.map +1 -0
  122. package/lib/module/skia/Picture/PictureFactory.js +2 -0
  123. package/lib/module/skia/Picture/PictureFactory.js.map +1 -0
  124. package/lib/module/skia/Picture/PictureRecorder.js +2 -0
  125. package/lib/module/skia/Picture/PictureRecorder.js.map +1 -0
  126. package/lib/module/skia/Picture/index.js +5 -0
  127. package/lib/module/skia/Picture/index.js.map +1 -0
  128. package/lib/module/skia/Picture/usePicture.js +19 -0
  129. package/lib/module/skia/Picture/usePicture.js.map +1 -0
  130. package/lib/module/skia/Skia.js +2 -0
  131. package/lib/module/skia/Skia.js.map +1 -1
  132. package/lib/module/skia/index.js +2 -0
  133. package/lib/module/skia/index.js.map +1 -1
  134. package/lib/module/values/hooks/useDerivedValue.js +1 -1
  135. package/lib/module/values/hooks/useDerivedValue.js.map +1 -1
  136. package/lib/module/views/SkiaView.js +6 -44
  137. package/lib/module/views/SkiaView.js.map +1 -1
  138. package/lib/module/views/types.js.map +1 -1
  139. package/lib/typescript/src/renderer/Canvas.d.ts +5 -10
  140. package/lib/typescript/src/renderer/components/Drawing.d.ts +7 -0
  141. package/lib/typescript/src/renderer/components/Picture.d.ts +6 -0
  142. package/lib/typescript/src/renderer/components/imageFilters/InnerShadow.d.ts +3 -12
  143. package/lib/typescript/src/renderer/components/imageFilters/{DropShadow.d.ts → Shadow.d.ts} +3 -2
  144. package/lib/typescript/src/renderer/components/imageFilters/index.d.ts +1 -2
  145. package/lib/typescript/src/renderer/components/index.d.ts +2 -1
  146. package/lib/typescript/src/renderer/components/shapes/Box.d.ts +23 -0
  147. package/lib/typescript/src/renderer/components/shapes/FitBox.d.ts +9 -0
  148. package/lib/typescript/src/renderer/components/shapes/index.d.ts +1 -0
  149. package/lib/typescript/src/renderer/index.d.ts +1 -0
  150. package/lib/typescript/src/renderer/nodes/Declaration.d.ts +3 -0
  151. package/lib/typescript/src/renderer/nodes/Drawing.d.ts +2 -2
  152. package/lib/typescript/src/renderer/nodes/Node.d.ts +2 -2
  153. package/lib/typescript/src/renderer/processors/Paint.d.ts +2 -2
  154. package/lib/typescript/src/renderer/processors/math/Math.d.ts +14 -0
  155. package/lib/typescript/src/renderer/processors/math/Matrix3.d.ts +1 -0
  156. package/lib/typescript/src/renderer/typeddash.d.ts +1 -0
  157. package/lib/typescript/src/renderer/useContextBridge.d.ts +5 -0
  158. package/lib/typescript/src/skia/Canvas.d.ts +6 -0
  159. package/lib/typescript/src/skia/Picture/Picture.d.ts +26 -0
  160. package/lib/typescript/src/skia/Picture/PictureFactory.d.ts +8 -0
  161. package/lib/typescript/src/skia/Picture/PictureRecorder.d.ts +15 -0
  162. package/lib/typescript/src/skia/Picture/index.d.ts +4 -0
  163. package/lib/typescript/src/skia/Picture/usePicture.d.ts +11 -0
  164. package/lib/typescript/src/skia/Skia.d.ts +5 -0
  165. package/lib/typescript/src/skia/index.d.ts +2 -0
  166. package/lib/typescript/src/views/SkiaView.d.ts +28 -13
  167. package/lib/typescript/src/views/types.d.ts +0 -23
  168. package/libs/ios/libskia.xcframework/ios-arm64_arm64e/libskia.a +0 -0
  169. package/libs/ios/libskia.xcframework/ios-arm64_arm64e_x86_64-simulator/libskia.a +0 -0
  170. package/libs/ios/libskshaper.xcframework/ios-arm64_arm64e/libskshaper.a +0 -0
  171. package/libs/ios/libskshaper.xcframework/ios-arm64_arm64e_x86_64-simulator/libskshaper.a +0 -0
  172. package/libs/ios/libsvg.xcframework/Info.plist +5 -5
  173. package/libs/ios/libsvg.xcframework/ios-arm64_arm64e/libsvg.a +0 -0
  174. package/libs/ios/libsvg.xcframework/ios-arm64_arm64e_x86_64-simulator/libsvg.a +0 -0
  175. package/package.json +7 -7
  176. package/src/renderer/Canvas.tsx +14 -30
  177. package/src/renderer/HostConfig.ts +2 -20
  178. package/src/renderer/components/Drawing.tsx +16 -0
  179. package/src/renderer/components/Group.tsx +44 -27
  180. package/src/renderer/components/Paint.tsx +5 -35
  181. package/src/renderer/components/Picture.tsx +17 -0
  182. package/src/renderer/components/imageFilters/InnerShadow.tsx +33 -47
  183. package/src/renderer/components/imageFilters/Shadow.tsx +39 -0
  184. package/src/renderer/components/imageFilters/index.ts +1 -2
  185. package/src/renderer/components/index.ts +2 -1
  186. package/src/renderer/components/maskFilters/Blur.tsx +1 -1
  187. package/src/renderer/components/shapes/Box.tsx +98 -0
  188. package/src/renderer/components/shapes/FitBox.tsx +6 -4
  189. package/src/renderer/components/shapes/index.ts +1 -0
  190. package/src/renderer/index.ts +1 -0
  191. package/src/renderer/nodes/Declaration.tsx +14 -0
  192. package/src/renderer/nodes/Drawing.tsx +16 -26
  193. package/src/renderer/nodes/Node.ts +9 -12
  194. package/src/renderer/processors/Paint.ts +34 -31
  195. package/src/renderer/processors/math/Math.ts +16 -0
  196. package/src/renderer/processors/math/Matrix3.ts +35 -31
  197. package/src/renderer/typeddash.ts +18 -0
  198. package/src/renderer/useContextBridge.tsx +21 -0
  199. package/src/skia/Canvas.ts +7 -0
  200. package/src/skia/Picture/Picture.ts +34 -0
  201. package/src/skia/Picture/PictureFactory.ts +9 -0
  202. package/src/skia/Picture/PictureRecorder.ts +18 -0
  203. package/src/skia/Picture/index.ts +4 -0
  204. package/src/skia/Picture/usePicture.ts +28 -0
  205. package/src/skia/Skia.ts +5 -0
  206. package/src/skia/index.ts +2 -0
  207. package/src/values/hooks/useDerivedValue.ts +1 -1
  208. package/src/views/SkiaView.tsx +31 -41
  209. package/src/views/types.ts +0 -24
  210. package/lib/commonjs/renderer/components/Defs.js.map +0 -1
  211. package/lib/commonjs/renderer/components/imageFilters/DropShadow.js.map +0 -1
  212. package/lib/module/renderer/components/Defs.js +0 -16
  213. package/lib/module/renderer/components/Defs.js.map +0 -1
  214. package/lib/module/renderer/components/imageFilters/DropShadow.js.map +0 -1
  215. package/lib/typescript/src/renderer/components/Defs.d.ts +0 -5
  216. package/src/renderer/components/Defs.tsx +0 -19
  217. package/src/renderer/components/imageFilters/DropShadow.tsx +0 -31
@@ -1,6 +1,7 @@
1
1
  import type { ReactNode, RefObject } from "react";
2
2
  import { BlendMode, PaintStyle, StrokeJoin, StrokeCap } from "../../skia";
3
3
  import type { SkPaint, Color } from "../../skia";
4
+ import type { DeclarationResult } from "../nodes";
4
5
  export declare type SkEnum<T> = Uncapitalize<keyof T extends string ? keyof T : never>;
5
6
  export interface ChildrenProps {
6
7
  children?: ReactNode | ReactNode[];
@@ -17,5 +18,4 @@ export interface CustomPaintProps extends ChildrenProps {
17
18
  opacity?: number;
18
19
  }
19
20
  export declare const enumKey: <K extends string>(k: K) => Capitalize<K>;
20
- export declare const processPaint: (paint: SkPaint, currentOpacity: number, { color, blendMode, style, strokeWidth, strokeJoin, strokeCap, strokeMiter, opacity, }: CustomPaintProps) => void;
21
- export declare const selectPaint: (currentPaint: SkPaint, { paint, color: cl, blendMode, style: paintStyle, strokeWidth, strokeJoin, strokeCap, strokeMiter, opacity, }: CustomPaintProps) => SkPaint;
21
+ export declare const processPaint: (paint: SkPaint, currentOpacity: number, { paint: paintRef, color, blendMode, style, strokeWidth, strokeJoin, strokeCap, strokeMiter, opacity, }: CustomPaintProps, children: DeclarationResult[]) => SkPaint;
@@ -1 +1,15 @@
1
+ /**
2
+ * Linear interpolation
3
+ * @param value
4
+ * @param x
5
+ * @param y
6
+ */
1
7
  export declare const mix: (value: number, x: number, y: number) => number;
8
+ /**
9
+ * @summary Clamps a node with a lower and upper bound.
10
+ * @example
11
+ clamp(-1, 0, 100); // 0
12
+ clamp(1, 0, 100); // 1
13
+ clamp(101, 0, 100); // 100
14
+ */
15
+ export declare const clamp: (value: number, lowerBound: number, upperBound: number) => number;
@@ -9,5 +9,6 @@ declare type Transformations = {
9
9
  readonly [Name in Transform2dName]: number;
10
10
  };
11
11
  export declare type Transforms2d = readonly (Pick<Transformations, "translateX"> | Pick<Transformations, "translateY"> | Pick<Transformations, "scale"> | Pick<Transformations, "scaleX"> | Pick<Transformations, "scaleY"> | Pick<Transformations, "skewX"> | Pick<Transformations, "skewY"> | Pick<Transformations, "rotate">)[];
12
+ export declare const matrixVecMul3: (m: Matrix3, v: Vec3) => readonly [number, number, number];
12
13
  export declare const processTransform2d: (transforms: Transforms2d) => SkMatrix;
13
14
  export {};
@@ -1,2 +1,3 @@
1
1
  export declare const mapKeys: <T>(obj: T) => (keyof T)[];
2
2
  export declare const exhaustiveCheck: (a: never) => never;
3
+ export declare const shallowEq: <P>(p1: P, p2: P) => boolean;
@@ -0,0 +1,5 @@
1
+ import React from "react";
2
+ import type { ReactNode, Context } from "react";
3
+ export declare const useContextBridge: (...contexts: Context<any>[]) => ({ children }: {
4
+ children: ReactNode;
5
+ }) => React.ReactElement<any, string | React.JSXElementConstructor<any>>;
@@ -12,6 +12,7 @@ import type { SkMatrix } from "./Matrix";
12
12
  import type { SkImageFilter } from "./ImageFilter";
13
13
  import type { SkVertices } from "./Vertices";
14
14
  import type { SkTextBlob } from "./TextBlob";
15
+ import type { SkPicture } from "./Picture";
15
16
  export declare enum ClipOp {
16
17
  Difference = 0,
17
18
  Intersect = 1
@@ -372,4 +373,9 @@ export interface SkCanvas {
372
373
  * @param m
373
374
  */
374
375
  concat(m: SkMatrix): void;
376
+ /**
377
+ * Draws the given picture using the current clip, current matrix, and the provided paint.
378
+ * @param skp
379
+ */
380
+ drawPicture(skp: SkPicture): void;
375
381
  }
@@ -0,0 +1,26 @@
1
+ import type { InputColorMatrix } from "../ColorFilter";
2
+ import type { FilterMode } from "../Image";
3
+ import type { TileMode } from "../ImageFilter";
4
+ import type { SkRect } from "../Rect";
5
+ import type { IShader } from "../Shader";
6
+ export interface SkPicture {
7
+ /**
8
+ * Returns a new shader that will draw with this picture.
9
+ *
10
+ * @param tmx The tiling mode to use when sampling in the x-direction.
11
+ * @param tmy The tiling mode to use when sampling in the y-direction.
12
+ * @param mode How to filter the tiles
13
+ * @param localMatrix Optional matrix used when sampling
14
+ * @param tileRect The tile rectangle in picture coordinates: this represents the subset
15
+ * (or superset) of the picture used when building a tile. It is not
16
+ * affected by localMatrix and does not imply scaling (only translation
17
+ * and cropping). If null, the tile rect is considered equal to the picture
18
+ * bounds.
19
+ */
20
+ makeShader(tmx: TileMode, tmy: TileMode, mode: FilterMode, localMatrix?: InputColorMatrix, tileRect?: SkRect): IShader;
21
+ /**
22
+ * Returns the serialized format of this SkPicture. The format may change at anytime and
23
+ * no promises are made for backwards or forward compatibility.
24
+ */
25
+ serialize(): Uint8Array | null;
26
+ }
@@ -0,0 +1,8 @@
1
+ import type { SkPicture } from "./Picture";
2
+ export interface PictureFactory {
3
+ /**
4
+ * Returns an SkPicture which has been serialized previously to the given bytes.
5
+ * @param bytes
6
+ */
7
+ MakePicture(bytes: Uint8Array | ArrayBuffer): SkPicture | null;
8
+ }
@@ -0,0 +1,15 @@
1
+ import type { SkCanvas } from "../Canvas";
2
+ import type { SkRect } from "../Rect";
3
+ import type { SkPicture } from "./Picture";
4
+ export interface SkPictureRecorder {
5
+ /**
6
+ * Returns a canvas on which to draw. When done drawing, call finishRecordingAsPicture()
7
+ *
8
+ * @param bounds - a rect to cull the results.
9
+ */
10
+ beginRecording(bounds: SkRect): SkCanvas;
11
+ /**
12
+ * Returns the captured draw commands as a picture and invalidates the canvas returned earlier.
13
+ */
14
+ finishRecordingAsPicture(): SkPicture;
15
+ }
@@ -0,0 +1,4 @@
1
+ export * from "./Picture";
2
+ export * from "./PictureRecorder";
3
+ export * from "./usePicture";
4
+ export * from "./PictureFactory";
@@ -0,0 +1,11 @@
1
+ import type { DependencyList } from "react";
2
+ import type { SkCanvas } from "../Canvas";
3
+ import type { SkRect } from "../Rect";
4
+ import type { SkPicture } from "./Picture";
5
+ /**
6
+ * Memoizes and returns an SkPicture that can be drawn to another canvas.
7
+ * @param rect Picture bounds
8
+ * @param cb Callback for drawing to the canvas
9
+ * @returns SkPicture
10
+ */
11
+ export declare const usePicture: (rect: SkRect, cb: (canvas: SkCanvas) => void, deps?: DependencyList) => SkPicture;
@@ -25,6 +25,7 @@ import "./NativeSetup";
25
25
  import type { SkRSXform } from "./RSXform";
26
26
  import type { SkPath } from "./Path/Path";
27
27
  import type { SkContourMeasureIter } from "./ContourMeasure";
28
+ import type { PictureFactory, SkPictureRecorder } from "./Picture";
28
29
  /**
29
30
  * Declares the interface for the native Skia API
30
31
  */
@@ -35,6 +36,8 @@ export interface Skia {
35
36
  RSXform: (scos: number, ssin: number, tx: number, ty: number) => SkRSXform;
36
37
  ContourMeasureIter: (path: SkPath, forceClosed: boolean, resScale: number) => SkContourMeasureIter;
37
38
  Paint: () => SkPaint;
39
+ PictureRecorder: () => SkPictureRecorder;
40
+ Picture: PictureFactory;
38
41
  Path: PathFactory;
39
42
  Matrix: () => SkMatrix;
40
43
  ColorFilter: ColorFilterFactory;
@@ -89,6 +92,8 @@ export declare const Skia: {
89
92
  XYWHRect: (x: number, y: number, width: number, height: number) => SkRect;
90
93
  RRectXY: (rect: SkRect, rx: number, ry: number) => SkRRect;
91
94
  Paint: () => SkPaint;
95
+ PictureRecorder: () => SkPictureRecorder;
96
+ Picture: PictureFactory;
92
97
  Path: PathFactory;
93
98
  ColorFilter: ColorFilterFactory;
94
99
  ContourMeasureIter: (path: SkPath, forceClosed: boolean, resScale: number) => SkContourMeasureIter;
@@ -20,3 +20,5 @@ export * from "./Surface";
20
20
  export * from "./FontMgr";
21
21
  export * from "./Vertices";
22
22
  export * from "./Color";
23
+ export * from "./Picture";
24
+ export * from "./Data";
@@ -1,7 +1,8 @@
1
1
  import React from "react";
2
+ import type { ViewProps } from "react-native";
2
3
  import type { SkImage, SkRect } from "../skia";
3
4
  import type { SkiaReadonlyValue } from "../values";
4
- import type { DrawMode, RNSkiaDrawCallback, RNSkiaViewProps } from "./types";
5
+ import type { DrawMode, RNSkiaDrawCallback } from "./types";
5
6
  declare global {
6
7
  var SkiaViewApi: {
7
8
  invalidateSkiaView: (nativeId: number) => void;
@@ -11,12 +12,34 @@ declare global {
11
12
  registerValuesInView: (nativeId: number, values: SkiaReadonlyValue<unknown>[]) => () => void;
12
13
  };
13
14
  }
14
- export declare class SkiaView extends React.Component<RNSkiaViewProps> {
15
- constructor(props: RNSkiaViewProps);
15
+ export interface SkiaViewProps extends ViewProps {
16
+ /**
17
+ * Sets the drawing mode for the skia view. There are two drawing
18
+ * modes, "continuous" and "default", where the continuous mode will
19
+ * continuously redraw the view, and the default mode will only
20
+ * redraw when any of the regular react properties are changed like
21
+ * sizes and margins.
22
+ */
23
+ mode?: DrawMode;
24
+ /**
25
+ * When set to true the view will display information about the
26
+ * average time it takes to render.
27
+ */
28
+ debug?: boolean;
29
+ /**
30
+ * Draw callback. Will be called whenever the view is invalidated and
31
+ * needs to redraw. This is either caused by a change in a react
32
+ * property, a touch event, or a call to redraw. If the view is in
33
+ * continuous mode the callback will be called 60 frames per second
34
+ * by the native view.
35
+ */
36
+ onDraw?: RNSkiaDrawCallback;
37
+ }
38
+ export declare class SkiaView extends React.Component<SkiaViewProps> {
39
+ constructor(props: SkiaViewProps);
16
40
  private _nativeId;
17
- private _animatingValues;
18
41
  get nativeId(): number;
19
- componentDidUpdate(prevProps: RNSkiaViewProps): void;
42
+ componentDidUpdate(prevProps: SkiaViewProps): void;
20
43
  /**
21
44
  * Creates a snapshot from the canvas in the surface
22
45
  * @param rect Rect to use as bounds. Optional.
@@ -43,13 +66,5 @@ export declare class SkiaView extends React.Component<RNSkiaViewProps> {
43
66
  * @param values Values to register
44
67
  */
45
68
  registerValues(values: SkiaReadonlyValue<unknown>[]): () => void;
46
- /**
47
- * Increases the number of animations active in the view.
48
- */
49
- addAnimation(owner: unknown): void;
50
- /**
51
- * Decreases the number of animations active in the view.
52
- */
53
- removeAnimation(owner: unknown): void;
54
69
  render(): JSX.Element;
55
70
  }
@@ -35,29 +35,6 @@ export declare type TouchHandlers = {
35
35
  };
36
36
  export declare type TouchHandler = (touchInfo: Array<Array<TouchInfo>>) => void;
37
37
  export declare type RNSkiaDrawCallback = (canvas: SkCanvas, info: DrawingInfo) => void;
38
- export declare type RNSkiaViewProps = ViewProps & {
39
- /**
40
- * Sets the drawing mode for the skia view. There are two drawing
41
- * modes, "continuous" and "default", where the continuous mode will
42
- * continuously redraw the view, and the default mode will only
43
- * redraw when any of the regular react properties are changed like
44
- * sizes and margins.
45
- */
46
- mode?: DrawMode;
47
- /**
48
- * When set to true the view will display information about the
49
- * average time it takes to render.
50
- */
51
- debug?: boolean;
52
- /**
53
- * Draw callback. Will be called whenever the view is invalidated and
54
- * needs to redraw. This is either caused by a change in a react
55
- * property, a touch event, or a call to redraw. If the view is in
56
- * continuous mode the callback will be called 60 frames per second
57
- * by the native view.
58
- */
59
- onDraw?: RNSkiaDrawCallback;
60
- };
61
38
  /**
62
39
  * Listener interface for value changes
63
40
  */
@@ -6,32 +6,32 @@
6
6
  <array>
7
7
  <dict>
8
8
  <key>LibraryIdentifier</key>
9
- <string>ios-arm64_arm64e_x86_64-simulator</string>
9
+ <string>ios-arm64_arm64e</string>
10
10
  <key>LibraryPath</key>
11
11
  <string>libsvg.a</string>
12
12
  <key>SupportedArchitectures</key>
13
13
  <array>
14
14
  <string>arm64</string>
15
15
  <string>arm64e</string>
16
- <string>x86_64</string>
17
16
  </array>
18
17
  <key>SupportedPlatform</key>
19
18
  <string>ios</string>
20
- <key>SupportedPlatformVariant</key>
21
- <string>simulator</string>
22
19
  </dict>
23
20
  <dict>
24
21
  <key>LibraryIdentifier</key>
25
- <string>ios-arm64_arm64e</string>
22
+ <string>ios-arm64_arm64e_x86_64-simulator</string>
26
23
  <key>LibraryPath</key>
27
24
  <string>libsvg.a</string>
28
25
  <key>SupportedArchitectures</key>
29
26
  <array>
30
27
  <string>arm64</string>
31
28
  <string>arm64e</string>
29
+ <string>x86_64</string>
32
30
  </array>
33
31
  <key>SupportedPlatform</key>
34
32
  <string>ios</string>
33
+ <key>SupportedPlatformVariant</key>
34
+ <string>simulator</string>
35
35
  </dict>
36
36
  </array>
37
37
  <key>CFBundlePackageType</key>
package/package.json CHANGED
@@ -4,12 +4,9 @@
4
4
  "access": "public"
5
5
  },
6
6
  "title": "React Native Skia",
7
- "version": "0.1.115",
8
- "description": "Skia View for React Native",
7
+ "version": "0.1.119",
8
+ "description": "High-performance React Native Graphics using Skia",
9
9
  "main": "lib/module/index.js",
10
- "types": "lib/typescript/index.d.ts",
11
- "react-native": "lib/module/index.js",
12
- "module": "lib/module/index.js",
13
10
  "files": [
14
11
  "src",
15
12
  "lib",
@@ -38,7 +35,7 @@
38
35
  "tsc": "tsc --noEmit",
39
36
  "lint": "eslint . --ext .ts,.tsx --max-warnings 0",
40
37
  "test": "jest",
41
- "postinstall": "yarn node scripts/install-npm.js",
38
+ "postinstall": "node scripts/install-npm.js",
42
39
  "build": "bob build"
43
40
  },
44
41
  "repository": {
@@ -96,5 +93,8 @@
96
93
  "module",
97
94
  "typescript"
98
95
  ]
99
- }
96
+ },
97
+ "types": "lib/typescript/index.d.ts",
98
+ "module": "lib/module/index.js",
99
+ "react-native": "lib/module/index.js"
100
100
  }
@@ -11,8 +11,6 @@ import type {
11
11
  RefObject,
12
12
  ReactNode,
13
13
  ComponentProps,
14
- Context,
15
- ReactElement,
16
14
  MutableRefObject,
17
15
  ForwardedRef,
18
16
  } from "react";
@@ -23,6 +21,8 @@ import { SkiaView, useDrawCallback } from "../views";
23
21
  import type { TouchHandler } from "../views";
24
22
  import { Skia } from "../skia";
25
23
  import type { FontMgr } from "../skia/FontMgr/FontMgr";
24
+ import { useValue } from "../values/hooks/useValue";
25
+ import type { SkiaReadonlyValue } from "../values/types";
26
26
 
27
27
  import { debug as hostDebug, skHostConfig } from "./HostConfig";
28
28
  // import { debugTree } from "./nodes";
@@ -30,33 +30,12 @@ import { vec } from "./processors";
30
30
  import { Container } from "./nodes";
31
31
  import { DependencyManager } from "./DependencyManager";
32
32
 
33
- // useContextBridge() is taken from https://github.com/pmndrs/drei#usecontextbridge
34
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
35
- export const useContextBridge = (...contexts: Context<any>[]) => {
36
- const values =
37
- // eslint-disable-next-line react-hooks/rules-of-hooks
38
- contexts.map((context) => useContext(context));
39
- return useMemo(
40
- () =>
41
- ({ children }: { children: ReactNode }) =>
42
- contexts.reduceRight(
43
- (acc, Context, i) => (
44
- <Context.Provider value={values[i]} children={acc} />
45
- ),
46
- children
47
- ) as ReactElement,
48
- [contexts, values]
49
- );
50
- };
51
-
52
- interface CanvasContext {
33
+ const CanvasContext = React.createContext<SkiaReadonlyValue<{
53
34
  width: number;
54
35
  height: number;
55
- }
36
+ }> | null>(null);
56
37
 
57
- const CanvasContext = React.createContext<CanvasContext | null>(null);
58
-
59
- export const useCanvas = () => {
38
+ export const useCanvasSize = () => {
60
39
  const canvas = useContext(CanvasContext);
61
40
  if (!canvas) {
62
41
  throw new Error("Canvas context is not available");
@@ -93,6 +72,7 @@ const defaultFontMgr = Skia.FontMgr.RefDefault();
93
72
 
94
73
  export const Canvas = forwardRef<SkiaView, CanvasProps>(
95
74
  ({ children, style, debug, mode, onTouch, fontMgr }, forwardedRef) => {
75
+ const canvasCtx = useValue({ width: 0, height: 0 });
96
76
  const innerRef = useCanvasRef();
97
77
  const ref = useCombinedRefs(forwardedRef, innerRef);
98
78
  const [tick, setTick] = useState(0);
@@ -103,7 +83,6 @@ export const Canvas = forwardRef<SkiaView, CanvasProps>(
103
83
  [redraw, ref]
104
84
  );
105
85
 
106
- const canvasCtx = useRef({ width: 0, height: 0 });
107
86
  const root = useMemo(
108
87
  () => skiaReconciler.createContainer(container, 0, false, null),
109
88
  [container]
@@ -111,13 +90,13 @@ export const Canvas = forwardRef<SkiaView, CanvasProps>(
111
90
  // Render effect
112
91
  useEffect(() => {
113
92
  render(
114
- <CanvasContext.Provider value={canvasCtx.current}>
93
+ <CanvasContext.Provider value={canvasCtx}>
115
94
  {children}
116
95
  </CanvasContext.Provider>,
117
96
  root,
118
97
  container
119
98
  );
120
- }, [children, root, redraw, container]);
99
+ }, [children, root, redraw, container, canvasCtx]);
121
100
 
122
101
  // Draw callback
123
102
  const onDraw = useDrawCallback(
@@ -127,6 +106,12 @@ export const Canvas = forwardRef<SkiaView, CanvasProps>(
127
106
  if (onTouch) {
128
107
  onTouch(info.touches);
129
108
  }
109
+ if (
110
+ width !== canvasCtx.current.width ||
111
+ height !== canvasCtx.current.height
112
+ ) {
113
+ canvasCtx.current = { width, height };
114
+ }
130
115
  const paint = Skia.Paint();
131
116
  paint.setAntiAlias(true);
132
117
  const ctx = {
@@ -140,7 +125,6 @@ export const Canvas = forwardRef<SkiaView, CanvasProps>(
140
125
  center: vec(width / 2, height / 2),
141
126
  fontMgr: fontMgr ?? defaultFontMgr,
142
127
  };
143
- canvasCtx.current = ctx;
144
128
  container.draw(ctx);
145
129
  },
146
130
  [tick, onTouch]
@@ -3,7 +3,7 @@ import type { HostConfig } from "react-reconciler";
3
3
 
4
4
  import type { Node, Container, DeclarationProps, DrawingProps } from "./nodes";
5
5
  import { DeclarationNode, DrawingNode, NodeType } from "./nodes";
6
- import { exhaustiveCheck, mapKeys } from "./typeddash";
6
+ import { exhaustiveCheck, shallowEq } from "./typeddash";
7
7
 
8
8
  const DEBUG = false;
9
9
  export const debug = (...args: Parameters<typeof console.log>) => {
@@ -53,24 +53,6 @@ type SkiaHostConfig = HostConfig<
53
53
  NoTimeout
54
54
  >;
55
55
 
56
- // Shallow eq on props (without children)
57
- const shallowEq = <P extends Props>(p1: P, p2: P): boolean => {
58
- const keys1 = mapKeys(p1);
59
- const keys2 = mapKeys(p2);
60
- if (keys1.length !== keys2.length) {
61
- return false;
62
- }
63
- for (const key of keys1) {
64
- if (key === "children") {
65
- continue;
66
- }
67
- if (p1[key] !== p2[key]) {
68
- return false;
69
- }
70
- }
71
- return true;
72
- };
73
-
74
56
  const allChildrenAreMemoized = (node: Instance) => {
75
57
  if (!node.memoizable) {
76
58
  return false;
@@ -87,7 +69,7 @@ const bustBranchMemoization = (parent: Node) => {
87
69
  if (parent.memoizable) {
88
70
  let ancestor: Node | undefined = parent;
89
71
  while (ancestor) {
90
- ancestor.memoized = false;
72
+ ancestor.memoized = null;
91
73
  ancestor = ancestor.parent;
92
74
  }
93
75
  }
@@ -0,0 +1,16 @@
1
+ import React from "react";
2
+
3
+ import type { DrawingContext } from "../DrawingContext";
4
+ import { createDrawing } from "../nodes/Drawing";
5
+
6
+ interface DrawingProps {
7
+ drawing: (ctx: DrawingContext) => void;
8
+ }
9
+
10
+ const onDraw = createDrawing<DrawingProps>((ctx, { drawing }) => {
11
+ drawing(ctx);
12
+ });
13
+
14
+ export const Drawing = (props: DrawingProps) => {
15
+ return <skDrawing onDraw={onDraw} skipProcessing {...props} />;
16
+ };
@@ -3,19 +3,15 @@ import type { RefObject } from "react";
3
3
 
4
4
  import type { SkPaint } from "../../skia";
5
5
  import { ClipOp } from "../../skia";
6
- import {
7
- processTransform,
8
- selectPaint,
9
- processPaint,
10
- processClip,
11
- } from "../processors";
6
+ import { processTransform, processPaint, processClip } from "../processors";
12
7
  import type {
13
8
  CustomPaintProps,
14
9
  TransformProps,
15
10
  AnimatedProps,
16
11
  ClipDef,
17
12
  } from "../processors";
18
- import { createDrawing } from "../nodes";
13
+ import { createDrawing, DrawingNode } from "../nodes";
14
+ import { isDeclarationNode } from "../nodes/Declaration";
19
15
 
20
16
  const isSkPaint = (obj: RefObject<SkPaint> | SkPaint): obj is SkPaint =>
21
17
  "__typename__" in obj && obj.__typename__ === "Paint";
@@ -29,30 +25,51 @@ export interface GroupProps extends CustomPaintProps, TransformProps {
29
25
  const onDraw = createDrawing<GroupProps>(
30
26
  (ctx, { layer, clip, invertClip, ...groupProps }, node) => {
31
27
  const { canvas, opacity } = ctx;
32
- const paint = selectPaint(ctx.paint, groupProps);
33
- processPaint(paint, opacity, groupProps);
34
- if (layer) {
35
- if (typeof layer === "boolean") {
36
- canvas.saveLayer();
37
- } else if (isSkPaint(layer)) {
38
- canvas.saveLayer(layer);
28
+ const declarations = node.children
29
+ .filter(isDeclarationNode)
30
+ .map((child) => child.draw(ctx));
31
+
32
+ const drawings = node.children.filter(
33
+ (child) => child instanceof DrawingNode
34
+ );
35
+ const paint = processPaint(
36
+ ctx.paint.copy(),
37
+ opacity,
38
+ groupProps,
39
+ declarations
40
+ );
41
+ const hasTransform = !!groupProps.transform || !!groupProps.matrix;
42
+ const hasClip = !!clip;
43
+ const shouldSave = hasTransform || hasClip || !!layer;
44
+ if (shouldSave) {
45
+ if (layer) {
46
+ if (typeof layer === "boolean") {
47
+ canvas.saveLayer();
48
+ } else if (isSkPaint(layer)) {
49
+ canvas.saveLayer(layer);
50
+ } else {
51
+ canvas.saveLayer(layer.current ?? undefined);
52
+ }
39
53
  } else {
40
- canvas.saveLayer(layer.current ?? undefined);
54
+ canvas.save();
55
+ }
56
+ processTransform(ctx, groupProps);
57
+ if (clip) {
58
+ const op = invertClip ? ClipOp.Difference : ClipOp.Intersect;
59
+ processClip(canvas, clip, op);
41
60
  }
42
- } else {
43
- canvas.save();
44
61
  }
45
- processTransform(ctx, groupProps);
46
- if (clip) {
47
- const op = invertClip ? ClipOp.Difference : ClipOp.Intersect;
48
- processClip(canvas, clip, op);
62
+ node.visit(
63
+ {
64
+ ...ctx,
65
+ paint,
66
+ opacity: groupProps.opacity ? groupProps.opacity * opacity : opacity,
67
+ },
68
+ drawings
69
+ );
70
+ if (shouldSave) {
71
+ canvas.restore();
49
72
  }
50
- node.visit({
51
- ...ctx,
52
- paint,
53
- opacity: groupProps.opacity ? groupProps.opacity * opacity : opacity,
54
- });
55
- canvas.restore();
56
73
  }
57
74
  );
58
75