pixi.js
Version:
<p align="center"> <a href="https://pixijs.com" target="_blank" rel="noopener noreferrer"> <img height="150" src="https://files.pixijs.download/branding/pixijs-logo-transparent-dark.svg?v=1" alt="PixiJS logo"> </a> </p> <br/> <p align="center">
1 lines • 28.4 kB
Source Map (JSON)
{"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 { TextureStyle, type TextureStyleOptions } from '../../rendering/renderers/shared/texture/TextureStyle';\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';\n\nimport type { ICanvasRenderingContext2D } from '../../environment/canvas/ICanvasRenderingContext2D';\nimport type { CanvasAndContext } from '../../rendering/renderers/shared/texture/CanvasPool';\nimport type { FontMetrics } from '../text/canvas/utils/types';\n\n/** @internal */\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 textureStyle?: TextureStyle | TextureStyleOptions\n}\n\n/**\n * A BitmapFont that generates its glyphs dynamically.\n * @category text\n * @internal\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 _currentMaxCharHeight = 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 private readonly _textureStyle?: TextureStyle;\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 if (style.dropShadow)\n {\n // we want the drop shadow to fit the size of the requested text, so we need to scale it\n // accordingly (eg font size 20, with drop shadow 10 - drop shadow is 50% of size,\n // as dynamic font is size 100, the drop shadow should be adjusted to 50 to make it look right)\n style.dropShadow.blur *= this.baseRenderedFontSize / requestedFontSize;\n style.dropShadow.distance *= 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 if (dynamicOptions.textureStyle)\n {\n this._textureStyle = dynamicOptions.textureStyle instanceof TextureStyle\n ? dynamicOptions.textureStyle\n : new TextureStyle(dynamicOptions.textureStyle);\n }\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 = CanvasTextMetrics.graphemeSegmenter(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 let currentMaxCharHeight = this._currentMaxCharHeight;\n\n const fontScale = this.baseRenderedFontSize / this.baseMeasurementFontSize;\n const extraPadding = (style.dropShadow?.distance ?? 0) + (style._stroke?.width ?? 0);\n const padding = this._padding + extraPadding;\n\n let skipTexture = false;\n\n const maxTextureWidth = canvas.width / this.resolution;\n const maxTextureHeight = canvas.height / this.resolution;\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 = metrics.width * fontScale;\n // This is ugly - but italics are given more space so they don't overlap\n const textureGlyphWidth = Math.ceil((style.fontStyle === 'italic' ? 2 : 1) * width);\n\n const height = ((metrics.height) * fontScale);\n\n const paddedWidth = textureGlyphWidth + (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 currentMaxCharHeight = Math.ceil(Math.max(paddedHeight, currentMaxCharHeight));\n }\n\n if (currentX + paddedWidth > maxTextureWidth)\n {\n currentY += currentMaxCharHeight;\n\n // reset the line x and height..\n currentMaxCharHeight = paddedHeight;\n currentX = 0;\n\n if (currentY + currentMaxCharHeight > maxTextureHeight)\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 currentX = 0;\n currentY = 0;\n currentMaxCharHeight = 0;\n }\n }\n\n // Use the true advance width from context.measureText rather than\n // CanvasTextMetrics which returns Math.max(advanceWidth, boundsWidth).\n // For characters like 'f' whose visual bounds overhang, the bounding box\n // is wider than the advance, causing incorrect spacing.\n const xAdvance = (context.measureText(char).width / fontScale);\n\n // This is in coord space of the measurements.. not the texture\n this.chars[char] = {\n id: char.codePointAt(0),\n xOffset: -(padding / fontScale),\n yOffset: -(padding / fontScale),\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\n textureSource.update();\n\n this._currentX = currentX;\n this._currentY = currentY;\n this._currentMaxCharHeight = currentMaxCharHeight;\n\n // now apply kerning..\n if (!this._skipKerning) this._applyKerning(charList, context, fontScale);\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, fontScale: number): 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 && this.chars[first])\n {\n this.chars[first].kerning[second] = amount / fontScale;\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 && this.chars[second])\n {\n this.chars[second].kerning[first] = amount / fontScale;\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 if (this._textureStyle)\n {\n texture.source.style = this._textureStyle;\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 let removeShadow = false;\n\n if (style.stroke && strokeThickness)\n {\n removeShadow = true;\n context.strokeText(char, tx, ty + lineHeight - descent);\n }\n\n const { shadowBlur, shadowOffsetX, shadowOffsetY } = context;\n\n if (style._fill)\n {\n if (removeShadow)\n {\n context.shadowBlur = 0;\n context.shadowOffsetX = 0;\n context.shadowOffsetY = 0;\n }\n context.fillText(char, tx, ty + lineHeight - descent);\n }\n\n if (removeShadow)\n {\n context.shadowBlur = shadowBlur;\n context.shadowOffsetX = shadowOffsetX;\n context.shadowOffsetY = shadowOffsetY;\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 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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"}