/** * @author Richard Davey <rich@photonstorm.com> * @copyright 2016 Photon Storm Ltd. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License} */ /** * The CanvasPool is a global static object that allows Pixi and Phaser to pool canvas DOM elements. * * @class CanvasPool * @static */ PIXI.CanvasPool = { /** * Creates a new Canvas DOM element, or pulls one from the pool if free. * * @method create * @static * @param parent {any} The parent of the canvas element. * @param width {number} The width of the canvas element. * @param height {number} The height of the canvas element. * @return {HTMLCanvasElement} The canvas element. */ create: function (parent, width, height) { var idx = PIXI.CanvasPool.getFirst(); var canvas; if (idx === -1) { var container = { parent: parent, canvas: document.createElement('canvas') } PIXI.CanvasPool.pool.push(container); canvas = container.canvas; } else { PIXI.CanvasPool.pool[idx].parent = parent; canvas = PIXI.CanvasPool.pool[idx].canvas; } if (width !== undefined) { canvas.width = width; canvas.height = height; } return canvas; }, /** * Gets the first free canvas index from the pool. * * @method getFirst * @static * @return {number} */ getFirst: function () { var pool = PIXI.CanvasPool.pool; for (var i = 0; i < pool.length; i++) { if (!pool[i].parent) { return i; } } return -1; }, /** * Removes the parent from a canvas element from the pool, freeing it up for re-use. * * @method remove * @param parent {any} The parent of the canvas element. * @static */ remove: function (parent) { var pool = PIXI.CanvasPool.pool; for (var i = 0; i < pool.length; i++) { if (pool[i].parent === parent) { pool[i].parent = null; pool[i].canvas.width = 1; pool[i].canvas.height = 1; } } }, /** * Removes the parent from a canvas element from the pool, freeing it up for re-use. * * @method removeByCanvas * @param canvas {HTMLCanvasElement} The canvas element to remove * @static */ removeByCanvas: function (canvas) { var pool = PIXI.CanvasPool.pool; for (var i = 0; i < pool.length; i++) { if (pool[i].canvas === canvas) { pool[i].parent = null; pool[i].canvas.width = 1; pool[i].canvas.height = 1; } } }, /** * Gets the total number of used canvas elements in the pool. * * @method getTotal * @static * @return {number} The number of in-use (parented) canvas elements in the pool. */ getTotal: function () { var pool = PIXI.CanvasPool.pool; var c = 0; for (var i = 0; i < pool.length; i++) { if (pool[i].parent) { c++; } } return c; }, /** * Gets the total number of free canvas elements in the pool. * * @method getFree * @static * @return {number} The number of free (un-parented) canvas elements in the pool. */ getFree: function () { var pool = PIXI.CanvasPool.pool; var c = 0; for (var i = 0; i < pool.length; i++) { if (!pool[i].parent) { c++; } } return c; } }; /** * The pool into which the canvas dom elements are placed. * * @property pool * @type Array * @static */ PIXI.CanvasPool.pool = [];