{"version":3,"file":"CanvasTextPipe.mjs","sources":["../../../../src/scene/text/canvas/CanvasTextPipe.ts"],"sourcesContent":["import { ExtensionType } from '../../../extensions/Extensions';\nimport { GCManagedHash } from '../../../utils/data/GCManagedHash';\nimport { updateTextBounds } from '../utils/updateTextBounds';\nimport { BatchableText } from './BatchableText';\n\nimport type { InstructionSet } from '../../../rendering/renderers/shared/instructions/InstructionSet';\nimport type { RenderPipe } from '../../../rendering/renderers/shared/instructions/RenderPipe';\nimport type { Renderer } from '../../../rendering/renderers/types';\nimport type { Text } from '../Text';\n\n/** @internal */\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    private readonly _managedTexts: GCManagedHash<Text>;\n\n    constructor(renderer: Renderer)\n    {\n        this._renderer = renderer;\n        renderer.runners.resolutionChange.add(this);\n        this._managedTexts = new GCManagedHash({\n            renderer,\n            type: 'renderable',\n            onUnload: this.onTextUnload.bind(this),\n            name: 'canvasText'\n        });\n    }\n\n    protected resolutionChange()\n    {\n        for (const key in this._managedTexts.items)\n        {\n            const text = this._managedTexts.items[key];\n\n            if (text?._autoResolution) text.onViewUpdate();\n        }\n    }\n\n    public validateRenderable(text: Text): boolean\n    {\n        const gpuText = this._getGpuText(text);\n\n        const newKey = text.styleKey;\n\n        if (gpuText.currentKey !== newKey) return true;\n\n        return text._didTextUpdate;\n    }\n\n    public addRenderable(text: Text, instructionSet: InstructionSet)\n    {\n        const batchableText = this._getGpuText(text);\n\n        if (text._didTextUpdate)\n        {\n            const resolution = text._autoResolution ? this._renderer.resolution : text.resolution;\n\n            if (batchableText.currentKey !== text.styleKey || text.resolution !== resolution)\n            {\n                // If the text has changed, we need to update the GPU text\n                this._updateGpuText(text);\n            }\n\n            text._didTextUpdate = false;\n\n            updateTextBounds(batchableText, text);\n        }\n\n        this._renderer.renderPipes.batch.addToBatch(batchableText, instructionSet);\n    }\n\n    public updateRenderable(text: Text)\n    {\n        const batchableText = this._getGpuText(text);\n\n        batchableText._batcher.updateElement(batchableText);\n    }\n\n    private _updateGpuText(text: Text)\n    {\n        const batchableText = this._getGpuText(text);\n\n        if (batchableText.texture)\n        {\n            this._renderer.canvasText.decreaseReferenceCount(batchableText.currentKey);\n        }\n\n        text._resolution = text._autoResolution ? this._renderer.resolution : text.resolution;\n\n        batchableText.texture = this._renderer.canvasText.getManagedTexture(text);\n        batchableText.currentKey = text.styleKey;\n    }\n\n    private _getGpuText(text: Text)\n    {\n        return text._gpuData[this._renderer.uid] || this.initGpuText(text);\n    }\n\n    public initGpuText(text: Text)\n    {\n        const batchableText = new BatchableText();\n\n        batchableText.currentKey = '--';\n        batchableText.renderable = text;\n        batchableText.transform = text.groupTransform;\n        batchableText.bounds = { minX: 0, maxX: 1, minY: 0, maxY: 0 };\n        batchableText.roundPixels = (this._renderer._roundPixels | text._roundPixels) as 0 | 1;\n\n        text._gpuData[this._renderer.uid] = batchableText;\n        this._managedTexts.add(text);\n\n        return batchableText;\n    }\n\n    protected onTextUnload(text: Text)\n    {\n        const gpuData = text._gpuData[this._renderer.uid];\n\n        if (!gpuData) return;\n\n        const { canvasText } = this._renderer;\n        const refCount = canvasText.getReferenceCount(gpuData.currentKey);\n\n        if (refCount > 0)\n        {\n            canvasText.decreaseReferenceCount(gpuData.currentKey);\n        }\n        else if (gpuData.texture)\n        {\n            canvasText.returnTexture(gpuData.texture);\n        }\n    }\n\n    public destroy()\n    {\n        this._managedTexts.destroy();\n        this._renderer = null;\n    }\n}\n"],"names":[],"mappings":"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"}