UNPKG

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.57 kB
{"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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"}