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