{"version":3,"file":"SVG.mjs","sources":["../src/SVG.ts"],"sourcesContent":["import { Graphics } from '@pixi/graphics';\nimport dPathParser from 'd-path-parser';\nimport color from 'tinycolor2';\nimport arcToBezier from 'svg-arc-to-cubic-bezier';\n\ninterface SVGStyle\n{\n    fill: string | null;\n    opacity: string | null;\n    stroke: string | null;\n    strokeWidth: string | null;\n    strokeOpacity: string | null;\n    cap: string | null;\n    join: string | null;\n    miterLimit: string | null;\n}\n\n/**\n * Scalable Graphics drawn from SVG image document.\n * @class SVG\n * @extends PIXI.Graphics\n */\nclass SVG extends Graphics\n{\n    /** Fallback line color */\n    private lineColor: string | null = null;\n\n    /**\n     * @param svg - Inline SVGElement `<svg>` or buffer.\n     */\n    constructor(svg?: SVGSVGElement | SVGElement | string)\n    {\n        super();\n\n        if (svg)\n        {\n            this.drawSVG(svg);\n        }\n    }\n\n    /**\n     * Draw an SVG element.\n     * @param svg - Inline SVGElement `<svg>` or buffer.\n     * @return Element suitable for chaining.\n     */\n    drawSVG(svg: SVGSVGElement | SVGElement | string): this\n    {\n        if (typeof svg === 'string')\n        {\n            const div = document.createElement('div');\n\n            div.innerHTML = svg.trim();\n            svg = div.querySelector('svg') as SVGElement;\n        }\n\n        if (!svg)\n        {\n            throw new Error('Missing <svg> element in SVG constructor');\n        }\n\n        this._svgFill(svg);\n        this._svgChildren(svg.children);\n\n        return this;\n    }\n\n    /**\n     * Create a PIXI Graphic from SVG element\n     * @param children - Collection of SVG nodes\n     * @param inherit - Whether to inherit fill settings.\n     */\n    private _svgChildren(children: HTMLCollection, inherit = false): void\n    {\n        for (let i = 0; i < children.length; i++)\n        {\n            const child = children[i] as unknown as SVGElement;\n\n            this._svgFill(child, inherit);\n            switch (child.nodeName.toLowerCase())\n            {\n                case 'path': {\n                    this._svgPath(child as SVGPathElement);\n                    break;\n                }\n                case 'circle':\n                case 'ellipse': {\n                    this._svgCircle(child as SVGCircleElement);\n                    break;\n                }\n                case 'rect': {\n                    this._svgRect(child as SVGRectElement);\n                    break;\n                }\n                case 'polygon': {\n                    this._svgPoly(child as SVGPolygonElement, true);\n                    break;\n                }\n                case 'polyline': {\n                    this._svgPoly(child as SVGPolylineElement);\n                    break;\n                }\n                case 'g': {\n                    break;\n                }\n                default: {\n                    // eslint-disable-next-line no-console\n                    console.info(`[PIXI.SVG] <${child.nodeName}> elements unsupported`);\n                    break;\n                }\n            }\n            this._svgChildren(child.children, true);\n        }\n    }\n\n    /** Convert the Hexidecimal string (e.g., \"#fff\") to uint */\n    private _hexToUint(hex: string): number\n    {\n        if (hex[0] === '#')\n        {\n            // Remove the hash\n            hex = hex.substr(1);\n\n            // Convert shortcolors fc9 to ffcc99\n            if (hex.length === 3)\n            {\n                hex = hex.replace(/([a-f0-9])/ig, '$1$1');\n            }\n\n            return parseInt(hex, 16);\n        }\n\n        const { r, g, b } = color(hex).toRgb();\n\n        return (r << 16) + (g << 8) + b;\n    }\n\n    /**\n     * Render a <ellipse> element or <circle> element\n     * @param node - Circle element\n     */\n    private _svgCircle(node: SVGCircleElement): void\n    {\n        let heightProp = 'r';\n        let widthProp = 'r';\n        const isEllipse = node.nodeName === 'elipse';\n\n        if (isEllipse)\n        {\n            heightProp += 'x';\n            widthProp += 'y';\n        }\n        const width = parseFloat(node.getAttribute(widthProp) as string);\n        const height = parseFloat(node.getAttribute(heightProp) as string);\n        const cx = node.getAttribute('cx');\n        const cy = node.getAttribute('cy');\n        let x = 0;\n        let y = 0;\n\n        if (cx !== null)\n        {\n            x = parseFloat(cx);\n        }\n        if (cy !== null)\n        {\n            y = parseFloat(cy);\n        }\n        if (!isEllipse)\n        {\n            this.drawCircle(x, y, width);\n        }\n        else\n        {\n            this.drawEllipse(x, y, width, height);\n        }\n    }\n\n    /**\n     * Render a <rect> element\n     * @param node - Rectangle element\n     */\n    private _svgRect(node: SVGRectElement): void\n    {\n        const x = parseFloat(node.getAttribute('x') as string);\n        const y = parseFloat(node.getAttribute('y') as string);\n        const width = parseFloat(node.getAttribute('width') as string);\n        const height = parseFloat(node.getAttribute('height') as string);\n        const rx = parseFloat(node.getAttribute('rx') as string);\n\n        if (rx)\n        {\n            this.drawRoundedRect(x, y, width, height, rx);\n        }\n        else\n        {\n            this.drawRect(x, y, width, height);\n        }\n    }\n\n    /**\n     * Convert the SVG style name into usable name.\n     * @param name - Name of style\n     * @return Name used to reference style\n     */\n    private _convertStyleName(name: string): string\n    {\n        return name\n            .trim()\n            .replace('-width', 'Width')\n            .replace(/.*-(line)?/, '');\n    }\n\n    /**\n     * Get the style property and parse options.\n     * @param node - Element with style\n     * @return Style attributes\n     */\n    private _svgStyle(node: SVGElement): SVGStyle\n    {\n        const style = node.getAttribute('style');\n        const baseOpacity = node.getAttribute('opacity');\n        const result: SVGStyle = {\n            fill: node.getAttribute('fill'),\n            opacity: baseOpacity || node.getAttribute('fill-opacity'),\n            stroke: node.getAttribute('stroke'),\n            strokeOpacity: baseOpacity || node.getAttribute('stroke-opacity'),\n            strokeWidth: node.getAttribute('stroke-width'),\n            cap: node.getAttribute('stroke-linecap'),\n            join: node.getAttribute('stroke-linejoin'),\n            miterLimit: node.getAttribute('stroke-miterlimit'),\n        };\n\n        if (style !== null)\n        {\n            style.split(';').forEach((prop) =>\n            {\n                const [name, value] = prop.split(':');\n\n                if (name)\n                {\n                    const convertedName = this._convertStyleName(name) as keyof typeof result;\n\n                    if (!result[convertedName])\n                    {\n                        result[convertedName] = value.trim();\n                    }\n                }\n            });\n        }\n\n        return result;\n    }\n\n    /**\n     * Render a polyline element.\n     * @param node - Polyline element\n     * @param close - Close the path\n     */\n    private _svgPoly(node: SVGPolylineElement, close?: boolean)\n    {\n        const points = (node.getAttribute('points') as string)\n            .split(/[ ,]/g)\n            .map((p) => parseInt(p, 10));\n\n        this.drawPolygon(points);\n\n        if (close)\n        {\n            this.closePath();\n        }\n    }\n\n    /**\n     * Set the fill and stroke style.\n     * @param node - SVG element\n     * @param inherit - Inherit the fill style\n     */\n    private _svgFill(node: SVGElement, inherit?: boolean)\n    {\n        const { fill, opacity, stroke, strokeOpacity, strokeWidth, cap, join, miterLimit } = this._svgStyle(node);\n        const defaultLineWidth = stroke !== null ? 1 : 0;\n        const lineWidth = strokeWidth !== null ? parseFloat(strokeWidth) : defaultLineWidth;\n        const lineColor = stroke !== null ? this._hexToUint(stroke) : this.lineColor;\n\n        if (fill)\n        {\n            if (fill === 'none')\n            {\n                this.beginFill(0, 0);\n            }\n            else\n            {\n                this.beginFill(\n                    this._hexToUint(fill),\n                    opacity !== null ? parseFloat(opacity) : 1,\n                );\n            }\n        }\n        else if (!inherit)\n        {\n            this.beginFill(0);\n        }\n\n        this.lineStyle({\n            width: stroke === null && strokeWidth === null && inherit ? this.line.width : lineWidth,\n            alpha: strokeOpacity === null ? this.line.alpha : parseFloat(strokeOpacity),\n            color: stroke === null && inherit ? this.line.color : lineColor,\n            cap: cap === null && inherit ? this.line.cap : cap,\n            join: join === null && inherit ? this.line.join : join,\n            miterLimit: miterLimit === null && inherit ? this.line.miterLimit : parseFloat(miterLimit as string),\n        } as any);\n\n        if (node.getAttribute('fill-rule'))\n        {\n            // eslint-disable-next-line no-console\n            console.info('[PIXI.SVG] \"fill-rule\" attribute is not supported');\n        }\n    }\n\n    /**\n     * Render a <path> d element\n     * @param node - Path element.\n     */\n    private _svgPath(node: SVGPathElement)\n    {\n        const d = node.getAttribute('d') as string;\n        let x = 0;\n        let y = 0;\n        const commands = dPathParser(d.trim());\n\n        for (let i = 0; i < commands.length; i++)\n        {\n            const command = commands[i];\n\n            switch (command.code)\n            {\n                case 'm': {\n                    this.moveTo(\n                        x += command.end.x,\n                        y += command.end.y,\n                    );\n                    break;\n                }\n                case 'M': {\n                    this.moveTo(\n                        x = command.end.x,\n                        y = command.end.y,\n                    );\n                    break;\n                }\n                case 'H': {\n                    this.lineTo(x = command.value, y);\n                    break;\n                }\n                case 'h': {\n                    this.lineTo(x += command.value, y);\n                    break;\n                }\n                case 'V': {\n                    this.lineTo(x, y = command.value);\n                    break;\n                }\n                case 'v': {\n                    this.lineTo(x, y += command.value);\n                    break;\n                }\n                case 'Z': {\n                    this.closePath();\n                    break;\n                }\n                case 'L': {\n                    this.lineTo(\n                        x = command.end.x,\n                        y = command.end.y,\n                    );\n                    break;\n                }\n                case 'l': {\n                    this.lineTo(\n                        x += command.end.x,\n                        y += command.end.y,\n                    );\n                    break;\n                }\n                case 'C': {\n                    this.bezierCurveTo(\n                        command.cp1.x,\n                        command.cp1.y,\n                        command.cp2.x,\n                        command.cp2.y,\n                        x = command.end.x,\n                        y = command.end.y,\n                    );\n                    break;\n                }\n                case 'c': {\n                    const currX = x;\n                    const currY = y;\n\n                    this.bezierCurveTo(\n                        currX + command.cp1.x,\n                        currY + command.cp1.y,\n                        currX + command.cp2.x,\n                        currY + command.cp2.y,\n                        x += command.end.x,\n                        y += command.end.y,\n                    );\n                    break;\n                }\n                case 's':\n                case 'q': {\n                    const currX = x;\n                    const currY = y;\n\n                    this.quadraticCurveTo(\n                        currX + command.cp.x,\n                        currY + command.cp.y,\n                        x += command.end.x,\n                        y += command.end.y,\n                    );\n                    break;\n                }\n                case 'S':\n                case 'Q': {\n                    this.quadraticCurveTo(\n                        command.cp.x,\n                        command.cp.y,\n                        x = command.end.x,\n                        y = command.end.y,\n                    );\n                    break;\n                }\n                // The arc and arcTo commands are incompatible\n                // with SVG (mostly because elliptical arcs)\n                // so we normalize arcs from SVG into bezier curves\n                case 'a': {\n                    arcToBezier({\n                        px: x,\n                        py: y,\n                        cx: x += command.end.x,\n                        cy: y += command.end.y,\n                        rx: command.radii.x,\n                        ry: command.radii.y,\n                        xAxisRotation: command.rotation,\n                        largeArcFlag: command.large ? 1 : 0,\n                        sweepFlag: command.clockwise ? 1 : 0,\n                    }).forEach(({ x1, y1, x2, y2, x, y }) =>\n                        this.bezierCurveTo(x1, y1, x2, y2, x, y));\n                    break;\n                }\n                case 'A': {\n                    arcToBezier({\n                        px: x,\n                        py: y,\n                        cx: x = command.end.x,\n                        cy: y = command.end.y,\n                        rx: command.radii.x,\n                        ry: command.radii.y,\n                        xAxisRotation: command.rotation,\n                        largeArcFlag: command.large ? 1 : 0,\n                        sweepFlag: command.clockwise ? 1 : 0,\n                    }).forEach(({ x1, y1, x2, y2, x, y }) =>\n                        this.bezierCurveTo(x1, y1, x2, y2, x, y));\n                    break;\n                }\n                default: {\n                    // eslint-disable-next-line no-console\n                    console.info('[PIXI.SVG] Draw command not supported:', command.code, command);\n                    break;\n                }\n            }\n        }\n    }\n}\n\nexport { SVG };\n"],"names":["color","dPathParser","x","y"],"mappings":"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"}