85 lines
5.4 KiB
JavaScript
85 lines
5.4 KiB
JavaScript
shadow$provide.module$node_modules$pixi_DOT_js$lib$scene$text_html$HTMLTextSystem = function(global, require, module, exports) {
|
|
global = require("module$node_modules$pixi_DOT_js$lib$extensions$Extensions");
|
|
var CanvasPool = require("module$node_modules$pixi_DOT_js$lib$rendering$renderers$shared$texture$CanvasPool"), TexturePool = require("module$node_modules$pixi_DOT_js$lib$rendering$renderers$shared$texture$TexturePool"), types = require("module$node_modules$pixi_DOT_js$lib$rendering$renderers$types"), isSafari = require("module$node_modules$pixi_DOT_js$lib$utils$browser$isSafari"), warn = require("module$node_modules$pixi_DOT_js$lib$utils$logging$warn"), PoolGroup = require("module$node_modules$pixi_DOT_js$lib$utils$pool$PoolGroup"),
|
|
getPo2TextureFromSource = require("module$node_modules$pixi_DOT_js$lib$scene$text$utils$getPo2TextureFromSource"), HTMLTextRenderData = require("module$node_modules$pixi_DOT_js$lib$scene$text_html$HTMLTextRenderData"), extractFontFamilies = require("module$node_modules$pixi_DOT_js$lib$scene$text_html$utils$extractFontFamilies"), getFontCss = require("module$node_modules$pixi_DOT_js$lib$scene$text_html$utils$getFontCss"), getSVGUrl = require("module$node_modules$pixi_DOT_js$lib$scene$text_html$utils$getSVGUrl"),
|
|
getTemporaryCanvasFromImage = require("module$node_modules$pixi_DOT_js$lib$scene$text_html$utils$getTemporaryCanvasFromImage"), loadSVGImage = require("module$node_modules$pixi_DOT_js$lib$scene$text_html$utils$loadSVGImage"), measureHtmlText = require("module$node_modules$pixi_DOT_js$lib$scene$text_html$utils$measureHtmlText");
|
|
"use strict";
|
|
class HTMLTextSystem {
|
|
constructor(renderer) {
|
|
this._activeTextures = {};
|
|
this._renderer = renderer;
|
|
this._createCanvas = renderer.type === types.RendererType.WEBGPU;
|
|
}
|
|
getTexture(options) {
|
|
return this.getTexturePromise(options);
|
|
}
|
|
getManagedTexture(text) {
|
|
const textKey = text.styleKey;
|
|
if (this._activeTextures[textKey]) {
|
|
return this._increaseReferenceCount(textKey), this._activeTextures[textKey].promise;
|
|
}
|
|
text = this._buildTexturePromise(text).then(texture => this._activeTextures[textKey].texture = texture);
|
|
this._activeTextures[textKey] = {texture:null, promise:text, usageCount:1};
|
|
return text;
|
|
}
|
|
getReferenceCount(textKey) {
|
|
return this._activeTextures[textKey]?.usageCount ?? null;
|
|
}
|
|
_increaseReferenceCount(textKey) {
|
|
this._activeTextures[textKey].usageCount++;
|
|
}
|
|
decreaseReferenceCount(textKey) {
|
|
const activeTexture = this._activeTextures[textKey];
|
|
activeTexture && (activeTexture.usageCount--, 0 === activeTexture.usageCount && (activeTexture.texture ? this._cleanUp(activeTexture.texture) : activeTexture.promise.then(texture => {
|
|
activeTexture.texture = texture;
|
|
this._cleanUp(activeTexture.texture);
|
|
}).catch(() => {
|
|
warn.warn("HTMLTextSystem: Failed to clean texture");
|
|
}), this._activeTextures[textKey] = null));
|
|
}
|
|
getTexturePromise(options) {
|
|
return this._buildTexturePromise(options);
|
|
}
|
|
async _buildTexturePromise(options) {
|
|
const {text, style, resolution, textureStyle, autoGenerateMipmaps} = options;
|
|
options = PoolGroup.BigPool.get(HTMLTextRenderData.HTMLTextRenderData);
|
|
var fontFamilies = extractFontFamilies.extractFontFamilies(text, style), fontCSS = await getFontCss.getFontCss(fontFamilies);
|
|
const measured = measureHtmlText.measureHtmlText(text, style, fontCSS, options), height = Math.ceil(Math.ceil(Math.max(1, measured.height) + 2 * style.padding) * resolution), image = options.image;
|
|
image.width = (Math.ceil(Math.ceil(Math.max(1, measured.width) + 2 * style.padding) * resolution) | 0) + 2;
|
|
image.height = (height | 0) + 2;
|
|
fontCSS = getSVGUrl.getSVGUrl(text, style, resolution, fontCSS, options);
|
|
await loadSVGImage.loadSVGImage(image, fontCSS, isSafari.isSafari() && 0 < fontFamilies.length);
|
|
let canvasAndContext;
|
|
this._createCanvas && (canvasAndContext = getTemporaryCanvasFromImage.getTemporaryCanvasFromImage(image, resolution));
|
|
fontFamilies = getPo2TextureFromSource.getPo2TextureFromSource(canvasAndContext ? canvasAndContext.canvas : image, image.width - 2, image.height - 2, resolution, autoGenerateMipmaps);
|
|
textureStyle && (fontFamilies.source.style = textureStyle);
|
|
this._createCanvas && (this._renderer.texture.initSource(fontFamilies.source), CanvasPool.CanvasPool.returnCanvasAndContext(canvasAndContext));
|
|
PoolGroup.BigPool.return(options);
|
|
return fontFamilies;
|
|
}
|
|
returnTexturePromise(texturePromise) {
|
|
texturePromise.then(texture => {
|
|
this._cleanUp(texture);
|
|
}).catch(() => {
|
|
warn.warn("HTMLTextSystem: Failed to clean texture");
|
|
});
|
|
}
|
|
_cleanUp(texture) {
|
|
TexturePool.TexturePool.returnTexture(texture, !0);
|
|
texture.source.resource = null;
|
|
texture.source.uploadMethodId = "unknown";
|
|
}
|
|
destroy() {
|
|
this._renderer = null;
|
|
for (const key in this._activeTextures) {
|
|
this._activeTextures[key] && this.returnTexturePromise(this._activeTextures[key].promise);
|
|
}
|
|
this._activeTextures = null;
|
|
}
|
|
}
|
|
HTMLTextSystem.extension = {type:[global.ExtensionType.WebGLSystem, global.ExtensionType.WebGPUSystem, global.ExtensionType.CanvasSystem], name:"htmlText"};
|
|
exports.HTMLTextSystem = HTMLTextSystem;
|
|
};
|
|
|
|
//# sourceMappingURL=module$node_modules$pixi_DOT_js$lib$scene$text_html$HTMLTextSystem.js.map
|