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 • 18.9 kB
Source Map (JSON)
{"version":3,"file":"SVGParser.mjs","sources":["../../../../../src/scene/graphics/shared/svg/SVGParser.ts"],"sourcesContent":["import { warn } from '../../../../utils/logging/warn';\nimport { GraphicsPath } from '../path/GraphicsPath';\nimport { parseSVGDefinitions } from './parseSVGDefinitions';\nimport { parseSVGFloatAttribute } from './parseSVGFloatAttribute';\nimport { parseSVGStyle } from './parseSVGStyle';\nimport { checkForNestedPattern } from './utils/fillOperations';\nimport { appendSVGPath, calculatePathArea, extractSubpaths } from './utils/pathOperations';\n\nimport type { FillGradient } from '../fill/FillGradient';\nimport type { FillStyle, StrokeStyle } from '../FillTypes';\nimport type {\n GraphicsContext,\n} from '../GraphicsContext';\n\n/**\n * Represents a session for SVG parsing. Contains the current state and resources needed during parsing.\n * @internal\n */\nexport interface Session\n{\n /** The graphics context to render to */\n context: GraphicsContext;\n /** The current path being constructed */\n path: GraphicsPath;\n /** Map of definitions by id */\n defs: Record<string, FillGradient>;\n}\n\n/**\n * Parses an SVG element or string and renders it to a graphics context.\n * Handles both SVG strings and SVG DOM elements as input.\n * @param svg - The SVG content to parse, either as a string or element\n * @param graphicsContext - Optional graphics context to render to\n * @returns The graphics context with the SVG rendered into it\n * @internal\n */\nexport function SVGParser(\n svg: string | SVGElement | SVGSVGElement,\n graphicsContext?: GraphicsContext\n): GraphicsContext\n{\n // Convert string input to SVG element\n if (typeof svg === 'string')\n {\n // eslint-disable-next-line no-restricted-globals\n const div = document.createElement('div');\n\n div.innerHTML = svg.trim();\n svg = div.querySelector('svg') as SVGElement;\n }\n\n // Initialize parsing session\n const session = {\n context: graphicsContext,\n defs: {},\n path: new GraphicsPath(),\n };\n\n // Parse definitions (gradients, etc) first\n parseSVGDefinitions(svg, session);\n\n // Process all child elements except defs\n const children = svg.children;\n\n const { fillStyle, strokeStyle } = parseSVGStyle(svg, session);\n\n for (let i = 0; i < children.length; i++)\n {\n const child = children[i] as SVGElement;\n\n if (child.nodeName.toLowerCase() === 'defs') continue;\n renderChildren(child, session, fillStyle, strokeStyle);\n }\n\n return graphicsContext;\n}\n\n/**\n * Recursively renders SVG elements and their children.\n * Handles styling inheritance and different SVG shape types.\n * @param svg - The SVG element to render\n * @param session - The current parsing session\n * @param fillStyle - The inherited fill style\n * @param strokeStyle - The inherited stroke style\n */\nfunction renderChildren(svg: SVGElement, session: Session, fillStyle: FillStyle, strokeStyle: StrokeStyle): void\n{\n const children = svg.children;\n\n // Parse element's style and merge with inherited styles\n const { fillStyle: f1, strokeStyle: s1 } = parseSVGStyle(svg, session);\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 const noStyle = !fillStyle && !strokeStyle;\n\n // Default to black fill if no styles specified\n if (noStyle)\n {\n fillStyle = { color: 0 };\n }\n\n // Variables for shape attributes\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 // Handle different SVG element types\n switch (svg.nodeName.toLowerCase())\n {\n case 'path':\n {\n d = svg.getAttribute('d') as string;\n\n const fillRule = svg.getAttribute('fill-rule') as string;\n\n const subpaths = extractSubpaths(d);\n const hasExplicitEvenodd = fillRule === 'evenodd';\n const hasMultipleSubpaths = subpaths.length > 1;\n\n const shouldProcessHoles = hasExplicitEvenodd && hasMultipleSubpaths;\n\n if (shouldProcessHoles)\n {\n const subpathsWithArea = subpaths.map((subpath) => ({\n path: subpath,\n area: calculatePathArea(subpath)\n }));\n\n subpathsWithArea.sort((a, b) => b.area - a.area);\n\n // For complex cases, prefer multiple holes approach\n const useMultipleHolesApproach = subpaths.length > 3 || !checkForNestedPattern(subpathsWithArea);\n\n if (useMultipleHolesApproach)\n {\n // Multiple holes approach: first (largest) is fill, rest are holes\n for (let i = 0; i < subpathsWithArea.length; i++)\n {\n const subpath = subpathsWithArea[i];\n const isMainShape = i === 0;\n\n session.context.beginPath();\n const newPath = new GraphicsPath(undefined, true); // Always use evenodd for hole processing\n\n appendSVGPath(subpath.path, newPath);\n session.context.path(newPath);\n\n if (isMainShape)\n {\n if (fillStyle) session.context.fill(fillStyle);\n if (strokeStyle) session.context.stroke(strokeStyle);\n }\n else\n {\n session.context.cut();\n }\n }\n }\n else\n {\n // Nested holes approach: alternate between fill and cut\n for (let i = 0; i < subpathsWithArea.length; i++)\n {\n const subpath = subpathsWithArea[i];\n const isHole = i % 2 === 1; // Odd indices are holes\n\n session.context.beginPath();\n const newPath = new GraphicsPath(undefined, true); // Always use evenodd for hole processing\n\n appendSVGPath(subpath.path, newPath);\n session.context.path(newPath);\n\n if (isHole)\n {\n session.context.cut();\n }\n else\n {\n if (fillStyle) session.context.fill(fillStyle);\n if (strokeStyle) session.context.stroke(strokeStyle);\n }\n }\n }\n }\n else\n {\n const useEvenoddForGraphicsPath = fillRule ? (fillRule === 'evenodd') : true;\n\n graphicsPath = new GraphicsPath(d, useEvenoddForGraphicsPath);\n session.context.path(graphicsPath);\n if (fillStyle) session.context.fill(fillStyle);\n if (strokeStyle) session.context.stroke(strokeStyle);\n }\n break;\n }\n\n case 'circle':\n cx = parseSVGFloatAttribute(svg, 'cx', 0);\n cy = parseSVGFloatAttribute(svg, 'cy', 0);\n r = parseSVGFloatAttribute(svg, 'r', 0);\n session.context.ellipse(cx, cy, r, r);\n if (fillStyle) session.context.fill(fillStyle);\n if (strokeStyle) session.context.stroke(strokeStyle);\n break;\n\n case 'rect':\n x = parseSVGFloatAttribute(svg, 'x', 0);\n y = parseSVGFloatAttribute(svg, 'y', 0);\n width = parseSVGFloatAttribute(svg, 'width', 0);\n height = parseSVGFloatAttribute(svg, 'height', 0);\n rx = parseSVGFloatAttribute(svg, 'rx', 0);\n ry = parseSVGFloatAttribute(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(fillStyle);\n if (strokeStyle) session.context.stroke(strokeStyle);\n break;\n\n case 'ellipse':\n cx = parseSVGFloatAttribute(svg, 'cx', 0);\n cy = parseSVGFloatAttribute(svg, 'cy', 0);\n rx = parseSVGFloatAttribute(svg, 'rx', 0);\n ry = parseSVGFloatAttribute(svg, 'ry', 0);\n\n session.context.beginPath();\n session.context.ellipse(cx, cy, rx, ry);\n\n if (fillStyle) session.context.fill(fillStyle);\n if (strokeStyle) session.context.stroke(strokeStyle);\n break;\n\n case 'line':\n x1 = parseSVGFloatAttribute(svg, 'x1', 0);\n y1 = parseSVGFloatAttribute(svg, 'y1', 0);\n x2 = parseSVGFloatAttribute(svg, 'x2', 0);\n y2 = parseSVGFloatAttribute(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(strokeStyle);\n break;\n\n case 'polygon':\n pointsString = svg.getAttribute('points') as string;\n points = pointsString.match(/-?\\d+/g).map((n) => parseInt(n, 10));\n session.context.poly(points, true);\n if (fillStyle) session.context.fill(fillStyle);\n if (strokeStyle) session.context.stroke(strokeStyle);\n break;\n\n case 'polyline':\n pointsString = svg.getAttribute('points') as string;\n points = pointsString.match(/-?\\d+/g).map((n) => parseInt(n, 10));\n session.context.poly(points, false);\n if (strokeStyle) session.context.stroke(strokeStyle);\n break;\n\n // Group elements - just process children\n case 'g':\n case 'svg':\n break;\n\n default: {\n // Log unsupported elements\n warn(`[SVG parser] <${svg.nodeName}> elements unsupported`);\n break;\n }\n }\n\n if (noStyle)\n {\n fillStyle = null;\n }\n\n // Recursively process child elements\n for (let i = 0; i < children.length; i++)\n {\n renderChildren(children[i] as SVGElement, session, fillStyle, strokeStyle);\n }\n}\n"],"names":[],"mappings":"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"}