in packages/core/src/utils/path.ts [79:234]
static simplify(path: Directive[]) {
let x = 0
let y = 0
const n = path.length
let x1 = 0
let y1 = 0
let current: Directive | undefined
let converted = false
let result: Directive[] = []
let previous: string | undefined
let controlX = 0
let controlY = 0
for (let i = 0; i < n; ++i) {
converted = false
current = path[i].slice(0) as Directive
switch (current[0]) {
case 'l':
current[0] = 'L'
current[1] += x
current[2] += y
// falls through
case 'L':
x = current[1]
y = current[2]
break
case 'h':
current[1] += x
// falls through
case 'H':
current[0] = 'L'
current[2] = y
x = current[1]
break
case 'v':
current[1] += y
// falls through
case 'V':
current[0] = 'L'
y = current[1]
current[1] = x
current[2] = y
break
case 'm':
current[0] = 'M'
current[1] += x
current[2] += y
// falls through
case 'M':
x = current[1]
y = current[2]
x1 = current[1]
y1 = current[2]
break
case 'c':
current[0] = 'C'
current[1] += x
current[2] += y
current[3] += x
current[4] += y
current[5] += x
current[6] += y
// falls through
case 'C':
controlX = current[3]
controlY = current[4]
x = current[5]
y = current[6]
break
case 's':
current[0] = 'S'
current[1] += x
current[2] += y
current[3] += x
current[4] += y
// falls through
case 'S':
if (previous === 'C') {
controlX = 2 * x - controlX
controlY = 2 * y - controlY
}
else {
controlX = x
controlY = y
}
x = current[3]
y = current[4]
current[0] = 'C'
current[5] = current[3]
current[6] = current[4]
current[3] = current[1]
current[4] = current[2]
current[1] = controlX
current[2] = controlY
controlX = current[3]
controlY = current[4]
break
case 'q':
current[0] = 'Q'
current[1] += x
current[2] += y
current[3] += x
current[4] += y
// falls through
case 'Q':
controlX = current[1]
controlY = current[2]
x = current[3]
y = current[4]
break
case 't':
current[0] = 'T'
current[1] += x
current[2] += y
// falls through
case 'T':
if (previous === 'Q') {
controlX = 2 * x - controlX
controlY = 2 * y - controlY
}
else {
controlX = x
controlY = y
}
current[0] = 'Q'
x = current[1]
y = current[2]
current[1] = controlX
current[2] = controlY
current[3] = x
current[4] = y
break
case 'a':
current[0] = 'A'
current[6] += x
current[7] += y
// falls through
case 'A':
converted = true
result = result.concat(fromArcToBeziers(x, y, current))
x = current[6]
y = current[7]
break
case 'z':
case 'Z':
x = x1
y = y1
break
default:
}
if (!converted) {
result.push(current)
}
previous = current[0]
}
return result
}