UNPKG

pixi.js

Version:

<p align="center"> <a href="https://pixijs.com" target="_blank" rel="noopener noreferrer"> <img height="150" src="https://files.pixijs.download/branding/pixijs-logo-transparent-dark.svg?v=1" alt="PixiJS logo"> </a> </p> <br/> <p align="center">

118 lines (115 loc) 4.44 kB
import { ExtensionType } from '../../extensions/Extensions.mjs'; import { Texture } from '../../rendering/renderers/shared/texture/Texture.mjs'; import { GCManagedHash } from '../../utils/data/GCManagedHash.mjs'; import { updateTextBounds } from '../text/utils/updateTextBounds.mjs'; import { BatchableHTMLText } from './BatchableHTMLText.mjs'; "use strict"; class HTMLTextPipe { constructor(renderer) { this._renderer = renderer; renderer.runners.resolutionChange.add(this); this._managedTexts = new GCManagedHash({ renderer, type: "renderable", onUnload: this.onTextUnload.bind(this), name: "htmlText" }); } resolutionChange() { for (const key in this._managedTexts.items) { const text = this._managedTexts.items[key]; if (text?._autoResolution) { text.onViewUpdate(); } } } validateRenderable(htmlText) { const gpuText = this._getGpuText(htmlText); const newKey = htmlText.styleKey; if (gpuText.currentKey !== newKey) { return true; } return false; } addRenderable(htmlText, instructionSet) { const batchableHTMLText = this._getGpuText(htmlText); if (htmlText._didTextUpdate) { const resolution = htmlText._autoResolution ? this._renderer.resolution : htmlText.resolution; if (batchableHTMLText.currentKey !== htmlText.styleKey || htmlText.resolution !== resolution) { this._updateGpuText(htmlText).catch((e) => { console.error(e); }); } htmlText._didTextUpdate = false; updateTextBounds(batchableHTMLText, htmlText); } this._renderer.renderPipes.batch.addToBatch(batchableHTMLText, instructionSet); } updateRenderable(htmlText) { const batchableHTMLText = this._getGpuText(htmlText); batchableHTMLText._batcher.updateElement(batchableHTMLText); } async _updateGpuText(htmlText) { htmlText._didTextUpdate = false; const batchableHTMLText = this._getGpuText(htmlText); if (batchableHTMLText.generatingTexture) return; const oldTexturePromise = batchableHTMLText.texturePromise; batchableHTMLText.texturePromise = null; batchableHTMLText.generatingTexture = true; htmlText._resolution = htmlText._autoResolution ? this._renderer.resolution : htmlText.resolution; let texturePromise = this._renderer.htmlText.getTexturePromise(htmlText); if (oldTexturePromise) { texturePromise = texturePromise.finally(() => { this._renderer.htmlText.decreaseReferenceCount(batchableHTMLText.currentKey); this._renderer.htmlText.returnTexturePromise(oldTexturePromise); }); } batchableHTMLText.texturePromise = texturePromise; batchableHTMLText.currentKey = htmlText.styleKey; batchableHTMLText.texture = await texturePromise; const renderGroup = htmlText.renderGroup || htmlText.parentRenderGroup; if (renderGroup) { renderGroup.structureDidChange = true; } batchableHTMLText.generatingTexture = false; updateTextBounds(batchableHTMLText, htmlText); } _getGpuText(htmlText) { return htmlText._gpuData[this._renderer.uid] || this.initGpuText(htmlText); } initGpuText(htmlText) { const batchableHTMLText = new BatchableHTMLText(); batchableHTMLText.renderable = htmlText; batchableHTMLText.transform = htmlText.groupTransform; batchableHTMLText.texture = Texture.EMPTY; batchableHTMLText.bounds = { minX: 0, maxX: 1, minY: 0, maxY: 0 }; batchableHTMLText.roundPixels = this._renderer._roundPixels | htmlText._roundPixels; htmlText._resolution = htmlText._autoResolution ? this._renderer.resolution : htmlText.resolution; htmlText._gpuData[this._renderer.uid] = batchableHTMLText; this._managedTexts.add(htmlText); return batchableHTMLText; } onTextUnload(text) { const gpuData = text._gpuData[this._renderer.uid]; if (!gpuData) return; const { htmlText } = this._renderer; htmlText.getReferenceCount(gpuData.currentKey) === null ? htmlText.returnTexturePromise(gpuData.texturePromise) : htmlText.decreaseReferenceCount(gpuData.currentKey); } destroy() { this._managedTexts.destroy(); this._renderer = null; } } /** @ignore */ HTMLTextPipe.extension = { type: [ ExtensionType.WebGLPipes, ExtensionType.WebGPUPipes, ExtensionType.CanvasPipes ], name: "htmlText" }; export { HTMLTextPipe }; //# sourceMappingURL=HTMLTextPipe.mjs.map