@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.
- package/android/build.gradle +15 -11
- package/cpp/api/JsiSkCanvas.h +45 -2
- package/cpp/api/recorder/Drawings.h +31 -2
- package/cpp/api/recorder/Shaders.h +40 -0
- package/lib/commonjs/renderer/Canvas.d.ts +1 -2
- package/lib/commonjs/renderer/Canvas.js.map +1 -1
- package/lib/commonjs/sksg/Recorder/Player.d.ts +1 -1
- package/lib/commonjs/sksg/Recorder/Player.js.map +1 -1
- package/lib/commonjs/sksg/Recorder/commands/Box.js +2 -2
- package/lib/commonjs/sksg/Recorder/commands/Box.js.map +1 -1
- package/lib/commonjs/sksg/Recorder/commands/Drawing.d.ts +1 -3
- package/lib/commonjs/sksg/Recorder/commands/Drawing.js +1 -58
- package/lib/commonjs/sksg/Recorder/commands/Drawing.js.map +1 -1
- package/lib/module/renderer/Canvas.d.ts +1 -2
- package/lib/module/renderer/Canvas.js.map +1 -1
- package/lib/module/sksg/Recorder/Player.d.ts +1 -1
- package/lib/module/sksg/Recorder/Player.js.map +1 -1
- package/lib/module/sksg/Recorder/commands/Box.js +2 -2
- package/lib/module/sksg/Recorder/commands/Box.js.map +1 -1
- package/lib/module/sksg/Recorder/commands/Drawing.d.ts +1 -3
- package/lib/module/sksg/Recorder/commands/Drawing.js +2 -58
- package/lib/module/sksg/Recorder/commands/Drawing.js.map +1 -1
- package/lib/typescript/lib/commonjs/sksg/Recorder/commands/Drawing.d.ts +0 -1
- package/lib/typescript/lib/module/sksg/Recorder/commands/Drawing.d.ts +0 -1
- package/lib/typescript/src/renderer/Canvas.d.ts +1 -2
- package/lib/typescript/src/sksg/Recorder/Player.d.ts +1 -1
- package/lib/typescript/src/sksg/Recorder/commands/Drawing.d.ts +1 -3
- package/package.json +1 -1
- package/src/__tests__/snapshots/box/box-shadow-opacity.png +0 -0
- package/src/renderer/Canvas.tsx +1 -1
- package/src/renderer/__tests__/e2e/Box.spec.tsx +22 -0
- package/src/sksg/Recorder/Player.ts +1 -1
- package/src/sksg/Recorder/commands/Box.ts +2 -2
- 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(
|
|
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(
|
|
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;
|