@leafer-in/arrow
Version:
57 lines (48 loc) • 2.27 kB
text/typescript
import { IPathCommandData, IPointData } from '@leafer-ui/interface'
import { PathCommandMap as Command, PointHelper } from '@leafer-ui/draw'
const { M, L, C, Q, O } = Command
const { rotate, copyFrom, scale } = PointHelper
const point: IPointData = {} as IPointData
export const PathMatrixHelper = {
layout(data: IPathCommandData, x: number, y: number, scaleX?: number, scaleY?: number, rotation?: number, origin?: IPointData): void {
let command: number, i = 0, j: number, len = data.length
while (i < len) {
command = data[i]
switch (command) {
case M: // moveto(x, y)
case L: // lineto(x, y)
setPoint(data, i + 1, x, y, scaleX, scaleY, rotation, origin)
i += 3
break
case C: // bezierCurveTo(x1, y1, x2, y2, x, y)
for (j = 1; j < 6; j += 2) setPoint(data, i + j, x, y, scaleX, scaleY, rotation, origin)
i += 7
break
case Q: // quadraticCurveTo(x1, y1, x, y)
for (j = 1; j < 4; j += 2) setPoint(data, i + j, x, y, scaleX, scaleY, rotation, origin)
i += 5
break
case O: // arc(x, y, radius, startAngle, endAngle, anticlockwise)
data[i + 1] += x
data[i + 2] += y
if (scaleX) data[i + 3] *= scaleX
if (rotation) {
data[i + 4] += rotation
data[i + 5] += rotation
}
i += 7
break
}
}
},
rotate(data: IPathCommandData, rotation?: number, center?: IPointData): void {
PathMatrixHelper.layout(data, 0, 0, 1, 1, rotation, center)
}
}
function setPoint(data: IPathCommandData, startIndex: number, x: number, y: number, scaleX?: number, scaleY?: number, rotation?: number, origin?: IPointData): void {
copyFrom(point, data[startIndex], data[startIndex + 1])
if (rotation) rotate(point, rotation, origin)
if (scaleX) scale(point, scaleX, scaleY)
data[startIndex] = x + point.x
data[startIndex + 1] = y + point.y
}