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.23 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 * @param offsetX - X offset for gradient positioning (used for tagged text runs)\n * @param offsetY - Y offset for gradient positioning (used for tagged text runs)\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 offsetX = 0,\n offsetY = 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.source.pixelWidth, fillStyle.texture.source.pixelHeight);\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.source.pixelWidth,\n fillPattern.texture.source.pixelHeight\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) + offsetX,\n (start.y * height) + offsetY,\n (end.x * width) + offsetX,\n (end.y * height) + offsetY\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) + offsetX,\n (center.y * height) + offsetY,\n innerRadius * width,\n (outerCenter.x * width) + offsetX,\n (outerCenter.y * height) + offsetY,\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 let globalStop = start + (stop.offset * ratio);\n\n globalStop = Math.max(0, Math.min(1, globalStop));\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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"}