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 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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"}