{"version":3,"file":"loadBitmapFont.mjs","sources":["../../../../src/scene/text-bitmap/asset/loadBitmapFont.ts"],"sourcesContent":["import { LoaderParserPriority } from '../../../assets/loader/parsers/LoaderParser';\nimport { copySearchParams } from '../../../assets/utils/copySearchParams';\nimport { DOMAdapter } from '../../../environment/adapter';\nimport { ExtensionType } from '../../../extensions/Extensions';\nimport { path } from '../../../utils/path';\nimport { bitmapFontTextParser } from './bitmapFontTextParser';\nimport { bitmapFontXMLStringParser } from './bitmapFontXMLStringParser';\n\nimport type { CacheParser } from '../../../assets/cache/CacheParser';\nimport type { Loader } from '../../../assets/loader/Loader';\nimport type { LoaderParserAdvanced } from '../../../assets/loader/parsers/LoaderParser';\nimport type { ResolvedAsset } from '../../../assets/types';\nimport type { Texture } from '../../../rendering/renderers/shared/texture/Texture';\nimport type { BitmapFont } from '../BitmapFont';\n\nconst validExtensions = ['.xml', '.fnt'];\n\n/**\n * simple loader plugin for loading in bitmap fonts!\n * @category assets\n * @internal\n */\nexport const bitmapFontCachePlugin = {\n    extension: {\n        type: ExtensionType.CacheParser,\n        name: 'cacheBitmapFont',\n    },\n    test: (asset: BitmapFont) =>\n        !!asset?.pages && !!asset?.chars && typeof asset?.fontFamily === 'string' && asset.fontFamily !== '',\n    getCacheableAssets(keys: string[], asset: BitmapFont)\n    {\n        const out: Record<string, BitmapFont> = {};\n\n        keys.forEach((key) =>\n        {\n            out[key] = asset;\n            out[`${key}-bitmap`] = asset;\n        });\n\n        out[`${asset.fontFamily}-bitmap`] = asset;\n\n        return out;\n    }\n} satisfies CacheParser<BitmapFont>;\n\n/**\n * Loader plugin for loading bitmap fonts.\n * It supports both XML and text formats, and can handle distance field fonts.\n * @category assets\n * @advanced\n */\nexport const loadBitmapFont = {\n    extension: {\n        type: ExtensionType.LoadParser,\n        priority: LoaderParserPriority.Normal,\n    },\n\n    /** used for deprecation purposes */\n    name: 'loadBitmapFont',\n    id: 'bitmap-font',\n\n    test(url: string): boolean\n    {\n        return validExtensions.includes(path.extname(url).toLowerCase());\n    },\n\n    async testParse(data: string): Promise<boolean>\n    {\n        return bitmapFontTextParser.test(data) || bitmapFontXMLStringParser.test(data);\n    },\n\n    async parse(asset: string, data: ResolvedAsset, loader: Loader): Promise<BitmapFont>\n    {\n        const bitmapFontData = bitmapFontTextParser.test(asset)\n            ? bitmapFontTextParser.parse(asset)\n            : bitmapFontXMLStringParser.parse(asset);\n\n        const { src } = data;\n        const { pages } = bitmapFontData;\n        const textureUrls = [];\n\n        // if we have a distance field - we can assume this is a signed distance field font\n        // and we should use force linear filtering and no alpha premultiply\n        const textureOptions = (bitmapFontData.distanceField) ? {\n            scaleMode: 'linear',\n            alphaMode: 'premultiply-alpha-on-upload',\n            autoGenerateMipmaps: false,\n            resolution: 1,\n        } : {};\n\n        for (let i = 0; i < pages.length; ++i)\n        {\n            const pageFile = pages[i].file;\n            let imagePath = path.join(path.dirname(src), pageFile);\n\n            imagePath = copySearchParams(imagePath, src);\n\n            textureUrls.push({\n                src: imagePath,\n                data: textureOptions\n            });\n        }\n\n        const [loadedTextures, { BitmapFont }] = await Promise.all([\n            loader.load<Texture>(textureUrls),\n            import('../BitmapFont'),\n        ]);\n        const textures = textureUrls.map((url) => loadedTextures[url.src]);\n\n        const bitmapFont = new BitmapFont({\n            data: bitmapFontData,\n            textures\n        }, src);\n\n        return bitmapFont;\n    },\n\n    async load(url: string, _options: ResolvedAsset): Promise<string>\n    {\n        const response = await DOMAdapter.get().fetch(url);\n\n        return await response.text();\n    },\n\n    async unload(bitmapFont: BitmapFont, _resolvedAsset, loader): Promise<void>\n    {\n        await Promise.all(bitmapFont.pages.map((page) => loader.unload(page.texture.source._sourceOrigin)));\n\n        bitmapFont.destroy();\n    }\n} satisfies LoaderParserAdvanced<string, BitmapFont, BitmapFont>;\n"],"names":[],"mappings":"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"}