Skip to content

Commit 939ad0b

Browse files
authored
fix(🎨): consolidate color processing in the scenegraph (#2891)
1 parent 6bc0508 commit 939ad0b

File tree

7 files changed

+31
-29
lines changed

7 files changed

+31
-29
lines changed

Diff for: ‎packages/skia/src/dom/nodes/datatypes/Gradient.ts

+17-1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,22 @@ export const transformOrigin = (origin: Vector, transform: Transforms3d) => {
1616
];
1717
};
1818

19+
export const processColor = (
20+
Skia: Skia,
21+
color: number | string | Float32Array | number[]
22+
) => {
23+
"worklet";
24+
if (typeof color === "string" || typeof color === "number") {
25+
return Skia.Color(color);
26+
} else if (Array.isArray(color) || color instanceof Float32Array) {
27+
return color instanceof Float32Array ? color : new Float32Array(color);
28+
} else {
29+
throw new Error(
30+
`Invalid color type: ${typeof color}. Expected number, string, or array.`
31+
);
32+
}
33+
};
34+
1935
export const processGradientProps = (
2036
Skia: Skia,
2137
{ colors, positions, mode, flags, ...transform }: GradientProps
@@ -24,7 +40,7 @@ export const processGradientProps = (
2440
const localMatrix = Skia.Matrix();
2541
processTransformProps(localMatrix, transform);
2642
return {
27-
colors: colors.map((color) => Skia.Color(color)),
43+
colors: colors.map((color) => processColor(Skia, color)),
2844
positions: positions ?? null,
2945
mode: TileMode[enumKey(mode ?? "clamp")],
3046
flags,

Diff for: ‎packages/skia/src/sksg/Recorder/commands/Box.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { deflate, inflate } from "../../../dom/nodes";
1+
import { deflate, inflate, processColor } from "../../../dom/nodes";
22
import type { BoxProps, BoxShadowProps } from "../../../dom/types";
33
import { BlurStyle, ClipOp, isRRect } from "../../../skia/types";
44
import type { Command } from "../Core";
@@ -31,7 +31,7 @@ export const drawBox = (ctx: DrawingContext, command: BoxCommand) => {
3131
.map((shadow) => {
3232
const { color = "black", blur, spread = 0, dx = 0, dy = 0 } = shadow;
3333
const lPaint = Skia.Paint();
34-
lPaint.setColor(Skia.Color(color));
34+
lPaint.setColor(processColor(Skia, color));
3535
lPaint.setAlphaf(paint.getAlphaf() * opacity);
3636
lPaint.setMaskFilter(
3737
Skia.MaskFilter.MakeBlur(BlurStyle.Normal, blur, true)

Diff for: ‎packages/skia/src/sksg/Recorder/commands/ColorFilters.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { enumKey } from "../../../dom/nodes";
1+
import { enumKey, processColor } from "../../../dom/nodes";
22
import type {
33
BlendColorFilterProps,
44
LerpColorFilterProps,
@@ -59,7 +59,7 @@ export const pushColorFilter = (
5959
if (isColorFilter(command, NodeType.BlendColorFilter)) {
6060
const { props } = command;
6161
const { mode } = props;
62-
const color = ctx.Skia.Color(props.color);
62+
const color = processColor(ctx.Skia, props.color);
6363
cf = ctx.Skia.ColorFilter.MakeBlend(color, BlendMode[enumKey(mode)]);
6464
} else if (isColorFilter(command, NodeType.MatrixColorFilter)) {
6565
const { matrix } = command.props;

Diff for: ‎packages/skia/src/sksg/Recorder/commands/Drawing.ts

+5-4
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
inflate,
66
NodeType,
77
processCircle,
8+
processColor,
89
processPath,
910
processRect,
1011
processRRect,
@@ -87,7 +88,7 @@ export const drawBox = (
8788
.map((shadow) => {
8889
const { color = "black", blur, spread = 0, dx = 0, dy = 0 } = shadow;
8990
const lPaint = Skia.Paint();
90-
lPaint.setColor(Skia.Color(color));
91+
lPaint.setColor(processColor(Skia, color));
9192
lPaint.setAlphaf(paint.getAlphaf() * opacity);
9293
lPaint.setMaskFilter(
9394
Skia.MaskFilter.MakeBlur(BlurStyle.Normal, blur, true)
@@ -105,7 +106,7 @@ export const drawBox = (
105106
canvas.save();
106107
canvas.clipRRect(box, ClipOp.Intersect, false);
107108
const lPaint = Skia.Paint();
108-
lPaint.setColor(Skia.Color(color));
109+
lPaint.setColor(processColor(Skia, color));
109110
lPaint.setAlphaf(paint.getAlphaf() * opacity);
110111

111112
lPaint.setMaskFilter(
@@ -170,7 +171,7 @@ export const drawVertices = (ctx: DrawingContext, props: VerticesProps) => {
170171
vertexMode,
171172
props.vertices,
172173
textures,
173-
colors ? colors.map((c) => ctx.Skia.Color(c)) : undefined,
174+
colors ? colors.map((c) => processColor(ctx.Skia, c)) : undefined,
174175
indices
175176
);
176177
const defaultBlendMode = colors ? BlendMode.DstOver : BlendMode.SrcOver;
@@ -258,7 +259,7 @@ export const drawPatch = (ctx: DrawingContext, props: PatchProps) => {
258259
patch[0].c1,
259260
];
260261
const colors = props.colors
261-
? props.colors.map((c) => ctx.Skia.Color(c))
262+
? props.colors.map((c) => processColor(ctx.Skia, c))
262263
: undefined;
263264
ctx.canvas.drawPatch(points, colors, texture, mode, ctx.paint);
264265
};

Diff for: ‎packages/skia/src/sksg/Recorder/commands/ImageFilters.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { enumKey, processRadius } from "../../../dom/nodes";
1+
import { enumKey, processColor, processRadius } from "../../../dom/nodes";
22
import type {
33
BlendImageFilterProps,
44
BlurImageFilterProps,
@@ -113,7 +113,7 @@ const declareDropShadowImageFilter = (
113113
) => {
114114
"worklet";
115115
const { dx, dy, blur, shadowOnly, color: cl, inner } = props;
116-
const color = ctx.Skia.Color(cl);
116+
const color = processColor(ctx.Skia, cl);
117117
let factory;
118118
if (inner) {
119119
factory = MakeInnerShadow.bind(null, ctx.Skia, shadowOnly);

Diff for: ‎packages/skia/src/sksg/Recorder/commands/Paint.ts

+1-17
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { enumKey } from "../../../dom/nodes";
1+
import { enumKey, processColor } from "../../../dom/nodes";
22
import type { PaintProps } from "../../../dom/types";
33
import {
44
BlendMode,
@@ -8,22 +8,6 @@ import {
88
} from "../../../skia/types";
99
import type { SkPaint, Skia } from "../../../skia/types";
1010

11-
export const processColor = (
12-
Skia: Skia,
13-
color: number | string | Float32Array | number[]
14-
) => {
15-
"worklet";
16-
if (typeof color === "string" || typeof color === "number") {
17-
return Skia.Color(color);
18-
} else if (Array.isArray(color) || color instanceof Float32Array) {
19-
return color instanceof Float32Array ? color : new Float32Array(color);
20-
} else {
21-
throw new Error(
22-
`Invalid color type: ${typeof color}. Expected number, string, or array.`
23-
);
24-
}
25-
};
26-
2711
export const setPaintProperties = (
2812
Skia: Skia,
2913
paint: SkPaint,

Diff for: ‎packages/skia/src/sksg/Recorder/commands/Shaders.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import {
22
enumKey,
33
fitRects,
44
getRect,
5+
processColor,
56
processGradientProps,
67
processTransformProps,
78
rect2rect,
@@ -49,7 +50,7 @@ const declareShader = (ctx: DrawingContext, props: ShaderProps) => {
4950
const declareColorShader = (ctx: DrawingContext, props: ColorProps) => {
5051
"worklet";
5152
const { color } = props;
52-
const shader = ctx.Skia.Shader.MakeColor(ctx.Skia.Color(color));
53+
const shader = ctx.Skia.Shader.MakeColor(processColor(ctx.Skia, color));
5354
ctx.shaders.push(shader);
5455
};
5556

0 commit comments

Comments
 (0)