{"version":3,"file":"BitmapText.mjs","sources":["../src/BitmapText.ts"],"sourcesContent":["import { BLEND_MODES, ObservablePoint, Point, Program, settings, Texture, utils } from 'pixijs/core';\nimport { Container } from 'pixijs/display';\nimport { Mesh, MeshGeometry, MeshMaterial } from 'pixijs/mesh';\nimport { BitmapFont } from './BitmapFont';\nimport msdfFrag from './shader/msdf.frag';\nimport msdfVert from './shader/msdf.vert';\nimport { extractCharCode, splitTextToCharacters } from './utils';\n\nimport type { Rectangle, Renderer } from 'pixijs/core';\nimport type { IDestroyOptions } from 'pixijs/display';\nimport type { TextStyleAlign } from 'pixijs/text';\nimport type { IBitmapTextStyle } from './BitmapTextStyle';\n\ninterface PageMeshData\n{\n    index: number;\n    indexCount: number;\n    vertexCount: number;\n    uvsCount: number;\n    total: number;\n    mesh: Mesh;\n    vertices?: Float32Array;\n    uvs?: Float32Array;\n    indices?: Uint16Array;\n}\ninterface CharRenderData\n{\n    texture: Texture;\n    line: number;\n    charCode: number;\n    position: Point;\n    prevSpaces: number;\n}\n\n// If we ever need more than two pools, please make a Dict or something better.\nconst pageMeshDataDefaultPageMeshData: PageMeshData[] = [];\nconst pageMeshDataMSDFPageMeshData: PageMeshData[] = [];\nconst charRenderDataPool: CharRenderData[] = [];\n\n/**\n * A BitmapText object will create a line or multiple lines of text using bitmap font.\n *\n * The primary advantage of this class over Text is that all of your textures are pre-generated and loading,\n * meaning that rendering is fast, and changing text has no performance implications.\n *\n * Supporting character sets other than latin, such as CJK languages, may be impractical due to the number of characters.\n *\n * To split a line you can use '\\n', '\\r' or '\\r\\n' in your string.\n *\n * PixiJS can auto-generate fonts on-the-fly using BitmapFont or use fnt files provided by:\n * http://www.angelcode.com/products/bmfont/ for Windows or\n * http://www.bmglyph.com/ for Mac.\n *\n * You can also use SDF, MSDF and MTSDF BitmapFonts for vector-like scaling appearance provided by:\n * https://github.com/soimy/msdf-bmfont-xml for SDF and MSDF fnt files or\n * https://github.com/Chlumsky/msdf-atlas-gen for SDF, MSDF and MTSDF json files\n *\n * A BitmapText can only be created when the font is loaded.\n * @example\n * import { BitmapText } from 'pixijs/browser';\n *\n * // in this case the font is in a file called 'desyrel.fnt'\n * const bitmapText = new BitmapText('text using a fancy font!', {\n *     fontName: 'Desyrel',\n *     fontSize: 35,\n *     align: 'right',\n * });\n * @memberof PIXI\n */\nexport class BitmapText extends Container\n{\n    public static styleDefaults: Partial<IBitmapTextStyle> = {\n        align: 'left',\n        tint: 0xFFFFFF,\n        maxWidth: 0,\n        letterSpacing: 0,\n    };\n\n    /** Set to `true` if the BitmapText needs to be redrawn. */\n    public dirty: boolean;\n\n    /**\n     * The resolution / device pixel ratio of the canvas.\n     *\n     * This is set to automatically match the renderer resolution by default, but can be overridden by setting manually.\n     * @default PIXI.settings.RESOLUTION\n     */\n    _resolution: number;\n    _autoResolution: boolean;\n\n    /**\n     * Private tracker for the width of the overall text.\n     * @private\n     */\n    protected _textWidth: number;\n\n    /**\n     * Private tracker for the height of the overall text.\n     * @private\n     */\n    protected _textHeight: number;\n\n    /**\n     * Private tracker for the current text.\n     * @private\n     */\n    protected _text: string;\n\n    /**\n     * The max width of this bitmap text in pixels. If the text provided is longer than the\n     * value provided, line breaks will be automatically inserted in the last whitespace.\n     * Disable by setting value to 0\n     * @private\n     */\n    protected _maxWidth: number;\n\n    /**\n     * The max line height. This is useful when trying to use the total height of the Text,\n     * ie: when trying to vertically align. (Internally used)\n     * @private\n     */\n    protected _maxLineHeight: number;\n\n    /**\n     * Letter spacing. This is useful for setting the space between characters.\n     * @private\n     */\n    protected _letterSpacing: number;\n\n    /**\n     * Text anchor.\n     * @readonly\n     * @private\n     */\n    protected _anchor: ObservablePoint;\n\n    /**\n     * Private tracker for the current font.\n     * @private\n     */\n    protected _font?: BitmapFont;\n\n    /**\n     * Private tracker for the current font name.\n     * @private\n     */\n    protected _fontName: string;\n\n    /**\n     * Private tracker for the current font size.\n     * @private\n     */\n    protected _fontSize?: number;\n\n    /**\n     * Private tracker for the current text align.\n     * @type {string}\n     * @private\n     */\n    protected _align: TextStyleAlign;\n\n    /** Collection of page mesh data. */\n    protected _activePagesMeshData: PageMeshData[];\n\n    /**\n     * Private tracker for the current tint.\n     * @private\n     */\n    protected _tint = 0xFFFFFF;\n\n    /**\n     * If true PixiJS will Math.floor() x/y values when rendering.\n     * @default PIXI.settings.ROUND_PIXELS\n     */\n    protected _roundPixels: boolean;\n\n    /** Cached char texture is destroyed when BitmapText is destroyed. */\n    private _textureCache: Record<number, Texture>;\n\n    /**\n     * @param text - A string that you would like the text to display.\n     * @param style - The style parameters.\n     * @param {string} style.fontName - The installed BitmapFont name.\n     * @param {number} [style.fontSize] - The size of the font in pixels, e.g. 24. If undefined,\n     *.     this will default to the BitmapFont size.\n     * @param {string} [style.align='left'] - Alignment for multiline text ('left', 'center', 'right' or 'justify'),\n     *      does not affect single line text.\n     * @param {number} [style.tint=0xFFFFFF] - The tint color.\n     * @param {number} [style.letterSpacing=0] - The amount of spacing between letters.\n     * @param {number} [style.maxWidth=0] - The max width of the text before line wrapping.\n     */\n    constructor(text: string, style: Partial<IBitmapTextStyle> = {})\n    {\n        super();\n\n        // Apply the defaults\n        const { align, tint, maxWidth, letterSpacing, fontName, fontSize } = Object.assign(\n            {}, BitmapText.styleDefaults, style);\n\n        if (!BitmapFont.available[fontName])\n        {\n            throw new Error(`Missing BitmapFont \"${fontName}\"`);\n        }\n\n        this._activePagesMeshData = [];\n        this._textWidth = 0;\n        this._textHeight = 0;\n        this._align = align;\n        this._tint = tint;\n        this._font = undefined;\n        this._fontName = fontName;\n        this._fontSize = fontSize;\n        this.text = text;\n        this._maxWidth = maxWidth;\n        this._maxLineHeight = 0;\n        this._letterSpacing = letterSpacing;\n        this._anchor = new ObservablePoint((): void => { this.dirty = true; }, this, 0, 0);\n        this._roundPixels = settings.ROUND_PIXELS;\n        this.dirty = true;\n        this._resolution = settings.RESOLUTION;\n        this._autoResolution = true;\n        this._textureCache = {};\n    }\n\n    /** Renders text and updates it when needed. This should only be called if the BitmapFont is regenerated. */\n    public updateText(): void\n    {\n        const data = BitmapFont.available[this._fontName];\n        const fontSize = this.fontSize;\n        const scale = fontSize / data.size;\n        const pos = new Point();\n        const chars: CharRenderData[] = [];\n        const lineWidths = [];\n        const lineSpaces = [];\n        const text = this._text.replace(/(?:\\r\\n|\\r)/g, '\\n') || ' ';\n        const charsInput = splitTextToCharacters(text);\n        const maxWidth = this._maxWidth * data.size / fontSize;\n        const pageMeshDataPool = data.distanceFieldType === 'none'\n            ? pageMeshDataDefaultPageMeshData : pageMeshDataMSDFPageMeshData;\n\n        let prevCharCode = null;\n        let lastLineWidth = 0;\n        let maxLineWidth = 0;\n        let line = 0;\n        let lastBreakPos = -1;\n        let lastBreakWidth = 0;\n        let spacesRemoved = 0;\n        let maxLineHeight = 0;\n        let spaceCount = 0;\n\n        for (let i = 0; i < charsInput.length; i++)\n        {\n            const char = charsInput[i];\n            const charCode = extractCharCode(char);\n\n            if ((/(?:\\s)/).test(char))\n            {\n                lastBreakPos = i;\n                lastBreakWidth = lastLineWidth;\n                spaceCount++;\n            }\n\n            if (char === '\\r' || char === '\\n')\n            {\n                lineWidths.push(lastLineWidth);\n                lineSpaces.push(-1);\n                maxLineWidth = Math.max(maxLineWidth, lastLineWidth);\n                ++line;\n                ++spacesRemoved;\n\n                pos.x = 0;\n                pos.y += data.lineHeight;\n                prevCharCode = null;\n                spaceCount = 0;\n                continue;\n            }\n\n            const charData = data.chars[charCode];\n\n            if (!charData)\n            {\n                continue;\n            }\n\n            if (prevCharCode && charData.kerning[prevCharCode])\n            {\n                pos.x += charData.kerning[prevCharCode];\n            }\n\n            const charRenderData: CharRenderData = charRenderDataPool.pop() || {\n                texture: Texture.EMPTY,\n                line: 0,\n                charCode: 0,\n                prevSpaces: 0,\n                position: new Point(),\n            };\n\n            charRenderData.texture = charData.texture;\n            charRenderData.line = line;\n            charRenderData.charCode = charCode;\n            charRenderData.position.x = Math.round(pos.x + charData.xOffset + (this._letterSpacing / 2));\n            charRenderData.position.y = Math.round(pos.y + charData.yOffset);\n            charRenderData.prevSpaces = spaceCount;\n\n            chars.push(charRenderData);\n\n            lastLineWidth = charRenderData.position.x\n                + Math.max(charData.xAdvance - charData.xOffset, charData.texture.orig.width);\n            pos.x += charData.xAdvance + this._letterSpacing;\n            maxLineHeight = Math.max(maxLineHeight, (charData.yOffset + charData.texture.height));\n            prevCharCode = charCode;\n\n            if (lastBreakPos !== -1 && maxWidth > 0 && pos.x > maxWidth)\n            {\n                ++spacesRemoved;\n                utils.removeItems(chars, 1 + lastBreakPos - spacesRemoved, 1 + i - lastBreakPos);\n                i = lastBreakPos;\n                lastBreakPos = -1;\n\n                lineWidths.push(lastBreakWidth);\n                lineSpaces.push(chars.length > 0 ? chars[chars.length - 1].prevSpaces : 0);\n                maxLineWidth = Math.max(maxLineWidth, lastBreakWidth);\n                line++;\n\n                pos.x = 0;\n                pos.y += data.lineHeight;\n                prevCharCode = null;\n                spaceCount = 0;\n            }\n        }\n\n        const lastChar = charsInput[charsInput.length - 1];\n\n        if (lastChar !== '\\r' && lastChar !== '\\n')\n        {\n            if ((/(?:\\s)/).test(lastChar))\n            {\n                lastLineWidth = lastBreakWidth;\n            }\n\n            lineWidths.push(lastLineWidth);\n            maxLineWidth = Math.max(maxLineWidth, lastLineWidth);\n            lineSpaces.push(-1);\n        }\n\n        const lineAlignOffsets = [];\n\n        for (let i = 0; i <= line; i++)\n        {\n            let alignOffset = 0;\n\n            if (this._align === 'right')\n            {\n                alignOffset = maxLineWidth - lineWidths[i];\n            }\n            else if (this._align === 'center')\n            {\n                alignOffset = (maxLineWidth - lineWidths[i]) / 2;\n            }\n            else if (this._align === 'justify')\n            {\n                alignOffset = lineSpaces[i] < 0 ? 0 : (maxLineWidth - lineWidths[i]) / lineSpaces[i];\n            }\n\n            lineAlignOffsets.push(alignOffset);\n        }\n\n        const lenChars = chars.length;\n\n        const pagesMeshData: Record<number, PageMeshData> = {};\n\n        const newPagesMeshData: PageMeshData[] = [];\n\n        const activePagesMeshData = this._activePagesMeshData;\n\n        pageMeshDataPool.push(...activePagesMeshData);\n\n        for (let i = 0; i < lenChars; i++)\n        {\n            const texture = chars[i].texture;\n            const baseTextureUid = texture.baseTexture.uid;\n\n            if (!pagesMeshData[baseTextureUid])\n            {\n                let pageMeshData = pageMeshDataPool.pop();\n\n                if (!pageMeshData)\n                {\n                    const geometry = new MeshGeometry();\n                    let material: MeshMaterial;\n                    let meshBlendMode: BLEND_MODES;\n\n                    if (data.distanceFieldType === 'none')\n                    {\n                        material = new MeshMaterial(Texture.EMPTY);\n                        meshBlendMode = BLEND_MODES.NORMAL;\n                    }\n                    else\n                    {\n                        material = new MeshMaterial(Texture.EMPTY,\n                            { program: Program.from(msdfVert, msdfFrag), uniforms: { uFWidth: 0 } });\n                        meshBlendMode = BLEND_MODES.NORMAL_NPM;\n                    }\n\n                    const mesh = new Mesh(geometry, material);\n\n                    mesh.blendMode = meshBlendMode;\n\n                    pageMeshData = {\n                        index: 0,\n                        indexCount: 0,\n                        vertexCount: 0,\n                        uvsCount: 0,\n                        total: 0,\n                        mesh,\n                        vertices: null,\n                        uvs: null,\n                        indices: null,\n                    };\n                }\n\n                // reset data..\n                pageMeshData.index = 0;\n                pageMeshData.indexCount = 0;\n                pageMeshData.vertexCount = 0;\n                pageMeshData.uvsCount = 0;\n                pageMeshData.total = 0;\n\n                // TODO need to get page texture here somehow..\n                const { _textureCache } = this;\n\n                _textureCache[baseTextureUid] = _textureCache[baseTextureUid] || new Texture(texture.baseTexture);\n                pageMeshData.mesh.texture = _textureCache[baseTextureUid];\n\n                pageMeshData.mesh.tint = this._tint;\n\n                newPagesMeshData.push(pageMeshData);\n\n                pagesMeshData[baseTextureUid] = pageMeshData;\n            }\n\n            pagesMeshData[baseTextureUid].total++;\n        }\n\n        // lets find any previously active pageMeshDatas that are no longer required for\n        // the updated text (if any), removed and return them to the pool.\n        for (let i = 0; i < activePagesMeshData.length; i++)\n        {\n            if (!newPagesMeshData.includes(activePagesMeshData[i]))\n            {\n                this.removeChild(activePagesMeshData[i].mesh);\n            }\n        }\n\n        // next lets add any new meshes, that have not yet been added to this BitmapText\n        // we only add if its not already a child of this BitmapObject\n        for (let i = 0; i < newPagesMeshData.length; i++)\n        {\n            if (newPagesMeshData[i].mesh.parent !== this)\n            {\n                this.addChild(newPagesMeshData[i].mesh);\n            }\n        }\n\n        // active page mesh datas are set to be the new pages added.\n        this._activePagesMeshData = newPagesMeshData;\n\n        for (const i in pagesMeshData)\n        {\n            const pageMeshData = pagesMeshData[i];\n            const total = pageMeshData.total;\n\n            // lets only allocate new buffers if we can fit the new text in the current ones..\n            // unless that is, we will be batching. Currently batching dose not respect the size property of mesh\n            if (!(pageMeshData.indices?.length > 6 * total) || pageMeshData.vertices.length < Mesh.BATCHABLE_SIZE * 2)\n            {\n                pageMeshData.vertices = new Float32Array(4 * 2 * total);\n                pageMeshData.uvs = new Float32Array(4 * 2 * total);\n                pageMeshData.indices = new Uint16Array(6 * total);\n            }\n            else\n            {\n                const total = pageMeshData.total;\n                const vertices = pageMeshData.vertices;\n\n                // Clear the garbage at the end of the vertices buffer. This will prevent the bounds miscalculation.\n                for (let i = total * 4 * 2; i < vertices.length; i++)\n                {\n                    vertices[i] = 0;\n                }\n            }\n\n            // as a buffer maybe bigger than the current word, we set the size of the meshMaterial\n            // to match the number of letters needed\n            pageMeshData.mesh.size = 6 * total;\n        }\n\n        for (let i = 0; i < lenChars; i++)\n        {\n            const char = chars[i];\n            let offset = char.position.x + (lineAlignOffsets[char.line] * (this._align === 'justify' ? char.prevSpaces : 1));\n\n            if (this._roundPixels)\n            {\n                offset = Math.round(offset);\n            }\n\n            const xPos = offset * scale;\n            const yPos = char.position.y * scale;\n            const texture = char.texture;\n\n            const pageMesh = pagesMeshData[texture.baseTexture.uid];\n\n            const textureFrame = texture.frame;\n            const textureUvs = texture._uvs;\n\n            const index = pageMesh.index++;\n\n            pageMesh.indices[(index * 6) + 0] = 0 + (index * 4);\n            pageMesh.indices[(index * 6) + 1] = 1 + (index * 4);\n            pageMesh.indices[(index * 6) + 2] = 2 + (index * 4);\n            pageMesh.indices[(index * 6) + 3] = 0 + (index * 4);\n            pageMesh.indices[(index * 6) + 4] = 2 + (index * 4);\n            pageMesh.indices[(index * 6) + 5] = 3 + (index * 4);\n\n            pageMesh.vertices[(index * 8) + 0] = xPos;\n            pageMesh.vertices[(index * 8) + 1] = yPos;\n\n            pageMesh.vertices[(index * 8) + 2] = xPos + (textureFrame.width * scale);\n            pageMesh.vertices[(index * 8) + 3] = yPos;\n\n            pageMesh.vertices[(index * 8) + 4] = xPos + (textureFrame.width * scale);\n            pageMesh.vertices[(index * 8) + 5] = yPos + (textureFrame.height * scale);\n\n            pageMesh.vertices[(index * 8) + 6] = xPos;\n            pageMesh.vertices[(index * 8) + 7] = yPos + (textureFrame.height * scale);\n\n            pageMesh.uvs[(index * 8) + 0] = textureUvs.x0;\n            pageMesh.uvs[(index * 8) + 1] = textureUvs.y0;\n\n            pageMesh.uvs[(index * 8) + 2] = textureUvs.x1;\n            pageMesh.uvs[(index * 8) + 3] = textureUvs.y1;\n\n            pageMesh.uvs[(index * 8) + 4] = textureUvs.x2;\n            pageMesh.uvs[(index * 8) + 5] = textureUvs.y2;\n\n            pageMesh.uvs[(index * 8) + 6] = textureUvs.x3;\n            pageMesh.uvs[(index * 8) + 7] = textureUvs.y3;\n        }\n\n        this._textWidth = maxLineWidth * scale;\n        this._textHeight = (pos.y + data.lineHeight) * scale;\n\n        for (const i in pagesMeshData)\n        {\n            const pageMeshData = pagesMeshData[i];\n\n            // apply anchor\n            if (this.anchor.x !== 0 || this.anchor.y !== 0)\n            {\n                let vertexCount = 0;\n\n                const anchorOffsetX = this._textWidth * this.anchor.x;\n                const anchorOffsetY = this._textHeight * this.anchor.y;\n\n                for (let i = 0; i < pageMeshData.total; i++)\n                {\n                    pageMeshData.vertices[vertexCount++] -= anchorOffsetX;\n                    pageMeshData.vertices[vertexCount++] -= anchorOffsetY;\n\n                    pageMeshData.vertices[vertexCount++] -= anchorOffsetX;\n                    pageMeshData.vertices[vertexCount++] -= anchorOffsetY;\n\n                    pageMeshData.vertices[vertexCount++] -= anchorOffsetX;\n                    pageMeshData.vertices[vertexCount++] -= anchorOffsetY;\n\n                    pageMeshData.vertices[vertexCount++] -= anchorOffsetX;\n                    pageMeshData.vertices[vertexCount++] -= anchorOffsetY;\n                }\n            }\n\n            this._maxLineHeight = maxLineHeight * scale;\n\n            const vertexBuffer = pageMeshData.mesh.geometry.getBuffer('aVertexPosition');\n            const textureBuffer = pageMeshData.mesh.geometry.getBuffer('aTextureCoord');\n            const indexBuffer = pageMeshData.mesh.geometry.getIndex();\n\n            vertexBuffer.data = pageMeshData.vertices;\n            textureBuffer.data = pageMeshData.uvs;\n            indexBuffer.data = pageMeshData.indices;\n\n            vertexBuffer.update();\n            textureBuffer.update();\n            indexBuffer.update();\n        }\n\n        for (let i = 0; i < chars.length; i++)\n        {\n            charRenderDataPool.push(chars[i]);\n        }\n\n        this._font = data;\n        this.dirty = false;\n    }\n\n    updateTransform(): void\n    {\n        this.validate();\n        this.containerUpdateTransform();\n    }\n\n    _render(renderer: Renderer): void\n    {\n        if (this._autoResolution && this._resolution !== renderer.resolution)\n        {\n            this._resolution = renderer.resolution;\n            this.dirty = true;\n        }\n\n        // Update the uniform\n        const { distanceFieldRange, distanceFieldType, size } = BitmapFont.available[this._fontName];\n\n        if (distanceFieldType !== 'none')\n        {\n            // Inject the shader code with the correct value\n            const { a, b, c, d } = this.worldTransform;\n\n            const dx = Math.sqrt((a * a) + (b * b));\n            const dy = Math.sqrt((c * c) + (d * d));\n            const worldScale = (Math.abs(dx) + Math.abs(dy)) / 2;\n\n            const fontScale = this.fontSize / size;\n\n            const resolution = renderer._view.resolution;\n\n            for (const mesh of this._activePagesMeshData)\n            {\n                mesh.mesh.shader.uniforms.uFWidth = worldScale * distanceFieldRange * fontScale * resolution;\n            }\n        }\n\n        super._render(renderer);\n    }\n\n    /**\n     * Validates text before calling parent's getLocalBounds\n     * @returns - The rectangular bounding area\n     */\n    public getLocalBounds(): Rectangle\n    {\n        this.validate();\n\n        return super.getLocalBounds();\n    }\n\n    /**\n     * Updates text when needed\n     * @private\n     */\n    protected validate(): void\n    {\n        const font = BitmapFont.available[this._fontName];\n\n        if (!font)\n        {\n            throw new Error(`Missing BitmapFont \"${this._fontName}\"`);\n        }\n        if (this._font !== font)\n        {\n            this.dirty = true;\n        }\n\n        if (this.dirty)\n        {\n            this.updateText();\n        }\n    }\n\n    /**\n     * The tint of the BitmapText object.\n     * @default 0xffffff\n     */\n    public get tint(): number\n    {\n        return this._tint;\n    }\n\n    public set tint(value: number)\n    {\n        if (this._tint === value) return;\n\n        this._tint = value;\n\n        for (let i = 0; i < this._activePagesMeshData.length; i++)\n        {\n            this._activePagesMeshData[i].mesh.tint = value;\n        }\n    }\n\n    /**\n     * The alignment of the BitmapText object.\n     * @member {string}\n     * @default 'left'\n     */\n    public get align(): TextStyleAlign\n    {\n        return this._align;\n    }\n\n    public set align(value: TextStyleAlign)\n    {\n        if (this._align !== value)\n        {\n            this._align = value;\n            this.dirty = true;\n        }\n    }\n\n    /** The name of the BitmapFont. */\n    public get fontName(): string\n    {\n        return this._fontName;\n    }\n\n    public set fontName(value: string)\n    {\n        if (!BitmapFont.available[value])\n        {\n            throw new Error(`Missing BitmapFont \"${value}\"`);\n        }\n\n        if (this._fontName !== value)\n        {\n            this._fontName = value;\n            this.dirty = true;\n        }\n    }\n\n    /** The size of the font to display. */\n    public get fontSize(): number\n    {\n        return this._fontSize ?? BitmapFont.available[this._fontName].size;\n    }\n\n    public set fontSize(value: number | undefined)\n    {\n        if (this._fontSize !== value)\n        {\n            this._fontSize = value;\n            this.dirty = true;\n        }\n    }\n\n    /**\n     * The anchor sets the origin point of the text.\n     *\n     * The default is `(0,0)`, this means the text's origin is the top left.\n     *\n     * Setting the anchor to `(0.5,0.5)` means the text's origin is centered.\n     *\n     * Setting the anchor to `(1,1)` would mean the text's origin point will be the bottom right corner.\n     */\n    public get anchor(): ObservablePoint\n    {\n        return this._anchor;\n    }\n\n    public set anchor(value: ObservablePoint)\n    {\n        if (typeof value === 'number')\n        {\n            this._anchor.set(value);\n        }\n        else\n        {\n            this._anchor.copyFrom(value);\n        }\n    }\n\n    /** The text of the BitmapText object. */\n    public get text(): string\n    {\n        return this._text;\n    }\n\n    public set text(text: string)\n    {\n        text = String(text === null || text === undefined ? '' : text);\n\n        if (this._text === text)\n        {\n            return;\n        }\n        this._text = text;\n        this.dirty = true;\n    }\n\n    /**\n     * The max width of this bitmap text in pixels. If the text provided is longer than the\n     * value provided, line breaks will be automatically inserted in the last whitespace.\n     * Disable by setting the value to 0.\n     */\n    public get maxWidth(): number\n    {\n        return this._maxWidth;\n    }\n\n    public set maxWidth(value: number)\n    {\n        if (this._maxWidth === value)\n        {\n            return;\n        }\n        this._maxWidth = value;\n        this.dirty = true;\n    }\n\n    /**\n     * The max line height. This is useful when trying to use the total height of the Text,\n     * i.e. when trying to vertically align.\n     * @readonly\n     */\n    public get maxLineHeight(): number\n    {\n        this.validate();\n\n        return this._maxLineHeight;\n    }\n\n    /**\n     * The width of the overall text, different from fontSize,\n     * which is defined in the style object.\n     * @readonly\n     */\n    public get textWidth(): number\n    {\n        this.validate();\n\n        return this._textWidth;\n    }\n\n    /** Additional space between characters. */\n    public get letterSpacing(): number\n    {\n        return this._letterSpacing;\n    }\n\n    public set letterSpacing(value: number)\n    {\n        if (this._letterSpacing !== value)\n        {\n            this._letterSpacing = value;\n            this.dirty = true;\n        }\n    }\n\n    /**\n     * If true PixiJS will Math.floor() x/y values when rendering, stopping pixel interpolation.\n     * Advantages can include sharper image quality (like text) and faster rendering on canvas.\n     * The main disadvantage is movement of objects may appear less smooth.\n     * To set the global default, change {@link PIXI.settings.ROUND_PIXELS}\n     * @default PIXI.settings.ROUND_PIXELS\n     */\n    public get roundPixels(): boolean\n    {\n        return this._roundPixels;\n    }\n\n    public set roundPixels(value: boolean)\n    {\n        if (value !== this._roundPixels)\n        {\n            this._roundPixels = value;\n            this.dirty = true;\n        }\n    }\n\n    /**\n     * The height of the overall text, different from fontSize,\n     * which is defined in the style object.\n     * @readonly\n     */\n    public get textHeight(): number\n    {\n        this.validate();\n\n        return this._textHeight;\n    }\n\n    /**\n     * The resolution / device pixel ratio of the canvas.\n     *\n     * This is set to automatically match the renderer resolution by default, but can be overridden by setting manually.\n     * @default 1\n     */\n    get resolution(): number\n    {\n        return this._resolution;\n    }\n\n    set resolution(value: number)\n    {\n        this._autoResolution = false;\n\n        if (this._resolution === value)\n        {\n            return;\n        }\n\n        this._resolution = value;\n        this.dirty = true;\n    }\n\n    destroy(options?: boolean | IDestroyOptions): void\n    {\n        const { _textureCache } = this;\n        const data = BitmapFont.available[this._fontName];\n        const pageMeshDataPool = data.distanceFieldType === 'none'\n            ? pageMeshDataDefaultPageMeshData : pageMeshDataMSDFPageMeshData;\n\n        pageMeshDataPool.push(...this._activePagesMeshData);\n        for (const pageMeshData of this._activePagesMeshData)\n        {\n            this.removeChild(pageMeshData.mesh);\n        }\n        this._activePagesMeshData = [];\n\n        // Release references to any cached textures in page pool\n        pageMeshDataPool\n            .filter((page) => _textureCache[page.mesh.texture.baseTexture.uid])\n            .forEach((page) =>\n            {\n                page.mesh.texture = Texture.EMPTY;\n            });\n\n        for (const id in _textureCache)\n        {\n            const texture = _textureCache[id];\n\n            texture.destroy();\n            delete _textureCache[id];\n        }\n\n        this._font = null;\n        this._textureCache = null;\n\n        super.destroy(options);\n    }\n}\n"],"names":[],"mappings":"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"}