{"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":";;;;;;;;AAYA,MAAM,SAAA,GAAY,GAAA;AAcX,SAAS,kBAAA,CACZ,WACA,OAAA,EACA,WAAA,EACA,UAAU,CAAA,EACV,OAAA,GAAU,CAAA,EACV,OAAA,GAAU,CAAA,EAEd;AAEI,EAAA,IAAI,UAAU,OAAA,KAAY,OAAA,CAAQ,KAAA,IAAS,CAAC,UAAU,IAAA,EACtD;AACI,IAAA,OAAO,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,SAAA,CAAU,KAAK,CAAA,CAAE,QAAA,CAAS,SAAA,CAAU,KAAA,IAAS,CAAC,CAAA,CAAE,MAAA,EAAO;AAAA,EACxF,CAAA,MAAA,IAES,CAAC,SAAA,CAAU,IAAA,EACpB;AACI,IAAA,MAAM,UAAU,OAAA,CAAQ,aAAA,CAAc,UAAU,OAAA,CAAQ,MAAA,CAAO,UAAU,QAAQ,CAAA;AACjF,IAAA,MAAM,UAAA,GAAa,SAAA,CAAU,MAAA,CAAO,MAAA,CAAO,OAAO,MAAM,CAAA;AAExD,IAAA,UAAA,CAAW,KAAA,CAAM,UAAU,OAAA,CAAQ,MAAA,CAAO,YAAY,SAAA,CAAU,OAAA,CAAQ,OAAO,WAAW,CAAA;AAC1F,IAAA,OAAA,CAAQ,aAAa,UAAU,CAAA;AAE/B,IAAA,OAAO,OAAA;AAAA,EACX,CAAA,MAAA,IAES,SAAA,CAAU,IAAA,YAAgB,WAAA,EACnC;AACI,IAAA,MAAM,cAAc,SAAA,CAAU,IAAA;AAC9B,IAAA,MAAM,UAAU,OAAA,CAAQ,aAAA,CAAc,YAAY,OAAA,CAAQ,MAAA,CAAO,UAAU,QAAQ,CAAA;AACnF,IAAA,MAAM,UAAA,GAAa,WAAA,CAAY,SAAA,CAAU,MAAA,CAAO,OAAO,MAAM,CAAA;AAE7D,IAAA,UAAA,CAAW,KAAA;AAAA,MACP,WAAA,CAAY,QAAQ,MAAA,CAAO,UAAA;AAAA,MAC3B,WAAA,CAAY,QAAQ,MAAA,CAAO;AAAA,KAC/B;AAEA,IAAA,OAAA,CAAQ,aAAa,UAAU,CAAA;AAE/B,IAAA,OAAO,OAAA;AAAA,EACX,CAAA,MAAA,IAES,SAAA,CAAU,IAAA,YAAgB,YAAA,EACnC;AACI,IAAA,MAAM,eAAe,SAAA,CAAU,IAAA;AAE/B,IAAA,MAAM,QAAA,GAAW,aAAa,IAAA,KAAS,QAAA;AACvC,IAAA,MAAM,OAAA,GAAU,aAAa,YAAA,KAAiB,OAAA;AAE9C,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,IAAI,MAAA,GAAS,CAAA;AAGb,IAAA,IAAI,WAAW,WAAA,EACf;AACI,MAAA,KAAA,GAAQ,YAAY,KAAA,GAAQ,OAAA;AAC5B,MAAA,MAAA,GAAS,YAAY,MAAA,GAAS,OAAA;AAAA,IAClC;AAEA,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI,gBAAA,GAAmB,KAAA;AAEvB,IAAA,IAAI,QAAA,EACJ;AACI,MAAA,MAAM,EAAE,KAAA,EAAO,GAAA,EAAI,GAAI,YAAA;AAEvB,MAAA,QAAA,GAAW,OAAA,CAAQ,oBAAA;AAAA,QACd,KAAA,CAAM,IAAI,KAAA,GAAS,OAAA;AAAA,QACnB,KAAA,CAAM,IAAI,MAAA,GAAU,OAAA;AAAA,QACpB,GAAA,CAAI,IAAI,KAAA,GAAS,OAAA;AAAA,QACjB,GAAA,CAAI,IAAI,MAAA,GAAU;AAAA,OACvB;AAGA,MAAA,gBAAA,GAAmB,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,CAAA,GAAI,KAAA,CAAM,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAA,CAAK,GAAA,CAAI,CAAA,GAAI,KAAA,CAAM,KAAK,GAAG,CAAA;AAAA,IACnF,CAAA,MAEA;AACI,MAAA,MAAM,EAAE,MAAA,EAAQ,WAAA,EAAa,WAAA,EAAa,aAAY,GAAI,YAAA;AAE1D,MAAA,QAAA,GAAW,OAAA,CAAQ,oBAAA;AAAA,QACd,MAAA,CAAO,IAAI,KAAA,GAAS,OAAA;AAAA,QACpB,MAAA,CAAO,IAAI,MAAA,GAAU,OAAA;AAAA,QACtB,WAAA,GAAc,KAAA;AAAA,QACb,WAAA,CAAY,IAAI,KAAA,GAAS,OAAA;AAAA,QACzB,WAAA,CAAY,IAAI,MAAA,GAAU,OAAA;AAAA,QAC3B,WAAA,GAAc;AAAA,OAClB;AAAA,IACJ;AAGA,IAAA,IAAI,gBAAA,IAAoB,WAAW,WAAA,EACnC;AACI,MAAA,MAAM,KAAA,GAAS,YAAY,UAAA,GAAc,MAAA;AAEzC,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,WAAA,CAAY,KAAA,CAAM,QAAQ,CAAA,EAAA,EAC9C;AACI,QAAA,MAAM,KAAA,GAAA,CAAU,CAAA,GAAI,WAAA,CAAY,UAAA,GAAe,UAAU,CAAA,IAAM,MAAA;AAE/D,QAAA,YAAA,CAAa,UAAA,CAAW,OAAA,CAAQ,CAAC,IAAA,KACjC;AAEI,UAAA,IAAI,UAAA,GAAa,KAAA,GAAS,IAAA,CAAK,MAAA,GAAS,KAAA;AAExC,UAAA,UAAA,GAAa,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,UAAU,CAAC,CAAA;AAEhD,UAAA,QAAA,CAAS,YAAA;AAAA;AAAA,YAEL,IAAA,CAAK,KAAA,CAAM,UAAA,GAAa,SAAS,CAAA,GAAI,SAAA;AAAA,YACrC,MAAM,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,KAAK,EAAE,KAAA;AAAM,WAC5C;AAAA,QACJ,CAAC,CAAA;AAAA,MACL;AAAA,IACJ,CAAA,MAEA;AAEI,MAAA,YAAA,CAAa,UAAA,CAAW,OAAA,CAAQ,CAAC,IAAA,KACjC;AACI,QAAA,QAAA,CAAS,YAAA,CAAa,IAAA,CAAK,MAAA,EAAQ,KAAA,CAAM,MAAA,CAAO,SAAS,IAAA,CAAK,KAAK,CAAA,CAAE,KAAA,EAAO,CAAA;AAAA,MAChF,CAAC,CAAA;AAAA,IACL;AAEA,IAAA,OAAO,QAAA;AAAA,EACX;AAGA,EAAA,IAAA,CAAK,4BAA4B,SAAS,CAAA;AAG1C,EAAA,OAAO,KAAA;AACX;;;;"}