91 lines
2.7 KiB
TypeScript
91 lines
2.7 KiB
TypeScript
import { encodeSVGPath } from "./SVGPathDataEncoder";
|
|
import { SVGPathDataParser } from "./SVGPathDataParser";
|
|
import { SVGPathDataTransformer } from "./SVGPathDataTransformer";
|
|
import { TransformableSVG } from "./TransformableSVG";
|
|
import { SVGCommand } from "./types";
|
|
|
|
export class SVGPathData extends TransformableSVG {
|
|
commands: SVGCommand[];
|
|
constructor(content: string | SVGCommand[]) {
|
|
super();
|
|
if ("string" === typeof content) {
|
|
this.commands = SVGPathData.parse(content);
|
|
} else {
|
|
this.commands = content;
|
|
}
|
|
}
|
|
|
|
encode() {
|
|
return SVGPathData.encode(this.commands);
|
|
}
|
|
|
|
getBounds() {
|
|
const boundsTransform = SVGPathDataTransformer.CALCULATE_BOUNDS();
|
|
|
|
this.transform(boundsTransform);
|
|
return boundsTransform;
|
|
}
|
|
|
|
transform(
|
|
transformFunction: (input: SVGCommand) => SVGCommand | SVGCommand[],
|
|
) {
|
|
const newCommands = [];
|
|
|
|
for (const command of this.commands) {
|
|
const transformedCommand = transformFunction(command);
|
|
|
|
if (Array.isArray(transformedCommand)) {
|
|
newCommands.push(...transformedCommand);
|
|
} else {
|
|
newCommands.push(transformedCommand);
|
|
}
|
|
}
|
|
this.commands = newCommands;
|
|
return this;
|
|
}
|
|
|
|
static encode(commands: SVGCommand[]) {
|
|
return encodeSVGPath(commands);
|
|
}
|
|
|
|
static parse(path: string) {
|
|
const parser = new SVGPathDataParser();
|
|
const commands: SVGCommand[] = [];
|
|
parser.parse(path, commands);
|
|
parser.finish(commands);
|
|
return commands;
|
|
}
|
|
|
|
static readonly CLOSE_PATH: 1 = 1;
|
|
static readonly MOVE_TO: 2 = 2;
|
|
static readonly HORIZ_LINE_TO: 4 = 4;
|
|
static readonly VERT_LINE_TO: 8 = 8;
|
|
static readonly LINE_TO: 16 = 16;
|
|
static readonly CURVE_TO: 32 = 32;
|
|
static readonly SMOOTH_CURVE_TO: 64 = 64;
|
|
static readonly QUAD_TO: 128 = 128;
|
|
static readonly SMOOTH_QUAD_TO: 256 = 256;
|
|
static readonly ARC: 512 = 512;
|
|
static readonly LINE_COMMANDS = SVGPathData.LINE_TO | SVGPathData.HORIZ_LINE_TO | SVGPathData.VERT_LINE_TO;
|
|
static readonly DRAWING_COMMANDS = SVGPathData.HORIZ_LINE_TO | SVGPathData.VERT_LINE_TO | SVGPathData.LINE_TO |
|
|
SVGPathData.CURVE_TO | SVGPathData.SMOOTH_CURVE_TO | SVGPathData.QUAD_TO |
|
|
SVGPathData.SMOOTH_QUAD_TO | SVGPathData.ARC;
|
|
}
|
|
|
|
export const COMMAND_ARG_COUNTS = {
|
|
[SVGPathData.MOVE_TO]: 2,
|
|
[SVGPathData.LINE_TO]: 2,
|
|
[SVGPathData.HORIZ_LINE_TO]: 1,
|
|
[SVGPathData.VERT_LINE_TO]: 1,
|
|
[SVGPathData.CLOSE_PATH]: 0,
|
|
[SVGPathData.QUAD_TO]: 4,
|
|
[SVGPathData.SMOOTH_QUAD_TO]: 2,
|
|
[SVGPathData.CURVE_TO]: 6,
|
|
[SVGPathData.SMOOTH_CURVE_TO]: 4,
|
|
[SVGPathData.ARC]: 7,
|
|
};
|
|
|
|
export {encodeSVGPath} from "./SVGPathDataEncoder";
|
|
export {SVGPathDataParser} from "./SVGPathDataParser";
|
|
export {SVGPathDataTransformer} from "./SVGPathDataTransformer";
|