Files
nothoughts/node_modules/pixi.js/lib/scene/graphics/shared/svg/SVGParser.mjs.map
2025-08-04 18:57:35 +02:00

1 line
15 KiB
Plaintext

{"version":3,"file":"SVGParser.mjs","sources":["../../../../../src/scene/graphics/shared/svg/SVGParser.ts"],"sourcesContent":["import { Color } from '../../../../color/Color';\nimport { GraphicsPath } from '../path/GraphicsPath';\n\nimport type { ConvertedFillStyle, ConvertedStrokeStyle, FillStyle, StrokeStyle } from '../FillTypes';\nimport type {\n GraphicsContext,\n} from '../GraphicsContext';\n\ninterface Session\n{\n context: GraphicsContext;\n path: GraphicsPath;\n}\n\nexport function SVGParser(\n svg: string | SVGElement | SVGSVGElement,\n graphicsContext?: GraphicsContext\n): GraphicsContext\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 const session = {\n context: graphicsContext,\n path: new GraphicsPath(),\n };\n\n renderChildren(svg, session, null, null);\n\n return graphicsContext;\n}\n\nfunction renderChildren(svg: SVGElement, session: Session, fillStyle: FillStyle, strokeStyle: StrokeStyle): void\n{\n const children = svg.children;\n\n const { fillStyle: f1, strokeStyle: s1 } = parseStyle(svg);\n\n if (f1 && fillStyle)\n {\n fillStyle = { ...fillStyle, ...f1 };\n }\n else if (f1)\n {\n fillStyle = f1;\n }\n\n if (s1 && strokeStyle)\n {\n strokeStyle = { ...strokeStyle, ...s1 };\n }\n else if (s1)\n {\n strokeStyle = s1;\n }\n\n session.context.fillStyle = fillStyle;\n session.context.strokeStyle = strokeStyle;\n\n let x;\n let y;\n let x1;\n let y1;\n let x2;\n let y2;\n let cx;\n let cy;\n let r;\n let rx;\n let ry;\n let points;\n let pointsString;\n let d;\n let graphicsPath;\n let width;\n let height;\n\n switch (svg.nodeName.toLowerCase())\n {\n case 'path':\n d = svg.getAttribute('d') as string;\n\n graphicsPath = new GraphicsPath(d);\n\n session.context.path(graphicsPath);\n\n if (fillStyle) session.context.fill();\n if (strokeStyle) session.context.stroke();\n\n break;\n case 'circle':\n cx = parseFloatAttribute(svg, 'cx', 0);\n cy = parseFloatAttribute(svg, 'cy', 0);\n\n r = parseFloatAttribute(svg, 'r', 0);\n\n session.context.ellipse(cx, cy, r, r);\n\n if (fillStyle) session.context.fill();\n if (strokeStyle) session.context.stroke();\n\n break;\n case 'rect':\n x = parseFloatAttribute(svg, 'x', 0);\n y = parseFloatAttribute(svg, 'y', 0);\n\n width = parseFloatAttribute(svg, 'width', 0);\n height = parseFloatAttribute(svg, 'height', 0);\n\n rx = parseFloatAttribute(svg, 'rx', 0);\n ry = parseFloatAttribute(svg, 'ry', 0);\n\n if (rx || ry)\n {\n session.context.roundRect(x, y, width, height, rx || ry);\n }\n else\n {\n session.context.rect(x, y, width, height);\n }\n\n if (fillStyle) session.context.fill();\n if (strokeStyle) session.context.stroke();\n\n break;\n case 'ellipse':\n cx = parseFloatAttribute(svg, 'cx', 0);\n cy = parseFloatAttribute(svg, 'cy', 0);\n\n rx = parseFloatAttribute(svg, 'rx', 0);\n ry = parseFloatAttribute(svg, 'ry', 0);\n\n session.context.beginPath();\n session.context.ellipse(cx, cy, rx, ry); // , 0, Math.PI * 2);\n\n if (fillStyle) session.context.fill();\n if (strokeStyle) session.context.stroke();\n\n break;\n case 'line':\n x1 = parseFloatAttribute(svg, 'x1', 0);\n y1 = parseFloatAttribute(svg, 'y1', 0);\n\n x2 = parseFloatAttribute(svg, 'x2', 0);\n y2 = parseFloatAttribute(svg, 'y2', 0);\n\n session.context.beginPath();\n session.context.moveTo(x1, y1);\n session.context.lineTo(x2, y2);\n\n if (strokeStyle) session.context.stroke();\n\n break;\n\n case 'polygon':\n pointsString = svg.getAttribute('points') as string;\n\n points = pointsString.match(/\\d+/g).map((n) => parseInt(n, 10));\n\n session.context.poly(points, true);\n\n if (fillStyle) session.context.fill();\n if (strokeStyle) session.context.stroke();\n\n break;\n case 'polyline':\n pointsString = svg.getAttribute('points') as string;\n\n points = pointsString.match(/\\d+/g).map((n) => parseInt(n, 10));\n\n session.context.poly(points, false);\n\n if (strokeStyle) session.context.stroke();\n\n break;\n // children will cover these two..\n case 'g':\n case 'svg':\n break;\n default: {\n // eslint-disable-next-line no-console\n console.info(`[SVG parser] <${svg.nodeName}> elements unsupported`);\n break;\n }\n }\n\n for (let i = 0; i < children.length; i++)\n {\n renderChildren(children[i] as SVGElement, session, fillStyle, strokeStyle);\n }\n}\n\nfunction parseFloatAttribute(svg: SVGElement, id: string, defaultValue: number): number\n{\n const value = svg.getAttribute(id) as string;\n\n return value ? Number(value) : defaultValue;\n}\n\nfunction parseStyle(svg: SVGElement): { strokeStyle: ConvertedStrokeStyle; fillStyle: ConvertedFillStyle }\n{\n const style = svg.getAttribute('style');\n\n const strokeStyle: StrokeStyle = {};\n\n const fillStyle: FillStyle = {};\n\n let useFill = false;\n let useStroke = false;\n\n if (style)\n {\n const styleParts = style.split(';');\n\n for (let i = 0; i < styleParts.length; i++)\n {\n const stylePart = styleParts[i];\n\n const [key, value] = stylePart.split(':');\n\n switch (key)\n {\n case 'stroke':\n if (value !== 'none')\n {\n strokeStyle.color = Color.shared.setValue(value).toNumber();\n useStroke = true;\n }\n\n break;\n case 'stroke-width':\n strokeStyle.width = Number(value);\n break;\n case 'fill':\n if (value !== 'none')\n {\n useFill = true;\n fillStyle.color = Color.shared.setValue(value).toNumber();\n }\n break;\n case 'fill-opacity':\n fillStyle.alpha = Number(value);\n break;\n case 'stroke-opacity':\n strokeStyle.alpha = Number(value);\n break;\n case 'opacity':\n fillStyle.alpha = Number(value);\n strokeStyle.alpha = Number(value);\n break;\n }\n }\n }\n else\n {\n const stroke = svg.getAttribute('stroke');\n\n if (stroke && stroke !== 'none')\n {\n useStroke = true;\n strokeStyle.color = Color.shared.setValue(stroke).toNumber();\n\n strokeStyle.width = parseFloatAttribute(svg, 'stroke-width', 1);\n }\n\n const fill = svg.getAttribute('fill');\n\n if (fill && fill !== 'none')\n {\n useFill = true;\n fillStyle.color = Color.shared.setValue(fill).toNumber();\n }\n }\n\n return {\n strokeStyle: useStroke ? (strokeStyle as ConvertedStrokeStyle) : null,\n fillStyle: useFill ? (fillStyle as ConvertedFillStyle) : null,\n };\n}\n"],"names":[],"mappings":"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"}