135 lines
11 KiB
JavaScript
135 lines
11 KiB
JavaScript
shadow$provide.module$node_modules$pixi_DOT_js$lib$scene$text_bitmap$DynamicBitmapFont = function(global, require, module, exports) {
|
|
var Color = require("module$node_modules$pixi_DOT_js$lib$color$Color"), Rectangle = require("module$node_modules$pixi_DOT_js$lib$maths$shapes$Rectangle"), CanvasPool = require("module$node_modules$pixi_DOT_js$lib$rendering$renderers$shared$texture$CanvasPool"), ImageSource = require("module$node_modules$pixi_DOT_js$lib$rendering$renderers$shared$texture$sources$ImageSource"), Texture = require("module$node_modules$pixi_DOT_js$lib$rendering$renderers$shared$texture$Texture"), TextureStyle = require("module$node_modules$pixi_DOT_js$lib$rendering$renderers$shared$texture$TextureStyle"),
|
|
deprecation = require("module$node_modules$pixi_DOT_js$lib$utils$logging$deprecation"), 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");
|
|
global = require("module$node_modules$pixi_DOT_js$lib$scene$text$TextStyle");
|
|
require = require("module$node_modules$pixi_DOT_js$lib$scene$text_bitmap$AbstractBitmapFont");
|
|
"use strict";
|
|
const node_modules$pixi_DOT_js$lib$scene$text_bitmap$DynamicBitmapFont$classdecl$var36 = class extends require.AbstractBitmapFont {
|
|
constructor(options) {
|
|
super();
|
|
this.resolution = 1;
|
|
this.pages = [];
|
|
this._padding = 0;
|
|
this._measureCache = Object.create(null);
|
|
this._currentChars = [];
|
|
this._currentMaxCharHeight = this._currentY = this._currentX = 0;
|
|
this._currentPageIndex = -1;
|
|
this._skipKerning = !1;
|
|
options = {...node_modules$pixi_DOT_js$lib$scene$text_bitmap$DynamicBitmapFont$classdecl$var36.defaultOptions, ...options};
|
|
this._textureSize = options.textureSize;
|
|
this._mipmap = options.mipmap;
|
|
const style = options.style.clone();
|
|
options.overrideFill && (style._fill.color = 16777215, style._fill.alpha = 1, style._fill.texture = Texture.Texture.WHITE, style._fill.fill = null);
|
|
this.applyFillAsTint = options.overrideFill;
|
|
const requestedFontSize = style.fontSize;
|
|
style.fontSize = this.baseMeasurementFontSize;
|
|
const font = fontStringFromTextStyle.fontStringFromTextStyle(style);
|
|
options.overrideSize ? (style._stroke && (style._stroke.width *= this.baseRenderedFontSize / requestedFontSize), style.dropShadow && (style.dropShadow.blur *= this.baseRenderedFontSize / requestedFontSize, style.dropShadow.distance *= this.baseRenderedFontSize / requestedFontSize)) : style.fontSize = this.baseRenderedFontSize = requestedFontSize;
|
|
this._style = style;
|
|
this._skipKerning = options.skipKerning ?? !1;
|
|
this.resolution = options.resolution ?? 1;
|
|
this._padding = options.padding ?? 4;
|
|
options.textureStyle && (this._textureStyle = options.textureStyle instanceof TextureStyle.TextureStyle ? options.textureStyle : new TextureStyle.TextureStyle(options.textureStyle));
|
|
this.fontMetrics = CanvasTextMetrics.CanvasTextMetrics.measureFont(font);
|
|
this.lineHeight = style.lineHeight || this.fontMetrics.fontSize || style.fontSize;
|
|
}
|
|
ensureCharacters(chars) {
|
|
chars = CanvasTextMetrics.CanvasTextMetrics.graphemeSegmenter(chars).filter(char => !this._currentChars.includes(char)).filter((char, index, self) => self.indexOf(char) === index);
|
|
if (chars.length) {
|
|
this._currentChars = [...this._currentChars, ...chars];
|
|
var pageData = -1 === this._currentPageIndex ? this._nextPage() : this.pages[this._currentPageIndex];
|
|
var {canvas, context} = pageData.canvasAndContext, textureSource = pageData.texture.source;
|
|
pageData = this._style;
|
|
var currentX = this._currentX, currentY = this._currentY, currentMaxCharHeight = this._currentMaxCharHeight, fontScale = this.baseRenderedFontSize / this.baseMeasurementFontSize, padding = this._padding + ((pageData.dropShadow?.distance ?? 0) + (pageData._stroke?.width ?? 0)), skipTexture = !1, maxTextureWidth = canvas.width / this.resolution, maxTextureHeight = canvas.height / this.resolution;
|
|
for (let i = 0; i < chars.length; i++) {
|
|
const char = chars[i];
|
|
var metrics = CanvasTextMetrics.CanvasTextMetrics.measureText(char, pageData, canvas, !1);
|
|
metrics.lineHeight = metrics.height;
|
|
const paddedWidth = Math.ceil(("italic" === pageData.fontStyle ? 2 : 1) * metrics.width * fontScale) + 2 * padding;
|
|
var paddedHeight = metrics.height * fontScale + 2 * padding;
|
|
skipTexture = !1;
|
|
"\n" !== char && "\r" !== char && "\t" !== char && " " !== char && (skipTexture = !0, currentMaxCharHeight = Math.ceil(Math.max(paddedHeight, currentMaxCharHeight)));
|
|
currentX + paddedWidth > maxTextureWidth && (currentY += currentMaxCharHeight, currentMaxCharHeight = paddedHeight, currentX = 0, currentY + currentMaxCharHeight > maxTextureHeight && (textureSource.update(), textureSource = this._nextPage(), canvas = textureSource.canvasAndContext.canvas, context = textureSource.canvasAndContext.context, textureSource = textureSource.texture.source, currentMaxCharHeight = currentY = currentX = 0));
|
|
const xAdvance = context.measureText(char).width / fontScale;
|
|
this.chars[char] = {id:char.codePointAt(0), xOffset:-(padding / fontScale), yOffset:-(padding / fontScale), xAdvance, kerning:{}};
|
|
skipTexture && (this._drawGlyph(context, metrics, currentX + padding, currentY + padding, fontScale, pageData), skipTexture = textureSource.width * fontScale, metrics = textureSource.height * fontScale, paddedHeight = new Rectangle.Rectangle(currentX / skipTexture * textureSource.width, currentY / metrics * textureSource.height, paddedWidth / skipTexture * textureSource.width, paddedHeight / metrics * textureSource.height), this.chars[char].texture = new Texture.Texture({source:textureSource,
|
|
frame:paddedHeight}), currentX += Math.ceil(paddedWidth));
|
|
}
|
|
textureSource.update();
|
|
this._currentX = currentX;
|
|
this._currentY = currentY;
|
|
this._currentMaxCharHeight = currentMaxCharHeight;
|
|
this._skipKerning || this._applyKerning(chars, context, fontScale);
|
|
}
|
|
}
|
|
get pageTextures() {
|
|
deprecation.deprecation(deprecation.v8_0_0, "BitmapFont.pageTextures is deprecated, please use BitmapFont.pages instead.");
|
|
return this.pages;
|
|
}
|
|
_applyKerning(newChars, context, fontScale) {
|
|
const measureCache = this._measureCache;
|
|
for (let i = 0; i < newChars.length; i++) {
|
|
const first = newChars[i];
|
|
for (let j = 0; j < this._currentChars.length; j++) {
|
|
const second = this._currentChars[j];
|
|
let c1 = measureCache[first];
|
|
c1 || (c1 = measureCache[first] = context.measureText(first).width);
|
|
let c2 = measureCache[second];
|
|
c2 || (c2 = measureCache[second] = context.measureText(second).width);
|
|
var total = context.measureText(first + second).width;
|
|
(total -= c1 + c2) && this.chars[first] && (this.chars[first].kerning[second] = total / fontScale);
|
|
total = context.measureText(first + second).width;
|
|
(total -= c1 + c2) && this.chars[second] && (this.chars[second].kerning[first] = total / fontScale);
|
|
}
|
|
}
|
|
}
|
|
_nextPage() {
|
|
this._currentPageIndex++;
|
|
var textureResolution = this.resolution, canvasAndContext = CanvasPool.CanvasPool.getOptimalCanvasAndContext(this._textureSize, this._textureSize, textureResolution);
|
|
this._setupContext(canvasAndContext.context, this._style, textureResolution);
|
|
textureResolution = new Texture.Texture({source:new ImageSource.ImageSource({resource:canvasAndContext.canvas, resolution:this.baseRenderedFontSize / this.baseMeasurementFontSize * textureResolution, alphaMode:"premultiply-alpha-on-upload", autoGenerateMipmaps:this._mipmap})});
|
|
this._textureStyle && (textureResolution.source.style = this._textureStyle);
|
|
canvasAndContext = {canvasAndContext, texture:textureResolution};
|
|
return this.pages[this._currentPageIndex] = canvasAndContext;
|
|
}
|
|
_setupContext(context, style, resolution) {
|
|
style.fontSize = this.baseRenderedFontSize;
|
|
context.scale(resolution, resolution);
|
|
context.font = fontStringFromTextStyle.fontStringFromTextStyle(style);
|
|
style.fontSize = this.baseMeasurementFontSize;
|
|
context.textBaseline = style.textBaseline;
|
|
var stroke = style._stroke, strokeThickness = stroke?.width ?? 0;
|
|
stroke && (context.lineWidth = strokeThickness, context.lineJoin = stroke.join, context.miterLimit = stroke.miterLimit, context.strokeStyle = getCanvasFillStyle.getCanvasFillStyle(stroke, context));
|
|
style._fill && (context.fillStyle = getCanvasFillStyle.getCanvasFillStyle(style._fill, context));
|
|
style.dropShadow ? (style = style.dropShadow, stroke = Color.Color.shared.setValue(style.color).toArray(), strokeThickness = style.blur * resolution, resolution *= style.distance, context.shadowColor = `rgba(${255 * stroke[0]},${255 * stroke[1]},${255 * stroke[2]},${style.alpha})`, context.shadowBlur = strokeThickness, context.shadowOffsetX = Math.cos(style.angle) * resolution, context.shadowOffsetY = Math.sin(style.angle) * resolution) : (context.shadowColor = "black", context.shadowBlur =
|
|
0, context.shadowOffsetX = 0, context.shadowOffsetY = 0);
|
|
}
|
|
_drawGlyph(context, metrics, x, y, fontScale, style) {
|
|
const char = metrics.text, strokeThickness = (style._stroke?.width ?? 0) * fontScale;
|
|
x += strokeThickness / 2;
|
|
y -= strokeThickness / 2;
|
|
const descent = metrics.fontProperties.descent * fontScale;
|
|
metrics = metrics.lineHeight * fontScale;
|
|
fontScale = !1;
|
|
style.stroke && strokeThickness && (fontScale = !0, context.strokeText(char, x, y + metrics - descent));
|
|
const {shadowBlur, shadowOffsetX, shadowOffsetY} = context;
|
|
style._fill && (fontScale && (context.shadowBlur = 0, context.shadowOffsetX = 0, context.shadowOffsetY = 0), context.fillText(char, x, y + metrics - descent));
|
|
fontScale && (context.shadowBlur = shadowBlur, context.shadowOffsetX = shadowOffsetX, context.shadowOffsetY = shadowOffsetY);
|
|
}
|
|
destroy() {
|
|
super.destroy();
|
|
for (let i = 0; i < this.pages.length; i++) {
|
|
const {canvasAndContext, texture} = this.pages[i];
|
|
CanvasPool.CanvasPool.returnCanvasAndContext(canvasAndContext);
|
|
texture.destroy(!0);
|
|
}
|
|
this.pages = null;
|
|
}
|
|
};
|
|
require = node_modules$pixi_DOT_js$lib$scene$text_bitmap$DynamicBitmapFont$classdecl$var36;
|
|
require.defaultOptions = {textureSize:512, style:new global.TextStyle(), mipmap:!0};
|
|
exports.DynamicBitmapFont = require;
|
|
};
|
|
|
|
//# sourceMappingURL=module$node_modules$pixi_DOT_js$lib$scene$text_bitmap$DynamicBitmapFont.js.map
|