1 line
25 KiB
Plaintext
1 line
25 KiB
Plaintext
{"version":3,"file":"DynamicBitmapFont.mjs","sources":["../../../src/scene/text-bitmap/DynamicBitmapFont.ts"],"sourcesContent":["import { Color } from '../../color/Color';\nimport { Rectangle } from '../../maths/shapes/Rectangle';\nimport { CanvasPool } from '../../rendering/renderers/shared/texture/CanvasPool';\nimport { ImageSource } from '../../rendering/renderers/shared/texture/sources/ImageSource';\nimport { Texture } from '../../rendering/renderers/shared/texture/Texture';\nimport { deprecation, v8_0_0 } from '../../utils/logging/deprecation';\nimport { CanvasTextMetrics } from '../text/canvas/CanvasTextMetrics';\nimport { fontStringFromTextStyle } from '../text/canvas/utils/fontStringFromTextStyle';\nimport { getCanvasFillStyle } from '../text/canvas/utils/getCanvasFillStyle';\nimport { TextStyle } from '../text/TextStyle';\nimport { AbstractBitmapFont } from './AbstractBitmapFont';\nimport { resolveCharacters } from './utils/resolveCharacters';\n\nimport type { ICanvasRenderingContext2D } from '../../environment/canvas/ICanvasRenderingContext2D';\nimport type { CanvasAndContext } from '../../rendering/renderers/shared/texture/CanvasPool';\nimport type { FontMetrics } from '../text/canvas/CanvasTextMetrics';\n\nexport interface DynamicBitmapFontOptions\n{\n style: TextStyle\n skipKerning?: boolean\n resolution?: number\n padding?: number\n overrideFill?: boolean\n overrideSize?: boolean\n textureSize?: number\n mipmap?: boolean\n}\n\n/**\n * A BitmapFont that generates its glyphs dynamically.\n * @memberof text\n * @ignore\n */\nexport class DynamicBitmapFont extends AbstractBitmapFont<DynamicBitmapFont>\n{\n public static defaultOptions: DynamicBitmapFontOptions = {\n textureSize: 512,\n style: new TextStyle(),\n mipmap: true,\n };\n /**\n * this is a resolution modifier for the font size..\n * texture resolution will also be used to scale texture according to its font size also\n */\n public resolution = 1;\n /** The pages of the font. */\n public override readonly pages: {canvasAndContext?: CanvasAndContext, texture: Texture}[] = [];\n\n private readonly _padding: number = 0;\n private readonly _measureCache: Record<string, number> = Object.create(null);\n private _currentChars: string[] = [];\n private _currentX = 0;\n private _currentY = 0;\n private _currentPageIndex = -1;\n private readonly _style: TextStyle;\n private readonly _skipKerning: boolean = false;\n private readonly _textureSize: number;\n private readonly _mipmap: boolean;\n\n /**\n * @param options - The options for the dynamic bitmap font.\n */\n constructor(options: DynamicBitmapFontOptions)\n {\n super();\n\n const dynamicOptions = { ...DynamicBitmapFont.defaultOptions, ...options };\n\n this._textureSize = dynamicOptions.textureSize;\n this._mipmap = dynamicOptions.mipmap;\n\n const style = dynamicOptions.style.clone();\n\n if (dynamicOptions.overrideFill)\n {\n // assuming no shape fill..\n style._fill.color = 0xffffff;\n style._fill.alpha = 1;\n style._fill.texture = Texture.WHITE;\n style._fill.fill = null;\n }\n\n this.applyFillAsTint = dynamicOptions.overrideFill;\n\n const requestedFontSize = style.fontSize;\n\n // adjust font size to match the base measurement size\n style.fontSize = this.baseMeasurementFontSize;\n\n const font = fontStringFromTextStyle(style);\n\n if (dynamicOptions.overrideSize)\n {\n if (style._stroke)\n {\n // we want the stroke to fit the size of the requested text, so we need to scale it\n // accordingly (eg font size 20, with stroke 10 - stroke is 50% of size,\n // as dynamic font is size 100, the stroke should be adjusted to 50 to make it look right)\n style._stroke.width *= this.baseRenderedFontSize / requestedFontSize;\n }\n }\n else\n {\n style.fontSize = this.baseRenderedFontSize = requestedFontSize;\n }\n\n this._style = style;\n this._skipKerning = dynamicOptions.skipKerning ?? false;\n this.resolution = dynamicOptions.resolution ?? 1;\n this._padding = dynamicOptions.padding ?? 4;\n\n (this.fontMetrics as FontMetrics) = CanvasTextMetrics.measureFont(font);\n (this.lineHeight as number) = style.lineHeight || this.fontMetrics.fontSize || style.fontSize;\n }\n\n public ensureCharacters(chars: string): void\n {\n const charList = resolveCharacters(chars)\n .filter((char) => !this._currentChars.includes(char))\n .filter((char, index, self) => self.indexOf(char) === index);\n // filter returns..\n\n if (!charList.length) return;\n\n this._currentChars = [...this._currentChars, ...charList];\n\n let pageData;\n\n if (this._currentPageIndex === -1)\n {\n pageData = this._nextPage();\n }\n else\n {\n pageData = this.pages[this._currentPageIndex];\n }\n\n let { canvas, context } = pageData.canvasAndContext;\n let textureSource = pageData.texture.source;\n\n const style = this._style;\n\n let currentX = this._currentX;\n let currentY = this._currentY;\n\n const fontScale = this.baseRenderedFontSize / this.baseMeasurementFontSize;\n const padding = this._padding * fontScale;\n\n const widthScale = style.fontStyle === 'italic' ? 2 : 1;\n let maxCharHeight = 0;\n let skipTexture = false;\n\n for (let i = 0; i < charList.length; i++)\n {\n const char = charList[i];\n\n const metrics = CanvasTextMetrics.measureText(char, style, canvas, false);\n\n // override the line height.. we want this to be the glyps height\n // not the user specified one.\n metrics.lineHeight = metrics.height;\n\n const width = (widthScale * metrics.width) * fontScale;\n const height = (metrics.height) * fontScale;\n\n const paddedWidth = width + (padding * 2);\n const paddedHeight = height + (padding * 2);\n\n skipTexture = false;\n // don't let empty characters count towards the maxCharHeight\n if (char !== '\\n' && char !== '\\r' && char !== '\\t' && char !== ' ')\n {\n skipTexture = true;\n maxCharHeight = Math.ceil(Math.max(paddedHeight, maxCharHeight));// / 1.5;\n }\n\n if (currentX + paddedWidth > this._textureSize)\n {\n currentY += maxCharHeight;\n\n // reset the line x and height..\n maxCharHeight = paddedHeight;\n currentX = 0;\n\n if (currentY + maxCharHeight > this._textureSize)\n {\n textureSource.update();\n\n const pageData = this._nextPage();\n\n canvas = pageData.canvasAndContext.canvas;\n context = pageData.canvasAndContext.context;\n textureSource = pageData.texture.source;\n\n currentY = 0;\n }\n }\n\n const xAdvance = (width / fontScale)\n - (style.dropShadow?.distance ?? 0)\n - (style._stroke?.width ?? 0);\n\n // This is in coord space of the measurements.. not the texture\n this.chars[char] = {\n id: char.codePointAt(0),\n xOffset: -this._padding,\n yOffset: -this._padding,\n xAdvance,\n kerning: {},\n };\n\n if (skipTexture)\n {\n this._drawGlyph(\n context,\n metrics,\n currentX + padding,\n currentY + padding,\n fontScale,\n style,\n );\n\n const px = textureSource.width * fontScale;\n const py = textureSource.height * fontScale;\n\n const frame = new Rectangle(\n ((currentX) / px) * textureSource.width,\n ((currentY) / py) * textureSource.height,\n ((paddedWidth) / px) * textureSource.width,\n ((paddedHeight) / py) * textureSource.height,\n );\n\n this.chars[char].texture = new Texture({\n source: textureSource,\n frame,\n });\n\n currentX += Math.ceil(paddedWidth);\n }\n\n // now add it to the font data..\n }\n\n textureSource.update();\n\n this._currentX = currentX;\n this._currentY = currentY;\n\n // now apply kerning..\n this._skipKerning && this._applyKerning(charList, context);\n }\n\n /**\n * @deprecated since 8.0.0\n * The map of base page textures (i.e., sheets of glyphs).\n */\n public override get pageTextures(): DynamicBitmapFont['pages']\n {\n // #if _DEBUG\n deprecation(v8_0_0, 'BitmapFont.pageTextures is deprecated, please use BitmapFont.pages instead.');\n // #endif\n\n return this.pages;\n }\n\n private _applyKerning(newChars: string[], context: ICanvasRenderingContext2D): void\n {\n const measureCache = this._measureCache;\n\n for (let i = 0; i < newChars.length; i++)\n {\n const first = newChars[i];\n\n for (let j = 0; j < this._currentChars.length; j++)\n {\n // first go through new char being first\n const second = this._currentChars[j];\n\n let c1 = measureCache[first];\n\n if (!c1) c1 = measureCache[first] = context.measureText(first).width;\n\n let c2 = measureCache[second];\n\n if (!c2) c2 = measureCache[second] = context.measureText(second).width;\n\n let total = context.measureText(first + second).width;\n let amount = total - (c1 + c2);\n\n if (amount)\n {\n this.chars[first].kerning[second] = amount;\n }\n\n // then go through new char being second\n total = context.measureText(first + second).width;\n amount = total - (c1 + c2);\n\n if (amount)\n {\n this.chars[second].kerning[first] = amount;\n }\n }\n }\n }\n\n private _nextPage(): {canvasAndContext: CanvasAndContext, texture: Texture}\n {\n this._currentPageIndex++;\n\n const textureResolution = this.resolution;\n const canvasAndContext = CanvasPool.getOptimalCanvasAndContext(\n this._textureSize,\n this._textureSize,\n textureResolution\n );\n\n this._setupContext(canvasAndContext.context, this._style, textureResolution);\n\n const resolution = textureResolution * (this.baseRenderedFontSize / this.baseMeasurementFontSize);\n const texture = new Texture({\n source: new ImageSource({\n resource: canvasAndContext.canvas,\n resolution,\n alphaMode: 'premultiply-alpha-on-upload',\n autoGenerateMipmaps: this._mipmap,\n }),\n\n });\n\n const pageData = {\n canvasAndContext,\n texture,\n };\n\n this.pages[this._currentPageIndex] = pageData;\n\n return pageData;\n }\n\n // canvas style!\n private _setupContext(context: ICanvasRenderingContext2D, style: TextStyle, resolution: number): void\n {\n style.fontSize = this.baseRenderedFontSize;\n context.scale(resolution, resolution);\n context.font = fontStringFromTextStyle(style);\n style.fontSize = this.baseMeasurementFontSize;\n context.textBaseline = style.textBaseline;\n\n const stroke = style._stroke;\n const strokeThickness = stroke?.width ?? 0;\n\n if (stroke)\n {\n context.lineWidth = strokeThickness;\n context.lineJoin = stroke.join;\n context.miterLimit = stroke.miterLimit;\n\n // TODO prolly cache this??\n context.strokeStyle = getCanvasFillStyle(stroke, context);\n }\n\n if (style._fill)\n {\n // set canvas text styles\n context.fillStyle = getCanvasFillStyle(style._fill, context);\n }\n\n if (style.dropShadow)\n {\n const shadowOptions = style.dropShadow;\n const rgb = Color.shared.setValue(shadowOptions.color).toArray();\n\n const dropShadowBlur = shadowOptions.blur * resolution;\n const dropShadowDistance = shadowOptions.distance * resolution;\n\n context.shadowColor = `rgba(${rgb[0] * 255},${rgb[1] * 255},${rgb[2] * 255},${shadowOptions.alpha})`;\n context.shadowBlur = dropShadowBlur;\n context.shadowOffsetX = Math.cos(shadowOptions.angle) * dropShadowDistance;\n context.shadowOffsetY = Math.sin(shadowOptions.angle) * dropShadowDistance;\n }\n else\n {\n context.shadowColor = 'black';\n context.shadowBlur = 0;\n context.shadowOffsetX = 0;\n context.shadowOffsetY = 0;\n }\n }\n\n private _drawGlyph(\n context: ICanvasRenderingContext2D,\n metrics: CanvasTextMetrics,\n x: number,\n y: number,\n fontScale: number,\n style: TextStyle\n ): void\n {\n const char = metrics.text;\n const fontProperties = metrics.fontProperties;\n const stroke = style._stroke;\n\n const strokeThickness = (stroke?.width ?? 0) * fontScale;\n\n const tx = x + (strokeThickness / 2);\n const ty = y - (strokeThickness / 2);\n\n const descent = fontProperties.descent * fontScale;\n const lineHeight = metrics.lineHeight * fontScale;\n\n if (style.stroke && strokeThickness)\n {\n context.strokeText(char, tx, ty + lineHeight - descent);\n }\n\n if (style._fill)\n {\n context.fillText(char, tx, ty + lineHeight - descent);\n }\n }\n\n public override destroy(): void\n {\n super.destroy();\n\n for (let i = 0; i < this.pages.length; i++)\n {\n const { canvasAndContext, texture } = this.pages[i];\n\n // clear context.. this is the fastest way apparently!\n // eslint-disable-next-line no-self-assign\n canvasAndContext.canvas.width = canvasAndContext.canvas.width;\n\n CanvasPool.returnCanvasAndContext(canvasAndContext);\n texture.destroy(true);\n }\n\n (this.pages as null) = null;\n }\n}\n"],"names":["pageData"],"mappings":"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"} |