@mkabatek/pptx-viewer 1.5.3 → 1.5.5

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 (44) hide show
  1. package/README.md +13 -9
  2. package/package.json +2 -9
  3. package/node_modules/emf-converter/LICENSE +0 -21
  4. package/node_modules/emf-converter/README.md +0 -629
  5. package/node_modules/emf-converter/dist/index.d.mts +0 -86
  6. package/node_modules/emf-converter/dist/index.d.ts +0 -86
  7. package/node_modules/emf-converter/dist/index.js +0 -4257
  8. package/node_modules/emf-converter/dist/index.mjs +0 -4253
  9. package/node_modules/emf-converter/package.json +0 -53
  10. package/node_modules/mtx-decompressor/LICENSE +0 -373
  11. package/node_modules/mtx-decompressor/README.md +0 -271
  12. package/node_modules/mtx-decompressor/dist/index.d.mts +0 -84
  13. package/node_modules/mtx-decompressor/dist/index.d.ts +0 -84
  14. package/node_modules/mtx-decompressor/dist/index.js +0 -1532
  15. package/node_modules/mtx-decompressor/dist/index.mjs +0 -1528
  16. package/node_modules/mtx-decompressor/package.json +0 -44
  17. package/node_modules/pptx-viewer-core/LICENSE +0 -21
  18. package/node_modules/pptx-viewer-core/NOTICE +0 -16
  19. package/node_modules/pptx-viewer-core/README.md +0 -1294
  20. package/node_modules/pptx-viewer-core/dist/SvgExporter-BtZczTlB.d.ts +0 -557
  21. package/node_modules/pptx-viewer-core/dist/SvgExporter-D4mBWJHE.d.mts +0 -557
  22. package/node_modules/pptx-viewer-core/dist/cli/index.d.mts +0 -150
  23. package/node_modules/pptx-viewer-core/dist/cli/index.d.ts +0 -150
  24. package/node_modules/pptx-viewer-core/dist/cli/index.js +0 -0
  25. package/node_modules/pptx-viewer-core/dist/cli/index.mjs +0 -0
  26. package/node_modules/pptx-viewer-core/dist/converter/index.d.mts +0 -48
  27. package/node_modules/pptx-viewer-core/dist/converter/index.d.ts +0 -48
  28. package/node_modules/pptx-viewer-core/dist/converter/index.js +0 -0
  29. package/node_modules/pptx-viewer-core/dist/converter/index.mjs +0 -0
  30. package/node_modules/pptx-viewer-core/dist/index.d.mts +0 -12744
  31. package/node_modules/pptx-viewer-core/dist/index.d.ts +0 -12744
  32. package/node_modules/pptx-viewer-core/dist/index.js +0 -66894
  33. package/node_modules/pptx-viewer-core/dist/index.mjs +0 -66420
  34. package/node_modules/pptx-viewer-core/dist/presentation-nZxgWvXq.d.mts +0 -5645
  35. package/node_modules/pptx-viewer-core/dist/presentation-nZxgWvXq.d.ts +0 -5645
  36. package/node_modules/pptx-viewer-core/dist/signature-inspection-status-BCUpfCQh.d.mts +0 -220
  37. package/node_modules/pptx-viewer-core/dist/signature-inspection-status-BCUpfCQh.d.ts +0 -220
  38. package/node_modules/pptx-viewer-core/dist/signature-node/index.d.mts +0 -177
  39. package/node_modules/pptx-viewer-core/dist/signature-node/index.d.ts +0 -177
  40. package/node_modules/pptx-viewer-core/dist/signature-node/index.js +0 -1206
  41. package/node_modules/pptx-viewer-core/dist/signature-node/index.mjs +0 -1143
  42. package/node_modules/pptx-viewer-core/dist/text-operations-DCTGMltY.d.mts +0 -134
  43. package/node_modules/pptx-viewer-core/dist/text-operations-DYmhoi7U.d.ts +0 -134
  44. package/node_modules/pptx-viewer-core/package.json +0 -96
@@ -1,1528 +0,0 @@
1
- // src/stream.ts
2
- var Stream = class _Stream {
3
- buf;
4
- size;
5
- // how much data has been written or is valid
6
- reserved;
7
- // allocated capacity
8
- pos;
9
- // current byte position
10
- bitPos;
11
- // current bit position within the byte at `pos`
12
- constructor(buf, size) {
13
- if (buf) {
14
- this.buf = buf;
15
- this.size = size;
16
- this.reserved = buf.length;
17
- } else {
18
- this.buf = new Uint8Array(0);
19
- this.size = 0;
20
- this.reserved = 0;
21
- }
22
- this.pos = 0;
23
- this.bitPos = 0;
24
- }
25
- static fromExisting(buf, size, reserved) {
26
- const s = new _Stream(null, 0);
27
- s.buf = buf;
28
- s.size = size;
29
- s.reserved = reserved;
30
- return s;
31
- }
32
- reserve(n) {
33
- if (this.reserved >= n) {
34
- return;
35
- }
36
- const newBuf = new Uint8Array(n);
37
- newBuf.set(this.buf.subarray(0, this.size));
38
- this.buf = newBuf;
39
- this.reserved = n;
40
- }
41
- ensureWrite(n) {
42
- const needed = this.pos + n;
43
- if (needed > this.reserved) {
44
- this.reserve(Math.max(needed, this.reserved * 2 || 256));
45
- }
46
- if (needed > this.size) {
47
- this.size = needed;
48
- }
49
- }
50
- ensureRead(n) {
51
- if (this.pos + n > this.size) {
52
- throw new Error(
53
- `Stream: not enough data (need ${n} bytes at pos ${this.pos}, size ${this.size})`
54
- );
55
- }
56
- }
57
- // --- Seek ---
58
- seekAbsolute(pos) {
59
- if (pos > this.size) {
60
- throw new Error(`Stream: seek past end (${pos} > ${this.size})`);
61
- }
62
- this.pos = pos;
63
- this.bitPos = 0;
64
- }
65
- seekRelative(offset) {
66
- const newPos = this.pos + offset;
67
- if (newPos < 0) {
68
- throw new Error("Stream: negative seek");
69
- }
70
- if (newPos > this.size) {
71
- throw new Error("Stream: seek past end");
72
- }
73
- this.pos = newPos;
74
- this.bitPos = 0;
75
- }
76
- seekAbsoluteThroughReserve(pos) {
77
- if (pos > this.reserved) {
78
- this.reserve(pos);
79
- }
80
- if (pos > this.size) {
81
- this.size = pos;
82
- }
83
- this.pos = pos;
84
- this.bitPos = 0;
85
- }
86
- seekRelativeThroughReserve(offset) {
87
- this.seekAbsoluteThroughReserve(this.pos + offset);
88
- }
89
- // --- Read (Big-Endian) ---
90
- readU8() {
91
- this.ensureRead(1);
92
- return this.buf[this.pos++];
93
- }
94
- peekU8() {
95
- this.ensureRead(1);
96
- return this.buf[this.pos];
97
- }
98
- readU16() {
99
- this.ensureRead(2);
100
- const v = this.buf[this.pos] << 8 | this.buf[this.pos + 1];
101
- this.pos += 2;
102
- return v;
103
- }
104
- readU24() {
105
- this.ensureRead(3);
106
- const v = this.buf[this.pos] << 16 | this.buf[this.pos + 1] << 8 | this.buf[this.pos + 2];
107
- this.pos += 3;
108
- return v;
109
- }
110
- readU32() {
111
- this.ensureRead(4);
112
- const v = (this.buf[this.pos] << 24 | this.buf[this.pos + 1] << 16 | this.buf[this.pos + 2] << 8 | this.buf[this.pos + 3]) >>> 0;
113
- this.pos += 4;
114
- return v;
115
- }
116
- readS16() {
117
- const v = this.readU16();
118
- return v >= 32768 ? v - 65536 : v;
119
- }
120
- readS8() {
121
- const v = this.readU8();
122
- return v >= 128 ? v - 256 : v;
123
- }
124
- readChar() {
125
- return String.fromCharCode(this.readU8());
126
- }
127
- // --- Write (Big-Endian) ---
128
- writeU8(v) {
129
- this.ensureWrite(1);
130
- this.buf[this.pos++] = v & 255;
131
- }
132
- writeU16(v) {
133
- this.ensureWrite(2);
134
- this.buf[this.pos++] = v >> 8 & 255;
135
- this.buf[this.pos++] = v & 255;
136
- }
137
- writeU24(v) {
138
- this.ensureWrite(3);
139
- this.buf[this.pos++] = v >> 16 & 255;
140
- this.buf[this.pos++] = v >> 8 & 255;
141
- this.buf[this.pos++] = v & 255;
142
- }
143
- writeU32(v) {
144
- this.ensureWrite(4);
145
- this.buf[this.pos++] = v >>> 24 & 255;
146
- this.buf[this.pos++] = v >> 16 & 255;
147
- this.buf[this.pos++] = v >> 8 & 255;
148
- this.buf[this.pos++] = v & 255;
149
- }
150
- writeS16(v) {
151
- this.writeU16(v < 0 ? v + 65536 : v);
152
- }
153
- writeS8(v) {
154
- this.writeU8(v < 0 ? v + 256 : v);
155
- }
156
- // --- Bit-level reading (for triplet coordinate decoding) ---
157
- readNBits(n) {
158
- if (n === 0) {
159
- return 0;
160
- }
161
- let value = 0;
162
- let bitsRemaining = n;
163
- while (bitsRemaining > 0) {
164
- if (this.pos >= this.size && this.bitPos === 0) {
165
- throw new Error("Stream: not enough data for bit read");
166
- }
167
- const bitsAvailableInByte = 8 - this.bitPos;
168
- const bitsToRead = Math.min(bitsRemaining, bitsAvailableInByte);
169
- const shift = bitsAvailableInByte - bitsToRead;
170
- const mask = (1 << bitsToRead) - 1 << shift;
171
- value = value << bitsToRead | (this.buf[this.pos] & mask) >> shift;
172
- this.bitPos += bitsToRead;
173
- if (this.bitPos >= 8) {
174
- this.bitPos = 0;
175
- this.pos++;
176
- }
177
- bitsRemaining -= bitsToRead;
178
- }
179
- return value;
180
- }
181
- // --- Copy ---
182
- /** Copy `length` bytes from this stream to `dest`. */
183
- copyTo(dest, length) {
184
- if (this.pos + length > this.size) {
185
- throw new Error("Stream: not enough data for copy");
186
- }
187
- dest.ensureWrite(length);
188
- dest.buf.set(this.buf.subarray(this.pos, this.pos + length), dest.pos);
189
- this.pos += length;
190
- dest.pos += length;
191
- }
192
- /** Read rest of data as 4-byte-aligned U32 values. Returns 0 on incomplete read. */
193
- readRestAsU32() {
194
- if (this.pos + 4 > this.size) {
195
- if (this.pos >= this.size) {
196
- return null;
197
- }
198
- let val = 0;
199
- const remaining = this.size - this.pos;
200
- for (let i = 0; i < 4; i++) {
201
- val <<= 8;
202
- if (i < remaining) {
203
- val |= this.buf[this.pos + i];
204
- }
205
- }
206
- this.pos = this.size;
207
- return val >>> 0;
208
- }
209
- return this.readU32();
210
- }
211
- /** Compute checksum of bytes from beginPos to endPos as 4-byte aligned U32 sum. */
212
- checksumU32(beginPos, endPos) {
213
- let sum = 0;
214
- const savedPos = this.pos;
215
- this.pos = beginPos;
216
- while (this.pos < endPos) {
217
- const chunk = this.readRestAsU32();
218
- if (chunk === null) {
219
- break;
220
- }
221
- sum = sum + chunk >>> 0;
222
- }
223
- this.pos = savedPos;
224
- return sum;
225
- }
226
- /** Get a copy of the written data. */
227
- toUint8Array() {
228
- return this.buf.slice(0, this.size);
229
- }
230
- };
231
-
232
- // src/triplet-encodings.ts
233
- var TRIPLET_ENCODINGS = [
234
- // Indices 0-9: xBits=0 or yBits=0 (one axis)
235
- { byteCount: 2, xBits: 0, yBits: 8, deltaX: 0, deltaY: 0, xSign: 0, ySign: -1 },
236
- { byteCount: 2, xBits: 0, yBits: 8, deltaX: 0, deltaY: 0, xSign: 0, ySign: 1 },
237
- { byteCount: 2, xBits: 0, yBits: 8, deltaX: 0, deltaY: 256, xSign: 0, ySign: -1 },
238
- { byteCount: 2, xBits: 0, yBits: 8, deltaX: 0, deltaY: 256, xSign: 0, ySign: 1 },
239
- { byteCount: 2, xBits: 0, yBits: 8, deltaX: 0, deltaY: 512, xSign: 0, ySign: -1 },
240
- { byteCount: 2, xBits: 0, yBits: 8, deltaX: 0, deltaY: 512, xSign: 0, ySign: 1 },
241
- { byteCount: 2, xBits: 0, yBits: 8, deltaX: 0, deltaY: 768, xSign: 0, ySign: -1 },
242
- { byteCount: 2, xBits: 0, yBits: 8, deltaX: 0, deltaY: 768, xSign: 0, ySign: 1 },
243
- { byteCount: 2, xBits: 0, yBits: 8, deltaX: 0, deltaY: 1024, xSign: 0, ySign: -1 },
244
- { byteCount: 2, xBits: 0, yBits: 8, deltaX: 0, deltaY: 1024, xSign: 0, ySign: 1 },
245
- // Indices 10-19: yBits=0 (X axis only)
246
- { byteCount: 2, xBits: 8, yBits: 0, deltaX: 0, deltaY: 0, xSign: -1, ySign: 0 },
247
- { byteCount: 2, xBits: 8, yBits: 0, deltaX: 0, deltaY: 0, xSign: 1, ySign: 0 },
248
- { byteCount: 2, xBits: 8, yBits: 0, deltaX: 256, deltaY: 0, xSign: -1, ySign: 0 },
249
- { byteCount: 2, xBits: 8, yBits: 0, deltaX: 256, deltaY: 0, xSign: 1, ySign: 0 },
250
- { byteCount: 2, xBits: 8, yBits: 0, deltaX: 512, deltaY: 0, xSign: -1, ySign: 0 },
251
- { byteCount: 2, xBits: 8, yBits: 0, deltaX: 512, deltaY: 0, xSign: 1, ySign: 0 },
252
- { byteCount: 2, xBits: 8, yBits: 0, deltaX: 768, deltaY: 0, xSign: -1, ySign: 0 },
253
- { byteCount: 2, xBits: 8, yBits: 0, deltaX: 768, deltaY: 0, xSign: 1, ySign: 0 },
254
- { byteCount: 2, xBits: 8, yBits: 0, deltaX: 1024, deltaY: 0, xSign: -1, ySign: 0 },
255
- { byteCount: 2, xBits: 8, yBits: 0, deltaX: 1024, deltaY: 0, xSign: 1, ySign: 0 },
256
- // Indices 20-83: 4-bit X + 4-bit Y (2 bytes total)
257
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 1, deltaY: 1, xSign: -1, ySign: -1 },
258
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 1, deltaY: 1, xSign: 1, ySign: -1 },
259
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 1, deltaY: 1, xSign: -1, ySign: 1 },
260
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 1, deltaY: 1, xSign: 1, ySign: 1 },
261
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 1, deltaY: 17, xSign: -1, ySign: -1 },
262
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 1, deltaY: 17, xSign: 1, ySign: -1 },
263
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 1, deltaY: 17, xSign: -1, ySign: 1 },
264
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 1, deltaY: 17, xSign: 1, ySign: 1 },
265
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 1, deltaY: 33, xSign: -1, ySign: -1 },
266
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 1, deltaY: 33, xSign: 1, ySign: -1 },
267
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 1, deltaY: 33, xSign: -1, ySign: 1 },
268
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 1, deltaY: 33, xSign: 1, ySign: 1 },
269
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 1, deltaY: 49, xSign: -1, ySign: -1 },
270
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 1, deltaY: 49, xSign: 1, ySign: -1 },
271
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 1, deltaY: 49, xSign: -1, ySign: 1 },
272
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 1, deltaY: 49, xSign: 1, ySign: 1 },
273
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 17, deltaY: 1, xSign: -1, ySign: -1 },
274
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 17, deltaY: 1, xSign: 1, ySign: -1 },
275
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 17, deltaY: 1, xSign: -1, ySign: 1 },
276
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 17, deltaY: 1, xSign: 1, ySign: 1 },
277
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 17, deltaY: 17, xSign: -1, ySign: -1 },
278
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 17, deltaY: 17, xSign: 1, ySign: -1 },
279
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 17, deltaY: 17, xSign: -1, ySign: 1 },
280
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 17, deltaY: 17, xSign: 1, ySign: 1 },
281
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 17, deltaY: 33, xSign: -1, ySign: -1 },
282
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 17, deltaY: 33, xSign: 1, ySign: -1 },
283
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 17, deltaY: 33, xSign: -1, ySign: 1 },
284
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 17, deltaY: 33, xSign: 1, ySign: 1 },
285
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 17, deltaY: 49, xSign: -1, ySign: -1 },
286
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 17, deltaY: 49, xSign: 1, ySign: -1 },
287
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 17, deltaY: 49, xSign: -1, ySign: 1 },
288
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 17, deltaY: 49, xSign: 1, ySign: 1 },
289
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 33, deltaY: 1, xSign: -1, ySign: -1 },
290
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 33, deltaY: 1, xSign: 1, ySign: -1 },
291
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 33, deltaY: 1, xSign: -1, ySign: 1 },
292
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 33, deltaY: 1, xSign: 1, ySign: 1 },
293
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 33, deltaY: 17, xSign: -1, ySign: -1 },
294
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 33, deltaY: 17, xSign: 1, ySign: -1 },
295
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 33, deltaY: 17, xSign: -1, ySign: 1 },
296
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 33, deltaY: 17, xSign: 1, ySign: 1 },
297
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 33, deltaY: 33, xSign: -1, ySign: -1 },
298
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 33, deltaY: 33, xSign: 1, ySign: -1 },
299
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 33, deltaY: 33, xSign: -1, ySign: 1 },
300
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 33, deltaY: 33, xSign: 1, ySign: 1 },
301
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 33, deltaY: 49, xSign: -1, ySign: -1 },
302
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 33, deltaY: 49, xSign: 1, ySign: -1 },
303
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 33, deltaY: 49, xSign: -1, ySign: 1 },
304
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 33, deltaY: 49, xSign: 1, ySign: 1 },
305
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 49, deltaY: 1, xSign: -1, ySign: -1 },
306
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 49, deltaY: 1, xSign: 1, ySign: -1 },
307
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 49, deltaY: 1, xSign: -1, ySign: 1 },
308
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 49, deltaY: 1, xSign: 1, ySign: 1 },
309
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 49, deltaY: 17, xSign: -1, ySign: -1 },
310
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 49, deltaY: 17, xSign: 1, ySign: -1 },
311
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 49, deltaY: 17, xSign: -1, ySign: 1 },
312
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 49, deltaY: 17, xSign: 1, ySign: 1 },
313
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 49, deltaY: 33, xSign: -1, ySign: -1 },
314
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 49, deltaY: 33, xSign: 1, ySign: -1 },
315
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 49, deltaY: 33, xSign: -1, ySign: 1 },
316
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 49, deltaY: 33, xSign: 1, ySign: 1 },
317
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 49, deltaY: 49, xSign: -1, ySign: -1 },
318
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 49, deltaY: 49, xSign: 1, ySign: -1 },
319
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 49, deltaY: 49, xSign: -1, ySign: 1 },
320
- { byteCount: 2, xBits: 4, yBits: 4, deltaX: 49, deltaY: 49, xSign: 1, ySign: 1 },
321
- // Indices 84-119: 8-bit X + 8-bit Y (3 bytes total)
322
- { byteCount: 3, xBits: 8, yBits: 8, deltaX: 1, deltaY: 1, xSign: -1, ySign: -1 },
323
- { byteCount: 3, xBits: 8, yBits: 8, deltaX: 1, deltaY: 1, xSign: 1, ySign: -1 },
324
- { byteCount: 3, xBits: 8, yBits: 8, deltaX: 1, deltaY: 1, xSign: -1, ySign: 1 },
325
- { byteCount: 3, xBits: 8, yBits: 8, deltaX: 1, deltaY: 1, xSign: 1, ySign: 1 },
326
- { byteCount: 3, xBits: 8, yBits: 8, deltaX: 1, deltaY: 257, xSign: -1, ySign: -1 },
327
- { byteCount: 3, xBits: 8, yBits: 8, deltaX: 1, deltaY: 257, xSign: 1, ySign: -1 },
328
- { byteCount: 3, xBits: 8, yBits: 8, deltaX: 1, deltaY: 257, xSign: -1, ySign: 1 },
329
- { byteCount: 3, xBits: 8, yBits: 8, deltaX: 1, deltaY: 257, xSign: 1, ySign: 1 },
330
- { byteCount: 3, xBits: 8, yBits: 8, deltaX: 1, deltaY: 513, xSign: -1, ySign: -1 },
331
- { byteCount: 3, xBits: 8, yBits: 8, deltaX: 1, deltaY: 513, xSign: 1, ySign: -1 },
332
- { byteCount: 3, xBits: 8, yBits: 8, deltaX: 1, deltaY: 513, xSign: -1, ySign: 1 },
333
- { byteCount: 3, xBits: 8, yBits: 8, deltaX: 1, deltaY: 513, xSign: 1, ySign: 1 },
334
- { byteCount: 3, xBits: 8, yBits: 8, deltaX: 257, deltaY: 1, xSign: -1, ySign: -1 },
335
- { byteCount: 3, xBits: 8, yBits: 8, deltaX: 257, deltaY: 1, xSign: 1, ySign: -1 },
336
- { byteCount: 3, xBits: 8, yBits: 8, deltaX: 257, deltaY: 1, xSign: -1, ySign: 1 },
337
- { byteCount: 3, xBits: 8, yBits: 8, deltaX: 257, deltaY: 1, xSign: 1, ySign: 1 },
338
- { byteCount: 3, xBits: 8, yBits: 8, deltaX: 257, deltaY: 257, xSign: -1, ySign: -1 },
339
- { byteCount: 3, xBits: 8, yBits: 8, deltaX: 257, deltaY: 257, xSign: 1, ySign: -1 },
340
- { byteCount: 3, xBits: 8, yBits: 8, deltaX: 257, deltaY: 257, xSign: -1, ySign: 1 },
341
- { byteCount: 3, xBits: 8, yBits: 8, deltaX: 257, deltaY: 257, xSign: 1, ySign: 1 },
342
- { byteCount: 3, xBits: 8, yBits: 8, deltaX: 257, deltaY: 513, xSign: -1, ySign: -1 },
343
- { byteCount: 3, xBits: 8, yBits: 8, deltaX: 257, deltaY: 513, xSign: 1, ySign: -1 },
344
- { byteCount: 3, xBits: 8, yBits: 8, deltaX: 257, deltaY: 513, xSign: -1, ySign: 1 },
345
- { byteCount: 3, xBits: 8, yBits: 8, deltaX: 257, deltaY: 513, xSign: 1, ySign: 1 },
346
- { byteCount: 3, xBits: 8, yBits: 8, deltaX: 513, deltaY: 1, xSign: -1, ySign: -1 },
347
- { byteCount: 3, xBits: 8, yBits: 8, deltaX: 513, deltaY: 1, xSign: 1, ySign: -1 },
348
- { byteCount: 3, xBits: 8, yBits: 8, deltaX: 513, deltaY: 1, xSign: -1, ySign: 1 },
349
- { byteCount: 3, xBits: 8, yBits: 8, deltaX: 513, deltaY: 1, xSign: 1, ySign: 1 },
350
- { byteCount: 3, xBits: 8, yBits: 8, deltaX: 513, deltaY: 257, xSign: -1, ySign: -1 },
351
- { byteCount: 3, xBits: 8, yBits: 8, deltaX: 513, deltaY: 257, xSign: 1, ySign: -1 },
352
- { byteCount: 3, xBits: 8, yBits: 8, deltaX: 513, deltaY: 257, xSign: -1, ySign: 1 },
353
- { byteCount: 3, xBits: 8, yBits: 8, deltaX: 513, deltaY: 257, xSign: 1, ySign: 1 },
354
- { byteCount: 3, xBits: 8, yBits: 8, deltaX: 513, deltaY: 513, xSign: -1, ySign: -1 },
355
- { byteCount: 3, xBits: 8, yBits: 8, deltaX: 513, deltaY: 513, xSign: 1, ySign: -1 },
356
- { byteCount: 3, xBits: 8, yBits: 8, deltaX: 513, deltaY: 513, xSign: -1, ySign: 1 },
357
- { byteCount: 3, xBits: 8, yBits: 8, deltaX: 513, deltaY: 513, xSign: 1, ySign: 1 },
358
- // Indices 120-123: 12-bit X + 12-bit Y (4 bytes total)
359
- { byteCount: 4, xBits: 12, yBits: 12, deltaX: 0, deltaY: 0, xSign: -1, ySign: -1 },
360
- { byteCount: 4, xBits: 12, yBits: 12, deltaX: 0, deltaY: 0, xSign: 1, ySign: -1 },
361
- { byteCount: 4, xBits: 12, yBits: 12, deltaX: 0, deltaY: 0, xSign: -1, ySign: 1 },
362
- { byteCount: 4, xBits: 12, yBits: 12, deltaX: 0, deltaY: 0, xSign: 1, ySign: 1 },
363
- // Indices 124-127: 16-bit X + 16-bit Y (5 bytes total)
364
- { byteCount: 5, xBits: 16, yBits: 16, deltaX: 0, deltaY: 0, xSign: -1, ySign: -1 },
365
- { byteCount: 5, xBits: 16, yBits: 16, deltaX: 0, deltaY: 0, xSign: 1, ySign: -1 },
366
- { byteCount: 5, xBits: 16, yBits: 16, deltaX: 0, deltaY: 0, xSign: -1, ySign: 1 },
367
- { byteCount: 5, xBits: 16, yBits: 16, deltaX: 0, deltaY: 0, xSign: 1, ySign: 1 }
368
- ];
369
-
370
- // src/ctf-parser.ts
371
- var FLG_ON_CURVE = 1;
372
- var FLG_X_SHORT = 2;
373
- var FLG_Y_SHORT = 4;
374
- var FLG_X_SAME = 16;
375
- var FLG_Y_SAME = 32;
376
- var NPUSHB = 64;
377
- var NPUSHW = 65;
378
- var PUSHB = 176;
379
- var PUSHW = 184;
380
- var ARG_1_AND_2_ARE_WORDS = 1;
381
- var HAVE_SCALE = 8;
382
- var MORE_COMPONENTS = 32;
383
- var HAVE_XY_SCALE = 64;
384
- var HAVE_2_BY_2 = 128;
385
- var HAVE_INSTRUCTIONS = 256;
386
- var INT16_MIN = -32768;
387
- var INT16_MAX = 32767;
388
- function toInt16(v) {
389
- v &= 65535;
390
- return v >= 32768 ? v - 65536 : v;
391
- }
392
- function read255UShort(s) {
393
- const code = s.readU8();
394
- if (code === 253) {
395
- return s.readU16();
396
- }
397
- if (code === 255) {
398
- return 253 + s.readU8();
399
- }
400
- if (code === 254) {
401
- return 506 + s.readU8();
402
- }
403
- return code;
404
- }
405
- function read255Short(s) {
406
- let sign = 1;
407
- let code = s.readU8();
408
- if (code === 253) {
409
- return s.readS16();
410
- }
411
- if (code === 250) {
412
- sign = -1;
413
- code = s.readU8();
414
- }
415
- let value;
416
- if (code === 255) {
417
- value = 250 + s.readU8();
418
- } else if (code === 254) {
419
- value = 500 + s.readU8();
420
- } else {
421
- value = code;
422
- }
423
- return value * sign;
424
- }
425
- function unpackCVT(table, sIn) {
426
- sIn.seekAbsolute(table.offset);
427
- const tableLength = sIn.readU16();
428
- const numEntries = tableLength >>> 1;
429
- const out = new Stream(null, 0);
430
- out.reserve(tableLength);
431
- let lastValue = 0;
432
- for (let i = 0; i < numEntries; i++) {
433
- const code = sIn.readU8();
434
- let val;
435
- if (code >= 248) {
436
- val = 238 * (code - 247) + sIn.readU8();
437
- } else if (code >= 239) {
438
- val = -(238 * (code - 239) + sIn.readU8());
439
- } else if (code === 238) {
440
- val = sIn.readS16();
441
- } else {
442
- val = code;
443
- }
444
- lastValue = toInt16(lastValue + val);
445
- out.writeS16(lastValue);
446
- }
447
- table.buf = out.toUint8Array();
448
- table.bufSize = table.buf.length;
449
- }
450
- function decodePushInstructions(sIn, sOut, pushCount) {
451
- if (pushCount === 0) {
452
- return;
453
- }
454
- const data = [];
455
- let remaining = pushCount;
456
- let isShort = false;
457
- const runValues = [];
458
- function flush() {
459
- if (runValues.length === 0) {
460
- return;
461
- }
462
- const count = runValues.length;
463
- if (isShort) {
464
- if (count < 8) {
465
- sOut.writeU8(PUSHW + (count - 1));
466
- } else {
467
- sOut.writeU8(NPUSHW);
468
- sOut.writeU8(count);
469
- }
470
- for (const v of runValues) {
471
- sOut.writeS16(v);
472
- }
473
- } else {
474
- if (count < 8) {
475
- sOut.writeU8(PUSHB + (count - 1));
476
- } else {
477
- sOut.writeU8(NPUSHB);
478
- sOut.writeU8(count);
479
- }
480
- for (const v of runValues) {
481
- sOut.writeU8(v & 255);
482
- }
483
- }
484
- runValues.length = 0;
485
- }
486
- function put(v) {
487
- data.push(v);
488
- const needsShort = v < 0 || v > 255;
489
- if (runValues.length > 0 && needsShort !== isShort) {
490
- flush();
491
- }
492
- if (runValues.length === 0) {
493
- isShort = needsShort;
494
- }
495
- runValues.push(v);
496
- if (runValues.length >= 255) {
497
- flush();
498
- }
499
- }
500
- while (remaining > 0) {
501
- const code = sIn.peekU8();
502
- if (code === 251 && remaining >= 3 && data.length >= 2) {
503
- sIn.readU8();
504
- const prev = data[data.length - 2];
505
- put(prev);
506
- const val = read255Short(sIn);
507
- put(val);
508
- put(prev);
509
- remaining -= 3;
510
- } else if (code === 252 && remaining >= 5 && data.length >= 2) {
511
- sIn.readU8();
512
- const prev = data[data.length - 2];
513
- put(prev);
514
- const c = read255Short(sIn);
515
- put(c);
516
- put(prev);
517
- const d = read255Short(sIn);
518
- put(d);
519
- put(prev);
520
- remaining -= 5;
521
- } else {
522
- const v = read255Short(sIn);
523
- put(v);
524
- remaining -= 1;
525
- }
526
- }
527
- flush();
528
- }
529
- function makeGlyphFlags(x, y, onCurve, firstTime) {
530
- let flags = 0;
531
- if (onCurve) {
532
- flags |= FLG_ON_CURVE;
533
- }
534
- if (!firstTime && x === 0) {
535
- flags |= FLG_X_SAME;
536
- } else if (x > -256 && x < 0) {
537
- flags |= FLG_X_SHORT;
538
- } else if (x >= 0 && x < 256) {
539
- flags |= FLG_X_SHORT | FLG_X_SAME;
540
- }
541
- if (!firstTime && y === 0) {
542
- flags |= FLG_Y_SAME;
543
- } else if (y > -256 && y < 0) {
544
- flags |= FLG_Y_SHORT;
545
- } else if (y >= 0 && y < 256) {
546
- flags |= FLG_Y_SHORT | FLG_Y_SAME;
547
- }
548
- return flags;
549
- }
550
- function decodeSimpleGlyph(numContours, streams, out, calcBBox, minX, minY, maxX, maxY) {
551
- if (numContours === 0) {
552
- return;
553
- }
554
- const sGlyph = streams[0];
555
- out.writeS16(numContours);
556
- const bboxPos = out.pos;
557
- if (calcBBox) {
558
- minX = INT16_MAX;
559
- minY = INT16_MAX;
560
- maxX = INT16_MIN;
561
- maxY = INT16_MIN;
562
- out.writeS16(0);
563
- out.writeS16(0);
564
- out.writeS16(0);
565
- out.writeS16(0);
566
- } else {
567
- out.writeS16(minX);
568
- out.writeS16(minY);
569
- out.writeS16(maxX);
570
- out.writeS16(maxY);
571
- }
572
- let totalPoints = 0;
573
- for (let c = 0; c < numContours; c++) {
574
- if (c === 0) {
575
- totalPoints = 1;
576
- }
577
- const pointsInContour = read255UShort(sGlyph);
578
- totalPoints += pointsInContour;
579
- out.writeU16(totalPoints - 1);
580
- }
581
- const flagBytes = new Uint8Array(totalPoints);
582
- for (let i = 0; i < totalPoints; i++) {
583
- flagBytes[i] = sGlyph.readU8();
584
- }
585
- const xDeltas = new Int16Array(totalPoints);
586
- const yDeltas = new Int16Array(totalPoints);
587
- const onCurve = new Uint8Array(totalPoints);
588
- let cumulativeX = 0;
589
- let cumulativeY = 0;
590
- for (let i = 0; i < totalPoints; i++) {
591
- const flag = flagBytes[i];
592
- onCurve[i] = flag & 128 ? 0 : 1;
593
- const enc = TRIPLET_ENCODINGS[flag & 127];
594
- let dx = sGlyph.readNBits(enc.xBits) + enc.deltaX;
595
- let dy = sGlyph.readNBits(enc.yBits) + enc.deltaY;
596
- if (enc.xSign !== 0) {
597
- dx *= enc.xSign;
598
- }
599
- if (enc.ySign !== 0) {
600
- dy *= enc.ySign;
601
- }
602
- xDeltas[i] = dx;
603
- yDeltas[i] = dy;
604
- cumulativeX += dx;
605
- cumulativeY += dy;
606
- if (calcBBox) {
607
- if (cumulativeX < minX) {
608
- minX = cumulativeX;
609
- }
610
- if (cumulativeX > maxX) {
611
- maxX = cumulativeX;
612
- }
613
- if (cumulativeY < minY) {
614
- minY = cumulativeY;
615
- }
616
- if (cumulativeY > maxY) {
617
- maxY = cumulativeY;
618
- }
619
- }
620
- }
621
- const codeSizeLocation = out.pos;
622
- out.writeU16(0);
623
- const pushCount = read255UShort(sGlyph);
624
- decodePushInstructions(streams[1], out, pushCount);
625
- const codeSize = read255UShort(sGlyph);
626
- if (codeSize > 0) {
627
- streams[2].copyTo(out, codeSize);
628
- }
629
- const unpackedCodeSize = out.pos - (codeSizeLocation + 2);
630
- const savedPos = out.pos;
631
- out.seekAbsolute(codeSizeLocation);
632
- out.writeU16(unpackedCodeSize);
633
- out.seekAbsolute(savedPos);
634
- for (let i = 0; i < totalPoints; i++) {
635
- const f = makeGlyphFlags(xDeltas[i], yDeltas[i], onCurve[i] !== 0, i === 0);
636
- out.writeU8(f);
637
- }
638
- for (let i = 0; i < totalPoints; i++) {
639
- const x = xDeltas[i];
640
- if (i === 0 || x !== 0) {
641
- const absX = Math.abs(x);
642
- if (absX < 256) {
643
- out.writeU8(absX);
644
- } else {
645
- out.writeS16(x);
646
- }
647
- }
648
- }
649
- for (let i = 0; i < totalPoints; i++) {
650
- const y = yDeltas[i];
651
- if (i === 0 || y !== 0) {
652
- const absY = Math.abs(y);
653
- if (absY < 256) {
654
- out.writeU8(absY);
655
- } else {
656
- out.writeS16(y);
657
- }
658
- }
659
- }
660
- if (calcBBox) {
661
- const endPos = out.pos;
662
- out.seekAbsolute(bboxPos);
663
- out.writeS16(minX);
664
- out.writeS16(minY);
665
- out.writeS16(maxX);
666
- out.writeS16(maxY);
667
- out.seekAbsolute(endPos);
668
- }
669
- }
670
- function decodeCompositeGlyph(streams, out) {
671
- const sGlyph = streams[0];
672
- out.writeS16(-1);
673
- out.writeS16(sGlyph.readS16());
674
- out.writeS16(sGlyph.readS16());
675
- out.writeS16(sGlyph.readS16());
676
- out.writeS16(sGlyph.readS16());
677
- let flags = 0;
678
- do {
679
- flags = sGlyph.readU16();
680
- const glyphIndex = sGlyph.readU16();
681
- out.writeU16(flags);
682
- out.writeU16(glyphIndex);
683
- let argBytes;
684
- if (flags & ARG_1_AND_2_ARE_WORDS) {
685
- argBytes = 4;
686
- } else {
687
- argBytes = 2;
688
- }
689
- sGlyph.copyTo(out, argBytes);
690
- let transformBytes = 0;
691
- if (flags & HAVE_2_BY_2) {
692
- transformBytes = 8;
693
- } else if (flags & HAVE_XY_SCALE) {
694
- transformBytes = 4;
695
- } else if (flags & HAVE_SCALE) {
696
- transformBytes = 2;
697
- }
698
- if (transformBytes > 0) {
699
- sGlyph.copyTo(out, transformBytes);
700
- }
701
- } while (flags & MORE_COMPONENTS);
702
- if (flags & HAVE_INSTRUCTIONS) {
703
- const numInstrPos = out.pos;
704
- out.writeU16(0);
705
- const pushCount = read255UShort(sGlyph);
706
- decodePushInstructions(streams[1], out, pushCount);
707
- const codeSize = read255UShort(sGlyph);
708
- if (codeSize > 0) {
709
- streams[2].copyTo(out, codeSize);
710
- }
711
- const numInstr = out.pos - (numInstrPos + 2);
712
- const savedPos = out.pos;
713
- out.seekAbsolute(numInstrPos);
714
- out.writeU16(numInstr);
715
- out.seekAbsolute(savedPos);
716
- }
717
- }
718
- function decodeGlyph(streams, out) {
719
- const numContours = streams[0].readS16();
720
- if (numContours < 0) {
721
- decodeCompositeGlyph(streams, out);
722
- } else if (numContours === 32767) {
723
- const actualContours = streams[0].readS16();
724
- const xMin = streams[0].readS16();
725
- const yMin = streams[0].readS16();
726
- const xMax = streams[0].readS16();
727
- const yMax = streams[0].readS16();
728
- decodeSimpleGlyph(actualContours, streams, out, false, xMin, yMin, xMax, yMax);
729
- } else {
730
- decodeSimpleGlyph(numContours, streams, out, true, 0, 0, 0, 0);
731
- }
732
- }
733
- function populateGlyfAndLoca(glyf, loca, headData, maxpData, streams) {
734
- const numGlyphs = maxpData.numGlyphs;
735
- streams[0].seekAbsolute(glyf.offset);
736
- streams[1].seekAbsolute(0);
737
- streams[2].seekAbsolute(0);
738
- const maxGlyphSize = 5 * 2 + // header (numContours + bbox)
739
- 2 * maxpData.maxContours + // endPtsOfContours
740
- 2 + // instructionLength
741
- maxpData.maxSizeOfInstructions + 256 + // instructions + padding
742
- 5 * maxpData.maxPoints + // flags + coordinates
743
- 4 * maxpData.maxComponentElements * 6 + // composite components
744
- 256;
745
- const outStream = new Stream(null, 0);
746
- outStream.reserve(numGlyphs * 256);
747
- const isShortLoca = headData.indexToLocFormat === 0;
748
- const locaEntrySize = isShortLoca ? 2 : 4;
749
- const locaStream = new Stream(null, 0);
750
- locaStream.reserve((numGlyphs + 1) * locaEntrySize);
751
- if (isShortLoca) {
752
- locaStream.writeU16(0);
753
- } else {
754
- locaStream.writeU32(0);
755
- }
756
- for (let i = 0; i < numGlyphs; i++) {
757
- outStream.pos;
758
- outStream.reserve(outStream.pos + maxGlyphSize);
759
- decodeGlyph(streams, outStream);
760
- if (outStream.pos & 1) {
761
- outStream.writeU8(0);
762
- }
763
- if (isShortLoca) {
764
- locaStream.writeU16(outStream.pos >>> 1);
765
- } else {
766
- locaStream.writeU32(outStream.pos);
767
- }
768
- }
769
- glyf.buf = outStream.toUint8Array();
770
- glyf.bufSize = glyf.buf.length;
771
- loca.buf = locaStream.toUint8Array();
772
- loca.bufSize = loca.buf.length;
773
- }
774
- function parseHead(table) {
775
- const s = new Stream(table.buf, table.bufSize);
776
- s.seekAbsolute(50);
777
- return { indexToLocFormat: s.readS16() };
778
- }
779
- function parseMaxp(table) {
780
- const s = new Stream(table.buf, table.bufSize);
781
- const version = s.readU32();
782
- const numGlyphs = s.readU16();
783
- let maxPoints = 0;
784
- let maxContours = 0;
785
- let maxSizeOfInstructions = 0;
786
- let maxComponentElements = 0;
787
- if (version === 65536) {
788
- maxPoints = s.readU16();
789
- maxContours = s.readU16();
790
- s.readU16();
791
- s.readU16();
792
- s.readU16();
793
- s.readU16();
794
- s.readU16();
795
- s.readU16();
796
- s.readU16();
797
- s.readU16();
798
- maxSizeOfInstructions = s.readU16();
799
- maxComponentElements = s.readU16();
800
- }
801
- return {
802
- numGlyphs,
803
- maxPoints,
804
- maxContours,
805
- maxSizeOfInstructions,
806
- maxComponentElements
807
- };
808
- }
809
- function parseCTF(streams) {
810
- const s0 = streams[0];
811
- s0.readU32();
812
- const numTables = s0.readU16();
813
- s0.readU16();
814
- s0.readU16();
815
- s0.readU16();
816
- const tables = [];
817
- let glyfIdx = -1;
818
- let locaIdx = -1;
819
- let maxpIdx = -1;
820
- let headIdx = -1;
821
- for (let i = 0; i < numTables; i++) {
822
- const tag = s0.readChar() + s0.readChar() + s0.readChar() + s0.readChar();
823
- if (tag === "hdmx" || tag === "VDMX") {
824
- s0.seekRelative(12);
825
- continue;
826
- }
827
- s0.seekRelative(4);
828
- const offset = s0.readU32();
829
- const size = s0.readU32();
830
- const table = {
831
- tag,
832
- offset,
833
- bufSize: size,
834
- buf: new Uint8Array(0),
835
- checksum: 0
836
- };
837
- const idx = tables.length;
838
- tables.push(table);
839
- if (tag === "glyf") {
840
- glyfIdx = idx;
841
- } else if (tag === "loca") {
842
- locaIdx = idx;
843
- } else if (tag === "maxp") {
844
- maxpIdx = idx;
845
- } else if (tag === "head") {
846
- headIdx = idx;
847
- } else ;
848
- }
849
- for (let i = 0; i < tables.length; i++) {
850
- const table = tables[i];
851
- if (table.tag === "glyf" || table.tag === "loca") {
852
- continue;
853
- }
854
- if (table.tag === "cvt ") {
855
- unpackCVT(table, s0);
856
- continue;
857
- }
858
- s0.seekAbsolute(table.offset);
859
- const buf = new Uint8Array(table.bufSize);
860
- for (let b = 0; b < table.bufSize; b++) {
861
- buf[b] = s0.readU8();
862
- }
863
- table.buf = buf;
864
- if (table.tag === "head") {
865
- table.buf[8] = 0;
866
- table.buf[9] = 0;
867
- table.buf[10] = 0;
868
- table.buf[11] = 0;
869
- }
870
- }
871
- let headData = { indexToLocFormat: 0 };
872
- if (headIdx >= 0) {
873
- headData = parseHead(tables[headIdx]);
874
- }
875
- let maxpData = {
876
- numGlyphs: 0,
877
- maxPoints: 0,
878
- maxContours: 0,
879
- maxSizeOfInstructions: 0,
880
- maxComponentElements: 0
881
- };
882
- if (maxpIdx >= 0) {
883
- maxpData = parseMaxp(tables[maxpIdx]);
884
- }
885
- if (glyfIdx >= 0) {
886
- if (locaIdx < 0) {
887
- const locaTable = {
888
- tag: "loca",
889
- offset: 0,
890
- bufSize: 0,
891
- buf: new Uint8Array(0),
892
- checksum: 0
893
- };
894
- locaIdx = tables.length;
895
- tables.push(locaTable);
896
- }
897
- populateGlyfAndLoca(tables[glyfIdx], tables[locaIdx], headData, maxpData, streams);
898
- }
899
- return { tables };
900
- }
901
-
902
- // src/ahuff.ts
903
- function bitsUsed(x) {
904
- if (x <= 0) {
905
- return 0;
906
- }
907
- return 32 - Math.clz32(x);
908
- }
909
- var AHuff = class _AHuff {
910
- bio;
911
- range;
912
- tree;
913
- /** Maps symbol value -> current tree index of its leaf node. */
914
- symbolIndex;
915
- /** Number of bits that encode a "full-size" symbol (ceil(log2(range))). */
916
- bitCount;
917
- /**
918
- * Secondary bit width used for large-range trees.
919
- * 0 when range <= 256 (small tree path).
920
- */
921
- bitCount2;
922
- static ROOT = 1;
923
- constructor(bio, range) {
924
- this.bio = bio;
925
- this.range = range;
926
- this.bitCount = bitsUsed(range - 1);
927
- this.bitCount2 = 0;
928
- if (range > 256 && range < 512) {
929
- this.bitCount2 = bitsUsed(range - 256 - 1) + 1;
930
- }
931
- const treeSize = 2 * range;
932
- this.tree = Array.from({ length: treeSize });
933
- for (let i = 0; i < treeSize; i++) {
934
- this.tree[i] = { up: 0, left: 0, right: 0, code: -1, weight: 0 };
935
- }
936
- for (let i = 2; i < treeSize; i++) {
937
- this.tree[i].up = i >> 1;
938
- this.tree[i].weight = 1;
939
- }
940
- for (let i = 1; i < range; i++) {
941
- this.tree[i].left = 2 * i;
942
- this.tree[i].right = 2 * i + 1;
943
- this.tree[i].code = -1;
944
- }
945
- for (let i = 0; i < range; i++) {
946
- const leafIdx = range + i;
947
- this.tree[leafIdx].code = i;
948
- this.tree[leafIdx].left = -1;
949
- this.tree[leafIdx].right = -1;
950
- }
951
- this.symbolIndex = Array.from({ length: range });
952
- for (let i = 0; i < range; i++) {
953
- this.symbolIndex[i] = range + i;
954
- }
955
- this.initWeight(_AHuff.ROOT);
956
- if (this.bitCount2 !== 0) {
957
- this.updateWeight(this.symbolIndex[256]);
958
- this.updateWeight(this.symbolIndex[257]);
959
- const dup2Sym = range - 3;
960
- for (let i = 0; i < 12; i++) {
961
- this.updateWeight(this.symbolIndex[dup2Sym]);
962
- }
963
- const dup4Sym = range - 2;
964
- for (let i = 0; i < 6; i++) {
965
- this.updateWeight(this.symbolIndex[dup4Sym]);
966
- }
967
- } else {
968
- for (let j = 0; j < 2; j++) {
969
- for (let i = 0; i < range; i++) {
970
- this.updateWeight(this.symbolIndex[i]);
971
- }
972
- }
973
- }
974
- }
975
- // --------------------------------------------------------------------
976
- // Public API
977
- // --------------------------------------------------------------------
978
- /**
979
- * Decode one symbol from the bit stream.
980
- *
981
- * Starting at ROOT, read one bit at a time:
982
- * - 0 → go left
983
- * - 1 → go right
984
- * Continue until a leaf (code >= 0) is reached. Then update the
985
- * tree weights and return the symbol code.
986
- */
987
- readSymbol() {
988
- let a = _AHuff.ROOT;
989
- let symbol;
990
- do {
991
- a = this.bio.inputBit() ? this.tree[a].right : this.tree[a].left;
992
- symbol = this.tree[a].code;
993
- } while (symbol < 0);
994
- this.updateWeight(a);
995
- return symbol;
996
- }
997
- // --------------------------------------------------------------------
998
- // Private helpers
999
- // --------------------------------------------------------------------
1000
- /**
1001
- * Increment the weight of node `a` and propagate up to ROOT,
1002
- * swapping nodes as necessary to maintain the sibling property
1003
- * (nodes in non-increasing weight order by index).
1004
- *
1005
- * Algorithm:
1006
- * For each node from `a` up to (but not including) ROOT:
1007
- * 1. Look at the predecessor (a-1).
1008
- * 2. If it has the same weight, scan backwards to find the first
1009
- * node with that weight.
1010
- * 3. Swap `a` with that first node (unless it is ROOT or `a`'s
1011
- * own parent) to restore ordering.
1012
- * 4. Increment `a`'s weight.
1013
- * 5. Move to `a`'s parent.
1014
- * Finally increment ROOT's weight.
1015
- */
1016
- updateWeight(a) {
1017
- const tree = this.tree;
1018
- for (; a !== _AHuff.ROOT; a = tree[a].up) {
1019
- const weightA = tree[a].weight;
1020
- let b = a - 1;
1021
- if (tree[b].weight === weightA) {
1022
- do {
1023
- b--;
1024
- } while (tree[b].weight === weightA);
1025
- b++;
1026
- if (b > _AHuff.ROOT) {
1027
- this.swapNodes(a, b);
1028
- a = b;
1029
- }
1030
- }
1031
- tree[a].weight = weightA + 1;
1032
- }
1033
- tree[_AHuff.ROOT].weight++;
1034
- }
1035
- /**
1036
- * Swap two nodes in the tree while keeping the parent linkage
1037
- * consistent.
1038
- *
1039
- * What gets swapped: left, right, code, weight — everything that
1040
- * defines the *content* of the node. The `up` pointer stays with
1041
- * the position (the parent still points here).
1042
- *
1043
- * After the content swap we must:
1044
- * 1. Fix children's `up` pointers (they now live under the other
1045
- * position).
1046
- * 2. Fix `symbolIndex` for leaves so we can still find them by
1047
- * symbol value.
1048
- */
1049
- swapNodes(a, b) {
1050
- const tree = this.tree;
1051
- const upa = tree[a].up;
1052
- const upb = tree[b].up;
1053
- const tmp = tree[a];
1054
- tree[a] = tree[b];
1055
- tree[b] = tmp;
1056
- tree[a].up = upa;
1057
- tree[b].up = upb;
1058
- let code = tree[a].code;
1059
- if (code < 0) {
1060
- tree[tree[a].left].up = a;
1061
- tree[tree[a].right].up = a;
1062
- } else {
1063
- this.symbolIndex[code] = a;
1064
- }
1065
- code = tree[b].code;
1066
- if (code < 0) {
1067
- tree[tree[b].left].up = b;
1068
- tree[tree[b].right].up = b;
1069
- } else {
1070
- this.symbolIndex[code] = b;
1071
- }
1072
- }
1073
- /**
1074
- * Recursively compute weights for internal nodes after the initial
1075
- * tree construction. Leaf weights are already set to 1.
1076
- *
1077
- * weight(internal) = weight(left) + weight(right)
1078
- */
1079
- initWeight(a) {
1080
- const node = this.tree[a];
1081
- if (node.code >= 0) {
1082
- return node.weight;
1083
- }
1084
- node.weight = this.initWeight(node.left) + this.initWeight(node.right);
1085
- return node.weight;
1086
- }
1087
- };
1088
-
1089
- // src/bitio.ts
1090
- var BitIO = class {
1091
- data;
1092
- index;
1093
- size;
1094
- bitBuffer = 0;
1095
- bitCount = 0;
1096
- /**
1097
- * @param data Source byte buffer.
1098
- * @param offset Starting byte offset into `data`.
1099
- * @param size Number of bytes available from `offset`.
1100
- */
1101
- constructor(data, offset = 0, size) {
1102
- this.data = data;
1103
- this.index = offset;
1104
- this.size = size ?? data.length;
1105
- }
1106
- /**
1107
- * Read a single bit from the stream.
1108
- *
1109
- * Mirrors `MTX_BITIO_input_bit`:
1110
- * - If `bitCount` has reached 0, load the next byte into `bitBuffer`
1111
- * and reset `bitCount` to 7.
1112
- * - Shift `bitBuffer` left by 1.
1113
- * - Return whether bit 8 (0x100) is set (i.e. the MSB that was
1114
- * shifted out of the original byte value).
1115
- */
1116
- inputBit() {
1117
- if (this.bitCount-- === 0) {
1118
- if (this.index >= this.size) {
1119
- throw new Error("BitIO: end of data");
1120
- }
1121
- this.bitBuffer = this.data[this.index++];
1122
- this.bitCount = 7;
1123
- }
1124
- this.bitBuffer <<= 1;
1125
- return (this.bitBuffer & 256) !== 0;
1126
- }
1127
- /**
1128
- * Read an unsigned integer of `numberOfBits` width, MSB first.
1129
- *
1130
- * Mirrors `MTX_BITIO_ReadValue`: accumulates bits from the most
1131
- * significant down to the least significant.
1132
- */
1133
- readValue(numberOfBits) {
1134
- let value = 0;
1135
- for (let i = numberOfBits - 1; i >= 0; i--) {
1136
- value <<= 1;
1137
- if (this.inputBit()) {
1138
- value |= 1;
1139
- }
1140
- }
1141
- return value;
1142
- }
1143
- };
1144
-
1145
- // src/lzcomp.ts
1146
- var LEN_WIDTH = 3;
1147
- var DIST_WIDTH = 3;
1148
- var BIT_RANGE = LEN_WIDTH - 1;
1149
- var MAX_2BYTE_DIST = 512;
1150
- var PRELOAD_SIZE = 2 * 32 * 96 + 4 * 256;
1151
- var LEN_MIN = 2;
1152
- var DIST_MIN = 1;
1153
- var MAX_OUT_LEN = 4 * 1024 * 1024;
1154
- var MAX_OUT = 16 * 1024 * 1024;
1155
- var RLE_INITIAL = 0;
1156
- var RLE_NORMAL = 1;
1157
- var RLE_SEEN_ESCAPE = 2;
1158
- var RLE_NEED_BYTE = 3;
1159
- function setDistRange(length) {
1160
- let numDistRanges = 1;
1161
- let distMax = DIST_MIN + ((1 << DIST_WIDTH * numDistRanges) - 1);
1162
- while (distMax < length) {
1163
- numDistRanges++;
1164
- if (numDistRanges > 8) {
1165
- throw new Error("LZCOMP setDistRange: numDistRanges exceeds bound (8)");
1166
- }
1167
- distMax = DIST_MIN + ((1 << DIST_WIDTH * numDistRanges) - 1);
1168
- }
1169
- const DUP2 = 256 + (1 << LEN_WIDTH) * numDistRanges;
1170
- const DUP4 = DUP2 + 1;
1171
- const DUP6 = DUP4 + 1;
1172
- const NUM_SYMS = DUP6 + 1;
1173
- return { numDistRanges, distMax, DUP2, DUP4, DUP6, NUM_SYMS };
1174
- }
1175
- function initializeModel(window) {
1176
- let i = 0;
1177
- for (let k = 0; k < 32; k++) {
1178
- for (let j2 = 0; j2 < 96; j2++) {
1179
- window[i++] = k;
1180
- window[i++] = j2;
1181
- }
1182
- }
1183
- let j = 0;
1184
- while (i < PRELOAD_SIZE && j < 256) {
1185
- window[i++] = j;
1186
- window[i++] = j;
1187
- window[i++] = j;
1188
- window[i++] = j;
1189
- j++;
1190
- }
1191
- }
1192
- function decodeLength(lenEcoder, symbol, numDistRangesOut) {
1193
- const mask = 1 << BIT_RANGE;
1194
- let firstTime = true;
1195
- let value = 0;
1196
- let done;
1197
- let iters = 0;
1198
- do {
1199
- if (++iters > 16) {
1200
- throw new Error("LZCOMP decodeLength: iteration cap exceeded");
1201
- }
1202
- let bits;
1203
- if (firstTime) {
1204
- bits = symbol - 256;
1205
- firstTime = false;
1206
- numDistRangesOut[0] = Math.floor(bits / (1 << LEN_WIDTH)) + 1;
1207
- bits %= 1 << LEN_WIDTH;
1208
- } else {
1209
- bits = lenEcoder.readSymbol();
1210
- }
1211
- done = (bits & mask) === 0;
1212
- bits &= ~mask;
1213
- value <<= BIT_RANGE;
1214
- value |= bits;
1215
- } while (!done);
1216
- value += LEN_MIN;
1217
- return value;
1218
- }
1219
- function decodeDistance(distEcoder, numDistRanges) {
1220
- let value = 0;
1221
- for (let i = numDistRanges; i > 0; i--) {
1222
- const bits = distEcoder.readSymbol();
1223
- value <<= DIST_WIDTH;
1224
- value |= bits;
1225
- }
1226
- value += DIST_MIN;
1227
- return value;
1228
- }
1229
- function lzcompDecompress(data, size, version) {
1230
- const bio = new BitIO(data, 0, size);
1231
- let usingRunLength;
1232
- if (version === 1) {
1233
- usingRunLength = false;
1234
- } else {
1235
- usingRunLength = bio.inputBit();
1236
- }
1237
- const distEcoder = new AHuff(bio, 1 << DIST_WIDTH);
1238
- const lenEcoder = new AHuff(bio, 1 << LEN_WIDTH);
1239
- const outLen = bio.readValue(24);
1240
- if (outLen > MAX_OUT_LEN) {
1241
- throw new Error(`LZCOMP outLen ${outLen} exceeds maximum (${MAX_OUT_LEN})`);
1242
- }
1243
- const { DUP2, DUP4, DUP6, NUM_SYMS } = setDistRange(outLen);
1244
- const symEcoder = new AHuff(bio, NUM_SYMS);
1245
- const windowSize = PRELOAD_SIZE + outLen;
1246
- const win = new Uint8Array(windowSize);
1247
- initializeModel(win);
1248
- const base = PRELOAD_SIZE;
1249
- let outBufSize = outLen;
1250
- let outBuf = new Uint8Array(outBufSize);
1251
- let outIdx = 0;
1252
- let rleState = RLE_INITIAL;
1253
- let rleEscape = 0;
1254
- let rleCount = 0;
1255
- const emitByte = (byte) => {
1256
- if (!usingRunLength) {
1257
- if (outIdx >= outBufSize) {
1258
- outBufSize += outBufSize >>> 1;
1259
- if (outBufSize > MAX_OUT) {
1260
- throw new Error("LZCOMP output exceeds maximum size budget");
1261
- }
1262
- const tmp = new Uint8Array(outBufSize);
1263
- tmp.set(outBuf);
1264
- outBuf = tmp;
1265
- }
1266
- outBuf[outIdx++] = byte;
1267
- return;
1268
- }
1269
- switch (rleState) {
1270
- case RLE_INITIAL:
1271
- rleEscape = byte;
1272
- rleState = RLE_NORMAL;
1273
- break;
1274
- case RLE_NORMAL:
1275
- if (byte === rleEscape) {
1276
- rleState = RLE_SEEN_ESCAPE;
1277
- } else {
1278
- if (outIdx >= outBufSize) {
1279
- outBufSize += outBufSize >>> 1;
1280
- if (outBufSize > MAX_OUT) {
1281
- throw new Error("LZCOMP output exceeds maximum size budget");
1282
- }
1283
- const tmp = new Uint8Array(outBufSize);
1284
- tmp.set(outBuf);
1285
- outBuf = tmp;
1286
- }
1287
- outBuf[outIdx++] = byte;
1288
- }
1289
- break;
1290
- case RLE_SEEN_ESCAPE:
1291
- rleCount = byte;
1292
- if (rleCount === 0) {
1293
- if (outIdx >= outBufSize) {
1294
- outBufSize += outBufSize >>> 1;
1295
- if (outBufSize > MAX_OUT) {
1296
- throw new Error("LZCOMP output exceeds maximum size budget");
1297
- }
1298
- const tmp = new Uint8Array(outBufSize);
1299
- tmp.set(outBuf);
1300
- outBuf = tmp;
1301
- }
1302
- outBuf[outIdx++] = rleEscape;
1303
- rleState = RLE_NORMAL;
1304
- } else {
1305
- rleState = RLE_NEED_BYTE;
1306
- }
1307
- break;
1308
- case RLE_NEED_BYTE: {
1309
- if (outIdx + rleCount > outBufSize) {
1310
- outBufSize = outIdx + rleCount + (outBufSize >>> 1);
1311
- if (outBufSize > MAX_OUT) {
1312
- throw new Error("LZCOMP output exceeds maximum size budget");
1313
- }
1314
- const tmp = new Uint8Array(outBufSize);
1315
- tmp.set(outBuf);
1316
- outBuf = tmp;
1317
- }
1318
- for (let i = 0; i < rleCount; i++) {
1319
- outBuf[outIdx++] = byte;
1320
- }
1321
- rleState = RLE_NORMAL;
1322
- break;
1323
- }
1324
- }
1325
- };
1326
- for (let pos = 0; pos < outLen; ) {
1327
- const symbol = symEcoder.readSymbol();
1328
- let value;
1329
- if (symbol < 256) {
1330
- value = symbol;
1331
- } else if (symbol === DUP2) {
1332
- value = win[base + pos - 2];
1333
- } else if (symbol === DUP4) {
1334
- value = win[base + pos - 4];
1335
- } else if (symbol === DUP6) {
1336
- value = win[base + pos - 6];
1337
- } else {
1338
- const numDistRangesRef = [0];
1339
- let length = decodeLength(lenEcoder, symbol, numDistRangesRef);
1340
- const distance = decodeDistance(distEcoder, numDistRangesRef[0]);
1341
- if (distance >= MAX_2BYTE_DIST) {
1342
- length++;
1343
- }
1344
- const start = base + pos - distance - length + 1;
1345
- for (let j = 0; j < length; j++) {
1346
- value = win[start + j];
1347
- win[base + pos] = value;
1348
- pos++;
1349
- emitByte(value);
1350
- }
1351
- continue;
1352
- }
1353
- win[base + pos] = value;
1354
- pos++;
1355
- emitByte(value);
1356
- }
1357
- return outBuf.subarray(0, outIdx);
1358
- }
1359
-
1360
- // src/sfnt-builder.ts
1361
- function lgFloor(n) {
1362
- let ret = 0;
1363
- while (n > 1) {
1364
- n = Math.floor(n / 2);
1365
- ret++;
1366
- }
1367
- return ret;
1368
- }
1369
- function maxPow2(n) {
1370
- return 1 << lgFloor(n);
1371
- }
1372
- function writeOffsetTable(ctr, out) {
1373
- const numTables = ctr.tables.length;
1374
- const searchRange = maxPow2(numTables) * 16;
1375
- const entrySelector = lgFloor(numTables);
1376
- const rangeShift = numTables * 16 - searchRange;
1377
- out.writeU32(65536);
1378
- out.writeU16(numTables);
1379
- out.writeU16(searchRange);
1380
- out.writeU16(entrySelector);
1381
- out.writeU16(rangeShift);
1382
- }
1383
- function writeTableDirectory(ctr, out) {
1384
- for (const table of ctr.tables) {
1385
- out.writeU8(table.tag.charCodeAt(0));
1386
- out.writeU8(table.tag.charCodeAt(1));
1387
- out.writeU8(table.tag.charCodeAt(2));
1388
- out.writeU8(table.tag.charCodeAt(3));
1389
- out.writeU32(table.checksum);
1390
- out.writeU32(table.offset);
1391
- out.writeU32(table.bufSize);
1392
- }
1393
- }
1394
- function writeTableCheckingSum(table, out) {
1395
- table.offset = out.pos;
1396
- let checksum = 0;
1397
- const data = table.buf;
1398
- const len = table.bufSize;
1399
- const fullWords = Math.floor(len / 4);
1400
- const remainder = len % 4;
1401
- for (let i = 0; i < fullWords; i++) {
1402
- const off = i * 4;
1403
- const word = (data[off] << 24 | data[off + 1] << 16 | data[off + 2] << 8 | data[off + 3]) >>> 0;
1404
- checksum = checksum + word >>> 0;
1405
- out.writeU32(word);
1406
- }
1407
- if (remainder > 0) {
1408
- let word = 0;
1409
- for (let j = 0; j < remainder; j++) {
1410
- word |= data[fullWords * 4 + j] << 24 - j * 8;
1411
- }
1412
- word >>>= 0;
1413
- checksum = checksum + word >>> 0;
1414
- out.writeU32(word);
1415
- }
1416
- table.checksum = checksum;
1417
- }
1418
- function getTableDirectorySize(ctr) {
1419
- return 16 * ctr.tables.length;
1420
- }
1421
- function getRequiredSize(ctr) {
1422
- const offsetTableSize = 12;
1423
- const dirSize = getTableDirectorySize(ctr);
1424
- let tableDataSize = 0;
1425
- for (const table of ctr.tables) {
1426
- tableDataSize += Math.ceil(table.bufSize / 4) * 4;
1427
- }
1428
- return offsetTableSize + dirSize + tableDataSize;
1429
- }
1430
- function dumpContainer(ctr) {
1431
- const requiredSize = getRequiredSize(ctr);
1432
- const out = new Stream(new Uint8Array(requiredSize), 0);
1433
- writeOffsetTable(ctr, out);
1434
- const dirOffset = out.pos;
1435
- const dirSize = getTableDirectorySize(ctr);
1436
- out.pos += dirSize;
1437
- let totalChecksum = 0;
1438
- for (const table of ctr.tables) {
1439
- writeTableCheckingSum(table, out);
1440
- totalChecksum = totalChecksum + table.checksum >>> 0;
1441
- }
1442
- let headTable;
1443
- for (const table of ctr.tables) {
1444
- if (table.tag === "head") {
1445
- headTable = table;
1446
- break;
1447
- }
1448
- }
1449
- const afterTables = out.pos;
1450
- out.pos = dirOffset;
1451
- writeTableDirectory(ctr, out);
1452
- const beginningLen = 12 + dirSize;
1453
- let beginningChecksum = 0;
1454
- const buf = out.buf;
1455
- const beginningWords = Math.floor(beginningLen / 4);
1456
- for (let i = 0; i < beginningWords; i++) {
1457
- const off = i * 4;
1458
- const word = (buf[off] << 24 | buf[off + 1] << 16 | buf[off + 2] << 8 | buf[off + 3]) >>> 0;
1459
- beginningChecksum = beginningChecksum + word >>> 0;
1460
- }
1461
- totalChecksum = totalChecksum + beginningChecksum >>> 0;
1462
- const finalChecksum = 2981146554 - totalChecksum >>> 0;
1463
- if (headTable) {
1464
- const adjOffset = headTable.offset + 8;
1465
- buf[adjOffset] = finalChecksum >>> 24 & 255;
1466
- buf[adjOffset + 1] = finalChecksum >>> 16 & 255;
1467
- buf[adjOffset + 2] = finalChecksum >>> 8 & 255;
1468
- buf[adjOffset + 3] = finalChecksum & 255;
1469
- }
1470
- out.pos = afterTables;
1471
- return out.buf.subarray(0, out.pos);
1472
- }
1473
-
1474
- // src/mtx-decompress.ts
1475
- var ENCRYPTION_KEY = 80;
1476
- function unpackMtx(data, size) {
1477
- if (size < 10 || data.length < 10) {
1478
- throw new Error("MTX data too small: header requires at least 10 bytes");
1479
- }
1480
- const versionMagic = data[0];
1481
- const offset2 = data[4] << 16 | data[5] << 8 | data[6];
1482
- const offset3 = data[7] << 16 | data[8] << 8 | data[9];
1483
- if (offset2 < 10 || offset3 < offset2 || offset3 > size) {
1484
- throw new Error(
1485
- `MTX header offsets out of bounds: offset2=${offset2}, offset3=${offset3}, size=${size}`
1486
- );
1487
- }
1488
- const offsets = [10, offset2, offset3];
1489
- const blockSizes = [
1490
- Math.max(0, offset2 - 10),
1491
- Math.max(0, offset3 - offset2),
1492
- Math.max(0, size - offset3)
1493
- ];
1494
- const streams = [];
1495
- const decompressedSizes = [];
1496
- for (let i = 0; i < 3; i++) {
1497
- const block = data.subarray(offsets[i]);
1498
- const decompressed = lzcompDecompress(block, blockSizes[i], versionMagic);
1499
- streams.push(decompressed);
1500
- decompressedSizes.push(decompressed.length);
1501
- }
1502
- return { streams, sizes: decompressedSizes };
1503
- }
1504
- function decompressMtx(fontData, options) {
1505
- const encrypted = options?.encrypted ?? false;
1506
- const compressed = options?.compressed ?? true;
1507
- let data;
1508
- if (encrypted) {
1509
- data = new Uint8Array(fontData.length);
1510
- for (let i = 0; i < fontData.length; i++) {
1511
- data[i] = fontData[i] ^ ENCRYPTION_KEY;
1512
- }
1513
- } else {
1514
- data = fontData;
1515
- }
1516
- if (!compressed) {
1517
- return data;
1518
- }
1519
- const { streams } = unpackMtx(data, data.length);
1520
- const streamObjects = streams.map((buf) => new Stream(buf, buf.length));
1521
- const container = parseCTF(streamObjects);
1522
- return dumpContainer(container);
1523
- }
1524
- function decompressEotFont(fontData, compressed, encrypted) {
1525
- return decompressMtx(fontData, { encrypted, compressed });
1526
- }
1527
-
1528
- export { decompressEotFont, decompressMtx, unpackMtx };