imagescript 1.3.1 → 3.1.0

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.
Files changed (132) hide show
  1. package/LICENSE +4 -1
  2. package/README.md +76 -26
  3. package/THIRD_PARTY_NOTICES.md +156 -0
  4. package/dist/animation.d.ts +55 -0
  5. package/dist/animation.js +167 -0
  6. package/dist/codecs/crc.d.ts +9 -0
  7. package/dist/codecs/crc.js +29 -0
  8. package/dist/codecs/exif.d.ts +11 -0
  9. package/dist/codecs/exif.js +27 -0
  10. package/dist/codecs/gif.d.ts +44 -0
  11. package/dist/codecs/gif.js +401 -0
  12. package/dist/codecs/jpeg.d.ts +35 -0
  13. package/dist/codecs/jpeg.js +980 -0
  14. package/dist/codecs/png.d.ts +97 -0
  15. package/dist/codecs/png.js +664 -0
  16. package/dist/codecs/quantize.d.ts +25 -0
  17. package/dist/codecs/quantize.js +302 -0
  18. package/dist/codecs/tga.d.ts +16 -0
  19. package/dist/codecs/tga.js +203 -0
  20. package/dist/codecs/tiff.d.ts +6 -0
  21. package/dist/codecs/tiff.js +546 -0
  22. package/dist/codecs/vp8-tables.d.ts +10 -0
  23. package/dist/codecs/vp8-tables.js +17 -0
  24. package/dist/codecs/vp8.d.ts +8 -0
  25. package/dist/codecs/vp8.js +711 -0
  26. package/dist/codecs/vp8l.d.ts +62 -0
  27. package/dist/codecs/vp8l.js +909 -0
  28. package/dist/codecs/webp.d.ts +67 -0
  29. package/dist/codecs/webp.js +280 -0
  30. package/dist/codecs/zlib.d.ts +22 -0
  31. package/dist/codecs/zlib.js +607 -0
  32. package/dist/frame.d.ts +57 -0
  33. package/dist/frame.js +65 -0
  34. package/dist/gif.d.ts +31 -0
  35. package/dist/gif.js +20 -0
  36. package/dist/image-type.d.ts +24 -0
  37. package/dist/image-type.js +64 -0
  38. package/dist/image.d.ts +553 -0
  39. package/dist/image.js +1156 -0
  40. package/dist/index.d.ts +23 -0
  41. package/dist/index.js +20 -0
  42. package/dist/package.json +1 -0
  43. package/dist/render/font.d.ts +92 -0
  44. package/dist/render/font.js +954 -0
  45. package/dist/render/hinting.d.ts +110 -0
  46. package/dist/render/hinting.js +1236 -0
  47. package/dist/render/svg.d.ts +11 -0
  48. package/dist/render/svg.js +1717 -0
  49. package/dist/render/text.d.ts +63 -0
  50. package/dist/render/text.js +342 -0
  51. package/dist/text-layout.d.ts +46 -0
  52. package/dist/text-layout.js +35 -0
  53. package/dist/util/blur.d.ts +13 -0
  54. package/dist/util/blur.js +146 -0
  55. package/dist/util/mem.d.ts +10 -0
  56. package/dist/util/mem.js +23 -0
  57. package/dist/util/resample.d.ts +12 -0
  58. package/dist/util/resample.js +99 -0
  59. package/dist/util/utf8.d.ts +5 -0
  60. package/dist/util/utf8.js +55 -0
  61. package/dist/version.d.ts +1 -0
  62. package/dist/version.js +1 -0
  63. package/licenses/Apache-2.0.txt +202 -0
  64. package/licenses/FTL.txt +169 -0
  65. package/licenses/README.ijg +260 -0
  66. package/package.json +31 -7
  67. package/ImageScript.d.ts +0 -954
  68. package/ImageScript.js +0 -1669
  69. package/bench/_.mjs +0 -166
  70. package/bench/all.mjs +0 -4
  71. package/bench/blur.mjs +0 -59
  72. package/bench/flip.mjs +0 -63
  73. package/bench/overlay.mjs +0 -35
  74. package/bench/package.json +0 -7
  75. package/bench/readme.md +0 -64
  76. package/bench/resize.mjs +0 -52
  77. package/codecs/LICENSE +0 -21
  78. package/codecs/lib.d.ts +0 -50
  79. package/codecs/lib.js +0 -6
  80. package/codecs/lib.mjs +0 -1
  81. package/codecs/node/bin/arm64-darwin.node +0 -0
  82. package/codecs/node/bin/arm64-linux.node +0 -0
  83. package/codecs/node/bin/x64-darwin.node +0 -0
  84. package/codecs/node/bin/x64-linux.node +0 -0
  85. package/codecs/node/bin/x64-win32.node +0 -0
  86. package/codecs/node/index.js +0 -3
  87. package/codecs/node/index.mjs +0 -6
  88. package/codecs/package.json +0 -14
  89. package/codecs/readme.md +0 -38
  90. package/codecs/wasm/bin/codecs.wasm +0 -0
  91. package/codecs/wasm/bin/simd.wasm +0 -0
  92. package/codecs/wasm/bundle/browser.js +0 -1
  93. package/codecs/wasm/index.js +0 -1
  94. package/codecs/wasm/index.mjs +0 -1
  95. package/png/README.md +0 -1
  96. package/png/node.js +0 -1137
  97. package/png/src/crc.mjs +0 -49
  98. package/png/src/mem.mjs +0 -24
  99. package/png/src/png.mjs +0 -254
  100. package/png/src/zlib.mjs +0 -618
  101. package/tsconfig.json +0 -21
  102. package/utils/mem.js +0 -26
  103. package/v2/codecs/magic.js +0 -25
  104. package/v2/framebuffer.d.ts +0 -67
  105. package/v2/framebuffer.js +0 -2352
  106. package/v2/framebuffer.mjs +0 -126
  107. package/v2/framebuffer.rs +0 -1264
  108. package/v2/index.d.ts +0 -84
  109. package/v2/index.js +0 -261
  110. package/v2/ops/blur.mjs +0 -303
  111. package/v2/ops/color.mjs +0 -277
  112. package/v2/ops/crop.mjs +0 -64
  113. package/v2/ops/fill.mjs +0 -33
  114. package/v2/ops/flip.mjs +0 -33
  115. package/v2/ops/index.mjs +0 -9
  116. package/v2/ops/iterator.mjs +0 -34
  117. package/v2/ops/overlay.mjs +0 -63
  118. package/v2/ops/resize.mjs +0 -166
  119. package/v2/ops/rotate.mjs +0 -117
  120. package/v2/util/mem.mjs +0 -24
  121. package/wasm/any/font.wasm +0 -0
  122. package/wasm/any/gif.wasm +0 -0
  123. package/wasm/any/jpeg.wasm +0 -0
  124. package/wasm/any/png.wasm +0 -0
  125. package/wasm/any/svg.wasm +0 -0
  126. package/wasm/any/tiff.wasm +0 -0
  127. package/wasm/node/font.js +0 -142
  128. package/wasm/node/gif.js +0 -76
  129. package/wasm/node/jpeg.js +0 -92
  130. package/wasm/node/png.js +0 -49
  131. package/wasm/node/svg.js +0 -56
  132. package/wasm/node/tiff.js +0 -47
@@ -0,0 +1,607 @@
1
+ /*!
2
+ * zlib deflate/inflate, derived from fflate (https://github.com/101arrowz/fflate)
3
+ * Copyright (c) 2020 Arjun Barrett, MIT License (see THIRD_PARTY_NOTICES.md)
4
+ */
5
+ const u8 = Uint8Array, u16 = Uint16Array, u32 = Uint32Array;
6
+ const clim = u8.of(16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15);
7
+ const fleb = u8.of(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);
8
+ const fdeb = u8.of(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);
9
+ function freb(eb, start) {
10
+ const b = new u16(31);
11
+ for (let i = 0; i < 31; ++i)
12
+ b[i] = start += 1 << eb[i - 1];
13
+ const r = new u32(b[30]);
14
+ for (let i = 1; i < 30; ++i)
15
+ for (let j = b[i]; j < b[i + 1]; ++j)
16
+ r[j] = j - b[i] << 5 | i;
17
+ return [b, r];
18
+ }
19
+ const [fl, revfl] = freb(fleb, 2);
20
+ fl[28] = 258;
21
+ revfl[258] = 28;
22
+ const [fd, revfd] = freb(fdeb, 0);
23
+ const rev = new u16(32768);
24
+ for (let i = 0; i < 32768; ++i) {
25
+ let x = (i & 0xaaaa) >>> 1 | (i & 0x5555) << 1;
26
+ x = (x & 0xcccc) >>> 2 | (x & 0x3333) << 2;
27
+ x = (x & 0xf0f0) >>> 4 | (x & 0x0f0f) << 4;
28
+ rev[i] = ((x & 0xff00) >>> 8 | (x & 0x00ff) << 8) >>> 1;
29
+ }
30
+ function hMap(cd, mb, r) {
31
+ const s = cd.length;
32
+ const l = new u16(mb);
33
+ for (let i = 0; i < s; ++i)
34
+ if (cd[i])
35
+ ++l[cd[i] - 1];
36
+ const le = new u16(mb);
37
+ for (let i = 1; i < mb; ++i)
38
+ le[i] = le[i - 1] + l[i - 1] << 1;
39
+ let co;
40
+ if (r) {
41
+ co = new u16(1 << mb);
42
+ const rvb = 15 - mb;
43
+ for (let i = 0; i < s; ++i) {
44
+ if (!cd[i])
45
+ continue;
46
+ const sv = i << 4 | cd[i];
47
+ const r1 = mb - cd[i];
48
+ let v = le[cd[i] - 1]++ << r1;
49
+ for (const m = v | (1 << r1) - 1; v <= m; ++v)
50
+ co[rev[v] >>> rvb] = sv;
51
+ }
52
+ }
53
+ else {
54
+ co = new u16(s);
55
+ for (let i = 0; i < s; ++i)
56
+ if (cd[i])
57
+ co[i] = rev[le[cd[i] - 1]++] >>> 15 - cd[i];
58
+ }
59
+ return co;
60
+ }
61
+ const flt = new u8(288);
62
+ for (let i = 0; i < 144; ++i)
63
+ flt[i] = 8;
64
+ for (let i = 144; i < 256; ++i)
65
+ flt[i] = 9;
66
+ for (let i = 256; i < 280; ++i)
67
+ flt[i] = 7;
68
+ for (let i = 280; i < 288; ++i)
69
+ flt[i] = 8;
70
+ const fdt = new u8(32);
71
+ for (let i = 0; i < 32; ++i)
72
+ fdt[i] = 5;
73
+ const flm = hMap(flt, 9, false), flrm = hMap(flt, 9, true);
74
+ const fdm = hMap(fdt, 5, false), fdrm = hMap(fdt, 5, true);
75
+ function max(a) {
76
+ let m = a[0];
77
+ for (let i = 1; i < a.length; ++i)
78
+ if (a[i] > m)
79
+ m = a[i];
80
+ return m;
81
+ }
82
+ const bits = (d, p, m) => {
83
+ const o = p / 8 | 0;
84
+ return (d[o] | d[o + 1] << 8) >> (p & 7) & m;
85
+ };
86
+ const bits16 = (d, p) => {
87
+ const o = p / 8 | 0;
88
+ return (d[o] | d[o + 1] << 8 | d[o + 2] << 16) >> (p & 7);
89
+ };
90
+ const shft = (p) => (p + 7) / 8 | 0;
91
+ function inflate(dat, buf) {
92
+ const sl = dat.length;
93
+ if (!sl)
94
+ return buf.subarray(0, 0);
95
+ const tbts = sl * 8;
96
+ let final = 0, pos = 0, bt = 0;
97
+ let lm = null, dm = null, lbt = 0, dbt = 0;
98
+ do {
99
+ if (!lm) {
100
+ final = bits(dat, pos, 1);
101
+ const type = bits(dat, pos + 1, 3);
102
+ pos += 3;
103
+ if (!type) {
104
+ const s = shft(pos) + 4, l = dat[s - 4] | dat[s - 3] << 8, t = s + l;
105
+ if (t > sl)
106
+ throw new Error('zlib: unexpected end of data');
107
+ if (bt < buf.length)
108
+ buf.set(dat.subarray(s, Math.min(t, s + buf.length - bt)), bt);
109
+ bt += l;
110
+ pos = t * 8;
111
+ continue;
112
+ }
113
+ else if (type === 1) {
114
+ lm = flrm;
115
+ dm = fdrm;
116
+ lbt = 9;
117
+ dbt = 5;
118
+ }
119
+ else if (type === 2) {
120
+ const hLit = bits(dat, pos, 31) + 257, hcLen = bits(dat, pos + 10, 15) + 4;
121
+ const tl = hLit + bits(dat, pos + 5, 31) + 1;
122
+ pos += 14;
123
+ const ldt = new u8(tl);
124
+ const clt = new u8(19);
125
+ for (let i = 0; i < hcLen; ++i)
126
+ clt[clim[i]] = bits(dat, pos + i * 3, 7);
127
+ pos += hcLen * 3;
128
+ const clb = max(clt), clbmsk = (1 << clb) - 1;
129
+ const clm = hMap(clt, clb, true);
130
+ for (let i = 0; i < tl;) {
131
+ const r = clm[bits(dat, pos, clbmsk)];
132
+ pos += r & 15;
133
+ const s = r >> 4;
134
+ if (s < 16)
135
+ ldt[i++] = s;
136
+ else {
137
+ let c = 0, n = 0;
138
+ if (s === 16) {
139
+ n = 3 + bits(dat, pos, 3);
140
+ pos += 2;
141
+ c = ldt[i - 1];
142
+ }
143
+ else if (s === 17) {
144
+ n = 3 + bits(dat, pos, 7);
145
+ pos += 3;
146
+ }
147
+ else if (s === 18) {
148
+ n = 11 + bits(dat, pos, 127);
149
+ pos += 7;
150
+ }
151
+ while (n--)
152
+ ldt[i++] = c;
153
+ }
154
+ }
155
+ const lt = ldt.subarray(0, hLit), dt = ldt.subarray(hLit);
156
+ lbt = max(lt);
157
+ dbt = max(dt);
158
+ lm = hMap(lt, lbt, true);
159
+ dm = hMap(dt, dbt, true);
160
+ }
161
+ else
162
+ throw new Error('zlib: invalid block type');
163
+ if (pos > tbts)
164
+ throw new Error('zlib: unexpected end of data');
165
+ }
166
+ const lms = (1 << lbt) - 1, dms = (1 << dbt) - 1;
167
+ for (;;) {
168
+ const c = lm[bits16(dat, pos) & lms], sym = c >> 4;
169
+ pos += c & 15;
170
+ if (pos > tbts)
171
+ throw new Error('zlib: unexpected end of data');
172
+ if (!c)
173
+ throw new Error('zlib: invalid length/literal');
174
+ if (sym < 256)
175
+ buf[bt++] = sym;
176
+ else if (sym === 256) {
177
+ lm = null;
178
+ break;
179
+ }
180
+ else {
181
+ let add = sym - 254;
182
+ if (sym > 264) {
183
+ const i = sym - 257, b = fleb[i];
184
+ add = bits(dat, pos, (1 << b) - 1) + fl[i];
185
+ pos += b;
186
+ }
187
+ const d = dm[bits16(dat, pos) & dms], dsym = d >> 4;
188
+ if (!d)
189
+ throw new Error('zlib: invalid distance');
190
+ pos += d & 15;
191
+ let dt = fd[dsym];
192
+ if (dsym > 3) {
193
+ const b = fdeb[dsym];
194
+ dt += bits16(dat, pos) & (1 << b) - 1;
195
+ pos += b;
196
+ }
197
+ if (pos > tbts)
198
+ throw new Error('zlib: unexpected end of data');
199
+ if (bt >= buf.length) {
200
+ bt += add;
201
+ continue;
202
+ }
203
+ const end = bt + add;
204
+ for (; bt < end; bt += 4) {
205
+ buf[bt] = buf[bt - dt];
206
+ buf[bt + 1] = buf[bt + 1 - dt];
207
+ buf[bt + 2] = buf[bt + 2 - dt];
208
+ buf[bt + 3] = buf[bt + 3 - dt];
209
+ }
210
+ bt = end;
211
+ }
212
+ }
213
+ } while (!final);
214
+ return buf.subarray(0, Math.min(bt, buf.length));
215
+ }
216
+ const wbits = (d, p, v) => {
217
+ v <<= p & 7;
218
+ const o = p / 8 | 0;
219
+ d[o] |= v;
220
+ d[o + 1] |= v >> 8;
221
+ };
222
+ const wbits16 = (d, p, v) => {
223
+ v <<= p & 7;
224
+ const o = p / 8 | 0;
225
+ d[o] |= v;
226
+ d[o + 1] |= v >> 8;
227
+ d[o + 2] |= v >> 16;
228
+ };
229
+ const et = new u8(0);
230
+ function hTree(d, mb) {
231
+ const t = [];
232
+ for (let i = 0; i < d.length; ++i)
233
+ if (d[i])
234
+ t.push({ s: i, f: d[i] });
235
+ const s = t.length;
236
+ const t2 = t.slice();
237
+ if (!s)
238
+ return [et, 0];
239
+ if (s === 1) {
240
+ const v = new u8(t[0].s + 1);
241
+ v[t[0].s] = 1;
242
+ return [v, 1];
243
+ }
244
+ t.sort((a, b) => a.f - b.f);
245
+ t.push({ s: -1, f: 25001 });
246
+ let l = t[0], r = t[1], i0 = 0, i1 = 1, i2 = 2;
247
+ t[0] = { s: -1, f: l.f + r.f, l, r };
248
+ while (i1 !== s - 1) {
249
+ l = t[t[i0].f < t[i2].f ? i0++ : i2++];
250
+ r = t[i0 !== i1 && t[i0].f < t[i2].f ? i0++ : i2++];
251
+ t[i1++] = { s: -1, f: l.f + r.f, l, r };
252
+ }
253
+ let maxSym = t2[0].s;
254
+ for (let i = 1; i < s; ++i)
255
+ if (t2[i].s > maxSym)
256
+ maxSym = t2[i].s;
257
+ const tr = new u16(maxSym + 1);
258
+ let mbt = ln(t[i1 - 1], tr, 0);
259
+ if (mbt > mb) {
260
+ let i = 0, dt = 0;
261
+ const lft = mbt - mb, cst = 1 << lft;
262
+ t2.sort((a, b) => tr[b.s] - tr[a.s] || a.f - b.f);
263
+ for (; i < s; ++i) {
264
+ const i2 = t2[i].s;
265
+ if (tr[i2] > mb) {
266
+ dt += cst - (1 << mbt - tr[i2]);
267
+ tr[i2] = mb;
268
+ }
269
+ else
270
+ break;
271
+ }
272
+ dt >>= lft;
273
+ while (dt > 0) {
274
+ const i2 = t2[i].s;
275
+ if (tr[i2] < mb)
276
+ dt -= 1 << mb - tr[i2]++ - 1;
277
+ else
278
+ ++i;
279
+ }
280
+ for (; i >= 0 && dt; --i) {
281
+ const i2 = t2[i].s;
282
+ if (tr[i2] === mb) {
283
+ --tr[i2];
284
+ ++dt;
285
+ }
286
+ }
287
+ mbt = mb;
288
+ }
289
+ return [new u8(tr), mbt];
290
+ }
291
+ function ln(n, l, d) {
292
+ return n.s === -1
293
+ ? Math.max(ln(n.l, l, d + 1), ln(n.r, l, d + 1))
294
+ : (l[n.s] = d);
295
+ }
296
+ function lc(c) {
297
+ let s = c.length;
298
+ while (s && !c[--s])
299
+ ;
300
+ const cl = new u16(++s);
301
+ let cli = 0, cln = c[0], cls = 1;
302
+ const w = (v) => {
303
+ cl[cli++] = v;
304
+ };
305
+ for (let i = 1; i <= s; ++i) {
306
+ if (c[i] === cln && i !== s)
307
+ ++cls;
308
+ else {
309
+ if (!cln && cls > 2) {
310
+ for (; cls > 138; cls -= 138)
311
+ w(32754);
312
+ if (cls > 2) {
313
+ w(cls > 10 ? cls - 11 << 5 | 28690 : cls - 3 << 5 | 12305);
314
+ cls = 0;
315
+ }
316
+ }
317
+ else if (cls > 3) {
318
+ w(cln);
319
+ --cls;
320
+ for (; cls > 6; cls -= 6)
321
+ w(8304);
322
+ if (cls > 2) {
323
+ w(cls - 3 << 5 | 8208);
324
+ cls = 0;
325
+ }
326
+ }
327
+ while (cls--)
328
+ w(cln);
329
+ cls = 1;
330
+ cln = c[i];
331
+ }
332
+ }
333
+ return [cl.subarray(0, cli), s];
334
+ }
335
+ function clen(cf, cl) {
336
+ let l = 0;
337
+ for (let i = 0; i < cl.length; ++i)
338
+ l += cf[i] * cl[i];
339
+ return l;
340
+ }
341
+ function wfblk(out, pos, dat) {
342
+ const s = dat.length;
343
+ const o = shft(pos + 2);
344
+ out[o] = s & 255;
345
+ out[o + 1] = s >> 8;
346
+ out[o + 2] = out[o] ^ 255;
347
+ out[o + 3] = out[o + 1] ^ 255;
348
+ for (let i = 0; i < s; ++i)
349
+ out[o + i + 4] = dat[i];
350
+ return (o + 4 + s) * 8;
351
+ }
352
+ function wblk(dat, out, final, syms, lf, df, eb, li, bs, bl, p) {
353
+ wbits(out, p++, final);
354
+ ++lf[256];
355
+ const [dlt, mlb] = hTree(lf, 15);
356
+ const [ddt, mdb] = hTree(df, 15);
357
+ const [lclt, nlc] = lc(dlt);
358
+ const [lcdt, ndc] = lc(ddt);
359
+ const lcfreq = new u16(19);
360
+ for (let i = 0; i < lclt.length; ++i)
361
+ ++lcfreq[lclt[i] & 31];
362
+ for (let i = 0; i < lcdt.length; ++i)
363
+ ++lcfreq[lcdt[i] & 31];
364
+ const [lct, mlcb] = hTree(lcfreq, 7);
365
+ let nlcc = 19;
366
+ for (; nlcc > 4 && !lct[clim[nlcc - 1]]; --nlcc)
367
+ ;
368
+ const flen = (bl + 5) << 3;
369
+ const ftlen = clen(lf, flt) + clen(df, fdt) + eb;
370
+ const dtlen = clen(lf, dlt) + clen(df, ddt) + eb + 14 + 3 * nlcc + clen(lcfreq, lct) + 2 * lcfreq[16] + 3 * lcfreq[17] + 7 * lcfreq[18];
371
+ if (bs >= 0 && flen <= ftlen && flen <= dtlen)
372
+ return wfblk(out, p, dat.subarray(bs, bs + bl));
373
+ let lm, ll, dm, dl;
374
+ wbits(out, p, 1 + (dtlen < ftlen ? 1 : 0));
375
+ p += 2;
376
+ if (dtlen < ftlen) {
377
+ lm = hMap(dlt, mlb, false);
378
+ ll = dlt;
379
+ dm = hMap(ddt, mdb, false);
380
+ dl = ddt;
381
+ const llm = hMap(lct, mlcb, false);
382
+ wbits(out, p, nlc - 257);
383
+ wbits(out, p + 5, ndc - 1);
384
+ wbits(out, p + 10, nlcc - 4);
385
+ p += 14;
386
+ for (let i = 0; i < nlcc; ++i)
387
+ wbits(out, p + 3 * i, lct[clim[i]]);
388
+ p += 3 * nlcc;
389
+ for (const clct of [lclt, lcdt]) {
390
+ for (let i = 0; i < clct.length; ++i) {
391
+ const len = clct[i] & 31;
392
+ wbits(out, p, llm[len]);
393
+ p += lct[len];
394
+ if (len > 15) {
395
+ wbits(out, p, clct[i] >> 5 & 127);
396
+ p += clct[i] >> 12;
397
+ }
398
+ }
399
+ }
400
+ }
401
+ else {
402
+ lm = flm;
403
+ ll = flt;
404
+ dm = fdm;
405
+ dl = fdt;
406
+ }
407
+ for (let i = 0; i < li; ++i) {
408
+ const sym = syms[i];
409
+ if (sym > 255) {
410
+ const len = sym >> 18 & 31;
411
+ wbits16(out, p, lm[len + 257]);
412
+ p += ll[len + 257];
413
+ if (len > 7) {
414
+ wbits(out, p, sym >> 23 & 31);
415
+ p += fleb[len];
416
+ }
417
+ const dst = sym & 31;
418
+ wbits16(out, p, dm[dst]);
419
+ p += dl[dst];
420
+ if (dst > 3) {
421
+ wbits16(out, p, sym >> 5 & 8191);
422
+ p += fdeb[dst];
423
+ }
424
+ }
425
+ else {
426
+ wbits16(out, p, lm[sym]);
427
+ p += ll[sym];
428
+ }
429
+ }
430
+ wbits16(out, p, lm[256]);
431
+ return p + ll[256];
432
+ }
433
+ const deo = u32.of(65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632);
434
+ function deflate(dat, lvl, plvl, pre, post) {
435
+ const s = dat.length;
436
+ const o = new u8(pre + s + 5 * (1 + Math.ceil(s / 7000)) + post);
437
+ const w = o.subarray(pre, o.length - post);
438
+ let pos = 0;
439
+ if (!lvl || s < 8) {
440
+ for (let i = 0; i <= s; i += 65535) {
441
+ const e = i + 65535;
442
+ if (e >= s)
443
+ w[pos >> 3] = 1;
444
+ pos = wfblk(w, pos + 1, dat.subarray(i, e));
445
+ }
446
+ }
447
+ else {
448
+ const opt = deo[lvl - 1];
449
+ const n = opt >> 13, c = opt & 8191;
450
+ const msk = (1 << plvl) - 1;
451
+ const prev = new u16(32768), head = new u16(msk + 1);
452
+ const bs1 = Math.ceil(plvl / 3), bs2 = 2 * bs1;
453
+ const hsh = (i) => ((dat[i] | 0) ^ (dat[i + 1] | 0) << bs1 ^ (dat[i + 2] | 0) << bs2) & msk;
454
+ const syms = new u32(25000);
455
+ const lf = new u16(288), df = new u16(32);
456
+ let lcnt = 0, eb = 0, i = 0, li = 0, wi = 0, bs = 0;
457
+ for (; i < s; ++i) {
458
+ const hv = hsh(i);
459
+ let imod = i & 32767, pimod = head[hv];
460
+ prev[imod] = pimod;
461
+ head[hv] = imod;
462
+ if (wi <= i) {
463
+ const rem = s - i;
464
+ if ((lcnt > 7000 || li > 24576) && rem > 423) {
465
+ pos = wblk(dat, w, 0, syms, lf, df, eb, li, bs, i - bs, pos);
466
+ li = lcnt = eb = 0;
467
+ bs = i;
468
+ for (let j = 0; j < 286; ++j)
469
+ lf[j] = 0;
470
+ for (let j = 0; j < 30; ++j)
471
+ df[j] = 0;
472
+ }
473
+ let l = 2, d = 0, ch = c, dif = imod - pimod & 32767;
474
+ if (rem > 2 && hv === hsh(i - dif)) {
475
+ const maxn = Math.min(n, rem) - 1;
476
+ const maxd = Math.min(32767, i);
477
+ const ml = Math.min(258, rem);
478
+ while (dif <= maxd && --ch && imod !== pimod) {
479
+ if (dat[i + l] === dat[i + l - dif]) {
480
+ let nl = 0;
481
+ for (; nl < ml && dat[i + nl] === dat[i + nl - dif]; ++nl)
482
+ ;
483
+ if (nl > l) {
484
+ l = nl;
485
+ d = dif;
486
+ if (nl > maxn)
487
+ break;
488
+ const mmd = Math.min(dif, nl - 2);
489
+ let md = 0;
490
+ for (let j = 0; j < mmd; ++j) {
491
+ const ti = i - dif + j & 32767;
492
+ const pti = prev[ti];
493
+ const cd = ti - pti & 32767;
494
+ if (cd > md) {
495
+ md = cd;
496
+ pimod = ti;
497
+ }
498
+ }
499
+ }
500
+ }
501
+ imod = pimod;
502
+ pimod = prev[imod];
503
+ dif += imod - pimod & 32767;
504
+ }
505
+ }
506
+ if (d) {
507
+ syms[li++] = 268435456 | revfl[l] << 18 | revfd[d];
508
+ const lin = revfl[l] & 31, din = revfd[d] & 31;
509
+ eb += fleb[lin] + fdeb[din];
510
+ ++lf[257 + lin];
511
+ ++df[din];
512
+ wi = i + l;
513
+ ++lcnt;
514
+ }
515
+ else {
516
+ syms[li++] = dat[i];
517
+ ++lf[dat[i]];
518
+ }
519
+ }
520
+ }
521
+ pos = wblk(dat, w, 1, syms, lf, df, eb, li, bs, i - bs, pos);
522
+ }
523
+ return o.subarray(0, pre + shft(pos) + post);
524
+ }
525
+ function adler32(data) {
526
+ let a = 1, b = 0;
527
+ for (let i = 0; i < data.length;) {
528
+ const e = Math.min(i + 2655, data.length);
529
+ for (; i < e; ++i)
530
+ b += a += data[i];
531
+ a = (a & 65535) + 15 * (a >> 16);
532
+ b = (b & 65535) + 15 * (b >> 16);
533
+ }
534
+ a %= 65521;
535
+ b %= 65521;
536
+ return (b << 16 | a) >>> 0;
537
+ }
538
+ export function compress(data, level) {
539
+ level = Math.min(9, Math.max(0, level | 0));
540
+ const memory = Math.ceil(Math.max(8, Math.min(13, Math.log(data.length))) * 1.5);
541
+ const out = deflate(data, level, memory, 2, 4);
542
+ const hint = level === 0 ? 0 : level < 6 ? 1 : level === 9 ? 3 : 2;
543
+ out[0] = 120;
544
+ out[1] = hint << 6 | (hint ? 32 - 2 * hint : 1);
545
+ const checksum = adler32(data);
546
+ const end = out.length - 4;
547
+ out[end] = checksum >>> 24;
548
+ out[end + 1] = checksum >> 16 & 255;
549
+ out[end + 2] = checksum >> 8 & 255;
550
+ out[end + 3] = checksum & 255;
551
+ return out;
552
+ }
553
+ export function decompress(data, limit) {
554
+ if ((data[0] & 15) !== 8 || data[0] >> 4 > 7 || (data[0] << 8 | data[1]) % 31)
555
+ throw new Error('zlib: invalid header');
556
+ if (data[1] & 32)
557
+ throw new Error('zlib: preset dictionaries are not supported');
558
+ return inflate(data.subarray(2), new u8(limit));
559
+ }
560
+ const { process: runtime, DecompressionStream: NativeDecompression, Blob: NativeBlob } = globalThis;
561
+ const nodeZlib = (() => {
562
+ try {
563
+ return (runtime && runtime.getBuiltinModule && runtime.getBuiltinModule('node:zlib')) || null;
564
+ }
565
+ catch {
566
+ return null;
567
+ }
568
+ })();
569
+ const plain = (buffer) => new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength);
570
+ export async function compressAsync(data, level) {
571
+ level = Math.min(9, Math.max(0, level | 0));
572
+ if (nodeZlib)
573
+ return plain(nodeZlib.deflateSync(data, { level }));
574
+ return compress(data, level);
575
+ }
576
+ export async function decompressAsync(data, limit) {
577
+ if (nodeZlib) {
578
+ try {
579
+ return plain(nodeZlib.inflateSync(data, { maxOutputLength: limit, finishFlush: nodeZlib.constants.Z_SYNC_FLUSH }));
580
+ }
581
+ catch {
582
+ }
583
+ }
584
+ if (!NativeDecompression || !NativeBlob)
585
+ return decompress(data, limit);
586
+ const out = new Uint8Array(limit);
587
+ let offset = 0;
588
+ const reader = new NativeBlob([data]).stream().pipeThrough(new NativeDecompression('deflate')).getReader();
589
+ try {
590
+ for (;;) {
591
+ const { done, value } = await reader.read();
592
+ if (done || !value)
593
+ break;
594
+ out.set(value.subarray(0, Math.max(0, limit - offset)), offset);
595
+ offset += value.length;
596
+ if (offset >= limit)
597
+ break;
598
+ }
599
+ }
600
+ catch {
601
+ return decompress(data, limit);
602
+ }
603
+ finally {
604
+ reader.cancel().catch(() => { });
605
+ }
606
+ return out.subarray(0, Math.min(offset, limit));
607
+ }
@@ -0,0 +1,57 @@
1
+ import { Image, ResizeMode } from './image.js';
2
+ /** Names of the frame disposal modes, see {@link Frame.disposalMode} */
3
+ export type FrameDisposalModeName = 'any' | 'keep' | 'previous' | 'background';
4
+ /** Ids of the frame disposal modes, as GIFs store them (0 any, 1 keep, 2 previous, 3 background) */
5
+ export type FrameDisposalModeId = 0 | 1 | 2 | 3;
6
+ /**
7
+ * Represents a frame of an {@link Animation}
8
+ */
9
+ export declare class Frame extends Image {
10
+ /**
11
+ * Milliseconds. GIFs store hundredths of a second, so this is rounded to 10 ms when encoding a GIF;
12
+ * note that browsers play frames shorter than 20 ms with 100 ms
13
+ */
14
+ duration: number;
15
+ /** The frame's horizontal offset in the animation */
16
+ xOffset: number;
17
+ /** The frame's vertical offset in the animation */
18
+ yOffset: number;
19
+ /** Frame disposal mode ANY: the decoder decides (in practice like KEEP). For use with {@link Frame} */
20
+ static get DISPOSAL_ANY(): 'any';
21
+ /** Frame disposal mode KEEP. For use with {@link Frame} */
22
+ static get DISPOSAL_KEEP(): 'keep';
23
+ /** Frame disposal mode PREVIOUS. For use with {@link Frame} */
24
+ static get DISPOSAL_PREVIOUS(): 'previous';
25
+ /** Frame disposal mode BACKGROUND. For use with {@link Frame} */
26
+ static get DISPOSAL_BACKGROUND(): 'background';
27
+ /**
28
+ * Creates a new, blank frame
29
+ * @param duration The frame's duration (in ms)
30
+ * @param xOffset The frame's offset on the x-axis
31
+ * @param yOffset The frame's offset on the y-axis
32
+ * @param disposalMode The frame's disposal mode
33
+ */
34
+ constructor(width: number, height: number, duration?: number, xOffset?: number, yOffset?: number, disposalMode?: FrameDisposalModeName | FrameDisposalModeId);
35
+ /** The frame's disposal mode (`'any'`, `'keep'`, `'previous'` or `'background'`); also settable by id (0-3) */
36
+ get disposalMode(): FrameDisposalModeName;
37
+ /** Sets the disposal mode by name or id (0-3) */
38
+ set disposalMode(disposalMode: FrameDisposalModeName | FrameDisposalModeId);
39
+ toString(): string;
40
+ /**
41
+ * Converts an Image instance to a Frame, cloning it in the process
42
+ * @param image The image to create the frame from
43
+ * @param duration The frame's duration (in ms)
44
+ * @param xOffset The frame's offset on the x-axis
45
+ * @param yOffset The frame's offset on the y-axis
46
+ * @param disposalMode The frame's disposal mode
47
+ */
48
+ static from(image: Image, duration?: number, xOffset?: number, yOffset?: number, disposalMode?: FrameDisposalModeName | FrameDisposalModeId): Frame;
49
+ /**
50
+ * Clones the frame, including its duration, offsets and disposal mode
51
+ */
52
+ clone(): Frame;
53
+ /**
54
+ * Resizes the frame, scaling its offsets along with it
55
+ */
56
+ resize(width: number, height: number, mode?: ResizeMode): this;
57
+ }