pixi.js
Version:
<p align="center"> <a href="https://pixijs.com" target="_blank" rel="noopener noreferrer"> <img height="150" src="https://files.pixijs.download/branding/pixijs-logo-transparent-dark.svg?v=1" alt="PixiJS logo"> </a> </p> <br/> <p align="center">
1 lines • 13.5 kB
Source Map (JSON)
{"version":3,"file":"parseSVGPath.mjs","sources":["../../../../../src/scene/graphics/shared/svg/parseSVGPath.ts"],"sourcesContent":["import parse from 'parse-svg-path';\nimport { warn } from '../../../../utils/logging/warn';\n\nimport type { GraphicsPath } from '../path/GraphicsPath';\n\ninterface SubPath\n{\n startX: number;\n startY: number;\n}\n\n/**\n * Parses an SVG path data string and builds a GraphicsPath object from the commands.\n * This function handles all standard SVG path commands including moves, lines, curves and arcs.\n * It maintains state for the current position and subpaths to properly handle relative commands\n * and path closures.\n *\n * Supported SVG commands:\n * - M/m: Move to absolute/relative\n * - L/l: Line to absolute/relative\n * - H/h: Horizontal line absolute/relative\n * - V/v: Vertical line absolute/relative\n * - C/c: Cubic bezier curve absolute/relative\n * - S/s: Smooth cubic bezier curve absolute/relative\n * - Q/q: Quadratic bezier curve absolute/relative\n * - T/t: Smooth quadratic bezier curve absolute/relative\n * - A/a: Arc absolute/relative\n * - Z/z: Close path\n * @param svgPath - The SVG path data string to parse (e.g. \"M0,0 L100,100\")\n * @param path - The GraphicsPath object to build the path into\n * @returns The input path object with the SVG commands applied\n * @internal\n */\nexport function parseSVGPath(svgPath: string, path: GraphicsPath): GraphicsPath\n{\n // Parse the SVG path string into an array of commands\n const commands = parse(svgPath);\n\n // Track subpaths for proper path closure handling\n const subpaths: SubPath[] = [];\n let currentSubPath: SubPath | null = null;\n\n // Track current position for relative commands\n let lastX = 0;\n let lastY = 0;\n\n // Process each command in sequence\n for (let i = 0; i < commands.length; i++)\n {\n const command = commands[i];\n const type = command[0]; // The command letter\n const data = command; // The command parameters, 1-based indexed\n\n switch (type)\n {\n case 'M': // Move To (absolute)\n lastX = data[1];\n lastY = data[2];\n\n path.moveTo(lastX, lastY);\n break;\n case 'm': // Move To (relative)\n lastX += data[1];\n lastY += data[2];\n\n path.moveTo(lastX, lastY);\n break;\n case 'H': // Horizontal Line To (absolute)\n lastX = data[1];\n\n path.lineTo(lastX, lastY);\n break;\n case 'h': // Horizontal Line To (relative)\n lastX += data[1];\n\n path.lineTo(lastX, lastY);\n break;\n case 'V': // Vertical Line To (absolute)\n lastY = data[1];\n\n path.lineTo(lastX, lastY);\n break;\n case 'v': // Vertical Line To (relative)\n lastY += data[1];\n\n path.lineTo(lastX, lastY);\n break;\n case 'L': // Line To (absolute)\n lastX = data[1];\n lastY = data[2];\n\n path.lineTo(lastX, lastY);\n break;\n case 'l': // Line To (relative)\n lastX += data[1];\n lastY += data[2];\n\n path.lineTo(lastX, lastY);\n break;\n case 'C': // Cubic Bezier Curve (absolute)\n lastX = data[5];\n lastY = data[6];\n\n path.bezierCurveTo(\n data[1], data[2], // First control point\n data[3], data[4], // Second control point\n lastX, lastY // End point\n );\n break;\n case 'c': // Cubic Bezier Curve (relative)\n path.bezierCurveTo(\n lastX + data[1], lastY + data[2], // First control point\n lastX + data[3], lastY + data[4], // Second control point\n lastX + data[5], lastY + data[6] // End point\n );\n\n lastX += data[5];\n lastY += data[6];\n break;\n case 'S': // Smooth Cubic Bezier Curve (absolute)\n lastX = data[3];\n lastY = data[4];\n\n path.bezierCurveToShort(\n data[1], data[2], // Control point\n lastX, lastY // End point\n );\n break;\n case 's': // Smooth Cubic Bezier Curve (relative)\n path.bezierCurveToShort(\n lastX + data[1], lastY + data[2], // Control point\n lastX + data[3], lastY + data[4], // End point\n );\n\n lastX += data[3];\n lastY += data[4];\n break;\n case 'Q': // Quadratic Bezier Curve (absolute)\n lastX = data[3];\n lastY = data[4];\n\n path.quadraticCurveTo(\n data[1], data[2], // Control point\n lastX, lastY // End point\n );\n break;\n case 'q': // Quadratic Bezier Curve (relative)\n path.quadraticCurveTo(\n lastX + data[1], lastY + data[2], // Control point\n lastX + data[3], lastY + data[4] // End point\n );\n\n lastX += data[3];\n lastY += data[4];\n break;\n case 'T': // Smooth Quadratic Bezier Curve (absolute)\n lastX = data[1];\n lastY = data[2];\n\n path.quadraticCurveToShort(\n lastX, lastY // End point\n );\n break;\n case 't': // Smooth Quadratic Bezier Curve (relative)\n lastX += data[1];\n lastY += data[2];\n\n path.quadraticCurveToShort(\n lastX, lastY // End point\n );\n break;\n case 'A': // Arc (absolute)\n lastX = data[6];\n lastY = data[7];\n\n path.arcToSvg(\n data[1], // rx\n data[2], // ry\n data[3], // x-axis-rotation\n data[4], // large-arc-flag\n data[5], // sweep-flag\n lastX, lastY // End point\n );\n break;\n case 'a': // Arc (relative)\n lastX += data[6];\n lastY += data[7];\n\n path.arcToSvg(\n data[1], // rx\n data[2], // ry\n data[3], // x-axis-rotation\n data[4], // large-arc-flag\n data[5], // sweep-flag\n lastX, lastY // End point\n );\n break;\n case 'Z': // Close Path\n case 'z':\n path.closePath();\n if (subpaths.length > 0)\n {\n // Return to the start of the current subpath\n currentSubPath = subpaths.pop();\n if (currentSubPath)\n {\n lastX = currentSubPath.startX;\n lastY = currentSubPath.startY;\n }\n else\n {\n lastX = 0;\n lastY = 0;\n }\n }\n currentSubPath = null;\n break;\n default:\n // #if _DEBUG\n warn(`Unknown SVG path command: ${type}`);\n // #endif\n }\n\n // Track subpath starts for path closure\n if (type !== 'Z' && type !== 'z')\n {\n if (currentSubPath === null)\n {\n currentSubPath = { startX: lastX, startY: lastY };\n subpaths.push(currentSubPath);\n }\n }\n }\n\n return path;\n}\n"],"names":[],"mappings":"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"}