-
Notifications
You must be signed in to change notification settings - Fork 491
/
CanvasPool.js
211 lines (186 loc) · 4.97 KB
/
CanvasPool.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
/**
* @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 Phaser to recycle and pool Canvas DOM elements.
*
* @class Phaser.CanvasPool
* @static
*/
Phaser.CanvasPool = {
/**
* Creates a new Canvas DOM element, or pulls one from the pool if free.
*
* @method Phaser.CanvasPool.create
* @static
* @param {any} parent - The parent of the canvas element.
* @param {number} width - The width of the canvas element.
* @param {number} height - The height of the canvas element.
* @return {HTMLCanvasElement} The canvas element.
*/
create: function (parent, width, height)
{
var idx = Phaser.CanvasPool.getFirst();
var canvas;
if (idx === -1)
{
var container = {
parent: parent,
canvas: document.createElement('canvas')
};
Phaser.CanvasPool.pool.push(container);
canvas = container.canvas;
}
else
{
Phaser.CanvasPool.pool[idx].parent = parent;
canvas = Phaser.CanvasPool.pool[idx].canvas;
}
if (width !== undefined)
{
canvas.width = width;
canvas.height = height;
}
return canvas;
},
/**
* Gets the first free canvas index from the pool.
*
* @static
* @method Phaser.CanvasPool.getFirst
* @return {number}
*/
getFirst: function ()
{
var pool = Phaser.CanvasPool.pool;
for (var i = 0; i < pool.length; i++)
{
if (!pool[i].parent)
{
return i;
}
}
return -1;
},
/**
* Looks up a canvas based on its parent, and if found puts it back in the pool, freeing it up for re-use.
* The canvas has its width and height set to 1, and its parent attribute nulled.
*
* @static
* @method Phaser.CanvasPool.remove
* @param {any} parent - The parent of the canvas element.
*/
remove: function (parent)
{
var pool = Phaser.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;
}
}
},
/**
* Looks up a canvas based on its type, and if found puts it back in the pool, freeing it up for re-use.
* The canvas has its width and height set to 1, and its parent attribute nulled.
*
* @static
* @method Phaser.CanvasPool.removeByCanvas
* @param {HTMLCanvasElement} canvas - The canvas element to remove.
*/
removeByCanvas: function (canvas)
{
var pool = Phaser.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.
*
* @static
* @method Phaser.CanvasPool.getTotal
* @return {number} The number of in-use (parented) canvas elements in the pool.
*/
getTotal: function ()
{
var pool = Phaser.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.
*
* @static
* @method Phaser.CanvasPool.getFree
* @return {number} The number of free (un-parented) canvas elements in the pool.
*/
getFree: function ()
{
var pool = Phaser.CanvasPool.pool;
var c = 0;
for (var i = 0; i < pool.length; i++)
{
if (!pool[i].parent)
{
c++;
}
}
return c;
},
/**
* Prints in-use, free, and total counts to console.log.
*
* @static
* @method Phaser.CanvasPool.log
*/
log: function ()
{
console.log(
'CanvasPool: %s used, %s free, %s total',
Phaser.CanvasPool.getTotal(),
Phaser.CanvasPool.getFree(),
Phaser.CanvasPool.pool.length
);
}
};
/**
* The pool into which the canvas elements are placed.
*
* @property pool
* @type Array
* @static
*/
Phaser.CanvasPool.pool = [];
/**
* The total number of canvas elements in the {@link Phaser.CanvasPool.pool pool}.
*
* @property length
* @type number
* @static
* @readonly
*/
Object.defineProperty(Phaser.CanvasPool, 'length', {
get: function ()
{
return this.pool.length;
}
});