{"version":3,"file":"BitmapFont.mjs","sources":["../../../src/scene/text-bitmap/BitmapFont.ts"],"sourcesContent":["import { groupD8 } from '../../maths/matrix/groupD8';\nimport { Rectangle } from '../../maths/shapes/Rectangle';\nimport { Texture } from '../../rendering/renderers/shared/texture/Texture';\nimport { AbstractBitmapFont } from './AbstractBitmapFont';\nimport { BitmapFontManager } from './BitmapFontManager';\n\nimport type { FontMetrics } from '../text/canvas/utils/types';\nimport type { BitmapFontData } from './AbstractBitmapFont';\nimport type { BitmapFontInstallOptions } from './BitmapFontManager';\n\n/**\n * Options for creating a BitmapFont. Used when loading or creating bitmap fonts from existing textures and data.\n * @example\n * ```ts\n * import { BitmapFont, Texture } from 'pixi.js';\n *\n * // Create a bitmap font from loaded textures and data\n * const font = new BitmapFont({\n *     // Font data containing character metrics and layout info\n *     data: {\n *         pages: [{ id: 0, file: 'font.png' }],\n *         chars: {\n *             'A': {\n *                 id: 65,\n *                 page: 0,\n *                 x: 0,\n *                 y: 0,\n *                 width: 32,\n *                 height: 32,\n *                 xOffset: 0,\n *                 yOffset: 0,\n *                 xAdvance: 32,\n *                 letter: 'A'\n *             }\n *             // ... other characters\n *         },\n *         fontSize: 32,\n *         lineHeight: 36,\n *         baseLineOffset: 26,\n *         fontFamily: 'MyFont',\n *         // Optional distance field info for MSDF/SDF fonts\n *         distanceField: {\n *             type: 'msdf',\n *             range: 4\n *         }\n *     },\n *     // Array of textures containing the font glyphs\n *     textures: [\n *         Texture.from('font.png')\n *     ]\n * });\n * ```\n * @category text\n * @standard\n */\nexport interface BitmapFontOptions\n{\n    /**\n     * The bitmap font data containing character metrics, layout information,\n     * and font properties. This includes character positions, dimensions,\n     * kerning data, and general font settings.\n     */\n    data: BitmapFontData;\n\n    /**\n     * Array of textures containing the font glyphs. Each texture corresponds\n     * to a page in the font data. For simple fonts this is typically just\n     * one texture, but complex fonts may split glyphs across multiple textures.\n     */\n    textures: Texture[];\n}\n\n/**\n * A BitmapFont object represents a particular font face, size, and style.\n * This class handles both pre-loaded bitmap fonts and dynamically generated ones.\n * @example\n * ```ts\n * import { BitmapFont, Texture } from 'pixi.js';\n *\n * // Create a bitmap font from loaded textures and data\n * const font = new BitmapFont({\n *     data: {\n *         pages: [{ id: 0, file: 'font.png' }],\n *         chars: {\n *             'A': {\n *                 id: 65,\n *                 page: 0,\n *                 x: 0,\n *                 y: 0,\n *                 width: 32,\n *                 height: 32,\n *                 xOffset: 0,\n *                 yOffset: 0,\n *                 xAdvance: 32,\n *                 letter: 'A'\n *             }\n *         },\n *         fontSize: 32,\n *         lineHeight: 36,\n *         baseLineOffset: 26,\n *         fontFamily: 'MyFont',\n *         distanceField: {\n *             type: 'msdf',\n *             range: 4\n *         }\n *     },\n *     textures: [Texture.from('font.png')]\n * });\n *\n * // Install a font for global use\n * BitmapFont.install({\n *     name: 'MyCustomFont',\n *     style: {\n *         fontFamily: 'Arial',\n *         fontSize: 32,\n *         fill: '#ffffff',\n *         stroke: { color: '#000000', width: 2 }\n *     }\n * });\n *\n * // Uninstall when no longer needed\n * BitmapFont.uninstall('MyCustomFont');\n * ```\n * @category text\n * @standard\n */\nexport class BitmapFont extends AbstractBitmapFont<BitmapFont>\n{\n    /**\n     * The URL from which the font was loaded, if applicable.\n     * This is useful for tracking font sources and reloading.\n     * @example\n     * ```ts\n     * console.log(font.url); // 'fonts/myFont.fnt'\n     * ```\n     */\n    public url?: string;\n\n    constructor(options: BitmapFontOptions, url?: string)\n    {\n        super();\n\n        const { textures, data } = options;\n\n        Object.keys(data.pages).forEach((key: string) =>\n        {\n            const pageData = data.pages[parseInt(key, 10)];\n\n            const texture = textures[pageData.id];\n\n            this.pages.push({ texture });\n        });\n\n        Object.keys(data.chars).forEach((key: string) =>\n        {\n            const charData = data.chars[key];\n            const {\n                frame: textureFrame,\n                source: textureSource,\n                rotate: textureRotate,\n            } = textures[charData.page];\n\n            // Transform character coordinates based on texture rotation\n            const frame = groupD8.transformRectCoords(\n                charData,\n                textureFrame,\n                textureRotate,\n                new Rectangle()\n            );\n\n            const texture = new Texture({\n                frame,\n                orig: new Rectangle(0, 0, charData.width, charData.height),\n                source: textureSource,\n                rotate: textureRotate,\n            });\n\n            this.chars[key] = {\n                id: key.codePointAt(0),\n                xOffset: charData.xOffset,\n                yOffset: charData.yOffset,\n                xAdvance: charData.xAdvance,\n                kerning: charData.kerning ?? {},\n                texture,\n            };\n        });\n\n        this.baseRenderedFontSize = data.fontSize;\n\n        (this.baseMeasurementFontSize as number) = data.fontSize;\n        (this.fontMetrics as FontMetrics) = {\n            ascent: 0,\n            descent: 0,\n            fontSize: data.fontSize,\n        };\n        (this.baseLineOffset as number) = data.baseLineOffset;\n        (this.lineHeight as number) = data.lineHeight;\n        (this.fontFamily as string) = data.fontFamily;\n        (this.distanceField as { type: string, range: number }) = data.distanceField ?? {\n            type: 'none',\n            range: 0,\n        };\n\n        this.url = url;\n    }\n\n    /** Destroys the BitmapFont object. */\n    public override destroy(): void\n    {\n        super.destroy();\n\n        for (let i = 0; i < this.pages.length; i++)\n        {\n            const { texture } = this.pages[i];\n\n            texture.destroy(true);\n        }\n\n        (this.pages as null) = null;\n    }\n\n    /**\n     * Generates and installs a bitmap font with the specified options.\n     * The font will be cached and available for use in BitmapText objects.\n     * @param options - Setup options for font generation\n     * @returns Installed font instance\n     * @example\n     * ```ts\n     * // Install a basic font\n     * BitmapFont.install({\n     *     name: 'Title',\n     *     style: {\n     *         fontFamily: 'Arial',\n     *         fontSize: 32,\n     *         fill: '#ffffff'\n     *     }\n     * });\n     *\n     * // Install with advanced options\n     * BitmapFont.install({\n     *     name: 'Custom',\n     *     style: {\n     *         fontFamily: 'Arial',\n     *         fontSize: 24,\n     *         fill: '#00ff00',\n     *         stroke: { color: '#000000', width: 2 }\n     *     },\n     *     chars: [['a', 'z'], ['A', 'Z'], ['0', '9']],\n     *     resolution: 2,\n     *     padding: 4,\n     *     textureStyle: {\n     *         scaleMode: 'nearest'\n     *     }\n     * });\n     * ```\n     */\n    public static install(options: BitmapFontInstallOptions)\n    {\n        BitmapFontManager.install(options);\n    }\n    /**\n     * Uninstalls a bitmap font from the cache.\n     * This frees up memory and resources associated with the font.\n     * @param name - The name of the bitmap font to uninstall\n     * @example\n     * ```ts\n     * // Remove a font when it's no longer needed\n     * BitmapFont.uninstall('MyCustomFont');\n     *\n     * // Clear multiple fonts\n     * ['Title', 'Heading', 'Body'].forEach(BitmapFont.uninstall);\n     * ```\n     */\n    public static uninstall(name: string)\n    {\n        BitmapFontManager.uninstall(name);\n    }\n}\n"],"names":[],"mappings":";;;;;;;AA8HO,MAAM,mBAAmB,kBAAA,CAChC;AAAA,EAWI,WAAA,CAAY,SAA4B,GAAA,EACxC;AACI,IAAA,KAAA,EAAM;AAEN,IAAA,MAAM,EAAE,QAAA,EAAU,IAAA,EAAK,GAAI,OAAA;AAE3B,IAAA,MAAA,CAAO,KAAK,IAAA,CAAK,KAAK,CAAA,CAAE,OAAA,CAAQ,CAAC,GAAA,KACjC;AACI,MAAA,MAAM,WAAW,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,GAAA,EAAK,EAAE,CAAC,CAAA;AAE7C,MAAA,MAAM,OAAA,GAAU,QAAA,CAAS,QAAA,CAAS,EAAE,CAAA;AAEpC,MAAA,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,EAAE,OAAA,EAAS,CAAA;AAAA,IAC/B,CAAC,CAAA;AAED,IAAA,MAAA,CAAO,KAAK,IAAA,CAAK,KAAK,CAAA,CAAE,OAAA,CAAQ,CAAC,GAAA,KACjC;AACI,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC/B,MAAA,MAAM;AAAA,QACF,KAAA,EAAO,YAAA;AAAA,QACP,MAAA,EAAQ,aAAA;AAAA,QACR,MAAA,EAAQ;AAAA,OACZ,GAAI,QAAA,CAAS,QAAA,CAAS,IAAI,CAAA;AAG1B,MAAA,MAAM,QAAQ,OAAA,CAAQ,mBAAA;AAAA,QAClB,QAAA;AAAA,QACA,YAAA;AAAA,QACA,aAAA;AAAA,QACA,IAAI,SAAA;AAAU,OAClB;AAEA,MAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAQ;AAAA,QACxB,KAAA;AAAA,QACA,IAAA,EAAM,IAAI,SAAA,CAAU,CAAA,EAAG,GAAG,QAAA,CAAS,KAAA,EAAO,SAAS,MAAM,CAAA;AAAA,QACzD,MAAA,EAAQ,aAAA;AAAA,QACR,MAAA,EAAQ;AAAA,OACX,CAAA;AAED,MAAA,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,GAAI;AAAA,QACd,EAAA,EAAI,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA;AAAA,QACrB,SAAS,QAAA,CAAS,OAAA;AAAA,QAClB,SAAS,QAAA,CAAS,OAAA;AAAA,QAClB,UAAU,QAAA,CAAS,QAAA;AAAA,QACnB,OAAA,EAAS,QAAA,CAAS,OAAA,IAAW,EAAC;AAAA,QAC9B;AAAA,OACJ;AAAA,IACJ,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,uBAAuB,IAAA,CAAK,QAAA;AAEjC,IAAC,IAAA,CAAK,0BAAqC,IAAA,CAAK,QAAA;AAChD,IAAC,KAAK,WAAA,GAA8B;AAAA,MAChC,MAAA,EAAQ,CAAA;AAAA,MACR,OAAA,EAAS,CAAA;AAAA,MACT,UAAU,IAAA,CAAK;AAAA,KACnB;AACA,IAAC,IAAA,CAAK,iBAA4B,IAAA,CAAK,cAAA;AACvC,IAAC,IAAA,CAAK,aAAwB,IAAA,CAAK,UAAA;AACnC,IAAC,IAAA,CAAK,aAAwB,IAAA,CAAK,UAAA;AACnC,IAAC,IAAA,CAAK,aAAA,GAAoD,IAAA,CAAK,aAAA,IAAiB;AAAA,MAC5E,IAAA,EAAM,MAAA;AAAA,MACN,KAAA,EAAO;AAAA,KACX;AAEA,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AAAA,EACf;AAAA;AAAA,EAGgB,OAAA,GAChB;AACI,IAAA,KAAA,CAAM,OAAA,EAAQ;AAEd,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA,EAAA,EACvC;AACI,MAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,IAAA,CAAK,MAAM,CAAC,CAAA;AAEhC,MAAA,OAAA,CAAQ,QAAQ,IAAI,CAAA;AAAA,IACxB;AAEA,IAAC,KAAK,KAAA,GAAiB,IAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqCA,OAAc,QAAQ,OAAA,EACtB;AACI,IAAA,iBAAA,CAAkB,QAAQ,OAAO,CAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,OAAc,UAAU,IAAA,EACxB;AACI,IAAA,iBAAA,CAAkB,UAAU,IAAI,CAAA;AAAA,EACpC;AACJ;;;;"}