{"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\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 = 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\n if (!gpuText) continue;\n\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, instructionSet);\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.transform = text.groupTransform;\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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"}