shadow$provide.module$node_modules$pixi_DOT_js$lib$scene$text$canvas$CanvasTextGenerator = function(global, require, module, exports) { function countSpaces(text) { let count = 0; for (let i = 0; i < text.length; i++) { 32 === text.charCodeAt(i) && count++; } return count; } var Color = require("module$node_modules$pixi_DOT_js$lib$color$Color"); global = require("module$node_modules$pixi_DOT_js$lib$maths$shapes$Rectangle"); var CanvasPool = require("module$node_modules$pixi_DOT_js$lib$rendering$renderers$shared$texture$CanvasPool"), getCanvasBoundingBox = require("module$node_modules$pixi_DOT_js$lib$utils$canvas$getCanvasBoundingBox"), CanvasTextMetrics = require("module$node_modules$pixi_DOT_js$lib$scene$text$canvas$CanvasTextMetrics"), fontStringFromTextStyle = require("module$node_modules$pixi_DOT_js$lib$scene$text$canvas$utils$fontStringFromTextStyle"), getCanvasFillStyle = require("module$node_modules$pixi_DOT_js$lib$scene$text$canvas$utils$getCanvasFillStyle"); "use strict"; const tempRect = new global.Rectangle(); class CanvasTextGeneratorClass { getCanvasAndContext(options) { const {text, style, resolution = 1} = options; var padding = style._getFinalPadding(); const measured = CanvasTextMetrics.CanvasTextMetrics.measureText(text || " ", style), width = Math.ceil(Math.ceil(Math.max(1, measured.width) + 2 * padding) * resolution), height = Math.ceil(Math.ceil(Math.max(1, measured.height) + 2 * padding) * resolution); options = CanvasPool.CanvasPool.getOptimalCanvasAndContext(width, height); this._renderTextToCanvas(style, padding, resolution, options, measured); padding = style.trim ? getCanvasBoundingBox.getCanvasBoundingBox({canvas:options.canvas, width, height, resolution:1, output:tempRect}) : tempRect.set(0, 0, width, height); return {canvasAndContext:options, frame:padding}; } returnCanvasAndContext(canvasAndContext) { CanvasPool.CanvasPool.returnCanvasAndContext(canvasAndContext); } _renderTextToCanvas(style, padding, resolution, canvasAndContext, measured) { if (measured.runsByLine && 0 < measured.runsByLine.length) { this._renderTaggedTextToCanvas(measured, style, padding, resolution, canvasAndContext); } else { var {canvas, context} = canvasAndContext, font = fontStringFromTextStyle.fontStringFromTextStyle(style), lines = measured.lines, lineHeight = measured.lineHeight, lineWidths = measured.lineWidths, maxLineWidth = measured.maxLineWidth, fontProperties = measured.fontProperties, height = canvas.height; context.resetTransform(); context.scale(resolution, resolution); context.textBaseline = style.textBaseline; if (style._stroke?.width) { var strokeStyle = style._stroke; context.lineWidth = strokeStyle.width; context.miterLimit = strokeStyle.miterLimit; context.lineJoin = strokeStyle.join; context.lineCap = strokeStyle.cap; } context.font = font; var linePositionX; font = style.dropShadow ? 2 : 1; strokeStyle = (style._stroke?.width ?? 0) / 2; var linePositionYShift = (lineHeight - fontProperties.fontSize) / 2; 0 > lineHeight - fontProperties.fontSize && (linePositionYShift = 0); for (let i = 0; i < font; ++i) { const dsOffsetText = (linePositionX = style.dropShadow && 0 === i) ? Math.ceil(Math.max(1, height) + 2 * padding) : 0; var linePositionY = dsOffsetText * resolution; linePositionX ? this._setupDropShadow(context, style, resolution, linePositionY) : (linePositionX = style._gradientBounds, linePositionY = style._gradientOffset, linePositionX ? this._setFillAndStrokeStyles(context, style, {width:linePositionX.width, height:linePositionX.height, lineHeight:linePositionX.height, lines:measured.lines}, padding, strokeStyle, linePositionY?.x ?? 0, linePositionY?.y ?? 0) : linePositionY ? this._setFillAndStrokeStyles(context, style, measured, padding, strokeStyle, linePositionY.x, linePositionY.y) : this._setFillAndStrokeStyles(context, style, measured, padding, strokeStyle), context.shadowColor = "rgba(0,0,0,0)"); for (let j = 0; j < lines.length; j++) { linePositionX = strokeStyle; linePositionY = strokeStyle + j * lineHeight + fontProperties.ascent + linePositionYShift; linePositionX += this._getAlignmentOffset(lineWidths[j], maxLineWidth, style.align); let wordSpacing = 0; if ("justify" === style.align && style.wordWrap && j < lines.length - 1) { const spaces = countSpaces(lines[j]); 0 < spaces && (wordSpacing = (maxLineWidth - lineWidths[j]) / spaces); } style._stroke?.width && this._drawLetterSpacing(lines[j], style, canvasAndContext, linePositionX + padding, linePositionY + padding - dsOffsetText, !0, wordSpacing); void 0 !== style._fill && this._drawLetterSpacing(lines[j], style, canvasAndContext, linePositionX + padding, linePositionY + padding - dsOffsetText, !1, wordSpacing); } } } } _renderTaggedTextToCanvas(measured, style, padding, resolution, canvasAndContext) { const {canvas, context} = canvasAndContext, {runsByLine, lineWidths, maxLineWidth, lineAscents, lineHeights, hasDropShadow} = measured; measured = canvas.height; context.resetTransform(); context.scale(resolution, resolution); context.textBaseline = style.textBaseline; const passesCount = hasDropShadow ? 2 : 1; var maxStrokeWidth = style._stroke?.width ?? 0; for (var lineRuns$jscomp$0 of runsByLine) { for (var run of lineRuns$jscomp$0) { var w = run.style._stroke?.width ?? 0; w > maxStrokeWidth && (maxStrokeWidth = w); } } lineRuns$jscomp$0 = maxStrokeWidth / 2; run = []; for (maxStrokeWidth = 0; maxStrokeWidth < runsByLine.length; maxStrokeWidth++) { var lineRuns$jscomp$1 = runsByLine[maxStrokeWidth]; w = []; for (var run$jscomp$0 of lineRuns$jscomp$1) { lineRuns$jscomp$1 = fontStringFromTextStyle.fontStringFromTextStyle(run$jscomp$0.style), context.font = lineRuns$jscomp$1, w.push({width:CanvasTextMetrics.CanvasTextMetrics._measureText(run$jscomp$0.text, run$jscomp$0.style.letterSpacing, context), font:lineRuns$jscomp$1}); } run.push(w); } for (run$jscomp$0 = 0; run$jscomp$0 < passesCount; ++run$jscomp$0) { w = (maxStrokeWidth = hasDropShadow && 0 === run$jscomp$0) ? Math.ceil(Math.max(1, measured) + 2 * padding) : 0; lineRuns$jscomp$1 = w * resolution; maxStrokeWidth || (context.shadowColor = "rgba(0,0,0,0)"); let currentY = lineRuns$jscomp$0; for (let lineIndex = 0; lineIndex < runsByLine.length; lineIndex++) { const lineRuns = runsByLine[lineIndex]; var lineWidth = lineWidths[lineIndex], lineAscent = lineAscents[lineIndex]; const currentLineHeight = lineHeights[lineIndex], lineRunData = run[lineIndex]; var linePositionX = lineRuns$jscomp$0; linePositionX += this._getAlignmentOffset(lineWidth, maxLineWidth, style.align); let wordSpacing = 0; if ("justify" === style.align && style.wordWrap && lineIndex < runsByLine.length - 1) { var totalSpaces = 0; for (const run of lineRuns) { totalSpaces += countSpaces(run.text); } 0 < totalSpaces && (wordSpacing = (maxLineWidth - lineWidth) / totalSpaces); } lineWidth = currentY + lineAscent; lineAscent = linePositionX + padding; for (totalSpaces = 0; totalSpaces < lineRuns.length; totalSpaces++) { var run$jscomp$1 = lineRuns[totalSpaces]; const {width:runWidth, font:runFont} = lineRunData[totalSpaces]; context.font = runFont; context.textBaseline = run$jscomp$1.style.textBaseline; if (run$jscomp$1.style._stroke?.width) { const runStroke = run$jscomp$1.style._stroke; context.lineWidth = runStroke.width; context.miterLimit = runStroke.miterLimit; context.lineJoin = runStroke.join; context.lineCap = runStroke.cap; if (maxStrokeWidth) { if (run$jscomp$1.style.dropShadow) { this._setupDropShadow(context, run$jscomp$1.style, resolution, lineRuns$jscomp$1); } else { run$jscomp$1 = countSpaces(run$jscomp$1.text); lineAscent += runWidth + run$jscomp$1 * wordSpacing; continue; } } else { var runFontProps = CanvasTextMetrics.CanvasTextMetrics.measureFont(runFont); runFontProps = run$jscomp$1.style.lineHeight || runFontProps.fontSize; context.strokeStyle = getCanvasFillStyle.getCanvasFillStyle(runStroke, context, {width:runWidth, height:runFontProps, lineHeight:runFontProps, lines:[run$jscomp$1.text]}, 2 * padding, lineAscent - padding, currentY); } this._drawLetterSpacing(run$jscomp$1.text, run$jscomp$1.style, canvasAndContext, lineAscent, lineWidth + padding - w, !0, wordSpacing); } run$jscomp$1 = countSpaces(run$jscomp$1.text); lineAscent += runWidth + run$jscomp$1 * wordSpacing; } lineAscent = linePositionX + padding; for (linePositionX = 0; linePositionX < lineRuns.length; linePositionX++) { totalSpaces = lineRuns[linePositionX]; const {width:runWidth, font:runFont} = lineRunData[linePositionX]; context.font = runFont; context.textBaseline = totalSpaces.style.textBaseline; if (void 0 !== totalSpaces.style._fill) { if (maxStrokeWidth) { if (totalSpaces.style.dropShadow) { this._setupDropShadow(context, totalSpaces.style, resolution, lineRuns$jscomp$1); } else { totalSpaces = countSpaces(totalSpaces.text); lineAscent += runWidth + totalSpaces * wordSpacing; continue; } } else { run$jscomp$1 = CanvasTextMetrics.CanvasTextMetrics.measureFont(runFont), run$jscomp$1 = totalSpaces.style.lineHeight || run$jscomp$1.fontSize, context.fillStyle = getCanvasFillStyle.getCanvasFillStyle(totalSpaces.style._fill, context, {width:runWidth, height:run$jscomp$1, lineHeight:run$jscomp$1, lines:[totalSpaces.text]}, 2 * padding, lineAscent - padding, currentY); } this._drawLetterSpacing(totalSpaces.text, totalSpaces.style, canvasAndContext, lineAscent, lineWidth + padding - w, !1, wordSpacing); } totalSpaces = countSpaces(totalSpaces.text); lineAscent += runWidth + totalSpaces * wordSpacing; } currentY += currentLineHeight; } } } _setFillAndStrokeStyles(context, style, metrics, padding, halfStroke, offsetX = 0, offsetY = 0) { context.fillStyle = style._fill ? getCanvasFillStyle.getCanvasFillStyle(style._fill, context, metrics, 2 * padding, offsetX, offsetY) : null; style._stroke?.width && (context.strokeStyle = getCanvasFillStyle.getCanvasFillStyle(style._stroke, context, metrics, halfStroke + 2 * padding, offsetX, offsetY)); } _setupDropShadow(context, style, resolution, dsOffsetShadow) { context.fillStyle = "black"; context.strokeStyle = "black"; style = style.dropShadow; var dropShadowAlpha = style.alpha; context.shadowColor = Color.Color.shared.setValue(style.color).setAlpha(dropShadowAlpha).toRgbaString(); dropShadowAlpha = style.distance * resolution; context.shadowBlur = style.blur * resolution; context.shadowOffsetX = Math.cos(style.angle) * dropShadowAlpha; context.shadowOffsetY = Math.sin(style.angle) * dropShadowAlpha + dsOffsetShadow; } _getAlignmentOffset(lineWidth, alignWidth, align) { return "right" === align ? alignWidth - lineWidth : "center" === align ? (alignWidth - lineWidth) / 2 : 0; } _drawLetterSpacing(text, style, canvasAndContext, x, y, isStroke = !1, wordSpacing = 0) { ({context:canvasAndContext} = canvasAndContext); style = style.letterSpacing; var useExperimentalLetterSpacing = !1; CanvasTextMetrics.CanvasTextMetrics.experimentalLetterSpacingSupported && (CanvasTextMetrics.CanvasTextMetrics.experimentalLetterSpacing ? (canvasAndContext.letterSpacing = `${style}px`, canvasAndContext.textLetterSpacing = `${style}px`, useExperimentalLetterSpacing = !0) : (canvasAndContext.letterSpacing = "0px", canvasAndContext.textLetterSpacing = "0px")); if (0 !== style && !useExperimentalLetterSpacing || 0 !== wordSpacing) { if (0 === wordSpacing || 0 !== style && !useExperimentalLetterSpacing) { useExperimentalLetterSpacing = CanvasTextMetrics.CanvasTextMetrics.graphemeSegmenter(text); text = canvasAndContext.measureText(text).width; for (let i = 0; i < useExperimentalLetterSpacing.length; ++i) { const currentChar = useExperimentalLetterSpacing[i]; isStroke ? canvasAndContext.strokeText(currentChar, x, y) : canvasAndContext.fillText(currentChar, x, y); var currentWidth = ""; for (let j = i + 1; j < useExperimentalLetterSpacing.length; ++j) { currentWidth += useExperimentalLetterSpacing[j]; } currentWidth = canvasAndContext.measureText(currentWidth).width; x += text - currentWidth + style; " " === currentChar && (x += wordSpacing); text = currentWidth; } } else { for (style = text.split(" "), useExperimentalLetterSpacing = canvasAndContext.measureText(" ").width, text = 0; text < style.length; text++) { isStroke ? canvasAndContext.strokeText(style[text], x, y) : canvasAndContext.fillText(style[text], x, y), x += canvasAndContext.measureText(style[text]).width + useExperimentalLetterSpacing + wordSpacing; } } } else { isStroke ? canvasAndContext.strokeText(text, x, y) : canvasAndContext.fillText(text, x, y); } } } require = new CanvasTextGeneratorClass(); exports.CanvasTextGenerator = require; }; //# sourceMappingURL=module$node_modules$pixi_DOT_js$lib$scene$text$canvas$CanvasTextGenerator.js.map