Files
Foundry-VTT-Docker/resources/app/node_modules/@pixi/prepare/lib/BasePrepare.js
2025-01-04 00:34:03 +01:00

146 lines
5.9 KiB
JavaScript

"use strict";
var core = require("@pixi/core"), display = require("@pixi/display"), text = require("@pixi/text"), CountLimiter = require("./CountLimiter.js");
function findMultipleBaseTextures(item, queue) {
let result = !1;
if (item?._textures?.length) {
for (let i = 0; i < item._textures.length; i++)
if (item._textures[i] instanceof core.Texture) {
const baseTexture = item._textures[i].baseTexture;
queue.includes(baseTexture) || (queue.push(baseTexture), result = !0);
}
}
return result;
}
function findBaseTexture(item, queue) {
if (item.baseTexture instanceof core.BaseTexture) {
const texture = item.baseTexture;
return queue.includes(texture) || queue.push(texture), !0;
}
return !1;
}
function findTexture(item, queue) {
if (item._texture && item._texture instanceof core.Texture) {
const texture = item._texture.baseTexture;
return queue.includes(texture) || queue.push(texture), !0;
}
return !1;
}
function drawText(_helper, item) {
return item instanceof text.Text ? (item.updateText(!0), !0) : !1;
}
function calculateTextStyle(_helper, item) {
if (item instanceof text.TextStyle) {
const font = item.toFontString();
return text.TextMetrics.measureFont(font), !0;
}
return !1;
}
function findText(item, queue) {
if (item instanceof text.Text) {
queue.includes(item.style) || queue.push(item.style), queue.includes(item) || queue.push(item);
const texture = item._texture.baseTexture;
return queue.includes(texture) || queue.push(texture), !0;
}
return !1;
}
function findTextStyle(item, queue) {
return item instanceof text.TextStyle ? (queue.includes(item) || queue.push(item), !0) : !1;
}
const _BasePrepare = class _BasePrepare2 {
/**
* @param {PIXI.IRenderer} renderer - A reference to the current renderer
*/
constructor(renderer) {
this.limiter = new CountLimiter.CountLimiter(_BasePrepare2.uploadsPerFrame), this.renderer = renderer, this.uploadHookHelper = null, this.queue = [], this.addHooks = [], this.uploadHooks = [], this.completes = [], this.ticking = !1, this.delayedTick = () => {
this.queue && this.prepareItems();
}, this.registerFindHook(findText), this.registerFindHook(findTextStyle), this.registerFindHook(findMultipleBaseTextures), this.registerFindHook(findBaseTexture), this.registerFindHook(findTexture), this.registerUploadHook(drawText), this.registerUploadHook(calculateTextStyle);
}
/**
* Upload all the textures and graphics to the GPU.
* @method PIXI.BasePrepare#upload
* @param {PIXI.DisplayObject|PIXI.Container|PIXI.BaseTexture|PIXI.Texture|PIXI.Graphics|PIXI.Text} [item] -
* Container or display object to search for items to upload or the items to upload themselves,
* or optionally ommitted, if items have been added using {@link PIXI.BasePrepare#add `prepare.add`}.
*/
upload(item) {
return new Promise((resolve) => {
item && this.add(item), this.queue.length ? (this.completes.push(resolve), this.ticking || (this.ticking = !0, core.Ticker.system.addOnce(this.tick, this, core.UPDATE_PRIORITY.UTILITY))) : resolve();
});
}
/**
* Handle tick update
* @private
*/
tick() {
setTimeout(this.delayedTick, 0);
}
/**
* Actually prepare items. This is handled outside of the tick because it will take a while
* and we do NOT want to block the current animation frame from rendering.
* @private
*/
prepareItems() {
for (this.limiter.beginFrame(); this.queue.length && this.limiter.allowedToUpload(); ) {
const item = this.queue[0];
let uploaded = !1;
if (item && !item._destroyed) {
for (let i = 0, len = this.uploadHooks.length; i < len; i++)
if (this.uploadHooks[i](this.uploadHookHelper, item)) {
this.queue.shift(), uploaded = !0;
break;
}
}
uploaded || this.queue.shift();
}
if (this.queue.length)
core.Ticker.system.addOnce(this.tick, this, core.UPDATE_PRIORITY.UTILITY);
else {
this.ticking = !1;
const completes = this.completes.slice(0);
this.completes.length = 0;
for (let i = 0, len = completes.length; i < len; i++)
completes[i]();
}
}
/**
* Adds hooks for finding items.
* @param {Function} addHook - Function call that takes two parameters: `item:*, queue:Array`
* function must return `true` if it was able to add item to the queue.
* @returns Instance of plugin for chaining.
*/
registerFindHook(addHook) {
return addHook && this.addHooks.push(addHook), this;
}
/**
* Adds hooks for uploading items.
* @param {Function} uploadHook - Function call that takes two parameters: `prepare:CanvasPrepare, item:*` and
* function must return `true` if it was able to handle upload of item.
* @returns Instance of plugin for chaining.
*/
registerUploadHook(uploadHook) {
return uploadHook && this.uploadHooks.push(uploadHook), this;
}
/**
* Manually add an item to the uploading queue.
* @param {PIXI.DisplayObject|PIXI.Container|PIXI.BaseTexture|PIXI.Texture|PIXI.Graphics|PIXI.Text|*} item - Object to
* add to the queue
* @returns Instance of plugin for chaining.
*/
add(item) {
for (let i = 0, len = this.addHooks.length; i < len && !this.addHooks[i](item, this.queue); i++)
;
if (item instanceof display.Container)
for (let i = item.children.length - 1; i >= 0; i--)
this.add(item.children[i]);
return this;
}
/** Destroys the plugin, don't use after this. */
destroy() {
this.ticking && core.Ticker.system.remove(this.tick, this), this.ticking = !1, this.addHooks = null, this.uploadHooks = null, this.renderer = null, this.completes = null, this.queue = null, this.limiter = null, this.uploadHookHelper = null;
}
};
_BasePrepare.uploadsPerFrame = 4;
let BasePrepare = _BasePrepare;
exports.BasePrepare = BasePrepare;
//# sourceMappingURL=BasePrepare.js.map