szld-libs 0.2.24 → 0.2.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,1664 @@
1
+ "use strict";
2
+ const pako = require("pako");
3
+ var UPNG = {};
4
+ UPNG.toRGBA8 = function(out) {
5
+ var w = out.width, h = out.height;
6
+ if (out.tabs.acTL == null)
7
+ return [UPNG.toRGBA8.decodeImage(out.data, w, h, out).buffer];
8
+ var frms = [];
9
+ if (out.frames[0].data == null)
10
+ out.frames[0].data = out.data;
11
+ var len = w * h * 4, img = new Uint8Array(len), empty = new Uint8Array(len), prev = new Uint8Array(len);
12
+ for (var i = 0; i < out.frames.length; i++) {
13
+ var frm = out.frames[i];
14
+ var fx = frm.rect.x, fy = frm.rect.y, fw = frm.rect.width, fh = frm.rect.height;
15
+ var fdata = UPNG.toRGBA8.decodeImage(frm.data, fw, fh, out);
16
+ if (i != 0)
17
+ for (var j = 0; j < len; j++)
18
+ prev[j] = img[j];
19
+ if (frm.blend == 0)
20
+ UPNG._copyTile(fdata, fw, fh, img, w, h, fx, fy, 0);
21
+ else if (frm.blend == 1)
22
+ UPNG._copyTile(fdata, fw, fh, img, w, h, fx, fy, 1);
23
+ frms.push(img.buffer.slice(0));
24
+ if (frm.dispose == 0)
25
+ ;
26
+ else if (frm.dispose == 1)
27
+ UPNG._copyTile(empty, fw, fh, img, w, h, fx, fy, 0);
28
+ else if (frm.dispose == 2)
29
+ for (var j = 0; j < len; j++)
30
+ img[j] = prev[j];
31
+ }
32
+ return frms;
33
+ };
34
+ UPNG.toRGBA8.decodeImage = function(data, w, h, out) {
35
+ var area = w * h, bpp = UPNG.decode._getBPP(out);
36
+ var bpl = Math.ceil(w * bpp / 8);
37
+ var bf = new Uint8Array(area * 4), bf32 = new Uint32Array(bf.buffer);
38
+ var ctype = out.ctype, depth = out.depth;
39
+ var rs = UPNG._bin.readUshort;
40
+ if (ctype == 6) {
41
+ var qarea = area << 2;
42
+ if (depth == 8)
43
+ for (var i = 0; i < qarea; i += 4) {
44
+ bf[i] = data[i];
45
+ bf[i + 1] = data[i + 1];
46
+ bf[i + 2] = data[i + 2];
47
+ bf[i + 3] = data[i + 3];
48
+ }
49
+ if (depth == 16)
50
+ for (var i = 0; i < qarea; i++) {
51
+ bf[i] = data[i << 1];
52
+ }
53
+ } else if (ctype == 2) {
54
+ var ts = out.tabs["tRNS"];
55
+ if (ts == null) {
56
+ if (depth == 8)
57
+ for (var i = 0; i < area; i++) {
58
+ var ti = i * 3;
59
+ bf32[i] = 255 << 24 | data[ti + 2] << 16 | data[ti + 1] << 8 | data[ti];
60
+ }
61
+ if (depth == 16)
62
+ for (var i = 0; i < area; i++) {
63
+ var ti = i * 6;
64
+ bf32[i] = 255 << 24 | data[ti + 4] << 16 | data[ti + 2] << 8 | data[ti];
65
+ }
66
+ } else {
67
+ var tr = ts[0], tg = ts[1], tb = ts[2];
68
+ if (depth == 8)
69
+ for (var i = 0; i < area; i++) {
70
+ var qi = i << 2, ti = i * 3;
71
+ bf32[i] = 255 << 24 | data[ti + 2] << 16 | data[ti + 1] << 8 | data[ti];
72
+ if (data[ti] == tr && data[ti + 1] == tg && data[ti + 2] == tb)
73
+ bf[qi + 3] = 0;
74
+ }
75
+ if (depth == 16)
76
+ for (var i = 0; i < area; i++) {
77
+ var qi = i << 2, ti = i * 6;
78
+ bf32[i] = 255 << 24 | data[ti + 4] << 16 | data[ti + 2] << 8 | data[ti];
79
+ if (rs(data, ti) == tr && rs(data, ti + 2) == tg && rs(data, ti + 4) == tb)
80
+ bf[qi + 3] = 0;
81
+ }
82
+ }
83
+ } else if (ctype == 3) {
84
+ var p = out.tabs["PLTE"], ap = out.tabs["tRNS"], tl = ap ? ap.length : 0;
85
+ if (depth == 1)
86
+ for (var y = 0; y < h; y++) {
87
+ var s0 = y * bpl, t0 = y * w;
88
+ for (var i = 0; i < w; i++) {
89
+ var qi = t0 + i << 2, j = data[s0 + (i >> 3)] >> 7 - ((i & 7) << 0) & 1, cj = 3 * j;
90
+ bf[qi] = p[cj];
91
+ bf[qi + 1] = p[cj + 1];
92
+ bf[qi + 2] = p[cj + 2];
93
+ bf[qi + 3] = j < tl ? ap[j] : 255;
94
+ }
95
+ }
96
+ if (depth == 2)
97
+ for (var y = 0; y < h; y++) {
98
+ var s0 = y * bpl, t0 = y * w;
99
+ for (var i = 0; i < w; i++) {
100
+ var qi = t0 + i << 2, j = data[s0 + (i >> 2)] >> 6 - ((i & 3) << 1) & 3, cj = 3 * j;
101
+ bf[qi] = p[cj];
102
+ bf[qi + 1] = p[cj + 1];
103
+ bf[qi + 2] = p[cj + 2];
104
+ bf[qi + 3] = j < tl ? ap[j] : 255;
105
+ }
106
+ }
107
+ if (depth == 4)
108
+ for (var y = 0; y < h; y++) {
109
+ var s0 = y * bpl, t0 = y * w;
110
+ for (var i = 0; i < w; i++) {
111
+ var qi = t0 + i << 2, j = data[s0 + (i >> 1)] >> 4 - ((i & 1) << 2) & 15, cj = 3 * j;
112
+ bf[qi] = p[cj];
113
+ bf[qi + 1] = p[cj + 1];
114
+ bf[qi + 2] = p[cj + 2];
115
+ bf[qi + 3] = j < tl ? ap[j] : 255;
116
+ }
117
+ }
118
+ if (depth == 8)
119
+ for (var i = 0; i < area; i++) {
120
+ var qi = i << 2, j = data[i], cj = 3 * j;
121
+ bf[qi] = p[cj];
122
+ bf[qi + 1] = p[cj + 1];
123
+ bf[qi + 2] = p[cj + 2];
124
+ bf[qi + 3] = j < tl ? ap[j] : 255;
125
+ }
126
+ } else if (ctype == 4) {
127
+ if (depth == 8)
128
+ for (var i = 0; i < area; i++) {
129
+ var qi = i << 2, di = i << 1, gr = data[di];
130
+ bf[qi] = gr;
131
+ bf[qi + 1] = gr;
132
+ bf[qi + 2] = gr;
133
+ bf[qi + 3] = data[di + 1];
134
+ }
135
+ if (depth == 16)
136
+ for (var i = 0; i < area; i++) {
137
+ var qi = i << 2, di = i << 2, gr = data[di];
138
+ bf[qi] = gr;
139
+ bf[qi + 1] = gr;
140
+ bf[qi + 2] = gr;
141
+ bf[qi + 3] = data[di + 2];
142
+ }
143
+ } else if (ctype == 0) {
144
+ var tr = out.tabs["tRNS"] ? out.tabs["tRNS"] : -1;
145
+ for (var y = 0; y < h; y++) {
146
+ var off = y * bpl, to = y * w;
147
+ if (depth == 1)
148
+ for (var x = 0; x < w; x++) {
149
+ var gr = 255 * (data[off + (x >>> 3)] >>> 7 - (x & 7) & 1), al = gr == tr * 255 ? 0 : 255;
150
+ bf32[to + x] = al << 24 | gr << 16 | gr << 8 | gr;
151
+ }
152
+ else if (depth == 2)
153
+ for (var x = 0; x < w; x++) {
154
+ var gr = 85 * (data[off + (x >>> 2)] >>> 6 - ((x & 3) << 1) & 3), al = gr == tr * 85 ? 0 : 255;
155
+ bf32[to + x] = al << 24 | gr << 16 | gr << 8 | gr;
156
+ }
157
+ else if (depth == 4)
158
+ for (var x = 0; x < w; x++) {
159
+ var gr = 17 * (data[off + (x >>> 1)] >>> 4 - ((x & 1) << 2) & 15), al = gr == tr * 17 ? 0 : 255;
160
+ bf32[to + x] = al << 24 | gr << 16 | gr << 8 | gr;
161
+ }
162
+ else if (depth == 8)
163
+ for (var x = 0; x < w; x++) {
164
+ var gr = data[off + x], al = gr == tr ? 0 : 255;
165
+ bf32[to + x] = al << 24 | gr << 16 | gr << 8 | gr;
166
+ }
167
+ else if (depth == 16)
168
+ for (var x = 0; x < w; x++) {
169
+ var gr = data[off + (x << 1)], al = rs(data, off + (x << i)) == tr ? 0 : 255;
170
+ bf32[to + x] = al << 24 | gr << 16 | gr << 8 | gr;
171
+ }
172
+ }
173
+ }
174
+ return bf;
175
+ };
176
+ UPNG.decode = function(buff) {
177
+ var data = new Uint8Array(buff), offset = 8, bin = UPNG._bin, rUs = bin.readUshort, rUi = bin.readUint;
178
+ var out = { tabs: {}, frames: [] };
179
+ var dd = new Uint8Array(data.length), doff = 0;
180
+ var fd, foff = 0;
181
+ var mgck = [137, 80, 78, 71, 13, 10, 26, 10];
182
+ for (var i = 0; i < 8; i++)
183
+ if (data[i] != mgck[i])
184
+ throw "The input is not a PNG file!";
185
+ while (offset < data.length) {
186
+ var len = bin.readUint(data, offset);
187
+ offset += 4;
188
+ var type = bin.readASCII(data, offset, 4);
189
+ offset += 4;
190
+ if (type == "IHDR") {
191
+ UPNG.decode._IHDR(data, offset, out);
192
+ } else if (type == "CgBI") {
193
+ out.tabs[type] = data.slice(offset, offset + 4);
194
+ } else if (type == "IDAT") {
195
+ for (var i = 0; i < len; i++)
196
+ dd[doff + i] = data[offset + i];
197
+ doff += len;
198
+ } else if (type == "acTL") {
199
+ out.tabs[type] = { num_frames: rUi(data, offset), num_plays: rUi(data, offset + 4) };
200
+ fd = new Uint8Array(data.length);
201
+ } else if (type == "fcTL") {
202
+ if (foff != 0) {
203
+ var fr = out.frames[out.frames.length - 1];
204
+ fr.data = UPNG.decode._decompress(out, fd.slice(0, foff), fr.rect.width, fr.rect.height);
205
+ foff = 0;
206
+ }
207
+ var rct = {
208
+ x: rUi(data, offset + 12),
209
+ y: rUi(data, offset + 16),
210
+ width: rUi(data, offset + 4),
211
+ height: rUi(data, offset + 8)
212
+ };
213
+ var del = rUs(data, offset + 22);
214
+ del = rUs(data, offset + 20) / (del == 0 ? 100 : del);
215
+ var frm = { rect: rct, delay: Math.round(del * 1e3), dispose: data[offset + 24], blend: data[offset + 25] };
216
+ out.frames.push(frm);
217
+ } else if (type == "fdAT") {
218
+ for (var i = 0; i < len - 4; i++)
219
+ fd[foff + i] = data[offset + i + 4];
220
+ foff += len - 4;
221
+ } else if (type == "pHYs") {
222
+ out.tabs[type] = [bin.readUint(data, offset), bin.readUint(data, offset + 4), data[offset + 8]];
223
+ } else if (type == "cHRM") {
224
+ out.tabs[type] = [];
225
+ for (var i = 0; i < 8; i++)
226
+ out.tabs[type].push(bin.readUint(data, offset + i * 4));
227
+ } else if (type == "tEXt" || type == "zTXt") {
228
+ if (out.tabs[type] == null)
229
+ out.tabs[type] = {};
230
+ var nz = bin.nextZero(data, offset);
231
+ var keyw = bin.readASCII(data, offset, nz - offset);
232
+ var text, tl = offset + len - nz - 1;
233
+ if (type == "tEXt")
234
+ text = bin.readASCII(data, nz + 1, tl);
235
+ else {
236
+ var bfr = UPNG.decode._inflate(data.slice(nz + 2, nz + 2 + tl));
237
+ text = bin.readUTF8(bfr, 0, bfr.length);
238
+ }
239
+ out.tabs[type][keyw] = text;
240
+ } else if (type == "iTXt") {
241
+ if (out.tabs[type] == null)
242
+ out.tabs[type] = {};
243
+ var nz = 0, off = offset;
244
+ nz = bin.nextZero(data, off);
245
+ var keyw = bin.readASCII(data, off, nz - off);
246
+ off = nz + 1;
247
+ var cflag = data[off];
248
+ data[off + 1];
249
+ off += 2;
250
+ nz = bin.nextZero(data, off);
251
+ bin.readASCII(data, off, nz - off);
252
+ off = nz + 1;
253
+ nz = bin.nextZero(data, off);
254
+ bin.readUTF8(data, off, nz - off);
255
+ off = nz + 1;
256
+ var text, tl = len - (off - offset);
257
+ if (cflag == 0)
258
+ text = bin.readUTF8(data, off, tl);
259
+ else {
260
+ var bfr = UPNG.decode._inflate(data.slice(off, off + tl));
261
+ text = bin.readUTF8(bfr, 0, bfr.length);
262
+ }
263
+ out.tabs[type][keyw] = text;
264
+ } else if (type == "PLTE") {
265
+ out.tabs[type] = bin.readBytes(data, offset, len);
266
+ } else if (type == "hIST") {
267
+ var pl = out.tabs["PLTE"].length / 3;
268
+ out.tabs[type] = [];
269
+ for (var i = 0; i < pl; i++)
270
+ out.tabs[type].push(rUs(data, offset + i * 2));
271
+ } else if (type == "tRNS") {
272
+ if (out.ctype == 3)
273
+ out.tabs[type] = bin.readBytes(data, offset, len);
274
+ else if (out.ctype == 0)
275
+ out.tabs[type] = rUs(data, offset);
276
+ else if (out.ctype == 2)
277
+ out.tabs[type] = [rUs(data, offset), rUs(data, offset + 2), rUs(data, offset + 4)];
278
+ } else if (type == "gAMA")
279
+ out.tabs[type] = bin.readUint(data, offset) / 1e5;
280
+ else if (type == "sRGB")
281
+ out.tabs[type] = data[offset];
282
+ else if (type == "bKGD") {
283
+ if (out.ctype == 0 || out.ctype == 4)
284
+ out.tabs[type] = [rUs(data, offset)];
285
+ else if (out.ctype == 2 || out.ctype == 6)
286
+ out.tabs[type] = [rUs(data, offset), rUs(data, offset + 2), rUs(data, offset + 4)];
287
+ else if (out.ctype == 3)
288
+ out.tabs[type] = data[offset];
289
+ } else if (type == "IEND") {
290
+ break;
291
+ }
292
+ offset += len;
293
+ bin.readUint(data, offset);
294
+ offset += 4;
295
+ }
296
+ if (foff != 0) {
297
+ var fr = out.frames[out.frames.length - 1];
298
+ fr.data = UPNG.decode._decompress(out, fd.slice(0, foff), fr.rect.width, fr.rect.height);
299
+ foff = 0;
300
+ }
301
+ out.data = UPNG.decode._decompress(out, dd, out.width, out.height);
302
+ delete out.compress;
303
+ delete out.interlace;
304
+ delete out.filter;
305
+ return out;
306
+ };
307
+ UPNG.decode._decompress = function(out, dd, w, h) {
308
+ var bpp = UPNG.decode._getBPP(out), bpl = Math.ceil(w * bpp / 8), buff = new Uint8Array((bpl + 1 + out.interlace) * h);
309
+ if (out.tabs["CgBI"])
310
+ dd = UPNG.inflateRaw(dd, buff);
311
+ else
312
+ dd = UPNG.decode._inflate(dd, buff);
313
+ if (out.interlace == 0)
314
+ dd = UPNG.decode._filterZero(dd, out, 0, w, h);
315
+ else if (out.interlace == 1)
316
+ dd = UPNG.decode._readInterlace(dd, out);
317
+ return dd;
318
+ };
319
+ UPNG.decode._inflate = function(data, buff) {
320
+ var out = UPNG["inflateRaw"](new Uint8Array(data.buffer, 2, data.length - 6), buff);
321
+ return out;
322
+ };
323
+ UPNG.inflateRaw = function() {
324
+ var H = {};
325
+ H.H = {};
326
+ H.H.N = function(N, W) {
327
+ var R = Uint8Array, i = 0, m = 0, J = 0, h = 0, Q = 0, X = 0, u = 0, w = 0, d = 0, v, C;
328
+ if (N[0] == 3 && N[1] == 0)
329
+ return W ? W : new R(0);
330
+ var V = H.H, n = V.b, A = V.e, l = V.R, M = V.n, I = V.A, e = V.Z, b = V.m, Z = W == null;
331
+ if (Z)
332
+ W = new R(N.length >>> 2 << 3);
333
+ while (i == 0) {
334
+ i = n(N, d, 1);
335
+ m = n(N, d + 1, 2);
336
+ d += 3;
337
+ if (m == 0) {
338
+ if ((d & 7) != 0)
339
+ d += 8 - (d & 7);
340
+ var D = (d >>> 3) + 4, q = N[D - 4] | N[D - 3] << 8;
341
+ if (Z)
342
+ W = H.H.W(W, w + q);
343
+ W.set(new R(N.buffer, N.byteOffset + D, q), w);
344
+ d = D + q << 3;
345
+ w += q;
346
+ continue;
347
+ }
348
+ if (Z)
349
+ W = H.H.W(W, w + (1 << 17));
350
+ if (m == 1) {
351
+ v = b.J;
352
+ C = b.h;
353
+ X = (1 << 9) - 1;
354
+ u = (1 << 5) - 1;
355
+ }
356
+ if (m == 2) {
357
+ J = A(N, d, 5) + 257;
358
+ h = A(N, d + 5, 5) + 1;
359
+ Q = A(N, d + 10, 4) + 4;
360
+ d += 14;
361
+ var j = 1;
362
+ for (var c = 0; c < 38; c += 2) {
363
+ b.Q[c] = 0;
364
+ b.Q[c + 1] = 0;
365
+ }
366
+ for (var c = 0; c < Q; c++) {
367
+ var K = A(N, d + c * 3, 3);
368
+ b.Q[(b.X[c] << 1) + 1] = K;
369
+ if (K > j)
370
+ j = K;
371
+ }
372
+ d += 3 * Q;
373
+ M(b.Q, j);
374
+ I(b.Q, j, b.u);
375
+ v = b.w;
376
+ C = b.d;
377
+ d = l(b.u, (1 << j) - 1, J + h, N, d, b.v);
378
+ var r = V.V(b.v, 0, J, b.C);
379
+ X = (1 << r) - 1;
380
+ var S = V.V(b.v, J, h, b.D);
381
+ u = (1 << S) - 1;
382
+ M(b.C, r);
383
+ I(b.C, r, v);
384
+ M(b.D, S);
385
+ I(b.D, S, C);
386
+ }
387
+ while (true) {
388
+ var T = v[e(N, d) & X];
389
+ d += T & 15;
390
+ var p = T >>> 4;
391
+ if (p >>> 8 == 0) {
392
+ W[w++] = p;
393
+ } else if (p == 256) {
394
+ break;
395
+ } else {
396
+ var z = w + p - 254;
397
+ if (p > 264) {
398
+ var _ = b.q[p - 257];
399
+ z = w + (_ >>> 3) + A(N, d, _ & 7);
400
+ d += _ & 7;
401
+ }
402
+ var $ = C[e(N, d) & u];
403
+ d += $ & 15;
404
+ var s = $ >>> 4, Y = b.c[s], a = (Y >>> 4) + n(N, d, Y & 15);
405
+ d += Y & 15;
406
+ while (w < z) {
407
+ W[w] = W[w++ - a];
408
+ W[w] = W[w++ - a];
409
+ W[w] = W[w++ - a];
410
+ W[w] = W[w++ - a];
411
+ }
412
+ w = z;
413
+ }
414
+ }
415
+ }
416
+ return W.length == w ? W : W.slice(0, w);
417
+ };
418
+ H.H.W = function(N, W) {
419
+ var R = N.length;
420
+ if (W <= R)
421
+ return N;
422
+ var V = new Uint8Array(R << 1);
423
+ V.set(N, 0);
424
+ return V;
425
+ };
426
+ H.H.R = function(N, W, R, V, n, A) {
427
+ var l = H.H.e, M = H.H.Z, I = 0;
428
+ while (I < R) {
429
+ var e = N[M(V, n) & W];
430
+ n += e & 15;
431
+ var b = e >>> 4;
432
+ if (b <= 15) {
433
+ A[I] = b;
434
+ I++;
435
+ } else {
436
+ var Z = 0, m = 0;
437
+ if (b == 16) {
438
+ m = 3 + l(V, n, 2);
439
+ n += 2;
440
+ Z = A[I - 1];
441
+ } else if (b == 17) {
442
+ m = 3 + l(V, n, 3);
443
+ n += 3;
444
+ } else if (b == 18) {
445
+ m = 11 + l(V, n, 7);
446
+ n += 7;
447
+ }
448
+ var J = I + m;
449
+ while (I < J) {
450
+ A[I] = Z;
451
+ I++;
452
+ }
453
+ }
454
+ }
455
+ return n;
456
+ };
457
+ H.H.V = function(N, W, R, V) {
458
+ var n = 0, A = 0, l = V.length >>> 1;
459
+ while (A < R) {
460
+ var M = N[A + W];
461
+ V[A << 1] = 0;
462
+ V[(A << 1) + 1] = M;
463
+ if (M > n)
464
+ n = M;
465
+ A++;
466
+ }
467
+ while (A < l) {
468
+ V[A << 1] = 0;
469
+ V[(A << 1) + 1] = 0;
470
+ A++;
471
+ }
472
+ return n;
473
+ };
474
+ H.H.n = function(N, W) {
475
+ var R = H.H.m, V = N.length, n, A, l, M, I, e = R.j;
476
+ for (var M = 0; M <= W; M++)
477
+ e[M] = 0;
478
+ for (M = 1; M < V; M += 2)
479
+ e[N[M]]++;
480
+ var b = R.K;
481
+ n = 0;
482
+ e[0] = 0;
483
+ for (A = 1; A <= W; A++) {
484
+ n = n + e[A - 1] << 1;
485
+ b[A] = n;
486
+ }
487
+ for (l = 0; l < V; l += 2) {
488
+ I = N[l + 1];
489
+ if (I != 0) {
490
+ N[l] = b[I];
491
+ b[I]++;
492
+ }
493
+ }
494
+ };
495
+ H.H.A = function(N, W, R) {
496
+ var V = N.length, n = H.H.m, A = n.r;
497
+ for (var l = 0; l < V; l += 2)
498
+ if (N[l + 1] != 0) {
499
+ var M = l >> 1, I = N[l + 1], e = M << 4 | I, b = W - I, Z = N[l] << b, m = Z + (1 << b);
500
+ while (Z != m) {
501
+ var J = A[Z] >>> 15 - W;
502
+ R[J] = e;
503
+ Z++;
504
+ }
505
+ }
506
+ };
507
+ H.H.l = function(N, W) {
508
+ var R = H.H.m.r, V = 15 - W;
509
+ for (var n = 0; n < N.length; n += 2) {
510
+ var A = N[n] << W - N[n + 1];
511
+ N[n] = R[A] >>> V;
512
+ }
513
+ };
514
+ H.H.M = function(N, W, R) {
515
+ R = R << (W & 7);
516
+ var V = W >>> 3;
517
+ N[V] |= R;
518
+ N[V + 1] |= R >>> 8;
519
+ };
520
+ H.H.I = function(N, W, R) {
521
+ R = R << (W & 7);
522
+ var V = W >>> 3;
523
+ N[V] |= R;
524
+ N[V + 1] |= R >>> 8;
525
+ N[V + 2] |= R >>> 16;
526
+ };
527
+ H.H.e = function(N, W, R) {
528
+ return (N[W >>> 3] | N[(W >>> 3) + 1] << 8) >>> (W & 7) & (1 << R) - 1;
529
+ };
530
+ H.H.b = function(N, W, R) {
531
+ return (N[W >>> 3] | N[(W >>> 3) + 1] << 8 | N[(W >>> 3) + 2] << 16) >>> (W & 7) & (1 << R) - 1;
532
+ };
533
+ H.H.Z = function(N, W) {
534
+ return (N[W >>> 3] | N[(W >>> 3) + 1] << 8 | N[(W >>> 3) + 2] << 16) >>> (W & 7);
535
+ };
536
+ H.H.i = function(N, W) {
537
+ return (N[W >>> 3] | N[(W >>> 3) + 1] << 8 | N[(W >>> 3) + 2] << 16 | N[(W >>> 3) + 3] << 24) >>> (W & 7);
538
+ };
539
+ H.H.m = function() {
540
+ var N = Uint16Array, W = Uint32Array;
541
+ return {
542
+ K: new N(16),
543
+ j: new N(16),
544
+ X: [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15],
545
+ S: [
546
+ 3,
547
+ 4,
548
+ 5,
549
+ 6,
550
+ 7,
551
+ 8,
552
+ 9,
553
+ 10,
554
+ 11,
555
+ 13,
556
+ 15,
557
+ 17,
558
+ 19,
559
+ 23,
560
+ 27,
561
+ 31,
562
+ 35,
563
+ 43,
564
+ 51,
565
+ 59,
566
+ 67,
567
+ 83,
568
+ 99,
569
+ 115,
570
+ 131,
571
+ 163,
572
+ 195,
573
+ 227,
574
+ 258,
575
+ 999,
576
+ 999,
577
+ 999
578
+ ],
579
+ T: [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 0, 0, 0],
580
+ q: new N(32),
581
+ p: [
582
+ 1,
583
+ 2,
584
+ 3,
585
+ 4,
586
+ 5,
587
+ 7,
588
+ 9,
589
+ 13,
590
+ 17,
591
+ 25,
592
+ 33,
593
+ 49,
594
+ 65,
595
+ 97,
596
+ 129,
597
+ 193,
598
+ 257,
599
+ 385,
600
+ 513,
601
+ 769,
602
+ 1025,
603
+ 1537,
604
+ 2049,
605
+ 3073,
606
+ 4097,
607
+ 6145,
608
+ 8193,
609
+ 12289,
610
+ 16385,
611
+ 24577,
612
+ 65535,
613
+ 65535
614
+ ],
615
+ z: [0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 0, 0],
616
+ c: new W(32),
617
+ J: new N(512),
618
+ _: [],
619
+ h: new N(32),
620
+ $: [],
621
+ w: new N(32768),
622
+ C: [],
623
+ v: [],
624
+ d: new N(32768),
625
+ D: [],
626
+ u: new N(512),
627
+ Q: [],
628
+ r: new N(1 << 15),
629
+ s: new W(286),
630
+ Y: new W(30),
631
+ a: new W(19),
632
+ t: new W(15e3),
633
+ k: new N(1 << 16),
634
+ g: new N(1 << 15)
635
+ };
636
+ }();
637
+ (function() {
638
+ var N = H.H.m, W = 1 << 15;
639
+ for (var R = 0; R < W; R++) {
640
+ var V = R;
641
+ V = (V & 2863311530) >>> 1 | (V & 1431655765) << 1;
642
+ V = (V & 3435973836) >>> 2 | (V & 858993459) << 2;
643
+ V = (V & 4042322160) >>> 4 | (V & 252645135) << 4;
644
+ V = (V & 4278255360) >>> 8 | (V & 16711935) << 8;
645
+ N.r[R] = (V >>> 16 | V << 16) >>> 17;
646
+ }
647
+ function n(A, l, M) {
648
+ while (l-- != 0)
649
+ A.push(0, M);
650
+ }
651
+ for (var R = 0; R < 32; R++) {
652
+ N.q[R] = N.S[R] << 3 | N.T[R];
653
+ N.c[R] = N.p[R] << 4 | N.z[R];
654
+ }
655
+ n(N._, 144, 8);
656
+ n(N._, 255 - 143, 9);
657
+ n(N._, 279 - 255, 7);
658
+ n(N._, 287 - 279, 8);
659
+ H.H.n(N._, 9);
660
+ H.H.A(N._, 9, N.J);
661
+ H.H.l(N._, 9);
662
+ n(N.$, 32, 5);
663
+ H.H.n(N.$, 5);
664
+ H.H.A(N.$, 5, N.h);
665
+ H.H.l(N.$, 5);
666
+ n(N.Q, 19, 0);
667
+ n(N.C, 286, 0);
668
+ n(N.D, 30, 0);
669
+ n(N.v, 320, 0);
670
+ })();
671
+ return H.H.N;
672
+ }();
673
+ UPNG.decode._readInterlace = function(data, out) {
674
+ var w = out.width, h = out.height;
675
+ var bpp = UPNG.decode._getBPP(out), cbpp = bpp >> 3, bpl = Math.ceil(w * bpp / 8);
676
+ var img = new Uint8Array(h * bpl);
677
+ var di = 0;
678
+ var starting_row = [0, 0, 4, 0, 2, 0, 1];
679
+ var starting_col = [0, 4, 0, 2, 0, 1, 0];
680
+ var row_increment = [8, 8, 8, 4, 4, 2, 2];
681
+ var col_increment = [8, 8, 4, 4, 2, 2, 1];
682
+ var pass = 0;
683
+ while (pass < 7) {
684
+ var ri = row_increment[pass], ci = col_increment[pass];
685
+ var sw = 0, sh = 0;
686
+ var cr = starting_row[pass];
687
+ while (cr < h) {
688
+ cr += ri;
689
+ sh++;
690
+ }
691
+ var cc = starting_col[pass];
692
+ while (cc < w) {
693
+ cc += ci;
694
+ sw++;
695
+ }
696
+ var bpll = Math.ceil(sw * bpp / 8);
697
+ UPNG.decode._filterZero(data, out, di, sw, sh);
698
+ var y = 0, row = starting_row[pass];
699
+ while (row < h) {
700
+ var col = starting_col[pass];
701
+ var cdi = di + y * bpll << 3;
702
+ while (col < w) {
703
+ if (bpp == 1) {
704
+ var val = data[cdi >> 3];
705
+ val = val >> 7 - (cdi & 7) & 1;
706
+ img[row * bpl + (col >> 3)] |= val << 7 - ((col & 7) << 0);
707
+ }
708
+ if (bpp == 2) {
709
+ var val = data[cdi >> 3];
710
+ val = val >> 6 - (cdi & 7) & 3;
711
+ img[row * bpl + (col >> 2)] |= val << 6 - ((col & 3) << 1);
712
+ }
713
+ if (bpp == 4) {
714
+ var val = data[cdi >> 3];
715
+ val = val >> 4 - (cdi & 7) & 15;
716
+ img[row * bpl + (col >> 1)] |= val << 4 - ((col & 1) << 2);
717
+ }
718
+ if (bpp >= 8) {
719
+ var ii = row * bpl + col * cbpp;
720
+ for (var j = 0; j < cbpp; j++)
721
+ img[ii + j] = data[(cdi >> 3) + j];
722
+ }
723
+ cdi += bpp;
724
+ col += ci;
725
+ }
726
+ y++;
727
+ row += ri;
728
+ }
729
+ if (sw * sh != 0)
730
+ di += sh * (1 + bpll);
731
+ pass = pass + 1;
732
+ }
733
+ return img;
734
+ };
735
+ UPNG.decode._getBPP = function(out) {
736
+ var noc = [1, null, 3, 1, 2, null, 4][out.ctype];
737
+ return noc * out.depth;
738
+ };
739
+ UPNG.decode._filterZero = function(data, out, off, w, h) {
740
+ var bpp = UPNG.decode._getBPP(out), bpl = Math.ceil(w * bpp / 8), paeth = UPNG.decode._paeth;
741
+ bpp = Math.ceil(bpp / 8);
742
+ var i = 0, di = 1, type = data[off], x = 0;
743
+ if (type > 1)
744
+ data[off] = [0, 0, 1][type - 2];
745
+ if (type == 3)
746
+ for (x = bpp; x < bpl; x++)
747
+ data[x + 1] = data[x + 1] + (data[x + 1 - bpp] >>> 1) & 255;
748
+ for (var y = 0; y < h; y++) {
749
+ i = off + y * bpl;
750
+ di = i + y + 1;
751
+ type = data[di - 1];
752
+ x = 0;
753
+ if (type == 0)
754
+ for (; x < bpl; x++)
755
+ data[i + x] = data[di + x];
756
+ else if (type == 1) {
757
+ for (; x < bpp; x++)
758
+ data[i + x] = data[di + x];
759
+ for (; x < bpl; x++)
760
+ data[i + x] = data[di + x] + data[i + x - bpp];
761
+ } else if (type == 2) {
762
+ for (; x < bpl; x++)
763
+ data[i + x] = data[di + x] + data[i + x - bpl];
764
+ } else if (type == 3) {
765
+ for (; x < bpp; x++)
766
+ data[i + x] = data[di + x] + (data[i + x - bpl] >>> 1);
767
+ for (; x < bpl; x++)
768
+ data[i + x] = data[di + x] + (data[i + x - bpl] + data[i + x - bpp] >>> 1);
769
+ } else {
770
+ for (; x < bpp; x++)
771
+ data[i + x] = data[di + x] + paeth(0, data[i + x - bpl], 0);
772
+ for (; x < bpl; x++)
773
+ data[i + x] = data[di + x] + paeth(data[i + x - bpp], data[i + x - bpl], data[i + x - bpp - bpl]);
774
+ }
775
+ }
776
+ return data;
777
+ };
778
+ UPNG.decode._paeth = function(a, b, c) {
779
+ var p = a + b - c, pa = p - a, pb = p - b, pc = p - c;
780
+ if (pa * pa <= pb * pb && pa * pa <= pc * pc)
781
+ return a;
782
+ else if (pb * pb <= pc * pc)
783
+ return b;
784
+ return c;
785
+ };
786
+ UPNG.decode._IHDR = function(data, offset, out) {
787
+ var bin = UPNG._bin;
788
+ out.width = bin.readUint(data, offset);
789
+ offset += 4;
790
+ out.height = bin.readUint(data, offset);
791
+ offset += 4;
792
+ out.depth = data[offset];
793
+ offset++;
794
+ out.ctype = data[offset];
795
+ offset++;
796
+ out.compress = data[offset];
797
+ offset++;
798
+ out.filter = data[offset];
799
+ offset++;
800
+ out.interlace = data[offset];
801
+ offset++;
802
+ };
803
+ UPNG._bin = {
804
+ nextZero: function(data, p) {
805
+ while (data[p] != 0)
806
+ p++;
807
+ return p;
808
+ },
809
+ readUshort: function(buff, p) {
810
+ return buff[p] << 8 | buff[p + 1];
811
+ },
812
+ writeUshort: function(buff, p, n) {
813
+ buff[p] = n >> 8 & 255;
814
+ buff[p + 1] = n & 255;
815
+ },
816
+ readUint: function(buff, p) {
817
+ return buff[p] * (256 * 256 * 256) + (buff[p + 1] << 16 | buff[p + 2] << 8 | buff[p + 3]);
818
+ },
819
+ writeUint: function(buff, p, n) {
820
+ buff[p] = n >> 24 & 255;
821
+ buff[p + 1] = n >> 16 & 255;
822
+ buff[p + 2] = n >> 8 & 255;
823
+ buff[p + 3] = n & 255;
824
+ },
825
+ readASCII: function(buff, p, l) {
826
+ var s = "";
827
+ for (var i = 0; i < l; i++)
828
+ s += String.fromCharCode(buff[p + i]);
829
+ return s;
830
+ },
831
+ writeASCII: function(data, p, s) {
832
+ for (var i = 0; i < s.length; i++)
833
+ data[p + i] = s.charCodeAt(i);
834
+ },
835
+ readBytes: function(buff, p, l) {
836
+ var arr = [];
837
+ for (var i = 0; i < l; i++)
838
+ arr.push(buff[p + i]);
839
+ return arr;
840
+ },
841
+ pad: function(n) {
842
+ return n.length < 2 ? "0" + n : n;
843
+ },
844
+ readUTF8: function(buff, p, l) {
845
+ var s = "", ns;
846
+ for (var i = 0; i < l; i++)
847
+ s += "%" + UPNG._bin.pad(buff[p + i].toString(16));
848
+ try {
849
+ ns = decodeURIComponent(s);
850
+ } catch (e) {
851
+ return UPNG._bin.readASCII(buff, p, l);
852
+ }
853
+ return ns;
854
+ }
855
+ };
856
+ UPNG._copyTile = function(sb, sw, sh, tb, tw, th, xoff, yoff, mode) {
857
+ var w = Math.min(sw, tw), h = Math.min(sh, th);
858
+ var si = 0, ti = 0;
859
+ for (var y = 0; y < h; y++)
860
+ for (var x = 0; x < w; x++) {
861
+ if (xoff >= 0 && yoff >= 0) {
862
+ si = y * sw + x << 2;
863
+ ti = (yoff + y) * tw + xoff + x << 2;
864
+ } else {
865
+ si = (-yoff + y) * sw - xoff + x << 2;
866
+ ti = y * tw + x << 2;
867
+ }
868
+ if (mode == 0) {
869
+ tb[ti] = sb[si];
870
+ tb[ti + 1] = sb[si + 1];
871
+ tb[ti + 2] = sb[si + 2];
872
+ tb[ti + 3] = sb[si + 3];
873
+ } else if (mode == 1) {
874
+ var fa = sb[si + 3] * (1 / 255), fr = sb[si] * fa, fg = sb[si + 1] * fa, fb = sb[si + 2] * fa;
875
+ var ba = tb[ti + 3] * (1 / 255), br = tb[ti] * ba, bg = tb[ti + 1] * ba, bb = tb[ti + 2] * ba;
876
+ var ifa = 1 - fa, oa = fa + ba * ifa, ioa = oa == 0 ? 0 : 1 / oa;
877
+ tb[ti + 3] = 255 * oa;
878
+ tb[ti + 0] = (fr + br * ifa) * ioa;
879
+ tb[ti + 1] = (fg + bg * ifa) * ioa;
880
+ tb[ti + 2] = (fb + bb * ifa) * ioa;
881
+ } else if (mode == 2) {
882
+ var fa = sb[si + 3], fr = sb[si], fg = sb[si + 1], fb = sb[si + 2];
883
+ var ba = tb[ti + 3], br = tb[ti], bg = tb[ti + 1], bb = tb[ti + 2];
884
+ if (fa == ba && fr == br && fg == bg && fb == bb) {
885
+ tb[ti] = 0;
886
+ tb[ti + 1] = 0;
887
+ tb[ti + 2] = 0;
888
+ tb[ti + 3] = 0;
889
+ } else {
890
+ tb[ti] = fr;
891
+ tb[ti + 1] = fg;
892
+ tb[ti + 2] = fb;
893
+ tb[ti + 3] = fa;
894
+ }
895
+ } else if (mode == 3) {
896
+ var fa = sb[si + 3], fr = sb[si], fg = sb[si + 1], fb = sb[si + 2];
897
+ var ba = tb[ti + 3], br = tb[ti], bg = tb[ti + 1], bb = tb[ti + 2];
898
+ if (fa == ba && fr == br && fg == bg && fb == bb)
899
+ continue;
900
+ if (fa < 220 && ba > 20)
901
+ return false;
902
+ }
903
+ }
904
+ return true;
905
+ };
906
+ UPNG.encode = function(bufs, w, h, ps, dels, tabs, forbidPlte) {
907
+ if (ps == null)
908
+ ps = 0;
909
+ if (forbidPlte == null)
910
+ forbidPlte = false;
911
+ var nimg = UPNG.encode.compress(bufs, w, h, ps, [false, false, false, 0, forbidPlte]);
912
+ UPNG.encode.compressPNG(nimg, -1);
913
+ return UPNG.encode._main(nimg, w, h, dels, tabs);
914
+ };
915
+ UPNG.encodeLL = function(bufs, w, h, cc, ac, depth, dels, tabs) {
916
+ var nimg = { ctype: 0 + (cc == 1 ? 0 : 2) + (ac == 0 ? 0 : 4), depth, frames: [] };
917
+ var bipp = (cc + ac) * depth, bipl = bipp * w;
918
+ for (var i = 0; i < bufs.length; i++)
919
+ nimg.frames.push({
920
+ rect: { x: 0, y: 0, width: w, height: h },
921
+ img: new Uint8Array(bufs[i]),
922
+ blend: 0,
923
+ dispose: 1,
924
+ bpp: Math.ceil(bipp / 8),
925
+ bpl: Math.ceil(bipl / 8)
926
+ });
927
+ UPNG.encode.compressPNG(nimg, 0, true);
928
+ var out = UPNG.encode._main(nimg, w, h, dels, tabs);
929
+ return out;
930
+ };
931
+ UPNG.encode._main = function(nimg, w, h, dels, tabs) {
932
+ if (tabs == null)
933
+ tabs = {};
934
+ var crc = UPNG.crc.crc, wUi = UPNG._bin.writeUint, wUs = UPNG._bin.writeUshort, wAs = UPNG._bin.writeASCII;
935
+ var offset = 8, anim = nimg.frames.length > 1, pltAlpha = false;
936
+ var leng = 8 + (16 + 5 + 4) + (anim ? 20 : 0);
937
+ if (tabs["sRGB"] != null)
938
+ leng += 8 + 1 + 4;
939
+ if (tabs["pHYs"] != null)
940
+ leng += 8 + 9 + 4;
941
+ if (nimg.ctype == 3) {
942
+ var dl = nimg.plte.length;
943
+ for (var i = 0; i < dl; i++)
944
+ if (nimg.plte[i] >>> 24 != 255)
945
+ pltAlpha = true;
946
+ leng += 8 + dl * 3 + 4 + (pltAlpha ? 8 + dl * 1 + 4 : 0);
947
+ }
948
+ for (var j = 0; j < nimg.frames.length; j++) {
949
+ var fr = nimg.frames[j];
950
+ if (anim)
951
+ leng += 38;
952
+ leng += fr.cimg.length + 12;
953
+ if (j != 0)
954
+ leng += 4;
955
+ }
956
+ leng += 12;
957
+ var data = new Uint8Array(leng);
958
+ var wr = [137, 80, 78, 71, 13, 10, 26, 10];
959
+ for (var i = 0; i < 8; i++)
960
+ data[i] = wr[i];
961
+ wUi(data, offset, 13);
962
+ offset += 4;
963
+ wAs(data, offset, "IHDR");
964
+ offset += 4;
965
+ wUi(data, offset, w);
966
+ offset += 4;
967
+ wUi(data, offset, h);
968
+ offset += 4;
969
+ data[offset] = nimg.depth;
970
+ offset++;
971
+ data[offset] = nimg.ctype;
972
+ offset++;
973
+ data[offset] = 0;
974
+ offset++;
975
+ data[offset] = 0;
976
+ offset++;
977
+ data[offset] = 0;
978
+ offset++;
979
+ wUi(data, offset, crc(data, offset - 17, 17));
980
+ offset += 4;
981
+ if (tabs["sRGB"] != null) {
982
+ wUi(data, offset, 1);
983
+ offset += 4;
984
+ wAs(data, offset, "sRGB");
985
+ offset += 4;
986
+ data[offset] = tabs["sRGB"];
987
+ offset++;
988
+ wUi(data, offset, crc(data, offset - 5, 5));
989
+ offset += 4;
990
+ }
991
+ if (tabs["pHYs"] != null) {
992
+ wUi(data, offset, 9);
993
+ offset += 4;
994
+ wAs(data, offset, "pHYs");
995
+ offset += 4;
996
+ wUi(data, offset, tabs["pHYs"][0]);
997
+ offset += 4;
998
+ wUi(data, offset, tabs["pHYs"][1]);
999
+ offset += 4;
1000
+ data[offset] = tabs["pHYs"][2];
1001
+ offset++;
1002
+ wUi(data, offset, crc(data, offset - 13, 13));
1003
+ offset += 4;
1004
+ }
1005
+ if (anim) {
1006
+ wUi(data, offset, 8);
1007
+ offset += 4;
1008
+ wAs(data, offset, "acTL");
1009
+ offset += 4;
1010
+ wUi(data, offset, nimg.frames.length);
1011
+ offset += 4;
1012
+ wUi(data, offset, tabs["loop"] != null ? tabs["loop"] : 0);
1013
+ offset += 4;
1014
+ wUi(data, offset, crc(data, offset - 12, 12));
1015
+ offset += 4;
1016
+ }
1017
+ if (nimg.ctype == 3) {
1018
+ var dl = nimg.plte.length;
1019
+ wUi(data, offset, dl * 3);
1020
+ offset += 4;
1021
+ wAs(data, offset, "PLTE");
1022
+ offset += 4;
1023
+ for (var i = 0; i < dl; i++) {
1024
+ var ti = i * 3, c = nimg.plte[i], r = c & 255, g = c >>> 8 & 255, b = c >>> 16 & 255;
1025
+ data[offset + ti + 0] = r;
1026
+ data[offset + ti + 1] = g;
1027
+ data[offset + ti + 2] = b;
1028
+ }
1029
+ offset += dl * 3;
1030
+ wUi(data, offset, crc(data, offset - dl * 3 - 4, dl * 3 + 4));
1031
+ offset += 4;
1032
+ if (pltAlpha) {
1033
+ wUi(data, offset, dl);
1034
+ offset += 4;
1035
+ wAs(data, offset, "tRNS");
1036
+ offset += 4;
1037
+ for (var i = 0; i < dl; i++)
1038
+ data[offset + i] = nimg.plte[i] >>> 24 & 255;
1039
+ offset += dl;
1040
+ wUi(data, offset, crc(data, offset - dl - 4, dl + 4));
1041
+ offset += 4;
1042
+ }
1043
+ }
1044
+ var fi = 0;
1045
+ for (var j = 0; j < nimg.frames.length; j++) {
1046
+ var fr = nimg.frames[j];
1047
+ if (anim) {
1048
+ wUi(data, offset, 26);
1049
+ offset += 4;
1050
+ wAs(data, offset, "fcTL");
1051
+ offset += 4;
1052
+ wUi(data, offset, fi++);
1053
+ offset += 4;
1054
+ wUi(data, offset, fr.rect.width);
1055
+ offset += 4;
1056
+ wUi(data, offset, fr.rect.height);
1057
+ offset += 4;
1058
+ wUi(data, offset, fr.rect.x);
1059
+ offset += 4;
1060
+ wUi(data, offset, fr.rect.y);
1061
+ offset += 4;
1062
+ wUs(data, offset, dels[j]);
1063
+ offset += 2;
1064
+ wUs(data, offset, 1e3);
1065
+ offset += 2;
1066
+ data[offset] = fr.dispose;
1067
+ offset++;
1068
+ data[offset] = fr.blend;
1069
+ offset++;
1070
+ wUi(data, offset, crc(data, offset - 30, 30));
1071
+ offset += 4;
1072
+ }
1073
+ var imgd = fr.cimg, dl = imgd.length;
1074
+ wUi(data, offset, dl + (j == 0 ? 0 : 4));
1075
+ offset += 4;
1076
+ var ioff = offset;
1077
+ wAs(data, offset, j == 0 ? "IDAT" : "fdAT");
1078
+ offset += 4;
1079
+ if (j != 0) {
1080
+ wUi(data, offset, fi++);
1081
+ offset += 4;
1082
+ }
1083
+ data.set(imgd, offset);
1084
+ offset += dl;
1085
+ wUi(data, offset, crc(data, ioff, offset - ioff));
1086
+ offset += 4;
1087
+ }
1088
+ wUi(data, offset, 0);
1089
+ offset += 4;
1090
+ wAs(data, offset, "IEND");
1091
+ offset += 4;
1092
+ wUi(data, offset, crc(data, offset - 4, 4));
1093
+ offset += 4;
1094
+ return data.buffer;
1095
+ };
1096
+ UPNG.encode.compressPNG = function(out, filter, levelZero) {
1097
+ for (var i = 0; i < out.frames.length; i++) {
1098
+ var frm = out.frames[i];
1099
+ frm.rect.width;
1100
+ var nh = frm.rect.height;
1101
+ var fdata = new Uint8Array(nh * frm.bpl + nh);
1102
+ frm.cimg = UPNG.encode._filterZero(frm.img, nh, frm.bpp, frm.bpl, fdata, filter, levelZero);
1103
+ }
1104
+ };
1105
+ UPNG.encode.compress = function(bufs, w, h, ps, prms) {
1106
+ var onlyBlend = prms[0], evenCrd = prms[1], forbidPrev = prms[2], minBits = prms[3], forbidPlte = prms[4];
1107
+ var ctype = 6, depth = 8, alphaAnd = 255;
1108
+ for (var j = 0; j < bufs.length; j++) {
1109
+ var img = new Uint8Array(bufs[j]), ilen = img.length;
1110
+ for (var i = 0; i < ilen; i += 4)
1111
+ alphaAnd &= img[i + 3];
1112
+ }
1113
+ var gotAlpha = alphaAnd != 255;
1114
+ var frms = UPNG.encode.framize(bufs, w, h, onlyBlend, evenCrd, forbidPrev);
1115
+ var cmap = {}, plte = [], inds = [];
1116
+ if (ps != 0) {
1117
+ var nbufs = [];
1118
+ for (var i = 0; i < frms.length; i++)
1119
+ nbufs.push(frms[i].img.buffer);
1120
+ var abuf = UPNG.encode.concatRGBA(nbufs), qres = UPNG.quantize(abuf, ps);
1121
+ var cof = 0, bb = new Uint8Array(qres.abuf);
1122
+ for (var i = 0; i < frms.length; i++) {
1123
+ var ti = frms[i].img, bln = ti.length;
1124
+ inds.push(new Uint8Array(qres.inds.buffer, cof >> 2, bln >> 2));
1125
+ for (var j = 0; j < bln; j += 4) {
1126
+ ti[j] = bb[cof + j];
1127
+ ti[j + 1] = bb[cof + j + 1];
1128
+ ti[j + 2] = bb[cof + j + 2];
1129
+ ti[j + 3] = bb[cof + j + 3];
1130
+ }
1131
+ cof += bln;
1132
+ }
1133
+ for (var i = 0; i < qres.plte.length; i++)
1134
+ plte.push(qres.plte[i].est.rgba);
1135
+ } else {
1136
+ for (var j = 0; j < frms.length; j++) {
1137
+ var frm = frms[j], img32 = new Uint32Array(frm.img.buffer), nw = frm.rect.width, ilen = img32.length;
1138
+ var ind = new Uint8Array(ilen);
1139
+ inds.push(ind);
1140
+ for (var i = 0; i < ilen; i++) {
1141
+ var c = img32[i];
1142
+ if (i != 0 && c == img32[i - 1])
1143
+ ind[i] = ind[i - 1];
1144
+ else if (i > nw && c == img32[i - nw])
1145
+ ind[i] = ind[i - nw];
1146
+ else {
1147
+ var cmc = cmap[c];
1148
+ if (cmc == null) {
1149
+ cmap[c] = cmc = plte.length;
1150
+ plte.push(c);
1151
+ if (plte.length >= 300)
1152
+ break;
1153
+ }
1154
+ ind[i] = cmc;
1155
+ }
1156
+ }
1157
+ }
1158
+ }
1159
+ var cc = plte.length;
1160
+ if (cc <= 256 && forbidPlte == false) {
1161
+ if (cc <= 2)
1162
+ depth = 1;
1163
+ else if (cc <= 4)
1164
+ depth = 2;
1165
+ else if (cc <= 16)
1166
+ depth = 4;
1167
+ else
1168
+ depth = 8;
1169
+ depth = Math.max(depth, minBits);
1170
+ }
1171
+ for (var j = 0; j < frms.length; j++) {
1172
+ var frm = frms[j];
1173
+ frm.rect.x;
1174
+ frm.rect.y;
1175
+ var nw = frm.rect.width, nh = frm.rect.height;
1176
+ var cimg = frm.img;
1177
+ new Uint32Array(cimg.buffer);
1178
+ var bpl = 4 * nw, bpp = 4;
1179
+ if (cc <= 256 && forbidPlte == false) {
1180
+ bpl = Math.ceil(depth * nw / 8);
1181
+ var nimg = new Uint8Array(bpl * nh);
1182
+ var inj = inds[j];
1183
+ for (var y = 0; y < nh; y++) {
1184
+ var i = y * bpl, ii = y * nw;
1185
+ if (depth == 8)
1186
+ for (var x = 0; x < nw; x++)
1187
+ nimg[i + x] = inj[ii + x];
1188
+ else if (depth == 4)
1189
+ for (var x = 0; x < nw; x++)
1190
+ nimg[i + (x >> 1)] |= inj[ii + x] << 4 - (x & 1) * 4;
1191
+ else if (depth == 2)
1192
+ for (var x = 0; x < nw; x++)
1193
+ nimg[i + (x >> 2)] |= inj[ii + x] << 6 - (x & 3) * 2;
1194
+ else if (depth == 1)
1195
+ for (var x = 0; x < nw; x++)
1196
+ nimg[i + (x >> 3)] |= inj[ii + x] << 7 - (x & 7) * 1;
1197
+ }
1198
+ cimg = nimg;
1199
+ ctype = 3;
1200
+ bpp = 1;
1201
+ } else if (gotAlpha == false && frms.length == 1) {
1202
+ var nimg = new Uint8Array(nw * nh * 3), area = nw * nh;
1203
+ for (var i = 0; i < area; i++) {
1204
+ var ti = i * 3, qi = i * 4;
1205
+ nimg[ti] = cimg[qi];
1206
+ nimg[ti + 1] = cimg[qi + 1];
1207
+ nimg[ti + 2] = cimg[qi + 2];
1208
+ }
1209
+ cimg = nimg;
1210
+ ctype = 2;
1211
+ bpp = 3;
1212
+ bpl = 3 * nw;
1213
+ }
1214
+ frm.img = cimg;
1215
+ frm.bpl = bpl;
1216
+ frm.bpp = bpp;
1217
+ }
1218
+ return { ctype, depth, plte, frames: frms };
1219
+ };
1220
+ UPNG.encode.framize = function(bufs, w, h, alwaysBlend, evenCrd, forbidPrev) {
1221
+ var frms = [];
1222
+ for (var j = 0; j < bufs.length; j++) {
1223
+ var cimg = new Uint8Array(bufs[j]), cimg32 = new Uint32Array(cimg.buffer);
1224
+ var nimg;
1225
+ var nx = 0, ny = 0, nw = w, nh = h, blend = alwaysBlend ? 1 : 0;
1226
+ if (j != 0) {
1227
+ var tlim = forbidPrev || alwaysBlend || j == 1 || frms[j - 2].dispose != 0 ? 1 : 2, tstp = 0, tarea = 1e9;
1228
+ for (var it = 0; it < tlim; it++) {
1229
+ var pimg = new Uint8Array(bufs[j - 1 - it]), p32 = new Uint32Array(bufs[j - 1 - it]);
1230
+ var mix = w, miy = h, max = -1, may = -1;
1231
+ for (var y = 0; y < h; y++)
1232
+ for (var x = 0; x < w; x++) {
1233
+ var i = y * w + x;
1234
+ if (cimg32[i] != p32[i]) {
1235
+ if (x < mix)
1236
+ mix = x;
1237
+ if (x > max)
1238
+ max = x;
1239
+ if (y < miy)
1240
+ miy = y;
1241
+ if (y > may)
1242
+ may = y;
1243
+ }
1244
+ }
1245
+ if (max == -1)
1246
+ mix = miy = max = may = 0;
1247
+ if (evenCrd) {
1248
+ if ((mix & 1) == 1)
1249
+ mix--;
1250
+ if ((miy & 1) == 1)
1251
+ miy--;
1252
+ }
1253
+ var sarea = (max - mix + 1) * (may - miy + 1);
1254
+ if (sarea < tarea) {
1255
+ tarea = sarea;
1256
+ tstp = it;
1257
+ nx = mix;
1258
+ ny = miy;
1259
+ nw = max - mix + 1;
1260
+ nh = may - miy + 1;
1261
+ }
1262
+ }
1263
+ var pimg = new Uint8Array(bufs[j - 1 - tstp]);
1264
+ if (tstp == 1)
1265
+ frms[j - 1].dispose = 2;
1266
+ nimg = new Uint8Array(nw * nh * 4);
1267
+ UPNG._copyTile(pimg, w, h, nimg, nw, nh, -nx, -ny, 0);
1268
+ blend = UPNG._copyTile(cimg, w, h, nimg, nw, nh, -nx, -ny, 3) ? 1 : 0;
1269
+ if (blend == 1)
1270
+ UPNG.encode._prepareDiff(cimg, w, h, nimg, { x: nx, y: ny, width: nw, height: nh });
1271
+ else
1272
+ UPNG._copyTile(cimg, w, h, nimg, nw, nh, -nx, -ny, 0);
1273
+ } else
1274
+ nimg = cimg.slice(0);
1275
+ frms.push({ rect: { x: nx, y: ny, width: nw, height: nh }, img: nimg, blend, dispose: 0 });
1276
+ }
1277
+ if (alwaysBlend)
1278
+ for (var j = 0; j < frms.length; j++) {
1279
+ var frm = frms[j];
1280
+ if (frm.blend == 1)
1281
+ continue;
1282
+ var r0 = frm.rect, r1 = frms[j - 1].rect;
1283
+ var miX = Math.min(r0.x, r1.x), miY = Math.min(r0.y, r1.y);
1284
+ var maX = Math.max(r0.x + r0.width, r1.x + r1.width), maY = Math.max(r0.y + r0.height, r1.y + r1.height);
1285
+ var r = { x: miX, y: miY, width: maX - miX, height: maY - miY };
1286
+ frms[j - 1].dispose = 1;
1287
+ if (j - 1 != 0)
1288
+ UPNG.encode._updateFrame(bufs, w, h, frms, j - 1, r, evenCrd);
1289
+ UPNG.encode._updateFrame(bufs, w, h, frms, j, r, evenCrd);
1290
+ }
1291
+ var area = 0;
1292
+ if (bufs.length != 1)
1293
+ for (var i = 0; i < frms.length; i++) {
1294
+ var frm = frms[i];
1295
+ area += frm.rect.width * frm.rect.height;
1296
+ }
1297
+ return frms;
1298
+ };
1299
+ UPNG.encode._updateFrame = function(bufs, w, h, frms, i, r, evenCrd) {
1300
+ var U8 = Uint8Array, U32 = Uint32Array;
1301
+ var pimg = new U8(bufs[i - 1]), pimg32 = new U32(bufs[i - 1]), nimg = i + 1 < bufs.length ? new U8(bufs[i + 1]) : null;
1302
+ var cimg = new U8(bufs[i]), cimg32 = new U32(cimg.buffer);
1303
+ var mix = w, miy = h, max = -1, may = -1;
1304
+ for (var y = 0; y < r.height; y++)
1305
+ for (var x = 0; x < r.width; x++) {
1306
+ var cx = r.x + x, cy = r.y + y;
1307
+ var j = cy * w + cx, cc = cimg32[j];
1308
+ if (cc == 0 || frms[i - 1].dispose == 0 && pimg32[j] == cc && (nimg == null || nimg[j * 4 + 3] != 0))
1309
+ ;
1310
+ else {
1311
+ if (cx < mix)
1312
+ mix = cx;
1313
+ if (cx > max)
1314
+ max = cx;
1315
+ if (cy < miy)
1316
+ miy = cy;
1317
+ if (cy > may)
1318
+ may = cy;
1319
+ }
1320
+ }
1321
+ if (max == -1)
1322
+ mix = miy = max = may = 0;
1323
+ if (evenCrd) {
1324
+ if ((mix & 1) == 1)
1325
+ mix--;
1326
+ if ((miy & 1) == 1)
1327
+ miy--;
1328
+ }
1329
+ r = { x: mix, y: miy, width: max - mix + 1, height: may - miy + 1 };
1330
+ var fr = frms[i];
1331
+ fr.rect = r;
1332
+ fr.blend = 1;
1333
+ fr.img = new Uint8Array(r.width * r.height * 4);
1334
+ if (frms[i - 1].dispose == 0) {
1335
+ UPNG._copyTile(pimg, w, h, fr.img, r.width, r.height, -r.x, -r.y, 0);
1336
+ UPNG.encode._prepareDiff(cimg, w, h, fr.img, r);
1337
+ } else
1338
+ UPNG._copyTile(cimg, w, h, fr.img, r.width, r.height, -r.x, -r.y, 0);
1339
+ };
1340
+ UPNG.encode._prepareDiff = function(cimg, w, h, nimg, rec) {
1341
+ UPNG._copyTile(cimg, w, h, nimg, rec.width, rec.height, -rec.x, -rec.y, 2);
1342
+ };
1343
+ UPNG.encode._filterZero = function(img, h, bpp, bpl, data, filter, levelZero) {
1344
+ var fls = [], ftry = [0, 1, 2, 3, 4];
1345
+ if (filter != -1)
1346
+ ftry = [filter];
1347
+ else if (h * bpl > 5e5 || bpp == 1)
1348
+ ftry = [0];
1349
+ var opts;
1350
+ if (levelZero)
1351
+ opts = { level: 0 };
1352
+ var CMPR = data.length > 1e7 && UZIP != null ? UZIP : pako;
1353
+ for (var i = 0; i < ftry.length; i++) {
1354
+ for (var y = 0; y < h; y++)
1355
+ UPNG.encode._filterLine(data, img, y, bpl, bpp, ftry[i]);
1356
+ fls.push(CMPR["deflate"](data, opts));
1357
+ }
1358
+ var ti, tsize = 1e9;
1359
+ for (var i = 0; i < fls.length; i++)
1360
+ if (fls[i].length < tsize) {
1361
+ ti = i;
1362
+ tsize = fls[i].length;
1363
+ }
1364
+ return fls[ti];
1365
+ };
1366
+ UPNG.encode._filterLine = function(data, img, y, bpl, bpp, type) {
1367
+ var i = y * bpl, di = i + y, paeth = UPNG.decode._paeth;
1368
+ data[di] = type;
1369
+ di++;
1370
+ if (type == 0) {
1371
+ if (bpl < 500)
1372
+ for (var x = 0; x < bpl; x++)
1373
+ data[di + x] = img[i + x];
1374
+ else
1375
+ data.set(new Uint8Array(img.buffer, i, bpl), di);
1376
+ } else if (type == 1) {
1377
+ for (var x = 0; x < bpp; x++)
1378
+ data[di + x] = img[i + x];
1379
+ for (var x = bpp; x < bpl; x++)
1380
+ data[di + x] = img[i + x] - img[i + x - bpp] + 256 & 255;
1381
+ } else if (y == 0) {
1382
+ for (var x = 0; x < bpp; x++)
1383
+ data[di + x] = img[i + x];
1384
+ if (type == 2)
1385
+ for (var x = bpp; x < bpl; x++)
1386
+ data[di + x] = img[i + x];
1387
+ if (type == 3)
1388
+ for (var x = bpp; x < bpl; x++)
1389
+ data[di + x] = img[i + x] - (img[i + x - bpp] >> 1) + 256 & 255;
1390
+ if (type == 4)
1391
+ for (var x = bpp; x < bpl; x++)
1392
+ data[di + x] = img[i + x] - paeth(img[i + x - bpp], 0, 0) + 256 & 255;
1393
+ } else {
1394
+ if (type == 2) {
1395
+ for (var x = 0; x < bpl; x++)
1396
+ data[di + x] = img[i + x] + 256 - img[i + x - bpl] & 255;
1397
+ }
1398
+ if (type == 3) {
1399
+ for (var x = 0; x < bpp; x++)
1400
+ data[di + x] = img[i + x] + 256 - (img[i + x - bpl] >> 1) & 255;
1401
+ for (var x = bpp; x < bpl; x++)
1402
+ data[di + x] = img[i + x] + 256 - (img[i + x - bpl] + img[i + x - bpp] >> 1) & 255;
1403
+ }
1404
+ if (type == 4) {
1405
+ for (var x = 0; x < bpp; x++)
1406
+ data[di + x] = img[i + x] + 256 - paeth(0, img[i + x - bpl], 0) & 255;
1407
+ for (var x = bpp; x < bpl; x++)
1408
+ data[di + x] = img[i + x] + 256 - paeth(img[i + x - bpp], img[i + x - bpl], img[i + x - bpp - bpl]) & 255;
1409
+ }
1410
+ }
1411
+ };
1412
+ UPNG.crc = {
1413
+ table: function() {
1414
+ var tab = new Uint32Array(256);
1415
+ for (var n = 0; n < 256; n++) {
1416
+ var c = n;
1417
+ for (var k = 0; k < 8; k++) {
1418
+ if (c & 1)
1419
+ c = 3988292384 ^ c >>> 1;
1420
+ else
1421
+ c = c >>> 1;
1422
+ }
1423
+ tab[n] = c;
1424
+ }
1425
+ return tab;
1426
+ }(),
1427
+ update: function(c, buf, off, len) {
1428
+ for (var i = 0; i < len; i++)
1429
+ c = UPNG.crc.table[(c ^ buf[off + i]) & 255] ^ c >>> 8;
1430
+ return c;
1431
+ },
1432
+ crc: function(b, o, l) {
1433
+ return UPNG.crc.update(4294967295, b, o, l) ^ 4294967295;
1434
+ }
1435
+ };
1436
+ UPNG.quantize = function(abuf, ps) {
1437
+ var oimg = new Uint8Array(abuf), nimg = oimg.slice(0), nimg32 = new Uint32Array(nimg.buffer);
1438
+ var KD = UPNG.quantize.getKDtree(nimg, ps);
1439
+ var root = KD[0], leafs = KD[1];
1440
+ var planeDst = UPNG.quantize.planeDst;
1441
+ var sb = oimg, tb = nimg32, len = sb.length;
1442
+ var inds = new Uint8Array(oimg.length >> 2), nd;
1443
+ if (oimg.length < 2e7)
1444
+ for (var i = 0; i < len; i += 4) {
1445
+ var r = sb[i] * (1 / 255), g = sb[i + 1] * (1 / 255), b = sb[i + 2] * (1 / 255), a = sb[i + 3] * (1 / 255);
1446
+ nd = UPNG.quantize.getNearest(root, r, g, b, a);
1447
+ inds[i >> 2] = nd.ind;
1448
+ tb[i >> 2] = nd.est.rgba;
1449
+ }
1450
+ else
1451
+ for (var i = 0; i < len; i += 4) {
1452
+ var r = sb[i] * (1 / 255), g = sb[i + 1] * (1 / 255), b = sb[i + 2] * (1 / 255), a = sb[i + 3] * (1 / 255);
1453
+ nd = root;
1454
+ while (nd.left)
1455
+ nd = planeDst(nd.est, r, g, b, a) <= 0 ? nd.left : nd.right;
1456
+ inds[i >> 2] = nd.ind;
1457
+ tb[i >> 2] = nd.est.rgba;
1458
+ }
1459
+ return { abuf: nimg.buffer, inds, plte: leafs };
1460
+ };
1461
+ UPNG.quantize.getKDtree = function(nimg, ps, err) {
1462
+ if (err == null)
1463
+ err = 1e-4;
1464
+ var nimg32 = new Uint32Array(nimg.buffer);
1465
+ var root = { i0: 0, i1: nimg.length, bst: null, est: null, tdst: 0, left: null, right: null };
1466
+ root.bst = UPNG.quantize.stats(nimg, root.i0, root.i1);
1467
+ root.est = UPNG.quantize.estats(root.bst);
1468
+ var leafs = [root];
1469
+ while (leafs.length < ps) {
1470
+ var maxL = 0, mi = 0;
1471
+ for (var i = 0; i < leafs.length; i++)
1472
+ if (leafs[i].est.L > maxL) {
1473
+ maxL = leafs[i].est.L;
1474
+ mi = i;
1475
+ }
1476
+ if (maxL < err)
1477
+ break;
1478
+ var node = leafs[mi];
1479
+ var s0 = UPNG.quantize.splitPixels(nimg, nimg32, node.i0, node.i1, node.est.e, node.est.eMq255);
1480
+ var s0wrong = node.i0 >= s0 || node.i1 <= s0;
1481
+ if (s0wrong) {
1482
+ node.est.L = 0;
1483
+ continue;
1484
+ }
1485
+ var ln = { i0: node.i0, i1: s0, bst: null, est: null, tdst: 0, left: null, right: null };
1486
+ ln.bst = UPNG.quantize.stats(nimg, ln.i0, ln.i1);
1487
+ ln.est = UPNG.quantize.estats(ln.bst);
1488
+ var rn = { i0: s0, i1: node.i1, bst: null, est: null, tdst: 0, left: null, right: null };
1489
+ rn.bst = { R: [], m: [], N: node.bst.N - ln.bst.N };
1490
+ for (var i = 0; i < 16; i++)
1491
+ rn.bst.R[i] = node.bst.R[i] - ln.bst.R[i];
1492
+ for (var i = 0; i < 4; i++)
1493
+ rn.bst.m[i] = node.bst.m[i] - ln.bst.m[i];
1494
+ rn.est = UPNG.quantize.estats(rn.bst);
1495
+ node.left = ln;
1496
+ node.right = rn;
1497
+ leafs[mi] = ln;
1498
+ leafs.push(rn);
1499
+ }
1500
+ leafs.sort(function(a, b) {
1501
+ return b.bst.N - a.bst.N;
1502
+ });
1503
+ for (var i = 0; i < leafs.length; i++)
1504
+ leafs[i].ind = i;
1505
+ return [root, leafs];
1506
+ };
1507
+ UPNG.quantize.getNearest = function(nd, r, g, b, a) {
1508
+ if (nd.left == null) {
1509
+ nd.tdst = UPNG.quantize.dist(nd.est.q, r, g, b, a);
1510
+ return nd;
1511
+ }
1512
+ var planeDst = UPNG.quantize.planeDst(nd.est, r, g, b, a);
1513
+ var node0 = nd.left, node1 = nd.right;
1514
+ if (planeDst > 0) {
1515
+ node0 = nd.right;
1516
+ node1 = nd.left;
1517
+ }
1518
+ var ln = UPNG.quantize.getNearest(node0, r, g, b, a);
1519
+ if (ln.tdst <= planeDst * planeDst)
1520
+ return ln;
1521
+ var rn = UPNG.quantize.getNearest(node1, r, g, b, a);
1522
+ return rn.tdst < ln.tdst ? rn : ln;
1523
+ };
1524
+ UPNG.quantize.planeDst = function(est, r, g, b, a) {
1525
+ var e = est.e;
1526
+ return e[0] * r + e[1] * g + e[2] * b + e[3] * a - est.eMq;
1527
+ };
1528
+ UPNG.quantize.dist = function(q, r, g, b, a) {
1529
+ var d0 = r - q[0], d1 = g - q[1], d2 = b - q[2], d3 = a - q[3];
1530
+ return d0 * d0 + d1 * d1 + d2 * d2 + d3 * d3;
1531
+ };
1532
+ UPNG.quantize.splitPixels = function(nimg, nimg32, i0, i1, e, eMq) {
1533
+ var vecDot = UPNG.quantize.vecDot;
1534
+ i1 -= 4;
1535
+ while (i0 < i1) {
1536
+ while (vecDot(nimg, i0, e) <= eMq)
1537
+ i0 += 4;
1538
+ while (vecDot(nimg, i1, e) > eMq)
1539
+ i1 -= 4;
1540
+ if (i0 >= i1)
1541
+ break;
1542
+ var t = nimg32[i0 >> 2];
1543
+ nimg32[i0 >> 2] = nimg32[i1 >> 2];
1544
+ nimg32[i1 >> 2] = t;
1545
+ i0 += 4;
1546
+ i1 -= 4;
1547
+ }
1548
+ while (vecDot(nimg, i0, e) > eMq)
1549
+ i0 -= 4;
1550
+ return i0 + 4;
1551
+ };
1552
+ UPNG.quantize.vecDot = function(nimg, i, e) {
1553
+ return nimg[i] * e[0] + nimg[i + 1] * e[1] + nimg[i + 2] * e[2] + nimg[i + 3] * e[3];
1554
+ };
1555
+ UPNG.quantize.stats = function(nimg, i0, i1) {
1556
+ var R = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
1557
+ var m = [0, 0, 0, 0];
1558
+ var N = i1 - i0 >> 2;
1559
+ for (var i = i0; i < i1; i += 4) {
1560
+ var r = nimg[i] * (1 / 255), g = nimg[i + 1] * (1 / 255), b = nimg[i + 2] * (1 / 255), a = nimg[i + 3] * (1 / 255);
1561
+ m[0] += r;
1562
+ m[1] += g;
1563
+ m[2] += b;
1564
+ m[3] += a;
1565
+ R[0] += r * r;
1566
+ R[1] += r * g;
1567
+ R[2] += r * b;
1568
+ R[3] += r * a;
1569
+ R[5] += g * g;
1570
+ R[6] += g * b;
1571
+ R[7] += g * a;
1572
+ R[10] += b * b;
1573
+ R[11] += b * a;
1574
+ R[15] += a * a;
1575
+ }
1576
+ R[4] = R[1];
1577
+ R[8] = R[2];
1578
+ R[9] = R[6];
1579
+ R[12] = R[3];
1580
+ R[13] = R[7];
1581
+ R[14] = R[11];
1582
+ return { R, m, N };
1583
+ };
1584
+ UPNG.quantize.estats = function(stats) {
1585
+ var R = stats.R, m = stats.m, N = stats.N;
1586
+ var m0 = m[0], m1 = m[1], m2 = m[2], m3 = m[3], iN = N == 0 ? 0 : 1 / N;
1587
+ var Rj = [
1588
+ R[0] - m0 * m0 * iN,
1589
+ R[1] - m0 * m1 * iN,
1590
+ R[2] - m0 * m2 * iN,
1591
+ R[3] - m0 * m3 * iN,
1592
+ R[4] - m1 * m0 * iN,
1593
+ R[5] - m1 * m1 * iN,
1594
+ R[6] - m1 * m2 * iN,
1595
+ R[7] - m1 * m3 * iN,
1596
+ R[8] - m2 * m0 * iN,
1597
+ R[9] - m2 * m1 * iN,
1598
+ R[10] - m2 * m2 * iN,
1599
+ R[11] - m2 * m3 * iN,
1600
+ R[12] - m3 * m0 * iN,
1601
+ R[13] - m3 * m1 * iN,
1602
+ R[14] - m3 * m2 * iN,
1603
+ R[15] - m3 * m3 * iN
1604
+ ];
1605
+ var A = Rj, M = UPNG.M4;
1606
+ var b = [Math.random(), Math.random(), Math.random(), Math.random()], mi = 0, tmi = 0;
1607
+ if (N != 0)
1608
+ for (var i = 0; i < 16; i++) {
1609
+ b = M.multVec(A, b);
1610
+ tmi = Math.sqrt(M.dot(b, b));
1611
+ b = M.sml(1 / tmi, b);
1612
+ if (i != 0 && Math.abs(tmi - mi) < 1e-9)
1613
+ break;
1614
+ mi = tmi;
1615
+ }
1616
+ var q = [m0 * iN, m1 * iN, m2 * iN, m3 * iN];
1617
+ var eMq255 = M.dot(M.sml(255, q), b);
1618
+ return {
1619
+ Cov: Rj,
1620
+ q,
1621
+ e: b,
1622
+ L: mi,
1623
+ eMq255,
1624
+ eMq: M.dot(b, q),
1625
+ rgba: (Math.round(255 * q[3]) << 24 | Math.round(255 * q[2]) << 16 | Math.round(255 * q[1]) << 8 | Math.round(255 * q[0]) << 0) >>> 0
1626
+ };
1627
+ };
1628
+ UPNG.M4 = {
1629
+ multVec: function(m, v) {
1630
+ return [
1631
+ m[0] * v[0] + m[1] * v[1] + m[2] * v[2] + m[3] * v[3],
1632
+ m[4] * v[0] + m[5] * v[1] + m[6] * v[2] + m[7] * v[3],
1633
+ m[8] * v[0] + m[9] * v[1] + m[10] * v[2] + m[11] * v[3],
1634
+ m[12] * v[0] + m[13] * v[1] + m[14] * v[2] + m[15] * v[3]
1635
+ ];
1636
+ },
1637
+ dot: function(x, y) {
1638
+ return x[0] * y[0] + x[1] * y[1] + x[2] * y[2] + x[3] * y[3];
1639
+ },
1640
+ sml: function(a, y) {
1641
+ return [a * y[0], a * y[1], a * y[2], a * y[3]];
1642
+ }
1643
+ };
1644
+ UPNG.encode.concatRGBA = function(bufs) {
1645
+ var tlen = 0;
1646
+ for (var i = 0; i < bufs.length; i++)
1647
+ tlen += bufs[i].byteLength;
1648
+ var nimg = new Uint8Array(tlen), noff = 0;
1649
+ for (var i = 0; i < bufs.length; i++) {
1650
+ var img = new Uint8Array(bufs[i]), il = img.length;
1651
+ for (var j = 0; j < il; j += 4) {
1652
+ var r = img[j], g = img[j + 1], b = img[j + 2], a = img[j + 3];
1653
+ if (a == 0)
1654
+ r = g = b = 0;
1655
+ nimg[noff + j] = r;
1656
+ nimg[noff + j + 1] = g;
1657
+ nimg[noff + j + 2] = b;
1658
+ nimg[noff + j + 3] = a;
1659
+ }
1660
+ noff += il;
1661
+ }
1662
+ return nimg.buffer;
1663
+ };
1664
+ module.exports = UPNG;