UNPKG

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">

183 lines (179 loc) 6.66 kB
'use strict'; var tinyLru = require('tiny-lru'); var Cache = require('../../assets/cache/Cache.js'); var deprecation = require('../../utils/logging/deprecation.js'); var warn = require('../../utils/logging/warn.js'); var CanvasTextMetrics = require('../text/canvas/CanvasTextMetrics.js'); var TextStyle = require('../text/TextStyle.js'); var DynamicBitmapFont = require('./DynamicBitmapFont.js'); var getBitmapTextLayout = require('./utils/getBitmapTextLayout.js'); var resolveCharacters = require('./utils/resolveCharacters.js'); "use strict"; let fontCount = 0; class BitmapFontManagerClass { constructor() { /** * This character set includes all the letters in the alphabet (both lower- and upper- case). * @type {string[][]} * @example * BitmapFont.from('ExampleFont', style, { chars: BitmapFont.ALPHA }) */ this.ALPHA = [["a", "z"], ["A", "Z"], " "]; /** * This character set includes all decimal digits (from 0 to 9). * @type {string[][]} * @example * BitmapFont.from('ExampleFont', style, { chars: BitmapFont.NUMERIC }) */ this.NUMERIC = [["0", "9"]]; /** * This character set is the union of `BitmapFont.ALPHA` and `BitmapFont.NUMERIC`. * @type {string[][]} */ this.ALPHANUMERIC = [["a", "z"], ["A", "Z"], ["0", "9"], " "]; /** * This character set consists of all the ASCII table. * @type {string[][]} * @see http://www.asciitable.com/ */ this.ASCII = [[" ", "~"]]; /** Default options for installing a new BitmapFont. */ this.defaultOptions = { chars: this.ALPHANUMERIC, resolution: 1, padding: 4, skipKerning: false, textureStyle: null }; /** Cache for measured text layouts to avoid recalculating them multiple times. */ this.measureCache = tinyLru.lru(1e3); } /** * Get a font for the specified text and style. * @param text - The text to get the font for * @param style - The style to use */ getFont(text, style) { let fontFamilyKey = `${style.fontFamily}-bitmap`; let overrideFill = true; if (style._fill.fill && !style._stroke) { fontFamilyKey += style._fill.fill.styleKey; overrideFill = false; } else if (style._stroke || style.dropShadow) { fontFamilyKey = `${style.styleKey}-bitmap`; overrideFill = false; } if (!Cache.Cache.has(fontFamilyKey)) { const styleCopy = Object.create(style); styleCopy.lineHeight = 0; const fnt = new DynamicBitmapFont.DynamicBitmapFont({ style: styleCopy, overrideFill, overrideSize: true, ...this.defaultOptions }); fontCount++; if (fontCount > 50) { warn.warn("BitmapText", `You have dynamically created ${fontCount} bitmap fonts, this can be inefficient. Try pre installing your font styles using \`BitmapFont.install({name:"style1", style})\``); } fnt.once("destroy", () => { fontCount--; Cache.Cache.remove(fontFamilyKey); }); Cache.Cache.set( fontFamilyKey, fnt ); } const dynamicFont = Cache.Cache.get(fontFamilyKey); dynamicFont.ensureCharacters?.(text); return dynamicFont; } /** * Get the layout of a text for the specified style. * @param text - The text to get the layout for * @param style - The style to use * @param trimEnd - Whether to ignore whitespaces at the end of each line */ getLayout(text, style, trimEnd = true) { const bitmapFont = this.getFont(text, style); const id = `${text}-${style.styleKey}-${trimEnd}`; if (this.measureCache.has(id)) { return this.measureCache.get(id); } const segments = CanvasTextMetrics.CanvasTextMetrics.graphemeSegmenter(text); const layoutData = getBitmapTextLayout.getBitmapTextLayout(segments, style, bitmapFont, trimEnd); this.measureCache.set(id, layoutData); return layoutData; } /** * Measure the text using the specified style. * @param text - The text to measure * @param style - The style to use * @param trimEnd - Whether to ignore whitespaces at the end of each line */ measureText(text, style, trimEnd = true) { return this.getLayout(text, style, trimEnd); } // eslint-disable-next-line max-len install(...args) { let options = args[0]; if (typeof options === "string") { options = { name: options, style: args[1], chars: args[2]?.chars, resolution: args[2]?.resolution, padding: args[2]?.padding, skipKerning: args[2]?.skipKerning }; deprecation.deprecation(deprecation.v8_0_0, "BitmapFontManager.install(name, style, options) is deprecated, use BitmapFontManager.install({name, style, ...options})"); } const name = options?.name; if (!name) { throw new Error("[BitmapFontManager] Property `name` is required."); } options = { ...this.defaultOptions, ...options }; const textStyle = options.style; const style = textStyle instanceof TextStyle.TextStyle ? textStyle : new TextStyle.TextStyle(textStyle); const overrideFill = options.dynamicFill ?? this._canUseTintForStyle(style); const font = new DynamicBitmapFont.DynamicBitmapFont({ style, overrideFill, skipKerning: options.skipKerning, padding: options.padding, resolution: options.resolution, overrideSize: false, textureStyle: options.textureStyle }); const flatChars = resolveCharacters.resolveCharacters(options.chars); font.ensureCharacters(flatChars.join("")); Cache.Cache.set(`${name}-bitmap`, font); font.once("destroy", () => Cache.Cache.remove(`${name}-bitmap`)); return font; } /** * Uninstalls a bitmap font from the cache. * @param {string} name - The name of the bitmap font to uninstall. */ uninstall(name) { const cacheKey = `${name}-bitmap`; const font = Cache.Cache.get(cacheKey); if (font) { font.destroy(); } } /** * Determines if a style can use tinting instead of baking colors into the bitmap. * Tinting is more efficient as it allows reusing the same bitmap with different colors. * @param style - The text style to evaluate * @returns true if the style can use tinting, false if colors must be baked in * @private */ _canUseTintForStyle(style) { return !style._stroke && (!style.dropShadow || style.dropShadow.color === 0) && !style._fill.fill && style._fill.color === 16777215; } } const BitmapFontManager = new BitmapFontManagerClass(); exports.BitmapFontManager = BitmapFontManager; //# sourceMappingURL=BitmapFontManager.js.map