@shopify/react-native-skia 1.12.3 → 1.12.4

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 (34) hide show
  1. package/android/build.gradle +15 -11
  2. package/cpp/api/JsiSkCanvas.h +45 -2
  3. package/cpp/api/recorder/Drawings.h +31 -2
  4. package/cpp/api/recorder/Shaders.h +40 -0
  5. package/lib/commonjs/renderer/Canvas.d.ts +1 -2
  6. package/lib/commonjs/renderer/Canvas.js.map +1 -1
  7. package/lib/commonjs/sksg/Recorder/Player.d.ts +1 -1
  8. package/lib/commonjs/sksg/Recorder/Player.js.map +1 -1
  9. package/lib/commonjs/sksg/Recorder/commands/Box.js +2 -2
  10. package/lib/commonjs/sksg/Recorder/commands/Box.js.map +1 -1
  11. package/lib/commonjs/sksg/Recorder/commands/Drawing.d.ts +1 -3
  12. package/lib/commonjs/sksg/Recorder/commands/Drawing.js +1 -58
  13. package/lib/commonjs/sksg/Recorder/commands/Drawing.js.map +1 -1
  14. package/lib/module/renderer/Canvas.d.ts +1 -2
  15. package/lib/module/renderer/Canvas.js.map +1 -1
  16. package/lib/module/sksg/Recorder/Player.d.ts +1 -1
  17. package/lib/module/sksg/Recorder/Player.js.map +1 -1
  18. package/lib/module/sksg/Recorder/commands/Box.js +2 -2
  19. package/lib/module/sksg/Recorder/commands/Box.js.map +1 -1
  20. package/lib/module/sksg/Recorder/commands/Drawing.d.ts +1 -3
  21. package/lib/module/sksg/Recorder/commands/Drawing.js +2 -58
  22. package/lib/module/sksg/Recorder/commands/Drawing.js.map +1 -1
  23. package/lib/typescript/lib/commonjs/sksg/Recorder/commands/Drawing.d.ts +0 -1
  24. package/lib/typescript/lib/module/sksg/Recorder/commands/Drawing.d.ts +0 -1
  25. package/lib/typescript/src/renderer/Canvas.d.ts +1 -2
  26. package/lib/typescript/src/sksg/Recorder/Player.d.ts +1 -1
  27. package/lib/typescript/src/sksg/Recorder/commands/Drawing.d.ts +1 -3
  28. package/package.json +1 -1
  29. package/src/__tests__/snapshots/box/box-shadow-opacity.png +0 -0
  30. package/src/renderer/Canvas.tsx +1 -1
  31. package/src/renderer/__tests__/e2e/Box.spec.tsx +22 -0
  32. package/src/sksg/Recorder/Player.ts +1 -1
  33. package/src/sksg/Recorder/commands/Box.ts +2 -2
  34. package/src/sksg/Recorder/commands/Drawing.ts +0 -65
@@ -80,4 +80,26 @@ describe("Box", () => {
80
80
  );
81
81
  checkImage(img, "snapshots/box/box-stroke.png");
82
82
  });
83
+
84
+ it("should draw a shadow with opacity", async () => {
85
+ const { rect } = importSkia();
86
+ const { width } = surface;
87
+ const size = width / 2;
88
+ const img = await surface.draw(
89
+ <>
90
+ <Fill color="white" />
91
+ <Box box={rect(size / 2, size / 2, size, size)} color="red">
92
+ <BoxShadow
93
+ dx={0}
94
+ dy={0}
95
+ blur={5}
96
+ spread={10}
97
+ inner
98
+ color={"rgba(0, 0, 255, 0.5)"}
99
+ />
100
+ </Box>
101
+ </>
102
+ );
103
+ checkImage(img, "snapshots/box/box-shadow-opacity.png");
104
+ });
83
105
  });
@@ -45,8 +45,8 @@ import {
45
45
  isDrawCommand,
46
46
  isGroup,
47
47
  materializeCommand,
48
- type Command,
49
48
  } from "./Core";
49
+ import type { Command } from "./Core";
50
50
  import type { DrawingContext } from "./DrawingContext";
51
51
 
52
52
  function play(ctx: DrawingContext, _command: Command) {
@@ -30,7 +30,7 @@ export const drawBox = (ctx: DrawingContext, command: BoxCommand) => {
30
30
  const { color = "black", blur, spread = 0, dx = 0, dy = 0 } = shadow;
31
31
  const lPaint = Skia.Paint();
32
32
  lPaint.setColor(processColor(Skia, color));
33
- lPaint.setAlphaf(paint.getAlphaf() * opacity);
33
+ lPaint.setAlphaf(lPaint.getAlphaf() * opacity);
34
34
  lPaint.setMaskFilter(
35
35
  Skia.MaskFilter.MakeBlur(BlurStyle.Normal, blur, true)
36
36
  );
@@ -48,7 +48,7 @@ export const drawBox = (ctx: DrawingContext, command: BoxCommand) => {
48
48
  canvas.clipRRect(box, ClipOp.Intersect, false);
49
49
  const lPaint = Skia.Paint();
50
50
  lPaint.setColor(Skia.Color(color));
51
- lPaint.setAlphaf(paint.getAlphaf() * opacity);
51
+ lPaint.setAlphaf(lPaint.getAlphaf() * opacity);
52
52
 
53
53
  lPaint.setMaskFilter(
54
54
  Skia.MaskFilter.MakeBlur(BlurStyle.Normal, blur, true)
@@ -1,9 +1,6 @@
1
1
  import {
2
- deflate,
3
2
  enumKey,
4
3
  fitRects,
5
- inflate,
6
- NodeType,
7
4
  processCircle,
8
5
  processColor,
9
6
  processPath,
@@ -12,8 +9,6 @@ import {
12
9
  } from "../../../dom/nodes";
13
10
  import type {
14
11
  AtlasProps,
15
- BoxProps,
16
- BoxShadowProps,
17
12
  CircleProps,
18
13
  DiffRectProps,
19
14
  DrawingNodeProps,
@@ -38,18 +33,13 @@ import { saturate } from "../../../renderer/processors";
38
33
  import type { SkPoint, SkRSXform } from "../../../skia/types";
39
34
  import {
40
35
  BlendMode,
41
- BlurStyle,
42
- ClipOp,
43
36
  FillType,
44
37
  FilterMode,
45
38
  isCubicSampling,
46
- isRRect,
47
39
  MipmapMode,
48
40
  PointMode,
49
41
  VertexMode,
50
42
  } from "../../../skia/types";
51
- import type { Node } from "../../Node";
52
- import { materialize } from "../../utils";
53
43
  import type { DrawingContext } from "../DrawingContext";
54
44
 
55
45
  export const drawLine = (ctx: DrawingContext, props: LineProps) => {
@@ -64,61 +54,6 @@ export const drawOval = (ctx: DrawingContext, props: OvalProps) => {
64
54
  ctx.canvas.drawOval(rect, ctx.paint);
65
55
  };
66
56
 
67
- export const drawBox = (
68
- ctx: DrawingContext,
69
- props: BoxProps,
70
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
71
- children: Node<any>[]
72
- ) => {
73
- "worklet";
74
- const { paint, Skia, canvas } = ctx;
75
- const { box: defaultBox } = props;
76
- const opacity = paint.getAlphaf();
77
- const box = isRRect(defaultBox) ? defaultBox : Skia.RRectXY(defaultBox, 0, 0);
78
- const shadows = children
79
- .map((node) => {
80
- if (node.type === NodeType.BoxShadow) {
81
- return materialize(node.props);
82
- }
83
- return null;
84
- })
85
- .filter((n): n is BoxShadowProps => n !== null);
86
- shadows
87
- .filter((shadow) => !shadow.inner)
88
- .map((shadow) => {
89
- const { color = "black", blur, spread = 0, dx = 0, dy = 0 } = shadow;
90
- const lPaint = Skia.Paint();
91
- lPaint.setColor(processColor(Skia, color));
92
- lPaint.setAlphaf(paint.getAlphaf() * opacity);
93
- lPaint.setMaskFilter(
94
- Skia.MaskFilter.MakeBlur(BlurStyle.Normal, blur, true)
95
- );
96
- canvas.drawRRect(inflate(Skia, box, spread, spread, dx, dy), lPaint);
97
- });
98
-
99
- canvas.drawRRect(box, paint);
100
-
101
- shadows
102
- .filter((shadow) => shadow.inner)
103
- .map((shadow) => {
104
- const { color = "black", blur, spread = 0, dx = 0, dy = 0 } = shadow;
105
- const delta = Skia.Point(10 + Math.abs(dx), 10 + Math.abs(dy));
106
- canvas.save();
107
- canvas.clipRRect(box, ClipOp.Intersect, false);
108
- const lPaint = Skia.Paint();
109
- lPaint.setColor(processColor(Skia, color));
110
- lPaint.setAlphaf(paint.getAlphaf() * opacity);
111
-
112
- lPaint.setMaskFilter(
113
- Skia.MaskFilter.MakeBlur(BlurStyle.Normal, blur, true)
114
- );
115
- const inner = deflate(Skia, box, spread, spread, dx, dy);
116
- const outer = inflate(Skia, box, delta.x, delta.y);
117
- canvas.drawDRRect(outer, inner, lPaint);
118
- canvas.restore();
119
- });
120
- };
121
-
122
57
  export const drawImage = (ctx: DrawingContext, props: ImageProps) => {
123
58
  "worklet";
124
59
  const { image, sampling } = props;