Files
il/resources/public/js/cljs-runtime/module$node_modules$pixi_DOT_js$lib$scene$text$canvas$CanvasTextGenerator.js
2026-07-01 22:38:29 -06:00

223 lines
14 KiB
JavaScript

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