Files
nothoughts/node_modules/pixi.js/lib/scene/text-html/HTMLTextPipe.mjs
2025-08-04 18:57:35 +02:00

144 lines
4.9 KiB
JavaScript

import { ExtensionType } from '../../extensions/Extensions.mjs';
import { Texture } from '../../rendering/renderers/shared/texture/Texture.mjs';
import { updateQuadBounds } from '../../utils/data/updateQuadBounds.mjs';
import { BigPool } from '../../utils/pool/PoolGroup.mjs';
import { BatchableSprite } from '../sprite/BatchableSprite.mjs';
"use strict";
class HTMLTextPipe {
constructor(renderer) {
this._gpuText = /* @__PURE__ */ Object.create(null);
this._destroyRenderableBound = this.destroyRenderable.bind(this);
this._renderer = renderer;
this._renderer.runners.resolutionChange.add(this);
}
resolutionChange() {
for (const i in this._gpuText) {
const gpuText = this._gpuText[i];
if (!gpuText)
continue;
const text = gpuText.batchableSprite.renderable;
if (text._autoResolution) {
text._resolution = this._renderer.resolution;
text.onViewUpdate();
}
}
}
validateRenderable(htmlText) {
const gpuText = this._getGpuText(htmlText);
const newKey = htmlText._getKey();
if (gpuText.textureNeedsUploading) {
gpuText.textureNeedsUploading = false;
return true;
}
if (gpuText.currentKey !== newKey) {
return true;
}
return false;
}
addRenderable(htmlText, instructionSet) {
const gpuText = this._getGpuText(htmlText);
const batchableSprite = gpuText.batchableSprite;
if (htmlText._didTextUpdate) {
this._updateText(htmlText);
}
this._renderer.renderPipes.batch.addToBatch(batchableSprite, instructionSet);
}
updateRenderable(htmlText) {
const gpuText = this._getGpuText(htmlText);
const batchableSprite = gpuText.batchableSprite;
if (htmlText._didTextUpdate) {
this._updateText(htmlText);
}
batchableSprite._batcher.updateElement(batchableSprite);
}
destroyRenderable(htmlText) {
htmlText.off("destroyed", this._destroyRenderableBound);
this._destroyRenderableById(htmlText.uid);
}
_destroyRenderableById(htmlTextUid) {
const gpuText = this._gpuText[htmlTextUid];
this._renderer.htmlText.decreaseReferenceCount(gpuText.currentKey);
BigPool.return(gpuText.batchableSprite);
this._gpuText[htmlTextUid] = null;
}
_updateText(htmlText) {
const newKey = htmlText._getKey();
const gpuText = this._getGpuText(htmlText);
const batchableSprite = gpuText.batchableSprite;
if (gpuText.currentKey !== newKey) {
this._updateGpuText(htmlText).catch((e) => {
console.error(e);
});
}
htmlText._didTextUpdate = false;
const padding = htmlText._style.padding;
updateQuadBounds(batchableSprite.bounds, htmlText._anchor, batchableSprite.texture, padding);
}
async _updateGpuText(htmlText) {
htmlText._didTextUpdate = false;
const gpuText = this._getGpuText(htmlText);
if (gpuText.generatingTexture)
return;
const newKey = htmlText._getKey();
this._renderer.htmlText.decreaseReferenceCount(gpuText.currentKey);
gpuText.generatingTexture = true;
gpuText.currentKey = newKey;
const resolution = htmlText.resolution ?? this._renderer.resolution;
const texture = await this._renderer.htmlText.getManagedTexture(
htmlText.text,
resolution,
htmlText._style,
htmlText._getKey()
);
const batchableSprite = gpuText.batchableSprite;
batchableSprite.texture = gpuText.texture = texture;
gpuText.generatingTexture = false;
gpuText.textureNeedsUploading = true;
htmlText.onViewUpdate();
const padding = htmlText._style.padding;
updateQuadBounds(batchableSprite.bounds, htmlText._anchor, batchableSprite.texture, padding);
}
_getGpuText(htmlText) {
return this._gpuText[htmlText.uid] || this.initGpuText(htmlText);
}
initGpuText(htmlText) {
const gpuTextData = {
texture: Texture.EMPTY,
currentKey: "--",
batchableSprite: BigPool.get(BatchableSprite),
textureNeedsUploading: false,
generatingTexture: false
};
const batchableSprite = gpuTextData.batchableSprite;
batchableSprite.renderable = htmlText;
batchableSprite.transform = htmlText.groupTransform;
batchableSprite.texture = Texture.EMPTY;
batchableSprite.bounds = { minX: 0, maxX: 1, minY: 0, maxY: 0 };
batchableSprite.roundPixels = this._renderer._roundPixels | htmlText._roundPixels;
htmlText._resolution = htmlText._autoResolution ? this._renderer.resolution : htmlText.resolution;
this._gpuText[htmlText.uid] = gpuTextData;
htmlText.on("destroyed", this._destroyRenderableBound);
return gpuTextData;
}
destroy() {
for (const i in this._gpuText) {
this._destroyRenderableById(i);
}
this._gpuText = null;
this._renderer = null;
}
}
/** @ignore */
HTMLTextPipe.extension = {
type: [
ExtensionType.WebGLPipes,
ExtensionType.WebGPUPipes,
ExtensionType.CanvasPipes
],
name: "htmlText"
};
export { HTMLTextPipe };
//# sourceMappingURL=HTMLTextPipe.mjs.map