{"version":3,"file":"BitmapFont.mjs","sources":["../src/BitmapFont.ts"],"sourcesContent":["import { ALPHA_MODES, BaseTexture, MIPMAP_MODES, Rectangle, settings, Texture, utils } from 'pixijs/core';\nimport { TextMetrics, TextStyle } from 'pixijs/text';\nimport { BitmapFontData } from './BitmapFontData';\nimport { autoDetectFormat } from './formats';\nimport { drawGlyph, extractCharCode, resolveCharacters } from './utils';\n\nimport type { IBaseTextureOptions, ICanvas, ICanvasRenderingContext2D, SCALE_MODES } from 'pixijs/core';\nimport type { ITextStyle } from 'pixijs/text';\n\nexport interface IBitmapFontCharacter\n{\n    xOffset: number;\n    yOffset: number;\n    xAdvance: number;\n    texture: Texture;\n    page: number;\n    kerning: utils.Dict<number>;\n}\n\ntype BaseOptions = Pick<IBaseTextureOptions, 'scaleMode' | 'mipmap' | 'anisotropicLevel' | 'alphaMode'>;\n\n/** @memberof PIXI */\nexport interface IBitmapFontOptions extends BaseOptions\n{\n    /**\n     * Characters included in the font set. You can also use ranges.\n     * For example, `[['a', 'z'], ['A', 'Z'], \"!@#$%^&*()~{}[] \"]`.\n     * Don't forget to include spaces ' ' in your character set!\n     * @default PIXI.BitmapFont.ALPHANUMERIC\n     */\n    chars?: string | (string | string[])[];\n\n    /**\n     * Render resolution for glyphs.\n     * @default 1\n     */\n    resolution?: number;\n\n    /**\n     * Padding between glyphs on texture atlas. Lower values could mean more visual artifacts\n     * and bleeding from other glyphs, larger values increase the space required on the texture.\n     * @default 4\n     */\n    padding?: number;\n\n    /**\n     * Optional width of atlas, smaller values to reduce memory.\n     * @default 512\n     */\n    textureWidth?: number;\n\n    /**\n     * Optional height of atlas, smaller values to reduce memory.\n     * @default 512\n     */\n    textureHeight?: number;\n\n    /**\n     * If mipmapping is enabled for texture. For instance, by default PixiJS only enables mipmapping\n     * on Power-of-Two textures. If your textureWidth or textureHeight are not power-of-two, you\n     * may consider enabling mipmapping to get better quality with lower font sizes. Note:\n     * for MSDF/SDF fonts, mipmapping is not supported.\n     * @default PIXI.BaseTexture.defaultOptions.mipmap\n     */\n    mipmap?: MIPMAP_MODES;\n\n    /**\n     * Anisotropic filtering level of texture.\n     * @default PIXI.BaseTexture.defaultOptions.anisotropicLevel\n     */\n    anisotropicLevel?: number;\n\n    /**\n     * Default scale mode, linear, nearest. Nearest can be helpful for bitmap-style fonts.\n     * @default PIXI.BaseTexture.defaultOptions.scaleMode\n     */\n    scaleMode?: SCALE_MODES;\n\n    /**\n     * Pre multiply the image alpha.  Note: for MSDF/SDF fonts, alphaMode is not supported.\n     * @default PIXI.BaseTexture.defaultOptions.alphaMode\n     */\n    alphaMode?: ALPHA_MODES;\n}\n\n/**\n * BitmapFont represents a typeface available for use with the BitmapText class. Use the `install`\n * method for adding a font to be used.\n * @memberof PIXI\n */\nexport class BitmapFont\n{\n    /**\n     * This character set includes all the letters in the alphabet (both lower- and upper- case).\n     * @type {string[][]}\n     * @example\n     * BitmapFont.from('ExampleFont', style, { chars: BitmapFont.ALPHA })\n     */\n    public static readonly ALPHA = [['a', 'z'], ['A', 'Z'], ' '];\n\n    /**\n     * This character set includes all decimal digits (from 0 to 9).\n     * @type {string[][]}\n     * @example\n     * BitmapFont.from('ExampleFont', style, { chars: BitmapFont.NUMERIC })\n     */\n    public static readonly NUMERIC = [['0', '9']];\n\n    /**\n     * This character set is the union of `BitmapFont.ALPHA` and `BitmapFont.NUMERIC`.\n     * @type {string[][]}\n     */\n    public static readonly ALPHANUMERIC = [['a', 'z'], ['A', 'Z'], ['0', '9'], ' '];\n\n    /**\n     * This character set consists of all the ASCII table.\n     * @member {string[][]}\n     * @see http://www.asciitable.com/\n     */\n    public static readonly ASCII = [[' ', '~']];\n\n    /**\n     * Collection of default options when using `BitmapFont.from`.\n     * @property {number} [resolution=1] -\n     * @property {number} [textureWidth=512] -\n     * @property {number} [textureHeight=512] -\n     * @property {number} [padding=4] -\n     * @property {string|string[]|string[][]} chars = PIXI.BitmapFont.ALPHANUMERIC\n     */\n    public static readonly defaultOptions: IBitmapFontOptions = {\n        resolution: 1,\n        textureWidth: 512,\n        textureHeight: 512,\n        padding: 4,\n        chars: BitmapFont.ALPHANUMERIC,\n    };\n\n    /** Collection of available/installed fonts. */\n    public static readonly available: utils.Dict<BitmapFont> = {};\n\n    /** The name of the font face. */\n    public readonly font: string;\n\n    /** The size of the font face in pixels. */\n    public readonly size: number;\n\n    /** The line-height of the font face in pixels. */\n    public readonly lineHeight: number;\n\n    /** The map of characters by character code. */\n    public readonly chars: utils.Dict<IBitmapFontCharacter>;\n\n    /** The map of base page textures (i.e., sheets of glyphs). */\n    public readonly pageTextures: utils.Dict<Texture>;\n\n    /** The range of the distance field in pixels. */\n    public readonly distanceFieldRange: number;\n\n    /** The kind of distance field for this font or \"none\". */\n    public readonly distanceFieldType: string;\n\n    private _ownsTextures: boolean;\n\n    /**\n     * @param data\n     * @param textures\n     * @param ownsTextures - Setting to `true` will destroy page textures\n     *        when the font is uninstalled.\n     */\n    constructor(data: BitmapFontData, textures: Texture[] | utils.Dict<Texture>, ownsTextures?: boolean)\n    {\n        const [info] = data.info;\n        const [common] = data.common;\n        const [page] = data.page;\n        const [distanceField] = data.distanceField;\n        const res = utils.getResolutionOfUrl(page.file);\n        const pageTextures: utils.Dict<Texture> = {};\n\n        this._ownsTextures = ownsTextures;\n        this.font = info.face;\n        this.size = info.size;\n        this.lineHeight = common.lineHeight / res;\n        this.chars = {};\n        this.pageTextures = pageTextures;\n\n        // Convert the input Texture, Textures or object\n        // into a page Texture lookup by \"id\"\n        for (let i = 0; i < data.page.length; i++)\n        {\n            const { id, file } = data.page[i];\n\n            pageTextures[id] = textures instanceof Array\n                ? textures[i] : textures[file];\n\n            // only MSDF and SDF fonts need no-premultiplied-alpha\n            if (distanceField?.fieldType && distanceField.fieldType !== 'none')\n            {\n                pageTextures[id].baseTexture.alphaMode = ALPHA_MODES.NO_PREMULTIPLIED_ALPHA;\n                pageTextures[id].baseTexture.mipmap = MIPMAP_MODES.OFF;\n            }\n        }\n\n        // parse letters\n        for (let i = 0; i < data.char.length; i++)\n        {\n            const { id, page } = data.char[i];\n            let { x, y, width, height, xoffset, yoffset, xadvance } = data.char[i];\n\n            x /= res;\n            y /= res;\n            width /= res;\n            height /= res;\n            xoffset /= res;\n            yoffset /= res;\n            xadvance /= res;\n\n            const rect = new Rectangle(\n                x + (pageTextures[page].frame.x / res),\n                y + (pageTextures[page].frame.y / res),\n                width,\n                height\n            );\n\n            this.chars[id] = {\n                xOffset: xoffset,\n                yOffset: yoffset,\n                xAdvance: xadvance,\n                kerning: {},\n                texture: new Texture(\n                    pageTextures[page].baseTexture,\n                    rect\n                ),\n                page,\n            };\n        }\n\n        // parse kernings\n        for (let i = 0; i < data.kerning.length; i++)\n        {\n            let { first, second, amount } = data.kerning[i];\n\n            first /= res;\n            second /= res;\n            amount /= res;\n\n            if (this.chars[second])\n            {\n                this.chars[second].kerning[first] = amount;\n            }\n        }\n\n        // Store distance field information\n        this.distanceFieldRange = distanceField?.distanceRange;\n        this.distanceFieldType = distanceField?.fieldType?.toLowerCase() ?? 'none';\n    }\n\n    /** Remove references to created glyph textures. */\n    public destroy(): void\n    {\n        for (const id in this.chars)\n        {\n            this.chars[id].texture.destroy();\n            this.chars[id].texture = null;\n        }\n\n        for (const id in this.pageTextures)\n        {\n            if (this._ownsTextures)\n            {\n                this.pageTextures[id].destroy(true);\n            }\n\n            this.pageTextures[id] = null;\n        }\n\n        // Set readonly null.\n        (this as any).chars = null;\n        (this as any).pageTextures = null;\n    }\n\n    /**\n     * Register a new bitmap font.\n     * @param data - The\n     *        characters map that could be provided as xml or raw string.\n     * @param textures - List of textures for each page.\n     * @param ownsTextures - Set to `true` to destroy page textures\n     *        when the font is uninstalled. By default fonts created with\n     *        `BitmapFont.from` or from the `BitmapFontLoader` are `true`.\n     * @returns {PIXI.BitmapFont} Result font object with font, size, lineHeight\n     *         and char fields.\n     */\n    public static install(\n        data: string | XMLDocument | BitmapFontData,\n        textures: Texture | Texture[] | utils.Dict<Texture>,\n        ownsTextures?: boolean\n    ): BitmapFont\n    {\n        let fontData;\n\n        if (data instanceof BitmapFontData)\n        {\n            fontData = data;\n        }\n        else\n        {\n            const format = autoDetectFormat(data);\n\n            if (!format)\n            {\n                throw new Error('Unrecognized data format for font.');\n            }\n\n            fontData = format.parse(data as any);\n        }\n\n        // Single texture, convert to list\n        if (textures instanceof Texture)\n        {\n            textures = [textures];\n        }\n\n        const font = new BitmapFont(fontData, textures, ownsTextures);\n\n        BitmapFont.available[font.font] = font;\n\n        return font;\n    }\n\n    /**\n     * Remove bitmap font by name.\n     * @param name - Name of the font to uninstall.\n     */\n    public static uninstall(name: string): void\n    {\n        const font = BitmapFont.available[name];\n\n        if (!font)\n        {\n            throw new Error(`No font found named '${name}'`);\n        }\n\n        font.destroy();\n        delete BitmapFont.available[name];\n    }\n\n    /**\n     * Generates a bitmap-font for the given style and character set. This does not support\n     * kernings yet. With `style` properties, only the following non-layout properties are used:\n     *\n     * - {@link PIXI.TextStyle#dropShadow|dropShadow}\n     * - {@link PIXI.TextStyle#dropShadowDistance|dropShadowDistance}\n     * - {@link PIXI.TextStyle#dropShadowColor|dropShadowColor}\n     * - {@link PIXI.TextStyle#dropShadowBlur|dropShadowBlur}\n     * - {@link PIXI.TextStyle#dropShadowAngle|dropShadowAngle}\n     * - {@link PIXI.TextStyle#fill|fill}\n     * - {@link PIXI.TextStyle#fillGradientStops|fillGradientStops}\n     * - {@link PIXI.TextStyle#fillGradientType|fillGradientType}\n     * - {@link PIXI.TextStyle#fontFamily|fontFamily}\n     * - {@link PIXI.TextStyle#fontSize|fontSize}\n     * - {@link PIXI.TextStyle#fontVariant|fontVariant}\n     * - {@link PIXI.TextStyle#fontWeight|fontWeight}\n     * - {@link PIXI.TextStyle#lineJoin|lineJoin}\n     * - {@link PIXI.TextStyle#miterLimit|miterLimit}\n     * - {@link PIXI.TextStyle#stroke|stroke}\n     * - {@link PIXI.TextStyle#strokeThickness|strokeThickness}\n     * - {@link PIXI.TextStyle#textBaseline|textBaseline}\n     * @param name - The name of the custom font to use with BitmapText.\n     * @param textStyle - Style options to render with BitmapFont.\n     * @param options - Setup options for font or name of the font.\n     * @returns Font generated by style options.\n     * @example\n     * import { BitmapFont, BitmapText } from 'pixijs/browser';\n     *\n     * BitmapFont.from('TitleFont', {\n     *     fontFamily: 'Arial',\n     *     fontSize: 12,\n     *     strokeThickness: 2,\n     *     fill: 'purple',\n     * });\n     *\n     * const title = new BitmapText('This is the title', { fontName: 'TitleFont' });\n     */\n    public static from(name: string, textStyle?: TextStyle | Partial<ITextStyle>, options?: IBitmapFontOptions): BitmapFont\n    {\n        if (!name)\n        {\n            throw new Error('[BitmapFont] Property `name` is required.');\n        }\n\n        const {\n            chars,\n            padding,\n            resolution,\n            textureWidth,\n            textureHeight,\n            ...baseOptions\n        } = Object.assign({}, BitmapFont.defaultOptions, options);\n\n        const charsList = resolveCharacters(chars);\n        const style = textStyle instanceof TextStyle ? textStyle : new TextStyle(textStyle);\n        const lineWidth = textureWidth;\n        const fontData = new BitmapFontData();\n\n        fontData.info[0] = {\n            face: style.fontFamily as string,\n            size: style.fontSize as number,\n        };\n        fontData.common[0] = {\n            lineHeight: style.fontSize as number,\n        };\n\n        let positionX = 0;\n        let positionY = 0;\n\n        let canvas: ICanvas;\n        let context: ICanvasRenderingContext2D;\n        let baseTexture: BaseTexture;\n        let maxCharHeight = 0;\n        const baseTextures: BaseTexture[] = [];\n        const textures: Texture[] = [];\n\n        for (let i = 0; i < charsList.length; i++)\n        {\n            if (!canvas)\n            {\n                canvas = settings.ADAPTER.createCanvas();\n                canvas.width = textureWidth;\n                canvas.height = textureHeight;\n\n                context = canvas.getContext('2d');\n                baseTexture = new BaseTexture(canvas, { resolution, ...baseOptions });\n\n                baseTextures.push(baseTexture);\n                textures.push(new Texture(baseTexture));\n\n                fontData.page.push({\n                    id: textures.length - 1,\n                    file: '',\n                });\n            }\n\n            // Measure glyph dimensions\n            const character = charsList[i];\n            const metrics = TextMetrics.measureText(character, style, false, canvas);\n            const width = metrics.width;\n            const height = Math.ceil(metrics.height);\n\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            // Can't fit char anymore: next canvas please!\n            if (positionY >= textureHeight - (height * resolution))\n            {\n                if (positionY === 0)\n                {\n                    // We don't want user debugging an infinite loop (or do we? :)\n                    throw new Error(`[BitmapFont] textureHeight ${textureHeight}px is too small `\n                        + `(fontFamily: '${style.fontFamily}', fontSize: ${style.fontSize}px, char: '${character}')`);\n                }\n\n                --i;\n\n                // Create new atlas once current has filled up\n                canvas = null;\n                context = null;\n                baseTexture = null;\n                positionY = 0;\n                positionX = 0;\n                maxCharHeight = 0;\n\n                continue;\n            }\n\n            maxCharHeight = Math.max(height + metrics.fontProperties.descent, maxCharHeight);\n\n            // Wrap line once full row has been rendered\n            if ((textureGlyphWidth * resolution) + positionX >= lineWidth)\n            {\n                if (positionX === 0)\n                {\n                    // Avoid infinite loop (There can be some very wide char like '\\uFDFD'!)\n                    throw new Error(`[BitmapFont] textureWidth ${textureWidth}px is too small `\n                        + `(fontFamily: '${style.fontFamily}', fontSize: ${style.fontSize}px, char: '${character}')`);\n                }\n\n                --i;\n                positionY += maxCharHeight * resolution;\n                positionY = Math.ceil(positionY);\n                positionX = 0;\n                maxCharHeight = 0;\n\n                continue;\n            }\n\n            drawGlyph(canvas, context, metrics, positionX, positionY, resolution, style);\n\n            // Unique (numeric) ID mapping to this glyph\n            const id = extractCharCode(metrics.text);\n\n            // Create a texture holding just the glyph\n            fontData.char.push({\n                id,\n                page: textures.length - 1,\n                x: positionX / resolution,\n                y: positionY / resolution,\n                width: textureGlyphWidth,\n                height,\n                xoffset: 0,\n                yoffset: 0,\n                xadvance: width\n                        - (style.dropShadow ? style.dropShadowDistance : 0)\n                        - (style.stroke ? style.strokeThickness : 0),\n            });\n\n            positionX += (textureGlyphWidth + (2 * padding)) * resolution;\n            positionX = Math.ceil(positionX);\n        }\n\n        // Brute-force kerning info, this can be expensive b/c it's an O(n²),\n        // but we're using measureText which is native and fast.\n        for (let i = 0, len = charsList.length; i < len; i++)\n        {\n            const first = charsList[i];\n\n            for (let j = 0; j < len; j++)\n            {\n                const second = charsList[j];\n                const c1 = context.measureText(first).width;\n                const c2 = context.measureText(second).width;\n                const total = context.measureText(first + second).width;\n                const amount = total - (c1 + c2);\n\n                if (amount)\n                {\n                    fontData.kerning.push({\n                        first: extractCharCode(first),\n                        second: extractCharCode(second),\n                        amount,\n                    });\n                }\n            }\n        }\n\n        const font = new BitmapFont(fontData, textures, true);\n\n        // Make it easier to replace a font\n        if (BitmapFont.available[name] !== undefined)\n        {\n            BitmapFont.uninstall(name);\n        }\n\n        BitmapFont.available[name] = font;\n\n        return font;\n    }\n}\n"],"names":[],"mappings":"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"}