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 • 9.39 kB
Source Map (JSON)
{"version":3,"file":"parseSVGStyle.mjs","sources":["../../../../../src/scene/graphics/shared/svg/parseSVGStyle.ts"],"sourcesContent":["import { Color } from '../../../../color/Color';\nimport { extractSvgUrlId } from './utils/extractSvgUrlId';\n\nimport type { ConvertedFillStyle, ConvertedStrokeStyle, FillStyle, StrokeStyle } from '../FillTypes';\nimport type { Session } from './SVGParser';\n\n/**\n * A map of SVG style attributes and their default values.\n * Each attribute has a type and default value used for SVG parsing.\n * - 'paint' type can be a color or gradient\n * - 'number' type is a numeric value\n * - 'string' type is a text value\n * @category scene\n * @advanced\n */\nexport const styleAttributes = {\n // Fill properties\n fill: { type: 'paint', default: 0 }, // Fill color/gradient\n 'fill-opacity': { type: 'number', default: 1 }, // Fill transparency\n\n // Stroke properties\n stroke: { type: 'paint', default: 0 }, // Stroke color/gradient\n 'stroke-width': { type: 'number', default: 1 }, // Width of stroke\n 'stroke-opacity': { type: 'number', default: 1 }, // Stroke transparency\n 'stroke-linecap': { type: 'string', default: 'butt' }, // End cap style: butt, round, square\n 'stroke-linejoin': { type: 'string', default: 'miter' }, // Join style: miter, round, bevel\n 'stroke-miterlimit': { type: 'number', default: 10 }, // Limit on miter join sharpness\n 'stroke-dasharray': { type: 'string', default: 'none' }, // Dash pattern\n 'stroke-dashoffset': { type: 'number', default: 0 }, // Offset for dash pattern\n\n // Global properties\n opacity: { type: 'number', default: 1 }, // Overall opacity\n};\n\n/**\n * Represents the result of parsing SVG style attributes\n * @internal\n */\nexport type StyleResult = {\n /** The stroke style properties */\n strokeStyle: StrokeStyle;\n /** The fill style properties */\n fillStyle: FillStyle;\n /** Whether fill should be applied */\n useFill: boolean;\n /** Whether stroke should be applied */\n useStroke: boolean;\n};\n\n/**\n * Parses SVG style attributes and inline styles to determine fill and stroke properties.\n * Handles both direct attributes and CSS-style declarations in the style attribute.\n * @param svg - The SVG element to parse styles from\n * @param session - The current SVG parsing session containing definitions\n * @returns An object containing the parsed fill and stroke styles\n * @internal\n */\nexport function parseSVGStyle(svg: SVGElement, session: Session): StyleResult\n{\n const style = svg.getAttribute('style');\n\n const strokeStyle: StrokeStyle = {};\n\n const fillStyle: FillStyle = {};\n\n const result: StyleResult = {\n strokeStyle,\n fillStyle,\n useFill: false,\n useStroke: false,\n };\n\n // First parse direct style attributes\n for (const key in styleAttributes)\n {\n const attribute = svg.getAttribute(key);\n\n if (attribute)\n {\n parseAttribute(session, result, key, attribute.trim());\n }\n }\n\n // Then parse inline styles which override direct attributes\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].trim();\n\n const [key, value] = stylePart.split(':');\n\n if (styleAttributes[key as keyof typeof styleAttributes])\n {\n parseAttribute(session, result, key, value.trim());\n }\n }\n }\n\n return {\n strokeStyle: result.useStroke ? (strokeStyle as ConvertedStrokeStyle) : null,\n fillStyle: result.useFill ? (fillStyle as ConvertedFillStyle) : null,\n useFill: result.useFill,\n useStroke: result.useStroke,\n };\n}\n\n/**\n * Parses a single SVG style attribute and updates the style result accordingly.\n * Handles color values, gradients, opacities and other style properties.\n * @param session - The current SVG parsing session containing definitions\n * @param result - The style result object to update\n * @param id - The attribute name/id to parse\n * @param value - The attribute value to parse\n */\nfunction parseAttribute(\n session: Session,\n result: StyleResult,\n id: string,\n value: string\n): void\n{\n switch (id)\n {\n case 'stroke':\n if (value !== 'none')\n {\n if (value.startsWith('url('))\n {\n // Extract gradient/pattern id from url reference\n const id = extractSvgUrlId(value);\n\n result.strokeStyle.fill = session.defs[id];\n }\n else\n {\n // Parse as color value\n result.strokeStyle.color = Color.shared.setValue(value).toNumber();\n }\n\n result.useStroke = true;\n }\n\n break;\n case 'stroke-width':\n result.strokeStyle.width = Number(value);\n break;\n case 'fill':\n if (value !== 'none')\n {\n if (value.startsWith('url('))\n {\n // Extract gradient/pattern id from url reference\n const id = extractSvgUrlId(value);\n\n result.fillStyle.fill = session.defs[id];\n }\n else\n {\n // Parse as color value\n result.fillStyle.color = Color.shared.setValue(value).toNumber();\n }\n\n result.useFill = true;\n }\n break;\n case 'fill-opacity':\n result.fillStyle.alpha = Number(value);\n break;\n case 'stroke-opacity':\n result.strokeStyle.alpha = Number(value);\n break;\n case 'opacity':\n // Global opacity affects both fill and stroke\n result.fillStyle.alpha = Number(value);\n result.strokeStyle.alpha = Number(value);\n break;\n }\n}\n"],"names":["id"],"mappings":"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"}