-
-
Notifications
You must be signed in to change notification settings - Fork 997
/
serialize-instructions.ts
104 lines (83 loc) · 2.7 KB
/
serialize-instructions.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
import type {Instruction} from './helpers/types';
/**
* @description Takes an array of Instruction's and serializes it into an SVG path string.
* @param {Array} instruction
* @returns a serialized SVG path string
* @see [Documentation](https://www.remotion.dev/docs/paths/serialize-instructions)
*/
const serializeInstruction = (instruction: Instruction): string => {
if (instruction.type === 'A') {
return `A ${instruction.rx} ${instruction.ry} ${
instruction.xAxisRotation
} ${Number(instruction.largeArcFlag)} ${Number(instruction.sweepFlag)} ${
instruction.x
} ${instruction.y}`;
}
if (instruction.type === 'a') {
return `a ${instruction.rx} ${instruction.ry} ${
instruction.xAxisRotation
} ${Number(instruction.largeArcFlag)} ${Number(instruction.sweepFlag)} ${
instruction.dx
} ${instruction.dy}`;
}
if (instruction.type === 'C') {
return `C ${instruction.cp1x} ${instruction.cp1y} ${instruction.cp2x} ${instruction.cp2y} ${instruction.x} ${instruction.y}`;
}
if (instruction.type === 'c') {
return `c ${instruction.cp1dx} ${instruction.cp1dy} ${instruction.cp2dx} ${instruction.cp2dy} ${instruction.dx} ${instruction.dy}`;
}
if (instruction.type === 'S') {
return `S ${instruction.cpx} ${instruction.cpy} ${instruction.x} ${instruction.y}`;
}
if (instruction.type === 's') {
return `s ${instruction.cpdx} ${instruction.cpdy} ${instruction.dx} ${instruction.dy}`;
}
if (instruction.type === 'Q') {
return `Q ${instruction.cpx} ${instruction.cpy} ${instruction.x} ${instruction.y}`;
}
if (instruction.type === 'q') {
return `q ${instruction.cpdx} ${instruction.cpdy} ${instruction.dx} ${instruction.dy}`;
}
if (instruction.type === 'Z') {
return 'Z';
}
if (instruction.type === 'H') {
return `H ${instruction.x}`;
}
if (instruction.type === 'h') {
return `h ${instruction.dx}`;
}
if (instruction.type === 'V') {
return `V ${instruction.y}`;
}
if (instruction.type === 'v') {
return `v ${instruction.dy}`;
}
if (instruction.type === 'L') {
return `L ${instruction.x} ${instruction.y}`;
}
if (instruction.type === 'l') {
return `l ${instruction.dx} ${instruction.dy}`;
}
if (instruction.type === 'M') {
return `M ${instruction.x} ${instruction.y}`;
}
if (instruction.type === 'm') {
return `m ${instruction.dx} ${instruction.dy}`;
}
if (instruction.type === 'T') {
return `T ${instruction.x} ${instruction.y}`;
}
if (instruction.type === 't') {
return `t ${instruction.dx} ${instruction.dy}`;
}
// @ts-expect-error
throw new Error(`Unknown instruction type: ${instruction.type}`);
};
export const serializeInstructions = (path: Instruction[]): string => {
return path
.map((p) => {
return serializeInstruction(p);
})
.join(' ');
};