{"version":3,"file":"CanvasTextPipe.mjs","sources":["../../../../src/scene/text/canvas/CanvasTextPipe.ts"],"sourcesContent":["import { ExtensionType } from '../../../extensions/Extensions';\nimport { updateQuadBounds } from '../../../utils/data/updateQuadBounds';\nimport { BigPool } from '../../../utils/pool/PoolGroup';\nimport { BatchableSprite } from '../../sprite/BatchableSprite';\n\nimport type { InstructionSet } from '../../../rendering/renderers/shared/instructions/InstructionSet';\nimport type { RenderPipe } from '../../../rendering/renderers/shared/instructions/RenderPipe';\nimport type { Texture } from '../../../rendering/renderers/shared/texture/Texture';\nimport type { Renderer } from '../../../rendering/renderers/types';\nimport type { Container } from '../../container/Container';\nimport type { Text } from '../Text';\n\nexport class CanvasTextPipe implements RenderPipe<Text>\n{\n    /** @ignore */\n    public static extension = {\n        type: [\n            ExtensionType.WebGLPipes,\n            ExtensionType.WebGPUPipes,\n            ExtensionType.CanvasPipes,\n        ],\n        name: 'text',\n    } as const;\n\n    private _renderer: Renderer;\n\n    private _gpuText: Record<number, {\n        texture: Texture,\n        currentKey: string,\n        batchableSprite: BatchableSprite,\n    }> = Object.create(null);\n\n    private readonly _destroyRenderableBound = this.destroyRenderable.bind(this) as (renderable: Container) => void;\n\n    constructor(renderer: Renderer)\n    {\n        this._renderer = renderer;\n        this._renderer.runners.resolutionChange.add(this);\n    }\n\n    public resolutionChange()\n    {\n        for (const i in this._gpuText)\n        {\n            const gpuText = this._gpuText[i];\n            const text = gpuText.batchableSprite.renderable as Text;\n\n            if (text._autoResolution)\n            {\n                text._resolution = this._renderer.resolution;\n                text.onViewUpdate();\n            }\n        }\n    }\n\n    public validateRenderable(text: Text): boolean\n    {\n        const gpuText = this._getGpuText(text);\n\n        const newKey = text._getKey();\n\n        if (gpuText.currentKey !== newKey)\n        {\n            const { width, height } = this._renderer.canvasText.getTextureSize(\n                text.text,\n                text.resolution,\n                text._style,\n            );\n\n            if (\n                // is only being used by this text:\n                this._renderer.canvasText.getReferenceCount(gpuText.currentKey) === 1\n                // check the size of the text is the same po2\n                && width === gpuText.texture._source.width\n                && height === gpuText.texture._source.height\n            )\n            {\n                return false;\n            }\n\n            return true;\n        }\n\n        return false;\n    }\n\n    public addRenderable(text: Text, _instructionSet: InstructionSet)\n    {\n        const gpuText = this._getGpuText(text);\n\n        const batchableSprite = gpuText.batchableSprite;\n\n        if (text._didTextUpdate)\n        {\n            this._updateText(text);\n        }\n\n        this._renderer.renderPipes.batch.addToBatch(batchableSprite);\n    }\n\n    public updateRenderable(text: Text)\n    {\n        const gpuText = this._getGpuText(text);\n        const batchableSprite = gpuText.batchableSprite;\n\n        if (text._didTextUpdate)\n        {\n            this._updateText(text);\n        }\n\n        batchableSprite.batcher.updateElement(batchableSprite);\n    }\n\n    public destroyRenderable(text: Text)\n    {\n        text.off('destroyed', this._destroyRenderableBound);\n\n        this._destroyRenderableById(text.uid);\n    }\n\n    private _destroyRenderableById(textUid: number)\n    {\n        const gpuText = this._gpuText[textUid];\n\n        this._renderer.canvasText.decreaseReferenceCount(gpuText.currentKey);\n\n        BigPool.return(gpuText.batchableSprite);\n\n        this._gpuText[textUid] = null;\n    }\n\n    private _updateText(text: Text)\n    {\n        const newKey = text._getKey();\n        const gpuText = this._getGpuText(text);\n        const batchableSprite = gpuText.batchableSprite;\n\n        if (gpuText.currentKey !== newKey)\n        {\n            this._updateGpuText(text);\n        }\n\n        text._didTextUpdate = false;\n\n        const padding = text._style.padding;\n\n        updateQuadBounds(batchableSprite.bounds, text._anchor, batchableSprite.texture, padding);\n    }\n\n    private _updateGpuText(text: Text)\n    {\n        const gpuText = this._getGpuText(text);\n        const batchableSprite = gpuText.batchableSprite;\n\n        if (gpuText.texture)\n        {\n            this._renderer.canvasText.decreaseReferenceCount(gpuText.currentKey);\n        }\n\n        gpuText.texture = batchableSprite.texture = this._renderer.canvasText.getManagedTexture(text);\n        gpuText.currentKey = text._getKey();\n        batchableSprite.texture = gpuText.texture;\n    }\n\n    private _getGpuText(text: Text)\n    {\n        return this._gpuText[text.uid] || this.initGpuText(text);\n    }\n\n    public initGpuText(text: Text)\n    {\n        const gpuTextData: CanvasTextPipe['_gpuText'][number] = {\n            texture: null,\n            currentKey: '--',\n            batchableSprite: BigPool.get(BatchableSprite),\n        };\n\n        gpuTextData.batchableSprite.renderable = text;\n        gpuTextData.batchableSprite.bounds = { minX: 0, maxX: 1, minY: 0, maxY: 0 };\n        gpuTextData.batchableSprite.roundPixels = (this._renderer._roundPixels | text._roundPixels) as 0 | 1;\n\n        this._gpuText[text.uid] = gpuTextData;\n\n        text._resolution = text._autoResolution ? this._renderer.resolution : text.resolution;\n        this._updateText(text);\n\n        // TODO perhaps manage this outside this pipe? (a bit like how we update / add)\n        text.on('destroyed', this._destroyRenderableBound);\n\n        return gpuTextData;\n    }\n\n    public destroy()\n    {\n        for (const i in this._gpuText)\n        {\n            this._destroyRenderableById(i as unknown as number);\n        }\n\n        this._gpuText = null;\n        this._renderer = null;\n    }\n}\n"],"names":[],"mappings":"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"}