imagescript 3.3.0 → 3.4.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 (59) hide show
  1. package/README.md +28 -8
  2. package/THIRD_PARTY_NOTICES.md +167 -2
  3. package/dist/animation.d.ts +18 -8
  4. package/dist/animation.js +23 -2
  5. package/dist/codecs/av1/cdef.js +197 -0
  6. package/dist/codecs/av1/data.js +141 -0
  7. package/dist/codecs/av1/decode.js +1769 -0
  8. package/dist/codecs/av1/filmgrain.js +219 -0
  9. package/dist/codecs/av1/frame.js +114 -0
  10. package/dist/codecs/av1/ipred.js +491 -0
  11. package/dist/codecs/av1/itx.js +950 -0
  12. package/dist/codecs/av1/loopfilter.js +149 -0
  13. package/dist/codecs/av1/msac.js +161 -0
  14. package/dist/codecs/av1/obu.js +516 -0
  15. package/dist/codecs/av1/postfilter.js +28 -0
  16. package/dist/codecs/av1/restoration.js +193 -0
  17. package/dist/codecs/av1/tables.js +160 -0
  18. package/dist/codecs/avif.js +581 -0
  19. package/dist/codecs/bmp.js +317 -0
  20. package/dist/codecs/hdr.d.ts +25 -0
  21. package/dist/codecs/hdr.js +201 -0
  22. package/dist/codecs/ico.js +48 -0
  23. package/dist/codecs/jpeg.js +2 -1
  24. package/dist/codecs/jxl/bits.js +126 -0
  25. package/dist/codecs/jxl/blend.js +117 -0
  26. package/dist/codecs/jxl/color.js +116 -0
  27. package/dist/codecs/jxl/dct.js +404 -0
  28. package/dist/codecs/jxl/entropy.js +556 -0
  29. package/dist/codecs/jxl/features.js +325 -0
  30. package/dist/codecs/jxl/filters.js +119 -0
  31. package/dist/codecs/jxl/frame-header.js +195 -0
  32. package/dist/codecs/jxl/frame.js +319 -0
  33. package/dist/codecs/jxl/headers.js +249 -0
  34. package/dist/codecs/jxl/idct.js +484 -0
  35. package/dist/codecs/jxl/modular.js +688 -0
  36. package/dist/codecs/jxl/quant.js +219 -0
  37. package/dist/codecs/jxl/upsample.js +52 -0
  38. package/dist/codecs/jxl/vardct.js +472 -0
  39. package/dist/codecs/jxl.js +89 -0
  40. package/dist/codecs/netpbm.js +239 -0
  41. package/dist/codecs/qoi.js +150 -0
  42. package/dist/codecs/vp8-enc-dsp.js +932 -0
  43. package/dist/codecs/vp8-enc-tables.js +78 -0
  44. package/dist/codecs/vp8-enc.js +1930 -0
  45. package/dist/codecs/webp.js +36 -2
  46. package/dist/image-type.d.ts +15 -1
  47. package/dist/image-type.js +45 -2
  48. package/dist/image.d.ts +47 -6
  49. package/dist/image.js +49 -3
  50. package/dist/index.d.ts +3 -2
  51. package/dist/index.js +2 -2
  52. package/dist/render/hinting.js +26 -18
  53. package/dist/render/layout.js +1 -1
  54. package/dist/render/svg.js +1 -1
  55. package/dist/render/unicode.js +1 -9
  56. package/dist/util/bytes.js +9 -0
  57. package/dist/util/resample.js +4 -2
  58. package/dist/version.js +1 -1
  59. package/package.json +25 -2
@@ -0,0 +1,149 @@
1
+ /*!
2
+ * The AV1 deblocking filter: every transform block edge of intra frames, filtered with the filters of dav1d
3
+ * (src/loopfilter_tmpl.c, src/lf_mask.c). Copyright (c) 2018-2021, VideoLAN and dav1d authors, Copyright (c) 2018,
4
+ * Two Orioles, LLC, BSD-2-Clause License (see THIRD_PARTY_NOTICES.md)
5
+ */
6
+ export function deblock(f) {
7
+ const lf = f.hdr.loopFilter;
8
+ if (!lf.levelY[0] && !lf.levelY[1])
9
+ return;
10
+ const sharp = lf.sharpness;
11
+ const I = new Uint8Array(64), E = new Uint8Array(64);
12
+ for (let level = 0; level < 64; level++) {
13
+ let limit = level;
14
+ if (sharp > 0)
15
+ limit = Math.min(limit >> (sharp + 3 >> 2), 9 - sharp);
16
+ I[level] = Math.max(limit, 1);
17
+ E[level] = 2 * (level + 2) + I[level];
18
+ }
19
+ const s4 = f.b4Stride;
20
+ for (let plane = 0; plane < f.planes.length; plane++) {
21
+ if (plane && !(plane === 1 ? lf.levelU : lf.levelV))
22
+ continue;
23
+ const subX = plane ? f.ssx : 0, subY = plane ? f.ssy : 0;
24
+ const txW = plane ? f.uvTxW : f.txW, txH = plane ? f.uvTxH : f.txH;
25
+ const pic = f.planes[plane], stride = f.strides[plane];
26
+ for (let pass = 0; pass < 2; pass++) {
27
+ const dx = pass ? 0 : 1, dy = pass;
28
+ const tx = pass ? txH : txW;
29
+ const level = plane ? plane + 1 : pass;
30
+ for (let row = 0; row < f.bh; row += 1 << subY) {
31
+ const y = row * 4;
32
+ if (y >= f.height || pass && !y)
33
+ continue;
34
+ for (let col = 0; col < f.bw; col += 1 << subX) {
35
+ const x = col * 4;
36
+ if (x >= f.width || !pass && !x)
37
+ continue;
38
+ const r = row | subY, c = col | subX;
39
+ const xP = x >> subX, yP = y >> subY;
40
+ const cur = (r >> subY) * s4 + (c >> subX);
41
+ const prevR = r - (dy << subY), prevC = c - (dx << subX);
42
+ const prev = (prevR >> subY) * s4 + (prevC >> subX);
43
+ const size = 4 << tx[cur];
44
+ if ((pass ? yP : xP) % size)
45
+ continue;
46
+ const filterSize = Math.min(plane ? 8 : 16, size, 4 << tx[prev]);
47
+ let lvl = f.lfLevels[(r * s4 + c) * 4 + level];
48
+ if (!lvl)
49
+ lvl = f.lfLevels[(prevR * s4 + prevC) * 4 + level];
50
+ if (!lvl)
51
+ continue;
52
+ const wd = plane && filterSize === 8 ? 6 : filterSize;
53
+ filter(pic, yP * stride + xP, E[lvl], I[lvl], lvl >> 4, pass ? 1 : stride, pass ? stride : 1, wd, f.bitdepth);
54
+ }
55
+ }
56
+ }
57
+ }
58
+ }
59
+ function filter(dst, d, E, I, H, stridea, strideb, wd, bitdepth) {
60
+ const shift = bitdepth - 8, F = 1 << shift;
61
+ E <<= shift;
62
+ I <<= shift;
63
+ H <<= shift;
64
+ const max = (1 << bitdepth) - 1;
65
+ const pix = (v) => v < 0 ? 0 : v > max ? max : v;
66
+ const diffMin = -128 * (1 << shift), diffMax = 128 * (1 << shift) - 1;
67
+ const clipDiff = (v) => v < diffMin ? diffMin : v > diffMax ? diffMax : v;
68
+ const abs = Math.abs;
69
+ for (let i = 0; i < 4; i++, d += stridea) {
70
+ let p6 = 0, p5 = 0, p4 = 0, p3 = 0, p2 = 0, q2 = 0, q3 = 0, q4 = 0, q5 = 0, q6 = 0;
71
+ const p1 = dst[d - 2 * strideb], p0 = dst[d - strideb], q0 = dst[d], q1 = dst[d + strideb];
72
+ let fm = abs(p1 - p0) <= I && abs(q1 - q0) <= I && abs(p0 - q0) * 2 + (abs(p1 - q1) >> 1) <= E;
73
+ if (wd > 4) {
74
+ p2 = dst[d - 3 * strideb];
75
+ q2 = dst[d + 2 * strideb];
76
+ fm &&= abs(p2 - p1) <= I && abs(q2 - q1) <= I;
77
+ if (wd > 6) {
78
+ p3 = dst[d - 4 * strideb];
79
+ q3 = dst[d + 3 * strideb];
80
+ fm &&= abs(p3 - p2) <= I && abs(q3 - q2) <= I;
81
+ }
82
+ }
83
+ if (!fm)
84
+ continue;
85
+ let flat8out = false, flat8in = false;
86
+ if (wd >= 16) {
87
+ p6 = dst[d - 7 * strideb];
88
+ p5 = dst[d - 6 * strideb];
89
+ p4 = dst[d - 5 * strideb];
90
+ q4 = dst[d + 4 * strideb];
91
+ q5 = dst[d + 5 * strideb];
92
+ q6 = dst[d + 6 * strideb];
93
+ flat8out = abs(p6 - p0) <= F && abs(p5 - p0) <= F && abs(p4 - p0) <= F && abs(q4 - q0) <= F &&
94
+ abs(q5 - q0) <= F && abs(q6 - q0) <= F;
95
+ }
96
+ if (wd >= 6)
97
+ flat8in = abs(p2 - p0) <= F && abs(p1 - p0) <= F && abs(q1 - q0) <= F && abs(q2 - q0) <= F;
98
+ if (wd >= 8)
99
+ flat8in &&= abs(p3 - p0) <= F && abs(q3 - q0) <= F;
100
+ if (wd >= 16 && flat8out && flat8in) {
101
+ dst[d - 6 * strideb] = (p6 * 7 + p5 * 2 + p4 * 2 + p3 + p2 + p1 + p0 + q0 + 8) >> 4;
102
+ dst[d - 5 * strideb] = (p6 * 5 + p5 * 2 + p4 * 2 + p3 * 2 + p2 + p1 + p0 + q0 + q1 + 8) >> 4;
103
+ dst[d - 4 * strideb] = (p6 * 4 + p5 + p4 * 2 + p3 * 2 + p2 * 2 + p1 + p0 + q0 + q1 + q2 + 8) >> 4;
104
+ dst[d - 3 * strideb] = (p6 * 3 + p5 + p4 + p3 * 2 + p2 * 2 + p1 * 2 + p0 + q0 + q1 + q2 + q3 + 8) >> 4;
105
+ dst[d - 2 * strideb] = (p6 * 2 + p5 + p4 + p3 + p2 * 2 + p1 * 2 + p0 * 2 + q0 + q1 + q2 + q3 + q4 + 8) >> 4;
106
+ dst[d - strideb] = (p6 + p5 + p4 + p3 + p2 + p1 * 2 + p0 * 2 + q0 * 2 + q1 + q2 + q3 + q4 + q5 + 8) >> 4;
107
+ dst[d] = (p5 + p4 + p3 + p2 + p1 + p0 * 2 + q0 * 2 + q1 * 2 + q2 + q3 + q4 + q5 + q6 + 8) >> 4;
108
+ dst[d + strideb] = (p4 + p3 + p2 + p1 + p0 + q0 * 2 + q1 * 2 + q2 * 2 + q3 + q4 + q5 + q6 * 2 + 8) >> 4;
109
+ dst[d + 2 * strideb] = (p3 + p2 + p1 + p0 + q0 + q1 * 2 + q2 * 2 + q3 * 2 + q4 + q5 + q6 * 3 + 8) >> 4;
110
+ dst[d + 3 * strideb] = (p2 + p1 + p0 + q0 + q1 + q2 * 2 + q3 * 2 + q4 * 2 + q5 + q6 * 4 + 8) >> 4;
111
+ dst[d + 4 * strideb] = (p1 + p0 + q0 + q1 + q2 + q3 * 2 + q4 * 2 + q5 * 2 + q6 * 5 + 8) >> 4;
112
+ dst[d + 5 * strideb] = (p0 + q0 + q1 + q2 + q3 + q4 * 2 + q5 * 2 + q6 * 7 + 8) >> 4;
113
+ }
114
+ else if (wd >= 8 && flat8in) {
115
+ dst[d - 3 * strideb] = (p3 * 3 + 2 * p2 + p1 + p0 + q0 + 4) >> 3;
116
+ dst[d - 2 * strideb] = (p3 * 2 + p2 + 2 * p1 + p0 + q0 + q1 + 4) >> 3;
117
+ dst[d - strideb] = (p3 + p2 + p1 + 2 * p0 + q0 + q1 + q2 + 4) >> 3;
118
+ dst[d] = (p2 + p1 + p0 + 2 * q0 + q1 + q2 + q3 + 4) >> 3;
119
+ dst[d + strideb] = (p1 + p0 + q0 + 2 * q1 + q2 + q3 * 2 + 4) >> 3;
120
+ dst[d + 2 * strideb] = (p0 + q0 + q1 + 2 * q2 + q3 * 3 + 4) >> 3;
121
+ }
122
+ else if (wd === 6 && flat8in) {
123
+ dst[d - 2 * strideb] = (p2 * 3 + 2 * p1 + 2 * p0 + q0 + 4) >> 3;
124
+ dst[d - strideb] = (p2 + 2 * p1 + 2 * p0 + 2 * q0 + q1 + 4) >> 3;
125
+ dst[d] = (p1 + 2 * p0 + 2 * q0 + 2 * q1 + q2 + 4) >> 3;
126
+ dst[d + strideb] = (p0 + 2 * q0 + 2 * q1 + q2 * 3 + 4) >> 3;
127
+ }
128
+ else {
129
+ const hev = abs(p1 - p0) > H || abs(q1 - q0) > H;
130
+ const top = (128 << shift) - 1;
131
+ if (hev) {
132
+ let f = clipDiff(p1 - q1);
133
+ f = clipDiff(3 * (q0 - p0) + f);
134
+ const f1 = Math.min(f + 4, top) >> 3, f2 = Math.min(f + 3, top) >> 3;
135
+ dst[d - strideb] = pix(p0 + f2);
136
+ dst[d] = pix(q0 - f1);
137
+ }
138
+ else {
139
+ const f = clipDiff(3 * (q0 - p0));
140
+ const f1 = Math.min(f + 4, top) >> 3, f2 = Math.min(f + 3, top) >> 3;
141
+ dst[d - strideb] = pix(p0 + f2);
142
+ dst[d] = pix(q0 - f1);
143
+ const g = (f1 + 1) >> 1;
144
+ dst[d - 2 * strideb] = pix(p1 + g);
145
+ dst[d + strideb] = pix(q1 - g);
146
+ }
147
+ }
148
+ }
149
+ }
@@ -0,0 +1,161 @@
1
+ /*!
2
+ * The AV1 symbol decoder (a multi-symbol arithmetic decoder with adapting CDFs), ported from dav1d (src/msac.c).
3
+ * Copyright (c) 2018-2021, VideoLAN and dav1d authors, Copyright (c) 2018, Two Orioles, LLC, BSD-2-Clause License
4
+ * (see THIRD_PARTY_NOTICES.md)
5
+ */
6
+ const PROB_SHIFT = 6, MIN_PROB = 4;
7
+ const WIN = 32;
8
+ export class SymbolDecoder {
9
+ data;
10
+ end;
11
+ allowUpdate;
12
+ pos;
13
+ dif = 0;
14
+ rng = 0x8000;
15
+ cnt = -15;
16
+ constructor(data, start, end, allowUpdate) {
17
+ this.data = data;
18
+ this.end = end;
19
+ this.allowUpdate = allowUpdate;
20
+ this.pos = start;
21
+ this.refill();
22
+ }
23
+ refill() {
24
+ let c = WIN - this.cnt - 24;
25
+ let dif = this.dif;
26
+ do {
27
+ if (this.pos >= this.end) {
28
+ dif = (dif | ~(~0xff << c)) >>> 0;
29
+ break;
30
+ }
31
+ dif = (dif | (this.data[this.pos++] ^ 0xff) << c) >>> 0;
32
+ c -= 8;
33
+ } while (c >= 0);
34
+ this.dif = dif;
35
+ this.cnt = WIN - c - 24;
36
+ }
37
+ norm(dif, rng) {
38
+ const d = 15 ^ (31 ^ Math.clz32(rng));
39
+ const cnt = this.cnt;
40
+ this.dif = (dif << d) >>> 0;
41
+ this.rng = rng << d;
42
+ this.cnt = cnt - d;
43
+ if (cnt >= 0 && cnt < d)
44
+ this.refill();
45
+ }
46
+ bool() {
47
+ const r = this.rng;
48
+ let dif = this.dif;
49
+ let v = (r >> 8 << 7) + MIN_PROB;
50
+ const vw = v * 65536;
51
+ const ret = dif >= vw ? 1 : 0;
52
+ if (ret) {
53
+ dif -= vw;
54
+ v = r - v;
55
+ }
56
+ this.norm(dif, v);
57
+ return ret ^ 1;
58
+ }
59
+ boolProb(f) {
60
+ const r = this.rng;
61
+ let dif = this.dif;
62
+ let v = ((r >> 8) * (f >> PROB_SHIFT) >> (7 - PROB_SHIFT)) + MIN_PROB;
63
+ const vw = v * 65536;
64
+ const ret = dif >= vw ? 1 : 0;
65
+ if (ret) {
66
+ dif -= vw;
67
+ v = r - v;
68
+ }
69
+ this.norm(dif, v);
70
+ return ret ^ 1;
71
+ }
72
+ bools(n) {
73
+ let v = 0;
74
+ while (n--)
75
+ v = v << 1 | this.bool();
76
+ return v;
77
+ }
78
+ uniform(n) {
79
+ const l = 32 - Math.clz32(n);
80
+ const m = (1 << l) - n;
81
+ const v = this.bools(l - 1);
82
+ return v < m ? v : (v << 1) - m + this.bool();
83
+ }
84
+ symbol(cdf, o, n) {
85
+ const c = this.dif >>> 16, r = this.rng >> 8;
86
+ let u, v = this.rng, val = -1;
87
+ do {
88
+ val++;
89
+ u = v;
90
+ v = r * (cdf[o + val] >> PROB_SHIFT) >> (7 - PROB_SHIFT);
91
+ v += MIN_PROB * (n - val);
92
+ } while (c < v);
93
+ this.norm(this.dif - v * 65536, u - v);
94
+ if (this.allowUpdate) {
95
+ const count = cdf[o + n];
96
+ const rate = 4 + (count >> 4) + (n > 2 ? 1 : 0);
97
+ let i = 0;
98
+ for (; i < val; i++)
99
+ cdf[o + i] += 32768 - cdf[o + i] >> rate;
100
+ for (; i < n; i++)
101
+ cdf[o + i] -= cdf[o + i] >> rate;
102
+ cdf[o + n] = count + (count < 32 ? 1 : 0);
103
+ }
104
+ return val;
105
+ }
106
+ boolAdapt(cdf, o) {
107
+ const bit = this.boolProb(cdf[o]);
108
+ if (this.allowUpdate) {
109
+ const count = cdf[o + 1];
110
+ const rate = 4 + (count >> 4);
111
+ if (bit)
112
+ cdf[o] += 32768 - cdf[o] >> rate;
113
+ else
114
+ cdf[o] -= cdf[o] >> rate;
115
+ cdf[o + 1] = count + (count < 32 ? 1 : 0);
116
+ }
117
+ return bit;
118
+ }
119
+ hiTok(cdf, o) {
120
+ let br = this.symbol(cdf, o, 3);
121
+ let tok = 3 + br;
122
+ if (br === 3) {
123
+ br = this.symbol(cdf, o, 3);
124
+ tok = 6 + br;
125
+ if (br === 3) {
126
+ br = this.symbol(cdf, o, 3);
127
+ tok = 9 + br;
128
+ if (br === 3)
129
+ tok = 12 + this.symbol(cdf, o, 3);
130
+ }
131
+ }
132
+ return tok;
133
+ }
134
+ golomb() {
135
+ let len = 0;
136
+ while (!this.bool() && len < 32)
137
+ len++;
138
+ let v = 1;
139
+ while (len--)
140
+ v = v * 2 + this.bool();
141
+ return v - 1;
142
+ }
143
+ subexp(ref, n, k) {
144
+ let a = 0;
145
+ if (this.bool()) {
146
+ if (this.bool())
147
+ k += this.bool() + 1;
148
+ a = 1 << k;
149
+ }
150
+ const v = this.bools(k) + a;
151
+ return ref * 2 <= n ? inverseRecenter(ref, v) : n - 1 - inverseRecenter(n - 1 - ref, v);
152
+ }
153
+ get overread() {
154
+ return this.cnt <= -15;
155
+ }
156
+ }
157
+ function inverseRecenter(r, v) {
158
+ if (v > r << 1)
159
+ return v;
160
+ return v & 1 ? r - (v + 1 >> 1) : r + (v >> 1);
161
+ }