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