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 • 8.8 kB
Source Map (JSON)
{"version":3,"file":"getCanvasFillStyle.mjs","sources":["../../../../../src/scene/text/canvas/utils/getCanvasFillStyle.ts"],"sourcesContent":["import { Color } from '../../../../color/Color';\nimport { Matrix } from '../../../../maths/matrix/Matrix';\nimport { Texture } from '../../../../rendering/renderers/shared/texture/Texture';\nimport { warn } from '../../../../utils/logging/warn';\nimport { FillGradient } from '../../../graphics/shared/fill/FillGradient';\nimport { FillPattern } from '../../../graphics/shared/fill/FillPattern';\n\nimport type { ICanvasRenderingContext2D } from '../../../../environment/canvas/ICanvasRenderingContext2D';\nimport type { ConvertedFillStyle } from '../../../graphics/shared/FillTypes';\nimport type { CanvasTextMetrics } from '../CanvasTextMetrics';\n\n// 5 decimal places\nconst PRECISION = 100000;\n\n/**\n * Converts a PixiJS fill style into a Canvas-compatible fill style.\n * Handles solid colors, textures, patterns, and gradients.\n * @param fillStyle - The PixiJS fill style to convert\n * @param context - The canvas rendering context\n * @param textMetrics - Metrics about the text being rendered\n * @param padding - Padding to add to the text metrics (used to ensure that the gradient accommodates the stroke width)\n * @returns Canvas-compatible fill style (string, CanvasGradient, or CanvasPattern)\n * @internal\n */\nexport function getCanvasFillStyle(\n fillStyle: ConvertedFillStyle,\n context: ICanvasRenderingContext2D,\n textMetrics?: CanvasTextMetrics,\n padding = 0\n): string | CanvasGradient | CanvasPattern\n{\n // Solid color fill\n if (fillStyle.texture === Texture.WHITE && !fillStyle.fill)\n {\n return Color.shared.setValue(fillStyle.color).setAlpha(fillStyle.alpha ?? 1).toHexa();\n }\n // Basic texture fill\n else if (!fillStyle.fill)\n {\n const pattern = context.createPattern(fillStyle.texture.source.resource, 'repeat');\n const tempMatrix = fillStyle.matrix.copyTo(Matrix.shared);\n\n tempMatrix.scale(fillStyle.texture.frame.width, fillStyle.texture.frame.height);\n pattern.setTransform(tempMatrix);\n\n return pattern;\n }\n // Pattern fill\n else if (fillStyle.fill instanceof FillPattern)\n {\n const fillPattern = fillStyle.fill;\n const pattern = context.createPattern(fillPattern.texture.source.resource, 'repeat');\n const tempMatrix = fillPattern.transform.copyTo(Matrix.shared);\n\n tempMatrix.scale(\n fillPattern.texture.frame.width,\n fillPattern.texture.frame.height\n );\n\n pattern.setTransform(tempMatrix);\n\n return pattern;\n }\n // Gradient fill\n else if (fillStyle.fill instanceof FillGradient)\n {\n const fillGradient = fillStyle.fill;\n\n const isLinear = fillGradient.type === 'linear';\n const isLocal = fillGradient.textureSpace === 'local';\n\n let width = 1;\n let height = 1;\n\n // Use text dimensions if in local space\n if (isLocal && textMetrics)\n {\n width = textMetrics.width + padding;\n height = textMetrics.height + padding;\n }\n\n let gradient: CanvasGradient;\n let isNearlyVertical = false;\n\n if (isLinear)\n {\n const { start, end } = fillGradient;\n\n gradient = context.createLinearGradient(\n start.x * width,\n start.y * height,\n end.x * width,\n end.y * height\n );\n\n // Check if gradient is nearly vertical (10% threshold)\n isNearlyVertical = Math.abs(end.x - start.x) < Math.abs((end.y - start.y) * 0.1);\n }\n else\n {\n const { center, innerRadius, outerCenter, outerRadius } = fillGradient;\n\n gradient = context.createRadialGradient(\n center.x * width,\n center.y * height,\n innerRadius * width,\n outerCenter.x * width,\n outerCenter.y * height,\n outerRadius * width\n );\n }\n\n // For vertical gradients in local space, repeat gradient per text line\n if (isNearlyVertical && isLocal && textMetrics)\n {\n const ratio = (textMetrics.lineHeight) / height;\n\n for (let i = 0; i < textMetrics.lines.length; i++)\n {\n const start = ((i * textMetrics.lineHeight) + (padding / 2)) / height;\n\n fillGradient.colorStops.forEach((stop) =>\n {\n // Convert to global space\n const globalStop = start + (stop.offset * ratio);\n\n gradient.addColorStop(\n // fix to 5 decimal places to avoid floating point precision issues\n Math.floor(globalStop * PRECISION) / PRECISION,\n Color.shared.setValue(stop.color).toHex()\n );\n });\n }\n }\n else\n {\n // Standard global space gradient handling\n fillGradient.colorStops.forEach((stop) =>\n {\n gradient.addColorStop(stop.offset, Color.shared.setValue(stop.color).toHex());\n });\n }\n\n return gradient;\n }\n\n // #if _DEBUG\n warn('FillStyle not recognised', fillStyle);\n // #endif\n\n return 'red';\n}\n"],"names":[],"mappings":"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"}