@shopify/react-native-skia 0.1.236 → 0.1.237

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (198) hide show
  1. package/cpp/api/JsiSkApi.h +2 -0
  2. package/cpp/api/JsiSkCanvas.h +36 -0
  3. package/cpp/api/JsiSkRSXform.h +35 -7
  4. package/cpp/rnskia/dom/JsiDomApi.h +2 -0
  5. package/cpp/rnskia/dom/nodes/JsiAtlasNode.h +60 -0
  6. package/cpp/rnskia/dom/props/RSXformProp.h +52 -0
  7. package/cpp/rnskia/dom/props/RectProp.h +31 -0
  8. package/lib/commonjs/dom/nodes/JsiSkDOM.d.ts +2 -1
  9. package/lib/commonjs/dom/nodes/JsiSkDOM.js +4 -0
  10. package/lib/commonjs/dom/nodes/JsiSkDOM.js.map +1 -1
  11. package/lib/commonjs/dom/nodes/drawings/AtlasNode.d.ts +8 -0
  12. package/lib/commonjs/dom/nodes/drawings/AtlasNode.js +47 -0
  13. package/lib/commonjs/dom/nodes/drawings/AtlasNode.js.map +1 -0
  14. package/lib/commonjs/dom/nodes/drawings/index.d.ts +1 -0
  15. package/lib/commonjs/dom/nodes/drawings/index.js +13 -0
  16. package/lib/commonjs/dom/nodes/drawings/index.js.map +1 -1
  17. package/lib/commonjs/dom/types/Drawings.d.ts +7 -1
  18. package/lib/commonjs/dom/types/Drawings.js.map +1 -1
  19. package/lib/commonjs/dom/types/NodeType.d.ts +1 -0
  20. package/lib/commonjs/dom/types/NodeType.js +1 -0
  21. package/lib/commonjs/dom/types/NodeType.js.map +1 -1
  22. package/lib/commonjs/dom/types/SkDOM.d.ts +2 -1
  23. package/lib/commonjs/dom/types/SkDOM.js.map +1 -1
  24. package/lib/commonjs/external/reanimated/buffers.d.ts +5 -0
  25. package/lib/commonjs/external/reanimated/buffers.js +48 -0
  26. package/lib/commonjs/external/reanimated/buffers.js.map +1 -0
  27. package/lib/commonjs/external/reanimated/index.d.ts +1 -0
  28. package/lib/commonjs/external/reanimated/index.js +13 -0
  29. package/lib/commonjs/external/reanimated/index.js.map +1 -1
  30. package/lib/commonjs/external/reanimated/textures.js +3 -17
  31. package/lib/commonjs/external/reanimated/textures.js.map +1 -1
  32. package/lib/commonjs/external/reanimated/useAnimatedImageValue.js +8 -1
  33. package/lib/commonjs/external/reanimated/useAnimatedImageValue.js.map +1 -1
  34. package/lib/commonjs/mock/index.js +5 -0
  35. package/lib/commonjs/mock/index.js.map +1 -1
  36. package/lib/commonjs/renderer/HostComponents.d.ts +3 -1
  37. package/lib/commonjs/renderer/HostComponents.js +3 -0
  38. package/lib/commonjs/renderer/HostComponents.js.map +1 -1
  39. package/lib/commonjs/renderer/Offscreen.d.ts +4 -2
  40. package/lib/commonjs/renderer/Offscreen.js +23 -18
  41. package/lib/commonjs/renderer/Offscreen.js.map +1 -1
  42. package/lib/commonjs/renderer/components/shapes/Atlas.d.ts +4 -0
  43. package/lib/commonjs/renderer/components/shapes/Atlas.js +17 -0
  44. package/lib/commonjs/renderer/components/shapes/Atlas.js.map +1 -0
  45. package/lib/commonjs/renderer/components/shapes/index.d.ts +1 -0
  46. package/lib/commonjs/renderer/components/shapes/index.js +13 -0
  47. package/lib/commonjs/renderer/components/shapes/index.js.map +1 -1
  48. package/lib/commonjs/skia/core/AnimatedImage.d.ts +1 -1
  49. package/lib/commonjs/skia/core/AnimatedImage.js +4 -1
  50. package/lib/commonjs/skia/core/AnimatedImage.js.map +1 -1
  51. package/lib/commonjs/skia/core/Data.d.ts +1 -1
  52. package/lib/commonjs/skia/core/Data.js +11 -4
  53. package/lib/commonjs/skia/core/Data.js.map +1 -1
  54. package/lib/commonjs/skia/core/Rect.d.ts +2 -2
  55. package/lib/commonjs/skia/types/Canvas.d.ts +16 -1
  56. package/lib/commonjs/skia/types/Canvas.js.map +1 -1
  57. package/lib/commonjs/skia/types/Image/Image.d.ts +8 -0
  58. package/lib/commonjs/skia/types/Image/Image.js.map +1 -1
  59. package/lib/commonjs/skia/types/RSXform.d.ts +7 -1
  60. package/lib/commonjs/skia/types/RSXform.js.map +1 -1
  61. package/lib/commonjs/skia/types/Rect.d.ts +4 -0
  62. package/lib/commonjs/skia/types/Rect.js.map +1 -1
  63. package/lib/commonjs/skia/types/Skia.d.ts +3 -2
  64. package/lib/commonjs/skia/types/Skia.js.map +1 -1
  65. package/lib/commonjs/skia/web/JsiSkCanvas.d.ts +2 -1
  66. package/lib/commonjs/skia/web/JsiSkCanvas.js +19 -0
  67. package/lib/commonjs/skia/web/JsiSkCanvas.js.map +1 -1
  68. package/lib/commonjs/skia/web/JsiSkRSXform.d.ts +8 -2
  69. package/lib/commonjs/skia/web/JsiSkRSXform.js +33 -2
  70. package/lib/commonjs/skia/web/JsiSkRSXform.js.map +1 -1
  71. package/lib/commonjs/skia/web/JsiSkRect.d.ts +3 -2
  72. package/lib/commonjs/skia/web/JsiSkRect.js +7 -0
  73. package/lib/commonjs/skia/web/JsiSkRect.js.map +1 -1
  74. package/lib/commonjs/skia/web/JsiSkTextBlobFactory.js +2 -1
  75. package/lib/commonjs/skia/web/JsiSkTextBlobFactory.js.map +1 -1
  76. package/lib/commonjs/skia/web/JsiSkia.js +5 -0
  77. package/lib/commonjs/skia/web/JsiSkia.js.map +1 -1
  78. package/lib/module/dom/nodes/JsiSkDOM.d.ts +2 -1
  79. package/lib/module/dom/nodes/JsiSkDOM.js +5 -1
  80. package/lib/module/dom/nodes/JsiSkDOM.js.map +1 -1
  81. package/lib/module/dom/nodes/drawings/AtlasNode.d.ts +8 -0
  82. package/lib/module/dom/nodes/drawings/AtlasNode.js +34 -0
  83. package/lib/module/dom/nodes/drawings/AtlasNode.js.map +1 -0
  84. package/lib/module/dom/nodes/drawings/index.d.ts +1 -0
  85. package/lib/module/dom/nodes/drawings/index.js +1 -0
  86. package/lib/module/dom/nodes/drawings/index.js.map +1 -1
  87. package/lib/module/dom/types/Drawings.d.ts +7 -1
  88. package/lib/module/dom/types/Drawings.js.map +1 -1
  89. package/lib/module/dom/types/NodeType.d.ts +1 -0
  90. package/lib/module/dom/types/NodeType.js +1 -0
  91. package/lib/module/dom/types/NodeType.js.map +1 -1
  92. package/lib/module/dom/types/SkDOM.d.ts +2 -1
  93. package/lib/module/dom/types/SkDOM.js.map +1 -1
  94. package/lib/module/external/reanimated/buffers.d.ts +5 -0
  95. package/lib/module/external/reanimated/buffers.js +27 -0
  96. package/lib/module/external/reanimated/buffers.js.map +1 -0
  97. package/lib/module/external/reanimated/index.d.ts +1 -0
  98. package/lib/module/external/reanimated/index.js +1 -0
  99. package/lib/module/external/reanimated/index.js.map +1 -1
  100. package/lib/module/external/reanimated/textures.js +5 -16
  101. package/lib/module/external/reanimated/textures.js.map +1 -1
  102. package/lib/module/external/reanimated/useAnimatedImageValue.js +7 -1
  103. package/lib/module/external/reanimated/useAnimatedImageValue.js.map +1 -1
  104. package/lib/module/mock/index.js +5 -0
  105. package/lib/module/mock/index.js.map +1 -1
  106. package/lib/module/renderer/HostComponents.d.ts +3 -1
  107. package/lib/module/renderer/HostComponents.js +3 -0
  108. package/lib/module/renderer/HostComponents.js.map +1 -1
  109. package/lib/module/renderer/Offscreen.d.ts +4 -2
  110. package/lib/module/renderer/Offscreen.js +15 -13
  111. package/lib/module/renderer/Offscreen.js.map +1 -1
  112. package/lib/module/renderer/components/shapes/Atlas.d.ts +4 -0
  113. package/lib/module/renderer/components/shapes/Atlas.js +5 -0
  114. package/lib/module/renderer/components/shapes/Atlas.js.map +1 -0
  115. package/lib/module/renderer/components/shapes/index.d.ts +1 -0
  116. package/lib/module/renderer/components/shapes/index.js +1 -0
  117. package/lib/module/renderer/components/shapes/index.js.map +1 -1
  118. package/lib/module/skia/core/AnimatedImage.d.ts +1 -1
  119. package/lib/module/skia/core/AnimatedImage.js +4 -1
  120. package/lib/module/skia/core/AnimatedImage.js.map +1 -1
  121. package/lib/module/skia/core/Data.d.ts +1 -1
  122. package/lib/module/skia/core/Data.js +11 -4
  123. package/lib/module/skia/core/Data.js.map +1 -1
  124. package/lib/module/skia/core/Rect.d.ts +2 -2
  125. package/lib/module/skia/types/Canvas.d.ts +16 -1
  126. package/lib/module/skia/types/Canvas.js.map +1 -1
  127. package/lib/module/skia/types/Image/Image.d.ts +8 -0
  128. package/lib/module/skia/types/Image/Image.js.map +1 -1
  129. package/lib/module/skia/types/RSXform.d.ts +7 -1
  130. package/lib/module/skia/types/RSXform.js.map +1 -1
  131. package/lib/module/skia/types/Rect.d.ts +4 -0
  132. package/lib/module/skia/types/Rect.js.map +1 -1
  133. package/lib/module/skia/types/Skia.d.ts +3 -2
  134. package/lib/module/skia/types/Skia.js.map +1 -1
  135. package/lib/module/skia/web/JsiSkCanvas.d.ts +2 -1
  136. package/lib/module/skia/web/JsiSkCanvas.js +18 -0
  137. package/lib/module/skia/web/JsiSkCanvas.js.map +1 -1
  138. package/lib/module/skia/web/JsiSkRSXform.d.ts +8 -2
  139. package/lib/module/skia/web/JsiSkRSXform.js +34 -3
  140. package/lib/module/skia/web/JsiSkRSXform.js.map +1 -1
  141. package/lib/module/skia/web/JsiSkRect.d.ts +3 -2
  142. package/lib/module/skia/web/JsiSkRect.js +7 -0
  143. package/lib/module/skia/web/JsiSkRect.js.map +1 -1
  144. package/lib/module/skia/web/JsiSkTextBlobFactory.js +2 -1
  145. package/lib/module/skia/web/JsiSkTextBlobFactory.js.map +1 -1
  146. package/lib/module/skia/web/JsiSkia.js +5 -0
  147. package/lib/module/skia/web/JsiSkia.js.map +1 -1
  148. package/lib/typescript/src/dom/nodes/JsiSkDOM.d.ts +2 -1
  149. package/lib/typescript/src/dom/nodes/drawings/AtlasNode.d.ts +8 -0
  150. package/lib/typescript/src/dom/nodes/drawings/index.d.ts +1 -0
  151. package/lib/typescript/src/dom/types/Drawings.d.ts +7 -1
  152. package/lib/typescript/src/dom/types/NodeType.d.ts +1 -0
  153. package/lib/typescript/src/dom/types/SkDOM.d.ts +2 -1
  154. package/lib/typescript/src/external/reanimated/buffers.d.ts +5 -0
  155. package/lib/typescript/src/external/reanimated/index.d.ts +1 -0
  156. package/lib/typescript/src/renderer/HostComponents.d.ts +3 -1
  157. package/lib/typescript/src/renderer/Offscreen.d.ts +4 -2
  158. package/lib/typescript/src/renderer/components/shapes/Atlas.d.ts +4 -0
  159. package/lib/typescript/src/renderer/components/shapes/index.d.ts +1 -0
  160. package/lib/typescript/src/skia/core/AnimatedImage.d.ts +1 -1
  161. package/lib/typescript/src/skia/core/Data.d.ts +1 -1
  162. package/lib/typescript/src/skia/core/Rect.d.ts +2 -2
  163. package/lib/typescript/src/skia/types/Canvas.d.ts +16 -1
  164. package/lib/typescript/src/skia/types/Image/Image.d.ts +8 -0
  165. package/lib/typescript/src/skia/types/RSXform.d.ts +7 -1
  166. package/lib/typescript/src/skia/types/Rect.d.ts +4 -0
  167. package/lib/typescript/src/skia/types/Skia.d.ts +3 -2
  168. package/lib/typescript/src/skia/web/JsiSkCanvas.d.ts +2 -1
  169. package/lib/typescript/src/skia/web/JsiSkRSXform.d.ts +8 -2
  170. package/lib/typescript/src/skia/web/JsiSkRect.d.ts +3 -2
  171. package/package.json +1 -1
  172. package/src/dom/nodes/JsiSkDOM.ts +8 -0
  173. package/src/dom/nodes/drawings/AtlasNode.ts +24 -0
  174. package/src/dom/nodes/drawings/index.ts +1 -0
  175. package/src/dom/types/Drawings.ts +9 -0
  176. package/src/dom/types/NodeType.ts +1 -0
  177. package/src/dom/types/SkDOM.ts +2 -0
  178. package/src/external/reanimated/buffers.ts +53 -0
  179. package/src/external/reanimated/index.ts +1 -0
  180. package/src/external/reanimated/textures.tsx +7 -19
  181. package/src/external/reanimated/useAnimatedImageValue.ts +15 -4
  182. package/src/mock/index.ts +5 -0
  183. package/src/renderer/HostComponents.ts +6 -1
  184. package/src/renderer/Offscreen.tsx +20 -16
  185. package/src/renderer/components/shapes/Atlas.tsx +8 -0
  186. package/src/renderer/components/shapes/index.ts +1 -0
  187. package/src/skia/core/AnimatedImage.ts +3 -2
  188. package/src/skia/core/Data.ts +8 -4
  189. package/src/skia/types/Canvas.ts +32 -1
  190. package/src/skia/types/Image/Image.ts +10 -0
  191. package/src/skia/types/RSXform.ts +7 -1
  192. package/src/skia/types/Rect.ts +6 -0
  193. package/src/skia/types/Skia.ts +10 -2
  194. package/src/skia/web/JsiSkCanvas.ts +60 -23
  195. package/src/skia/web/JsiSkRSXform.ts +28 -4
  196. package/src/skia/web/JsiSkRect.ts +12 -2
  197. package/src/skia/web/JsiSkTextBlobFactory.ts +5 -5
  198. package/src/skia/web/JsiSkia.ts +15 -0
@@ -1,26 +1,11 @@
1
1
  import type { ReactElement } from "react";
2
2
 
3
3
  import { JsiDrawingContext } from "../dom/types";
4
+ import type { SkPicture, SkSize } from "../skia/types";
4
5
  import { Skia } from "../skia";
5
6
 
6
7
  import { SkiaRoot } from "./Reconciler";
7
8
 
8
- export const drawAsImage = (
9
- element: ReactElement,
10
- width: number,
11
- height: number
12
- ) => {
13
- const picture = drawAsPicture(element);
14
- const surface = Skia.Surface.MakeOffscreen(width, height);
15
- if (!surface) {
16
- throw new Error("Could not create offscreen surface");
17
- }
18
- const canvas = surface.getCanvas();
19
- canvas.drawPicture(picture);
20
- surface.flush();
21
- return surface.makeImageSnapshot();
22
- };
23
-
24
9
  export const drawAsPicture = (element: ReactElement) => {
25
10
  const recorder = Skia.PictureRecorder();
26
11
  const canvas = recorder.beginRecording();
@@ -31,3 +16,22 @@ export const drawAsPicture = (element: ReactElement) => {
31
16
  const picture = recorder.finishRecordingAsPicture();
32
17
  return picture;
33
18
  };
19
+
20
+ export const drawAsImage = (element: ReactElement, size: SkSize) => {
21
+ return drawAsImageFromPicture(drawAsPicture(element), size);
22
+ };
23
+
24
+ // TODO: We're not sure yet why PixelRatio is not needed here.
25
+ const pd = 1;
26
+ export const drawAsImageFromPicture = (picture: SkPicture, size: SkSize) => {
27
+ "worklet";
28
+ const surface = Skia.Surface.MakeOffscreen(
29
+ size.width * pd,
30
+ size.height * pd
31
+ )!;
32
+ const canvas = surface.getCanvas();
33
+ canvas.scale(pd, pd);
34
+ canvas.drawPicture(picture);
35
+ surface.flush();
36
+ return surface.makeImageSnapshot();
37
+ };
@@ -0,0 +1,8 @@
1
+ import React from "react";
2
+
3
+ import type { AtlasProps } from "../../../dom/types";
4
+ import type { SkiaProps } from "../../processors";
5
+
6
+ export const Atlas = (props: SkiaProps<AtlasProps>) => {
7
+ return <skAtlas {...props} />;
8
+ };
@@ -11,3 +11,4 @@ export * from "./Vertices";
11
11
  export * from "./Fill";
12
12
  export * from "./FitBox";
13
13
  export * from "./Box";
14
+ export * from "./Atlas";
@@ -12,5 +12,6 @@ const animatedImgFactory = Skia.AnimatedImage.MakeAnimatedImageFromEncoded.bind(
12
12
  * */
13
13
  export const useAnimatedImage = (
14
14
  source: DataSourceParam,
15
- onError?: (err: Error) => void
16
- ) => useRawData(source, animatedImgFactory, onError);
15
+ onError?: (err: Error) => void,
16
+ managed = true
17
+ ) => useRawData(source, animatedImgFactory, onError, managed);
@@ -40,7 +40,8 @@ export const loadData = <T>(
40
40
 
41
41
  const useLoading = <T extends SkJSIInstance<string>>(
42
42
  source: DataSourceParam,
43
- loader: () => Promise<T | null>
43
+ loader: () => Promise<T | null>,
44
+ manage = true
44
45
  ) => {
45
46
  const mounted = useRef(false);
46
47
  const [data, setData] = useState<T | null>(null);
@@ -54,7 +55,9 @@ const useLoading = <T extends SkJSIInstance<string>>(
54
55
  }
55
56
  });
56
57
  return () => {
57
- dataRef.current?.dispose();
58
+ if (manage) {
59
+ dataRef.current?.dispose();
60
+ }
58
61
  mounted.current = false;
59
62
  };
60
63
  // eslint-disable-next-line react-hooks/exhaustive-deps
@@ -94,8 +97,9 @@ export const useCollectionLoading = <T extends SkJSIInstance<string>>(
94
97
  export const useRawData = <T extends SkJSIInstance<string>>(
95
98
  source: DataSourceParam,
96
99
  factory: (data: SkData) => T | null,
97
- onError?: (err: Error) => void
98
- ) => useLoading(source, () => loadData<T>(source, factory, onError));
100
+ onError?: (err: Error) => void,
101
+ manage = true
102
+ ) => useLoading(source, () => loadData<T>(source, factory, onError), manage);
99
103
 
100
104
  const identity = (data: SkData) => data;
101
105
 
@@ -2,7 +2,14 @@ import type { SkPaint } from "./Paint";
2
2
  import type { SkRect } from "./Rect";
3
3
  import type { SkFont } from "./Font";
4
4
  import type { SkPath } from "./Path";
5
- import type { SkImage, MipmapMode, FilterMode, ImageInfo } from "./Image";
5
+ import type {
6
+ SkImage,
7
+ MipmapMode,
8
+ FilterMode,
9
+ ImageInfo,
10
+ CubicResampler,
11
+ FilterOptions,
12
+ } from "./Image";
6
13
  import type { SkSVG } from "./SVG";
7
14
  import type { SkColor } from "./Color";
8
15
  import type { InputRRect } from "./RRect";
@@ -13,6 +20,7 @@ import type { SkImageFilter } from "./ImageFilter";
13
20
  import type { SkVertices } from "./Vertices";
14
21
  import type { SkTextBlob } from "./TextBlob";
15
22
  import type { SkPicture } from "./Picture";
23
+ import type { SkRSXform } from "./RSXform";
16
24
 
17
25
  export enum ClipOp {
18
26
  Difference,
@@ -493,6 +501,29 @@ export interface SkCanvas {
493
501
  */
494
502
  drawPicture(skp: SkPicture): void;
495
503
 
504
+ /**
505
+ * This method is used to draw an atlas on the canvas.
506
+ *
507
+ * @method drawAtlas
508
+ * @param {SkImage} atlas - The image to be drawn.
509
+ * @param {SkRect[]} srcs - The source rectangles.
510
+ * @param {SkRSXform[]} dsts - The destination transformations.
511
+ * @param {SkPaint} paint - The paint used for drawing.
512
+ * @param {BlendMode} [blendMode] - The blend mode used for drawing. Optional.
513
+ * @param {SkColor[]} [colors] - The colors used for drawing. Optional.
514
+ * @param {CubicResampler | FilterOptions} [sampling] - The sampling options. Optional.
515
+ * @returns {void} This method does not return anything.
516
+ */
517
+ drawAtlas(
518
+ atlas: SkImage,
519
+ srcs: SkRect[],
520
+ dsts: SkRSXform[],
521
+ paint: SkPaint,
522
+ blendMode?: BlendMode,
523
+ colors?: SkColor[],
524
+ sampling?: CubicResampler | FilterOptions
525
+ ): void;
526
+
496
527
  /** Read Image pixels
497
528
  *
498
529
  * @param srcX - x-axis upper left corner of the rectangle to read from
@@ -5,6 +5,16 @@ import type { SkShader } from "../Shader";
5
5
 
6
6
  import type { ImageInfo } from "./ImageFactory";
7
7
 
8
+ export interface CubicResampler {
9
+ B: number;
10
+ C: number;
11
+ }
12
+
13
+ export interface FilterOptions {
14
+ filter: FilterMode;
15
+ mipmap?: MipmapMode;
16
+ }
17
+
8
18
  export enum FilterMode {
9
19
  Nearest,
10
20
  Linear,
@@ -1,3 +1,9 @@
1
1
  import type { SkJSIInstance } from "./JsiInstance";
2
2
 
3
- export type SkRSXform = SkJSIInstance<"RSXform">;
3
+ export interface SkRSXform extends SkJSIInstance<"RSXform"> {
4
+ readonly scos: number;
5
+ readonly ssin: number;
6
+ readonly tx: number;
7
+ readonly ty: number;
8
+ set(scos: number, ssin: number, tx: number, ty: number): void;
9
+ }
@@ -1,3 +1,5 @@
1
+ import type { SkJSIInstance } from "./JsiInstance";
2
+
1
3
  export interface SkRect {
2
4
  readonly x: number;
3
5
  readonly y: number;
@@ -5,6 +7,10 @@ export interface SkRect {
5
7
  readonly height: number;
6
8
  }
7
9
 
10
+ export interface SkHostRect extends SkRect, SkJSIInstance<"Rect"> {
11
+ setXYWH(x: number, y: number, width: number, height: number): void;
12
+ }
13
+
8
14
  export const isRect = (def: unknown): def is SkRect => {
9
15
  "worklet";
10
16
  if (typeof def === "object" && def !== null) {
@@ -6,7 +6,7 @@ import type { SkTypeface, TypefaceFactory } from "./Typeface";
6
6
  import type { ImageFactory } from "./Image";
7
7
  import type { MaskFilterFactory } from "./MaskFilter";
8
8
  import type { SkPaint } from "./Paint";
9
- import type { SkRect } from "./Rect";
9
+ import type { SkHostRect, SkRect } from "./Rect";
10
10
  import type { SkRRect } from "./RRect";
11
11
  import type {
12
12
  RuntimeEffectFactory,
@@ -36,10 +36,18 @@ import type { ParagraphBuilderFactory } from "./Paragraph/ParagraphBuilder";
36
36
  */
37
37
  export interface Skia {
38
38
  Point: (x: number, y: number) => SkPoint;
39
- XYWHRect: (x: number, y: number, width: number, height: number) => SkRect;
39
+ XYWHRect: (x: number, y: number, width: number, height: number) => SkHostRect;
40
40
  RuntimeShaderBuilder: (rt: SkRuntimeEffect) => SkRuntimeShaderBuilder;
41
41
  RRectXY: (rect: SkRect, rx: number, ry: number) => SkRRect;
42
42
  RSXform: (scos: number, ssin: number, tx: number, ty: number) => SkRSXform;
43
+ RSXformFromRadians: (
44
+ scale: number,
45
+ radians: number,
46
+ tx: number,
47
+ ty: number,
48
+ px: number,
49
+ py: number
50
+ ) => SkRSXform;
43
51
  Color: (color: Color) => SkColor;
44
52
  ContourMeasureIter: (
45
53
  path: SkPath,
@@ -1,28 +1,31 @@
1
1
  import type { Canvas, CanvasKit } from "canvaskit-wasm";
2
2
 
3
- import type {
4
- BlendMode,
5
- ClipOp,
6
- FilterMode,
7
- MipmapMode,
8
- PointMode,
9
- SaveLayerFlag,
10
- ImageInfo,
11
- SkCanvas,
12
- SkColor,
13
- SkFont,
14
- SkImage,
15
- SkImageFilter,
16
- SkMatrix,
17
- SkPaint,
18
- SkPath,
19
- SkPicture,
20
- SkPoint,
21
- SkRect,
22
- InputRRect,
23
- SkSVG,
24
- SkTextBlob,
25
- SkVertices,
3
+ import {
4
+ type BlendMode,
5
+ type ClipOp,
6
+ type FilterMode,
7
+ type MipmapMode,
8
+ type PointMode,
9
+ type SaveLayerFlag,
10
+ type ImageInfo,
11
+ type SkCanvas,
12
+ type SkColor,
13
+ type SkFont,
14
+ type SkImage,
15
+ type SkImageFilter,
16
+ type SkMatrix,
17
+ type SkPaint,
18
+ type SkPath,
19
+ type SkPicture,
20
+ type SkPoint,
21
+ type SkRect,
22
+ type InputRRect,
23
+ type SkSVG,
24
+ type SkTextBlob,
25
+ type SkVertices,
26
+ type SkRSXform,
27
+ type CubicResampler,
28
+ type FilterOptions,
26
29
  } from "../types";
27
30
 
28
31
  import { getEnum, HostObject } from "./Host";
@@ -38,6 +41,7 @@ import { JsiSkPicture } from "./JsiSkPicture";
38
41
  import { JsiSkMatrix } from "./JsiSkMatrix";
39
42
  import { JsiSkImageFilter } from "./JsiSkImageFilter";
40
43
  import { JsiSkPoint } from "./JsiSkPoint";
44
+ import { JsiSkRSXform } from "./JsiSkRSXform";
41
45
 
42
46
  export class JsiSkCanvas
43
47
  extends HostObject<Canvas, "Canvas">
@@ -383,6 +387,39 @@ export class JsiSkCanvas
383
387
  this.ref.drawPicture(JsiSkPicture.fromValue(skp));
384
388
  }
385
389
 
390
+ drawAtlas(
391
+ atlas: SkImage,
392
+ srcs: SkRect[],
393
+ dsts: SkRSXform[],
394
+ paint: SkPaint,
395
+ blendMode?: BlendMode,
396
+ colors?: SkColor[],
397
+ _sampling?: CubicResampler | FilterOptions
398
+ ) {
399
+ const src = srcs.flatMap((s) =>
400
+ Array.from(JsiSkRect.fromValue(this.CanvasKit, s))
401
+ );
402
+ const dst = dsts.flatMap((s) => Array.from(JsiSkRSXform.fromValue(s)));
403
+ let cls: Uint32Array | undefined;
404
+ if (colors) {
405
+ cls = new Uint32Array(colors.length);
406
+ for (let i = 0; i < colors.length; i++) {
407
+ const [r, g, b, a] = colors[i];
408
+ cls[i] = this.CanvasKit.ColorAsInt(r * 255, g * 255, b * 255, a * 255);
409
+ }
410
+ }
411
+ this.ref.drawAtlas(
412
+ JsiSkImage.fromValue(atlas),
413
+ src,
414
+ dst,
415
+ JsiSkPaint.fromValue(paint),
416
+ blendMode
417
+ ? getEnum(this.CanvasKit.BlendMode, blendMode)
418
+ : this.CanvasKit.BlendMode.DstOver,
419
+ cls
420
+ );
421
+ }
422
+
386
423
  readPixels(srcX: number, srcY: number, imageInfo: ImageInfo) {
387
424
  const pxInfo = {
388
425
  width: imageInfo.width,
@@ -2,19 +2,43 @@ import type { CanvasKit } from "canvaskit-wasm";
2
2
 
3
3
  import type { SkRSXform } from "../types";
4
4
 
5
- import { HostObject } from "./Host";
5
+ import { BaseHostObject } from "./Host";
6
6
 
7
7
  export type RSXform = Float32Array;
8
8
 
9
9
  export class JsiSkRSXform
10
- extends HostObject<RSXform, "RSXform">
10
+ extends BaseHostObject<RSXform, "RSXform">
11
11
  implements SkRSXform
12
12
  {
13
+ static fromValue(rsxform: SkRSXform) {
14
+ if (rsxform instanceof JsiSkRSXform) {
15
+ return rsxform.ref;
16
+ }
17
+ return Float32Array.of(rsxform.scos, rsxform.ssin, rsxform.tx, rsxform.ty);
18
+ }
19
+
13
20
  constructor(CanvasKit: CanvasKit, ref: RSXform) {
14
21
  super(CanvasKit, ref, "RSXform");
15
22
  }
16
-
23
+ set(scos: number, ssin: number, tx: number, ty: number) {
24
+ this.ref[0] = scos;
25
+ this.ref[1] = ssin;
26
+ this.ref[2] = tx;
27
+ this.ref[3] = ty;
28
+ }
29
+ get scos() {
30
+ return this.ref[0];
31
+ }
32
+ get ssin() {
33
+ return this.ref[1];
34
+ }
35
+ get tx() {
36
+ return this.ref[2];
37
+ }
38
+ get ty() {
39
+ return this.ref[3];
40
+ }
17
41
  dispose = () => {
18
- // Do nothing in the web implementation
42
+ // nothing to do here, RSXform is a Float32Array
19
43
  };
20
44
  }
@@ -1,10 +1,13 @@
1
1
  import type { CanvasKit, Rect } from "canvaskit-wasm";
2
2
 
3
- import type { SkRect } from "../types";
3
+ import type { SkHostRect, SkRect } from "../types";
4
4
 
5
5
  import { BaseHostObject } from "./Host";
6
6
 
7
- export class JsiSkRect extends BaseHostObject<Rect, "Rect"> implements SkRect {
7
+ export class JsiSkRect
8
+ extends BaseHostObject<Rect, "Rect">
9
+ implements SkHostRect
10
+ {
8
11
  static fromValue(CanvasKit: CanvasKit, rect: SkRect) {
9
12
  if (rect instanceof JsiSkRect) {
10
13
  return rect.ref;
@@ -20,6 +23,13 @@ export class JsiSkRect extends BaseHostObject<Rect, "Rect"> implements SkRect {
20
23
  super(CanvasKit, ref, "Rect");
21
24
  }
22
25
 
26
+ setXYWH(x: number, y: number, width: number, height: number): void {
27
+ this.ref[0] = x;
28
+ this.ref[1] = y;
29
+ this.ref[2] = x + width;
30
+ this.ref[3] = y + height;
31
+ }
32
+
23
33
  get x() {
24
34
  return this.ref[0];
25
35
  }
@@ -7,7 +7,6 @@ import type { SkRSXform } from "../types/RSXform";
7
7
  import { Host } from "./Host";
8
8
  import { JsiSkFont } from "./JsiSkFont";
9
9
  import { JsiSkTextBlob } from "./JsiSkTextBlob";
10
- import type { RSXform } from "./JsiSkRSXform";
11
10
  import { JsiSkRSXform } from "./JsiSkRSXform";
12
11
 
13
12
  export class JsiSkTextBlobFactory extends Host implements TextBlobFactory {
@@ -34,20 +33,21 @@ export class JsiSkTextBlobFactory extends Host implements TextBlobFactory {
34
33
  this.CanvasKit,
35
34
  this.CanvasKit.TextBlob.MakeFromRSXform(
36
35
  str,
37
- rsxforms
38
- .map((f) => Array.from(JsiSkRSXform.fromValue<RSXform>(f)))
39
- .flat(),
36
+ rsxforms.map((f) => Array.from(JsiSkRSXform.fromValue(f))).flat(),
40
37
  JsiSkFont.fromValue(font)
41
38
  )
42
39
  );
43
40
  }
44
41
 
45
42
  MakeFromRSXformGlyphs(glyphs: number[], rsxforms: SkRSXform[], font: SkFont) {
43
+ const transforms = rsxforms.flatMap((s) =>
44
+ Array.from(JsiSkRSXform.fromValue(s))
45
+ );
46
46
  return new JsiSkTextBlob(
47
47
  this.CanvasKit,
48
48
  this.CanvasKit.TextBlob.MakeFromRSXformGlyphs(
49
49
  glyphs,
50
- rsxforms.map((f) => JsiSkRSXform.fromValue(f)),
50
+ transforms,
51
51
  JsiSkFont.fromValue(font)
52
52
  )
53
53
  );
@@ -52,6 +52,21 @@ export const JsiSkApi = (CanvasKit: CanvasKit): Skia => ({
52
52
  new JsiSkRRect(CanvasKit, rect, rx, ry),
53
53
  RSXform: (scos: number, ssin: number, tx: number, ty: number) =>
54
54
  new JsiSkRSXform(CanvasKit, Float32Array.of(scos, ssin, tx, ty)),
55
+ RSXformFromRadians: (
56
+ scale: number,
57
+ r: number,
58
+ tx: number,
59
+ ty: number,
60
+ px: number,
61
+ py: number
62
+ ) => {
63
+ const s = Math.sin(r) * scale;
64
+ const c = Math.cos(r) * scale;
65
+ return new JsiSkRSXform(
66
+ CanvasKit,
67
+ Float32Array.of(c, s, tx - c * px + s * py, ty - s * px - c * py)
68
+ );
69
+ },
55
70
  Color,
56
71
  ContourMeasureIter: (
57
72
  path: SkPath,