imagescript 3.2.1 → 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 (101) hide show
  1. package/README.md +35 -10
  2. package/THIRD_PARTY_NOTICES.md +298 -2
  3. package/dist/animation.d.ts +25 -8
  4. package/dist/animation.js +44 -13
  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/crc.js +5 -0
  21. package/dist/codecs/gif.js +10 -35
  22. package/dist/codecs/hdr.d.ts +25 -0
  23. package/dist/codecs/hdr.js +201 -0
  24. package/dist/codecs/ico.js +48 -0
  25. package/dist/codecs/jpeg.js +11 -28
  26. package/dist/codecs/jxl/bits.js +126 -0
  27. package/dist/codecs/jxl/blend.js +117 -0
  28. package/dist/codecs/jxl/color.js +116 -0
  29. package/dist/codecs/jxl/dct.js +404 -0
  30. package/dist/codecs/jxl/entropy.js +556 -0
  31. package/dist/codecs/jxl/features.js +325 -0
  32. package/dist/codecs/jxl/filters.js +119 -0
  33. package/dist/codecs/jxl/frame-header.js +195 -0
  34. package/dist/codecs/jxl/frame.js +319 -0
  35. package/dist/codecs/jxl/headers.js +249 -0
  36. package/dist/codecs/jxl/idct.js +484 -0
  37. package/dist/codecs/jxl/modular.js +688 -0
  38. package/dist/codecs/jxl/quant.js +219 -0
  39. package/dist/codecs/jxl/upsample.js +52 -0
  40. package/dist/codecs/jxl/vardct.js +472 -0
  41. package/dist/codecs/jxl.js +89 -0
  42. package/dist/codecs/netpbm.js +239 -0
  43. package/dist/codecs/png.js +22 -10
  44. package/dist/codecs/qoi.js +150 -0
  45. package/dist/codecs/tga.js +3 -1
  46. package/dist/codecs/tiff.js +7 -2
  47. package/dist/codecs/vp8-enc-dsp.js +932 -0
  48. package/dist/codecs/vp8-enc-tables.js +78 -0
  49. package/dist/codecs/vp8-enc.js +1930 -0
  50. package/dist/codecs/vp8.js +3 -1
  51. package/dist/codecs/vp8l.js +126 -58
  52. package/dist/codecs/webp.js +47 -11
  53. package/dist/codecs/zlib.js +81 -69
  54. package/dist/frame.d.ts +1 -0
  55. package/dist/frame.js +4 -2
  56. package/dist/gif.d.ts +1 -0
  57. package/dist/gif.js +2 -2
  58. package/dist/image-type.d.ts +15 -1
  59. package/dist/image-type.js +45 -2
  60. package/dist/image.d.ts +89 -13
  61. package/dist/image.js +266 -113
  62. package/dist/index.d.ts +3 -2
  63. package/dist/index.js +4 -4
  64. package/dist/render/bidi.js +350 -0
  65. package/dist/render/buffer.js +362 -0
  66. package/dist/render/color.js +164 -0
  67. package/dist/render/colr.js +523 -0
  68. package/dist/render/font.js +173 -241
  69. package/dist/render/hinting.js +38 -22
  70. package/dist/render/layout.js +1553 -0
  71. package/dist/render/linebreak.js +210 -0
  72. package/dist/render/segment.js +106 -0
  73. package/dist/render/shape.js +984 -0
  74. package/dist/render/shapers/arabic.js +284 -0
  75. package/dist/render/shapers/hangul.js +142 -0
  76. package/dist/render/shapers/hebrew.js +49 -0
  77. package/dist/render/shapers/index.js +52 -0
  78. package/dist/render/shapers/indic.js +579 -0
  79. package/dist/render/shapers/khmer.js +104 -0
  80. package/dist/render/shapers/machine.js +129 -0
  81. package/dist/render/shapers/myanmar.js +121 -0
  82. package/dist/render/shapers/syllabic.js +100 -0
  83. package/dist/render/shapers/thai.js +125 -0
  84. package/dist/render/shapers/use.js +235 -0
  85. package/dist/render/svg.js +102 -23
  86. package/dist/render/text.js +373 -103
  87. package/dist/render/unicode-data.js +63 -0
  88. package/dist/render/unicode.js +50 -0
  89. package/dist/text-layout.d.ts +4 -1
  90. package/dist/text-layout.js +2 -2
  91. package/dist/util/alpha.js +43 -0
  92. package/dist/util/blur.js +20 -33
  93. package/dist/util/bytes.js +40 -0
  94. package/dist/util/limits.js +34 -0
  95. package/dist/util/options.js +7 -0
  96. package/dist/util/resample.js +126 -7
  97. package/dist/util/rotate.js +43 -0
  98. package/dist/version.js +1 -1
  99. package/licenses/HarfBuzz.txt +42 -0
  100. package/licenses/Unicode-3.0.txt +39 -0
  101. 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
+ }