imagescript 1.3.0 → 3.0.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 (146) hide show
  1. package/LICENSE +4 -1
  2. package/README.md +64 -26
  3. package/THIRD_PARTY_NOTICES.md +74 -0
  4. package/dist/codecs/crc.d.ts +9 -0
  5. package/dist/codecs/crc.js +29 -0
  6. package/dist/codecs/exif.d.ts +11 -0
  7. package/dist/codecs/exif.js +27 -0
  8. package/dist/codecs/gif.d.ts +44 -0
  9. package/dist/codecs/gif.js +401 -0
  10. package/dist/codecs/jpeg.d.ts +35 -0
  11. package/dist/codecs/jpeg.js +980 -0
  12. package/dist/codecs/png.d.ts +44 -0
  13. package/dist/codecs/png.js +442 -0
  14. package/dist/codecs/quantize.d.ts +25 -0
  15. package/dist/codecs/quantize.js +302 -0
  16. package/dist/codecs/tiff.d.ts +6 -0
  17. package/dist/codecs/tiff.js +546 -0
  18. package/dist/codecs/zlib.d.ts +22 -0
  19. package/dist/codecs/zlib.js +607 -0
  20. package/dist/frame.d.ts +57 -0
  21. package/dist/frame.js +65 -0
  22. package/dist/gif.d.ts +44 -0
  23. package/dist/gif.js +93 -0
  24. package/dist/image-type.d.ts +20 -0
  25. package/dist/image-type.js +49 -0
  26. package/dist/image.d.ts +521 -0
  27. package/dist/image.js +1118 -0
  28. package/dist/index.d.ts +19 -0
  29. package/dist/index.js +13 -0
  30. package/dist/package.json +1 -0
  31. package/dist/render/font.d.ts +63 -0
  32. package/dist/render/font.js +857 -0
  33. package/dist/render/svg.d.ts +11 -0
  34. package/dist/render/svg.js +1717 -0
  35. package/dist/render/text.d.ts +61 -0
  36. package/dist/render/text.js +317 -0
  37. package/dist/text-layout.d.ts +46 -0
  38. package/dist/text-layout.js +35 -0
  39. package/dist/util/blur.d.ts +13 -0
  40. package/dist/util/blur.js +146 -0
  41. package/dist/util/mem.d.ts +10 -0
  42. package/dist/util/mem.js +23 -0
  43. package/dist/util/resample.d.ts +12 -0
  44. package/dist/util/resample.js +99 -0
  45. package/dist/util/utf8.d.ts +5 -0
  46. package/dist/util/utf8.js +55 -0
  47. package/dist/version.d.ts +1 -0
  48. package/dist/version.js +1 -0
  49. package/licenses/Apache-2.0.txt +202 -0
  50. package/licenses/README.ijg +260 -0
  51. package/package.json +31 -7
  52. package/ImageScript.d.ts +0 -235
  53. package/ImageScript.js +0 -1669
  54. package/bench/_.mjs +0 -166
  55. package/bench/all.mjs +0 -4
  56. package/bench/blur.mjs +0 -59
  57. package/bench/flip.mjs +0 -63
  58. package/bench/overlay.mjs +0 -35
  59. package/bench/package.json +0 -7
  60. package/bench/readme.md +0 -64
  61. package/bench/resize.mjs +0 -52
  62. package/codecs/LICENSE +0 -21
  63. package/codecs/lib.d.ts +0 -50
  64. package/codecs/lib.js +0 -6
  65. package/codecs/lib.mjs +0 -1
  66. package/codecs/node/bin/arm64-darwin.node +0 -0
  67. package/codecs/node/bin/arm64-linux.node +0 -0
  68. package/codecs/node/bin/x64-darwin.node +0 -0
  69. package/codecs/node/bin/x64-linux.node +0 -0
  70. package/codecs/node/bin/x64-win32.node +0 -0
  71. package/codecs/node/index.js +0 -3
  72. package/codecs/node/index.mjs +0 -6
  73. package/codecs/package.json +0 -14
  74. package/codecs/readme.md +0 -38
  75. package/codecs/tests/gif.js +0 -0
  76. package/codecs/tests/jpeg.js +0 -0
  77. package/codecs/tests/png.js +0 -0
  78. package/codecs/tests/results/gif/1024.nis.gif +0 -0
  79. package/codecs/tests/results/gif/1024.skyra.gif +0 -0
  80. package/codecs/tests/results/gif/256.nis.gif +0 -0
  81. package/codecs/tests/results/gif/256.skyra.gif +0 -0
  82. package/codecs/tests/results/jpeg/256.jpegjs.jpeg +0 -0
  83. package/codecs/tests/results/jpeg/256.nis.jpeg +0 -0
  84. package/codecs/tests/results/jpeg/256.sharp.jpeg +0 -0
  85. package/codecs/tests/results/jpeg/512.jpegjs.jpeg +0 -0
  86. package/codecs/tests/results/jpeg/512.nis.jpeg +0 -0
  87. package/codecs/tests/results/jpeg/512.sharp.jpeg +0 -0
  88. package/codecs/tests/results/jpeg/64.jpegjs.jpeg +0 -0
  89. package/codecs/tests/results/jpeg/64.nis.jpeg +0 -0
  90. package/codecs/tests/results/jpeg/64.sharp.jpeg +0 -0
  91. package/codecs/tests/results/png/256.jis.png +0 -0
  92. package/codecs/tests/results/png/256.nis.png +0 -0
  93. package/codecs/tests/results/png/256.sharp.png +0 -0
  94. package/codecs/tests/results/png/256.upng.png +0 -0
  95. package/codecs/tests/results/png/512.jis.png +0 -0
  96. package/codecs/tests/results/png/512.nis.png +0 -0
  97. package/codecs/tests/results/png/512.sharp.png +0 -0
  98. package/codecs/tests/results/png/512.upng.png +0 -0
  99. package/codecs/tests/results/png/64.jis.png +0 -0
  100. package/codecs/tests/results/png/64.nis.png +0 -0
  101. package/codecs/tests/results/png/64.sharp.png +0 -0
  102. package/codecs/tests/results/png/64.upng.png +0 -0
  103. package/codecs/tests/webp.js +0 -0
  104. package/codecs/wasm/bin/codecs.wasm +0 -0
  105. package/codecs/wasm/bin/simd.wasm +0 -0
  106. package/codecs/wasm/bundle/browser.js +0 -1
  107. package/codecs/wasm/index.js +0 -1
  108. package/codecs/wasm/index.mjs +0 -1
  109. package/png/README.md +0 -1
  110. package/png/node.js +0 -1137
  111. package/png/src/crc.mjs +0 -49
  112. package/png/src/mem.mjs +0 -24
  113. package/png/src/png.mjs +0 -254
  114. package/png/src/zlib.mjs +0 -618
  115. package/tsconfig.json +0 -21
  116. package/utils/mem.js +0 -26
  117. package/v2/codecs/magic.js +0 -25
  118. package/v2/framebuffer.d.ts +0 -67
  119. package/v2/framebuffer.js +0 -2352
  120. package/v2/framebuffer.mjs +0 -126
  121. package/v2/framebuffer.rs +0 -1264
  122. package/v2/index.d.ts +0 -84
  123. package/v2/index.js +0 -261
  124. package/v2/ops/blur.mjs +0 -303
  125. package/v2/ops/color.mjs +0 -277
  126. package/v2/ops/crop.mjs +0 -64
  127. package/v2/ops/fill.mjs +0 -33
  128. package/v2/ops/flip.mjs +0 -33
  129. package/v2/ops/index.mjs +0 -9
  130. package/v2/ops/iterator.mjs +0 -34
  131. package/v2/ops/overlay.mjs +0 -63
  132. package/v2/ops/resize.mjs +0 -166
  133. package/v2/ops/rotate.mjs +0 -117
  134. package/v2/util/mem.mjs +0 -24
  135. package/wasm/any/font.wasm +0 -0
  136. package/wasm/any/gif.wasm +0 -0
  137. package/wasm/any/jpeg.wasm +0 -0
  138. package/wasm/any/png.wasm +0 -0
  139. package/wasm/any/svg.wasm +0 -0
  140. package/wasm/any/tiff.wasm +0 -0
  141. package/wasm/node/font.js +0 -142
  142. package/wasm/node/gif.js +0 -76
  143. package/wasm/node/jpeg.js +0 -92
  144. package/wasm/node/png.js +0 -49
  145. package/wasm/node/svg.js +0 -56
  146. 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 GIF frame disposal modes, see {@link Frame.disposalMode} */
3
+ export type FrameDisposalModeName = 'any' | 'keep' | 'previous' | 'background';
4
+ /** Ids of the GIF frame disposal modes as stored in the file (0 any, 1 keep, 2 previous, 3 background) */
5
+ export type FrameDisposalModeId = 0 | 1 | 2 | 3;
6
+ /**
7
+ * Represents a frame in a GIF
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;
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 GIF */
16
+ xOffset: number;
17
+ /** The frame's vertical offset in the GIF */
18
+ yOffset: number;
19
+ /** GIF frame disposal mode ANY: the decoder decides (in practice like KEEP). For use with {@link Frame} */
20
+ static get DISPOSAL_ANY(): 'any';
21
+ /** GIF frame disposal mode KEEP. For use with {@link Frame} */
22
+ static get DISPOSAL_KEEP(): 'keep';
23
+ /** GIF frame disposal mode PREVIOUS. For use with {@link Frame} */
24
+ static get DISPOSAL_PREVIOUS(): 'previous';
25
+ /** GIF 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
+ }