@web-ppt/fonts 0.8.0-beta.3 → 0.9.0-beta.1

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.
@@ -0,0 +1,796 @@
1
+ import { n as e, r as t, t as n } from "./fault-Wg7mCzGf.js";
2
+ // src/glyphs/permissions.ts
3
+ function r(e, t) {
4
+ if (!t) return e;
5
+ let n = [
6
+ "installable",
7
+ "editable",
8
+ "view-print",
9
+ "restricted"
10
+ ];
11
+ if (!n.includes(t.usage) || typeof t.subsetAllowed != "boolean" || typeof t.outlineAllowed != "boolean") throw Error("invalid-font");
12
+ return {
13
+ usage: n[Math.max(n.indexOf(e.usage), n.indexOf(t.usage))],
14
+ subsetAllowed: e.subsetAllowed && t.subsetAllowed,
15
+ outlineAllowed: e.outlineAllowed && t.outlineAllowed
16
+ };
17
+ }
18
+ function i(e, t) {
19
+ let n = e & 15;
20
+ if (t > 5 || n & 1 || t >= 3 && ![
21
+ 0,
22
+ 2,
23
+ 4,
24
+ 8
25
+ ].includes(n) || t >= 2 && e & 64752) throw Error("invalid-font");
26
+ return {
27
+ usage: n & 8 ? "editable" : n & 4 ? "view-print" : n & 2 ? "restricted" : "installable",
28
+ subsetAllowed: t < 2 || !(e & 256),
29
+ outlineAllowed: t < 2 || !(e & 512)
30
+ };
31
+ }
32
+ function a(e, t) {
33
+ if (!e.outlineAllowed) return "bitmap-only";
34
+ if (e.usage === "restricted") return "embedding-restricted";
35
+ if (e.usage === "view-print" && t !== "view-print") return "preview-print-only";
36
+ }
37
+ // src/glyphs/sfnt.ts
38
+ function o(r) {
39
+ let a = new DataView(r.buffer, r.byteOffset, r.byteLength), o = e;
40
+ r.length < 4 && o();
41
+ let s = a.getUint32(0);
42
+ if ([2001684038, 2001684018].includes(s)) throw new n("needs-container-decoder");
43
+ if (s === 1953784678) throw new n("collection-not-supported");
44
+ (r.length < 12 || ![
45
+ 65536,
46
+ 1953658213,
47
+ 1330926671
48
+ ].includes(s)) && o();
49
+ let c = a.getUint16(4), l = 12 + c * 16;
50
+ (!c || c > 256 || l > r.length) && o();
51
+ let u = /* @__PURE__ */ new Map();
52
+ for (let e = 0; e < c; e++) {
53
+ let t = 12 + e * 16, n = String.fromCharCode(...r.subarray(t, t + 4)), i = a.getUint32(t + 8), s = a.getUint32(t + 12);
54
+ (u.has(n) || i < l || i % 4 || i + s > r.length) && o(), u.set(n, {
55
+ offset: i,
56
+ length: s
57
+ });
58
+ }
59
+ let d = [...u.values()].filter((e) => e.length).sort((e, t) => e.offset - t.offset);
60
+ d.some((e, t) => t > 0 && d[t - 1].offset + d[t - 1].length > e.offset) && o();
61
+ let f = (e, t) => {
62
+ let n = u.get(e);
63
+ return !n || n.length < t ? o() : n.offset;
64
+ };
65
+ if (u.has("fvar")) throw new n("variable-not-supported");
66
+ if (u.has("CFF ") || u.has("CFF2")) throw new n("cff-not-supported");
67
+ if ([
68
+ "COLR",
69
+ "CPAL",
70
+ "CBDT",
71
+ "CBLC",
72
+ "sbix",
73
+ "SVG "
74
+ ].some((e) => u.has(e))) throw new n("color-font-not-supported");
75
+ s === 1330926671 && o(), f("glyf", 0), f("loca", 4), f("cmap", 4), f("hmtx", 4);
76
+ let p = f("head", 54), m = f("OS/2", 78), h = f("maxp", 32), g = a.getUint16(m);
77
+ f("OS/2", g === 0 ? 78 : g === 1 ? 86 : g < 5 ? 96 : 100), f("hhea", 36);
78
+ let _ = a.getUint16(p + 18), v = a.getUint16(h + 4), y = a.getUint16(m + 4), b = a.getUint16(m + 8);
79
+ (a.getUint32(p + 12) !== 1594834165 || _ < 16 || _ > 16384 || !v || y < 1 || y > 1e3 || a.getUint32(h) !== 65536) && o();
80
+ let x = f("name", 6), S = u.get("name").length, C = a.getUint16(x + 2), w = a.getUint16(x + 4);
81
+ (6 + C * 12 > S || w < 6 + C * 12 || w > S) && o(), C > 1024 && t();
82
+ let T = [], E = 65536;
83
+ for (let e = 0; e < C; e++) {
84
+ let n = x + 6 + e * 12, i = a.getUint16(n), s = a.getUint16(n + 4), c = a.getUint16(n + 6), l = a.getUint16(n + 8), u = w + a.getUint16(n + 10);
85
+ if (u + l > S && o(), c !== 16 && c !== 1 || ![0, 3].includes(i) || l % 2 || l > 512) continue;
86
+ E -= l, E < 0 && t();
87
+ let d = new TextDecoder("utf-16be", { fatal: !0 }).decode(r.subarray(x + u, x + u + l)).trim();
88
+ d && d.length <= 256 && !/[\u0000-\u001f\u007f]/.test(d) && T.push({
89
+ value: d,
90
+ rank: (c === 16 ? 10 : 0) + (s === 1033 ? 2 : 0)
91
+ });
92
+ }
93
+ let D = T.sort((e, t) => t.rank - e.rank)[0]?.value;
94
+ return D || o(), {
95
+ tables: u,
96
+ info: {
97
+ sourceFamily: D,
98
+ weight: y,
99
+ italic: !!(a.getUint16(m + 62) & 1),
100
+ format: "ttf-glyf",
101
+ unitsPerEm: _,
102
+ glyphCount: v,
103
+ bbox: [
104
+ 36,
105
+ 38,
106
+ 40,
107
+ 42
108
+ ].map((e) => a.getInt16(p + e)),
109
+ fsType: b,
110
+ os2Version: a.getUint16(m),
111
+ embedding: i(b, a.getUint16(m)),
112
+ byteLength: r.length
113
+ }
114
+ };
115
+ }
116
+ // src/glyphs/glyph-data.ts
117
+ async function s(n, r, i, a) {
118
+ let o = i.length - 1, s = Array.from({ length: o }, () => []);
119
+ for (let c = 0; c < o; c++) {
120
+ let l = a();
121
+ l && await l;
122
+ let u = r + i[c], d = r + i[c + 1];
123
+ if (u === d) continue;
124
+ let f = u + 10, p = (t) => {
125
+ f + t > d && e();
126
+ }, m = () => {
127
+ p(2);
128
+ let e = n.getUint16(f);
129
+ return f += 2, e;
130
+ }, h = () => (p(1), n.getUint8(f++)), g = n.getInt16(u);
131
+ if ((n.getInt16(u + 2) > n.getInt16(u + 6) || n.getInt16(u + 4) > n.getInt16(u + 8)) && e(), g >= 0) {
132
+ let t = -1;
133
+ for (let n = 0; n < g; n++) {
134
+ let n = m();
135
+ n <= t && e(), t = n;
136
+ }
137
+ if (!g && f === d) continue;
138
+ let n = m();
139
+ p(n), f += n;
140
+ let r = t + 1, i = 0;
141
+ for (let t = 0; t < r;) {
142
+ let n = h(), a = n & 8 ? h() + 1 : 1;
143
+ (n & 128 || t + a > r) && e(), i += a * ((n & 2 ? 1 : n & 16 ? 0 : 2) + (n & 4 ? 1 : n & 32 ? 0 : 2)), t += a;
144
+ }
145
+ p(i);
146
+ } else {
147
+ let n = !0, r = !1;
148
+ for (; n;) {
149
+ let i = m(), a = m();
150
+ (a >= o || i & 57360 || (i & 6144) == 6144 || !s[c].length && !(i & 2)) && e(), [
151
+ 8,
152
+ 64,
153
+ 128
154
+ ].filter((e) => i & e).length > 1 && e();
155
+ let l = (i & 1 ? 4 : 2) + (i & 8 ? 2 : i & 64 ? 4 : i & 128 ? 8 : 0);
156
+ p(l), f += l, s[c].push(a), s[c].length > 4096 && t(), r ||= !!(i & 256), n = !!(i & 32);
157
+ }
158
+ r && p(m());
159
+ }
160
+ }
161
+ let c = new Uint8Array(o), l = new Uint8Array(o), u = new Uint32Array(o), d = (n, r) => {
162
+ if (c[n] === 1 && e(), r > 32 && t(), c[n] === 2) return;
163
+ c[n] = 1;
164
+ let i = 0, a = 1;
165
+ for (let e of s[n]) d(e, r + 1), i = Math.max(i, l[e] + 1), a += u[e], (i > 32 || a > 16384) && t();
166
+ l[n] = i, u[n] = a, c[n] = 2;
167
+ };
168
+ for (let e = 0; e < o; e++) {
169
+ let t = a();
170
+ t && await t, d(e, 0);
171
+ }
172
+ }
173
+ // src/glyphs/validate-glyphs.ts
174
+ async function c(e, t, n) {
175
+ let r = new DataView(e.buffer, e.byteOffset, e.byteLength), { tables: i, info: a } = t, o = i.get("head"), c = i.get("loca"), l = i.get("glyf"), u = i.get("hhea"), d = i.get("hmtx"), f = r.getInt16(o.offset + 50), p = f === 0 ? 2 : 4, m = r.getUint16(u.offset + 34);
176
+ if (![0, 1].includes(f) || c.length < (a.glyphCount + 1) * p || !m || m > a.glyphCount || d.length < m * 4 + (a.glyphCount - m) * 2) throw Error("invalid-font");
177
+ let h = 0, g = new Uint32Array(a.glyphCount + 1);
178
+ for (let e = 0; e <= a.glyphCount; e++) {
179
+ let t = p === 2 ? r.getUint16(c.offset + e * 2) * 2 : r.getUint32(c.offset + e * 4);
180
+ if (t < h || t > l.length || e > 0 && t !== h && t - h < 10) throw Error("invalid-font");
181
+ h = g[e] = t;
182
+ }
183
+ await s(r, l.offset, g, n);
184
+ }
185
+ // src/glyphs/validate-cmap.ts
186
+ async function l(r, i, a) {
187
+ let o = i.tables.get("cmap"), s = new DataView(r.buffer, r.byteOffset + o.offset, o.length), c = s.getUint16(2), l = 4 + c * 8;
188
+ (s.getUint16(0) || !c || l > s.byteLength) && e(), c > 256 && t();
189
+ let u = !1, d = 2e6, f = /* @__PURE__ */ new Set(), p = (t) => {
190
+ t >= i.info.glyphCount && e();
191
+ }, m = (e) => {
192
+ d -= e, d < 0 && t();
193
+ };
194
+ for (let t = 0; t < c; t++) {
195
+ let i = a();
196
+ i && await i;
197
+ let c = 4 + t * 8, d = s.getUint16(c), h = s.getUint16(c + 2), g = s.getUint32(c + 4);
198
+ (g < l || g + 6 > s.byteLength) && e();
199
+ let _ = s.getUint16(g);
200
+ if ((d === 0 && h !== 5 || d === 3 && [1, 10].includes(h)) && [
201
+ 4,
202
+ 6,
203
+ 10,
204
+ 12,
205
+ 13
206
+ ].includes(_) && (u = !0), ![
207
+ 0,
208
+ 4,
209
+ 6,
210
+ 10,
211
+ 12,
212
+ 13,
213
+ 14
214
+ ].includes(_)) throw new n("cmap-not-supported");
215
+ _ >= 10 && _ !== 14 && g + 12 > s.byteLength && e();
216
+ let v = _ === 14 ? s.getUint32(g + 2) : _ >= 10 ? s.getUint32(g + 4) : s.getUint16(g + 2);
217
+ (v < 6 || g + v > s.byteLength) && e();
218
+ let y = new DataView(r.buffer, r.byteOffset + o.offset + g, v), b = (t, n) => {
219
+ (t < 0 || t + n > v) && e();
220
+ };
221
+ if (d !== 1 && _ !== 14 && (_ >= 10 ? y.getUint32(8) : y.getUint16(4)) && e(), !f.has(g)) {
222
+ if (f.add(g), _ === 0) {
223
+ b(6, 256), m(256);
224
+ for (let e = 0; e < 256; e++) p(y.getUint8(6 + e));
225
+ } else if (_ === 4) {
226
+ b(0, 16);
227
+ let t = y.getUint16(6), n = t / 2, r = 16 + n * 8;
228
+ (!t || t % 2) && e(), b(0, r), y.getUint16(14 + n * 2) && e();
229
+ let i = -1;
230
+ for (let t = 0; t < n; t++) {
231
+ let o = a();
232
+ o && await o;
233
+ let s = y.getUint16(14 + t * 2), c = y.getUint16(16 + n * 2 + t * 2), l = y.getInt16(16 + n * 4 + t * 2), u = 16 + n * 6 + t * 2, d = y.getUint16(u);
234
+ (c > s || c <= i || d % 2 || t === n - 1 && (c !== 65535 || s !== 65535)) && e(), i = s, m(s - c + 1), d && u + d < r && e(), d && b(u + d, (s - c + 1) * 2);
235
+ for (let e = c; e <= s; e++) {
236
+ let t = d ? y.getUint16(u + d + (e - c) * 2) : e;
237
+ p(d && !t ? 0 : t + l & 65535);
238
+ }
239
+ }
240
+ } else if (_ === 6 || _ === 10) {
241
+ let t = _ === 10, n = t ? 20 : 10;
242
+ b(0, n);
243
+ let r = t ? y.getUint32(12) : y.getUint16(6), i = t ? y.getUint32(16) : y.getUint16(8);
244
+ (r + i > (t ? 1114112 : 65536) || t && y.getUint16(2)) && e(), b(n, i * 2), m(i);
245
+ for (let e = 0; e < i; e++) {
246
+ if (e % 256 == 0) {
247
+ let e = a();
248
+ e && await e;
249
+ }
250
+ p(y.getUint16(n + e * 2));
251
+ }
252
+ } else if (_ === 12 || _ === 13) {
253
+ b(0, 16);
254
+ let t = y.getUint32(12);
255
+ y.getUint16(2) && e(), b(16, t * 12), m(t);
256
+ let n = -1;
257
+ for (let r = 0; r < t; r++) {
258
+ if (r % 256 == 0) {
259
+ let e = a();
260
+ e && await e;
261
+ }
262
+ let t = 16 + r * 12, i = y.getUint32(t), o = y.getUint32(t + 4), s = y.getUint32(t + 8);
263
+ (i > o || i <= n || o > 1114111) && e(), p(s), p(s + (_ === 12 ? o - i : 0)), n = o;
264
+ }
265
+ } else {
266
+ b(0, 10);
267
+ let t = y.getUint32(6), n = 10 + t * 11;
268
+ b(0, n), m(t);
269
+ let r = (e) => y.getUint16(e) * 256 + y.getUint8(e + 2), i = -1;
270
+ for (let o = 0; o < t; o++) {
271
+ let t = a();
272
+ t && await t;
273
+ let s = 10 + o * 11, c = r(s);
274
+ (c <= i || !(c >= 65024 && c <= 65039 || c >= 917760 && c <= 917999)) && e(), i = c;
275
+ for (let t of [0, 1]) {
276
+ let i = y.getUint32(s + 3 + t * 4);
277
+ if (!i) continue;
278
+ i < n && e(), b(i, 4);
279
+ let o = y.getUint32(i), c = t ? 5 : 4;
280
+ b(i + 4, o * c), m(o);
281
+ let l = -1;
282
+ for (let n = 0; n < o; n++) {
283
+ if (n % 256 == 0) {
284
+ let e = a();
285
+ e && await e;
286
+ }
287
+ let o = i + 4 + n * c, s = r(o), u = s + (t ? 0 : y.getUint8(o + 3));
288
+ (s <= l || u > 1114111 || s <= 57343 && u >= 55296) && e(), t && p(y.getUint16(o + 3)), l = u;
289
+ }
290
+ }
291
+ }
292
+ }
293
+ }
294
+ }
295
+ if (!u) throw new n("cmap-not-supported");
296
+ }
297
+ // src/glyphs/text-scripts.ts
298
+ function u(e, t) {
299
+ let r = e.codePointAt(0), i = {
300
+ start: t,
301
+ end: t + e.length
302
+ };
303
+ if (r >= 55296 && r <= 57343 || /[\u0000-\u001f\u007f-\u009f]/u.test(e)) throw new n("invalid-text", void 0, i);
304
+ if (/[\u061c\u200e\u200f\u202a-\u202e\u2066-\u2069]/u.test(e)) throw new n("unsupported-direction", void 0, i);
305
+ if (/\p{Script=Latin}/u.test(e)) return "Latn";
306
+ if (/\p{Script=Han}/u.test(e)) return "Hani";
307
+ if (!/[\p{Script=Common}\p{Script=Inherited}]/u.test(e)) throw new n("unsupported-script", void 0, i);
308
+ }
309
+ function d(e, t) {
310
+ if (t.direction !== "ltr") return {
311
+ ok: !1,
312
+ reason: "unsupported-direction"
313
+ };
314
+ if (e.length > 1e5) return {
315
+ ok: !1,
316
+ reason: "resource-limit"
317
+ };
318
+ let r = [];
319
+ try {
320
+ let n = 0;
321
+ for (let t of e) r.push({
322
+ start: n,
323
+ script: u(t, n)
324
+ }), n += t.length;
325
+ let i = [], a = 0, o = r.find((e) => e.script)?.script ?? "Latn", s = (n) => {
326
+ n > a && i.push({
327
+ start: a,
328
+ end: n,
329
+ text: e.slice(a, n),
330
+ script: o,
331
+ ...t
332
+ });
333
+ };
334
+ for (let e of r) e.script && e.script !== o && (s(e.start), a = e.start, o = e.script);
335
+ return s(e.length), {
336
+ ok: !0,
337
+ value: i
338
+ };
339
+ } catch (e) {
340
+ return e instanceof n ? {
341
+ ok: !1,
342
+ reason: e.reason,
343
+ range: e.range
344
+ } : {
345
+ ok: !1,
346
+ reason: "invalid-text"
347
+ };
348
+ }
349
+ }
350
+ // src/glyphs/shape-run.ts
351
+ function f(e, t, r) {
352
+ if (t.direction !== "ltr") throw new n("unsupported-direction");
353
+ if (!["Latn", "Hani"].includes(t.script)) throw new n("unsupported-script");
354
+ if (e.length > r) throw new n("resource-limit");
355
+ if (typeof t.language != "string" || !/^[a-zA-Z]{2,8}(?:-[a-zA-Z0-9]{1,8})*$/.test(t.language)) throw new n("invalid-text");
356
+ let i = 0;
357
+ for (let r of e) {
358
+ let e = u(r, i);
359
+ if (e && e !== t.script) throw new n("script-mismatch", void 0, {
360
+ start: i,
361
+ end: i + r.length
362
+ });
363
+ i += r.length;
364
+ }
365
+ }
366
+ function p(e, t, r, i) {
367
+ let a = () => {
368
+ throw new n("shaper-failed");
369
+ };
370
+ if (i.length > Math.max(256, t.length * 32)) throw new n("resource-limit");
371
+ (t.length && !i.length || !t.length && i.length) && a();
372
+ let o = [], s = -1, c = 0, l = 0, u = i.map((n, r) => {
373
+ let { id: u, cluster: d, xOffset: f, yOffset: p } = n;
374
+ if ((!Number.isInteger(u) || u < 0 || u >= e.glyphCount || !Number.isInteger(d) || d < s || d >= t.length || r === 0 && d !== 0 || d > 0 && /[\udc00-\udfff]/u.test(t[d]) || ![
375
+ n.xAdvance,
376
+ n.yAdvance,
377
+ f,
378
+ p
379
+ ].every((e) => Number.isFinite(e) && Math.abs(e) <= 1e9)) && a(), d !== s) {
380
+ let e = o[o.length - 1];
381
+ e && (e.end = d, e.text = t.slice(e.start, d), e.glyphEnd = r), o.push({
382
+ start: d,
383
+ end: t.length,
384
+ text: "",
385
+ glyphStart: r,
386
+ glyphEnd: i.length
387
+ }), s = d;
388
+ }
389
+ return c += n.xAdvance, l += n.yAdvance, {
390
+ id: u,
391
+ xAdvance: n.xAdvance,
392
+ yAdvance: n.yAdvance,
393
+ xOffset: f,
394
+ yOffset: p
395
+ };
396
+ }), d = o[o.length - 1];
397
+ d && (d.text = t.slice(d.start));
398
+ let f = o.filter((e) => u.slice(e.glyphStart, e.glyphEnd).some((e) => e.id === 0)).map(({ start: e, end: t, text: n }) => ({
399
+ start: e,
400
+ end: t,
401
+ text: n
402
+ }));
403
+ return f.length ? {
404
+ ok: !1,
405
+ reason: "missing-glyphs",
406
+ faceId: e.id,
407
+ missing: f
408
+ } : {
409
+ ok: !0,
410
+ value: {
411
+ faceId: e.id,
412
+ text: t,
413
+ script: r.script,
414
+ direction: "ltr",
415
+ language: r.language,
416
+ unitsPerEm: e.unitsPerEm,
417
+ xAdvance: c,
418
+ yAdvance: l,
419
+ glyphs: u,
420
+ clusters: o
421
+ }
422
+ };
423
+ }
424
+ // src/glyphs/shaping.ts
425
+ function m(e, t) {
426
+ return new Promise((r, i) => {
427
+ let a = () => {
428
+ t.removeEventListener("abort", a), i(new n("aborted"));
429
+ };
430
+ t.aborted ? a() : t.addEventListener("abort", a, { once: !0 }), e.then(r, i).finally(() => t.removeEventListener("abort", a));
431
+ });
432
+ }
433
+ function h(e, t) {
434
+ let r = new AbortController(), i = /* @__PURE__ */ new Map(), a = /* @__PURE__ */ new Set(), o = /* @__PURE__ */ new Map(), s, c, l = () => e.loadShaper ? s ??= Promise.resolve().then(() => {
435
+ if (r.signal.aborted) throw new n("provider-disposed");
436
+ return e.loadShaper(r.signal);
437
+ }).then((e) => {
438
+ if (r.signal.aborted) throw e.dispose(), new n("provider-disposed");
439
+ return c = e, e;
440
+ }).catch((e) => {
441
+ throw s = void 0, e;
442
+ }) : Promise.reject(new n("shaper-unavailable")), u = async (e, s, c, u) => {
443
+ if (r.signal.aborted) return {
444
+ ok: !1,
445
+ reason: "provider-disposed",
446
+ faceId: e
447
+ };
448
+ let d = new AbortController(), f = () => d.abort();
449
+ o.has(e) || o.set(e, /* @__PURE__ */ new Set()), o.get(e).add(d), r.signal.addEventListener("abort", f, { once: !0 }), s.signal?.addEventListener("abort", f, { once: !0 }), s.signal?.aborted && f();
450
+ try {
451
+ if (d.signal.aborted) throw new n("aborted");
452
+ let o = await t(e, s);
453
+ if (!o.ok) return o;
454
+ if (a.has(e)) throw new n("face-unavailable");
455
+ if (d.signal.aborted) throw new n("aborted");
456
+ c(o.value);
457
+ let f = i.get(e);
458
+ if (!f) {
459
+ let t = new AbortController(), s;
460
+ s = {
461
+ pending: m(l(), t.signal).then((r) => {
462
+ if (a.has(e)) throw new n("face-unavailable");
463
+ return r.open({
464
+ ...o.value,
465
+ bytes: o.value.bytes.slice()
466
+ }, t.signal);
467
+ }).then((t) => {
468
+ if (r.signal.aborted || a.has(e)) throw t.dispose(), new n(r.signal.aborted ? "provider-disposed" : "face-unavailable");
469
+ return s.face = t, t;
470
+ }).catch((t) => {
471
+ throw i.delete(e), t;
472
+ }),
473
+ controller: t
474
+ }, i.set(e, s), f = s;
475
+ }
476
+ let p = await m(f.pending, d.signal);
477
+ return await m(Promise.resolve().then(() => {
478
+ if (d.signal.aborted) throw new n("aborted");
479
+ return u(p, o.value, d.signal);
480
+ }), d.signal);
481
+ } catch (t) {
482
+ return {
483
+ ok: !1,
484
+ faceId: e,
485
+ reason: r.signal.aborted ? "provider-disposed" : a.has(e) ? "face-unavailable" : d.signal.aborted ? "aborted" : t instanceof n ? t.reason : "shaper-failed",
486
+ ...t instanceof n && t.missing ? { missing: t.missing } : {},
487
+ ...t instanceof n && t.range ? { range: t.range } : {}
488
+ };
489
+ } finally {
490
+ r.signal.removeEventListener("abort", f), s.signal?.removeEventListener("abort", f), o.get(e)?.delete(d), o.get(e)?.size || o.delete(e);
491
+ }
492
+ };
493
+ return {
494
+ release(e) {
495
+ a.add(e);
496
+ let t = i.get(e);
497
+ i.delete(e), t?.face?.dispose(), t?.controller.abort();
498
+ for (let t of o.get(e) ?? []) t.abort();
499
+ },
500
+ shape(t, n, r) {
501
+ return u(t, r, () => f(n, r, e.limits?.maxTextLength ?? 1e5), async (e, t, i) => {
502
+ let a = n ? await e.shape(n, {
503
+ ...r,
504
+ signal: i
505
+ }) : [];
506
+ return p(t.info, n, r, a);
507
+ });
508
+ },
509
+ outline(e, t, r) {
510
+ return u(e, r, (e) => {
511
+ if (!Number.isInteger(t) || t < 0 || t >= e.info.glyphCount) throw new n("invalid-glyph-id");
512
+ }, async (e, i, a) => {
513
+ let o = await e.outline(t, {
514
+ ...r,
515
+ signal: a
516
+ });
517
+ if (o.length > 4e6) throw new n("resource-limit");
518
+ if (!/^[MmLlHhVvCcSsQqTtAaZz\d\s.,+eE-]*$/.test(o)) throw new n("shaper-failed");
519
+ return {
520
+ ok: !0,
521
+ value: o
522
+ };
523
+ });
524
+ },
525
+ dispose() {
526
+ if (!r.signal.aborted) {
527
+ c?.dispose(), c = void 0, r.abort();
528
+ for (let e of i.values()) e.controller.abort(), e.pending.then((e) => e.dispose(), () => {});
529
+ i.clear();
530
+ }
531
+ }
532
+ };
533
+ }
534
+ // src/glyphs/validation-budget.ts
535
+ function g(e = {}) {
536
+ let t = {
537
+ maxFontBytes: 33554432,
538
+ maxTotalFontBytes: 67108864,
539
+ maxFaces: 64,
540
+ maxGlyphs: 65535,
541
+ maxTextLength: 1e5,
542
+ ...e
543
+ };
544
+ if (!Object.values(t).every((e) => Number.isSafeInteger(e) && e > 0)) throw RangeError("Invalid font resource budget");
545
+ return t;
546
+ }
547
+ function _(e) {
548
+ let t = 0;
549
+ return () => {
550
+ if (e(), !(Date.now() < t)) return new Promise((e) => setTimeout(e, 0)).then(() => {
551
+ e(), t = Date.now() + 8;
552
+ });
553
+ };
554
+ }
555
+ // src/glyphs/eot-container.ts
556
+ function v(e) {
557
+ if (e.length < 36 || e[34] !== 76 || e[35] !== 80) return !1;
558
+ let t = new DataView(e.buffer, e.byteOffset, e.byteLength).getUint32(0);
559
+ return ![
560
+ 65536,
561
+ 1953658213,
562
+ 1330926671,
563
+ 1953784678,
564
+ 2001684038,
565
+ 2001684018
566
+ ].includes(t);
567
+ }
568
+ function y(t) {
569
+ let r = new DataView(t.buffer, t.byteOffset, t.byteLength);
570
+ (t.length < 96 || !v(t) || r.getUint32(0, !0) !== t.length) && e();
571
+ let a = r.getUint32(8, !0), o = r.getUint32(12, !0), s = r.getUint32(4, !0);
572
+ if (![
573
+ 65536,
574
+ 131073,
575
+ 131074
576
+ ].includes(a) || o & -268435702) throw new n("eot-feature-not-supported");
577
+ (!s || s > t.length - 96) && e();
578
+ let c = t.length - s, l = 80, u = (t) => {
579
+ l + t > c && e();
580
+ }, d = () => {
581
+ u(2);
582
+ let e = r.getUint16(l, !0);
583
+ return l += 2, e;
584
+ }, f = () => {
585
+ u(4);
586
+ let e = r.getUint32(l, !0);
587
+ return l += 4, e;
588
+ }, p = () => {
589
+ d() && e();
590
+ let n = d();
591
+ n % 2 && e(), u(n);
592
+ let r = new TextDecoder("utf-16le", { fatal: !0 }).decode(t.subarray(l, l + n));
593
+ return l += n, r;
594
+ };
595
+ for (let t = 64; t < 80; t += 4) r.getUint32(t, !0) && e();
596
+ for (let e = 0; e < 4; e++) p();
597
+ if (a !== 65536) {
598
+ if (p().replace(/\0/g, "")) throw new n("eot-root-restricted");
599
+ if (a === 131074) {
600
+ let t = f();
601
+ f(), t !== 1346851650 && e(), d() && e();
602
+ let r = d();
603
+ u(r), l += r;
604
+ let i = f(), a = f();
605
+ if (u(a), l += a, r || i || a) throw new n("eot-feature-not-supported");
606
+ }
607
+ }
608
+ if (l !== c && e(), o & 32) throw new n("eot-feature-not-supported");
609
+ let m = i(r.getUint16(32, !0), 2);
610
+ if (o & 1 && !m.subsetAllowed) throw new n("subset-not-permitted");
611
+ return {
612
+ offset: c,
613
+ size: s,
614
+ flags: o,
615
+ rights: m
616
+ };
617
+ }
618
+ function b(e, t) {
619
+ let n = e.slice(t.offset);
620
+ if (t.flags & 268435456) for (let e = 0; e < n.length; e++) n[e] ^= 80;
621
+ return n;
622
+ }
623
+ // src/glyphs/provider.ts
624
+ function x(e = {}) {
625
+ let t = !1, i = 0, s = new AbortController(), u = e.decodeEot, d = g(e.limits), f = /* @__PURE__ */ new Set(), p = /* @__PURE__ */ new Set(), x = /* @__PURE__ */ new Map(), S = (e) => ({
626
+ ...e,
627
+ bbox: [...e.bbox],
628
+ embedding: { ...e.embedding }
629
+ }), C = (e, n) => t ? {
630
+ ok: !1,
631
+ reason: "provider-disposed",
632
+ faceId: n
633
+ } : e.signal?.aborted ? {
634
+ ok: !1,
635
+ reason: "aborted",
636
+ faceId: n
637
+ } : void 0, w = async (e, t) => {
638
+ let n = C(t, e);
639
+ if (n) return n;
640
+ let r = x.get(e), i = r && a(r.info.embedding, t.purpose);
641
+ return i ? {
642
+ ok: !1,
643
+ reason: i,
644
+ faceId: e
645
+ } : r ? {
646
+ ok: !0,
647
+ value: {
648
+ bytes: r.bytes,
649
+ info: S(r.info)
650
+ }
651
+ } : {
652
+ ok: !1,
653
+ reason: "face-unavailable",
654
+ faceId: e
655
+ };
656
+ }, T = h({
657
+ ...e,
658
+ limits: d
659
+ }, w);
660
+ return {
661
+ async register(e, h) {
662
+ e = {
663
+ ...e,
664
+ restrictions: e.restrictions && { ...e.restrictions }
665
+ }, h = { ...h };
666
+ let g = C(h, e.id);
667
+ if (g) return g;
668
+ let w = (t) => ({
669
+ ok: !1,
670
+ reason: t,
671
+ faceId: e.id
672
+ });
673
+ if (!e.bytes?.length) return w("font-bytes-unavailable");
674
+ if (!e.id || e.id.length > 256) return w("invalid-font");
675
+ if (![
676
+ "explicit",
677
+ "embedded",
678
+ "substitute"
679
+ ].includes(e.origin) || !["edit", "view-print"].includes(h.purpose) || e.family !== void 0 && (!e.family.trim() || e.family.length > 256 || /[\u0000-\u001f\u007f]/.test(e.family))) return w("invalid-request");
680
+ if (x.has(e.id) || f.has(e.id) || p.has(e.id)) return w("duplicate-face-id");
681
+ let T = e.bytes.length, E = T + (v(e.bytes) ? d.maxFontBytes : 0), D = [...x.values()].reduce((e, t) => e + t.bytes.length, 0);
682
+ if (T > d.maxFontBytes || D + i + E > d.maxTotalFontBytes || x.size + f.size >= d.maxFaces) return w("resource-limit");
683
+ f.add(e.id), i += E;
684
+ let O = new AbortController(), k = () => O.abort();
685
+ s.signal.addEventListener("abort", k, { once: !0 }), h.signal?.addEventListener("abort", k, { once: !0 });
686
+ try {
687
+ let i = new Uint8Array(e.bytes), s = _(() => {
688
+ let e = C(h);
689
+ if (e) throw new n(e.reason);
690
+ });
691
+ await s();
692
+ let f = v(i) ? y(i) : void 0;
693
+ if (f) {
694
+ let e = a(f.rights, h.purpose);
695
+ if (e) return w(e);
696
+ if (f.flags & 4) {
697
+ if (!u) return w("decoder-unavailable");
698
+ let e;
699
+ try {
700
+ e = await m(Promise.resolve().then(() => {
701
+ if (O.signal.aborted) throw new n("aborted");
702
+ return u(i, {
703
+ signal: O.signal,
704
+ maxOutputBytes: d.maxFontBytes
705
+ });
706
+ }), O.signal);
707
+ } catch (e) {
708
+ return w(t ? "provider-disposed" : O.signal.aborted ? "aborted" : e instanceof n ? e.reason : "decode-failed");
709
+ }
710
+ if (!e?.length) return w("decode-failed");
711
+ if (e.length > d.maxFontBytes) return w("resource-limit");
712
+ i = new Uint8Array(e);
713
+ } else i = b(i, f);
714
+ }
715
+ let p = o(i);
716
+ if (p.info.embedding = r(r(p.info.embedding, f?.rights), e.restrictions), f && f.flags & 1 && !p.info.embedding.subsetAllowed) return w("subset-not-permitted");
717
+ if (p.info.glyphCount > d.maxGlyphs) return w("resource-limit");
718
+ let g = a(p.info.embedding, h.purpose);
719
+ if (g) return w(g);
720
+ await c(i, p, s), await l(i, p, s);
721
+ let T = C(h, e.id);
722
+ if (T) return T;
723
+ let E = {
724
+ ...p.info,
725
+ id: e.id,
726
+ family: e.family ?? p.info.sourceFamily,
727
+ origin: e.origin,
728
+ sourceLabel: e.sourceLabel,
729
+ embeddingEvidence: e.embeddingEvidence
730
+ };
731
+ return x.set(e.id, {
732
+ info: E,
733
+ bytes: i
734
+ }), {
735
+ ok: !0,
736
+ value: S(E)
737
+ };
738
+ } catch (e) {
739
+ return w(e instanceof n ? e.reason : "invalid-font");
740
+ } finally {
741
+ f.delete(e.id), i -= E, s.signal.removeEventListener("abort", k), h.signal?.removeEventListener("abort", k);
742
+ }
743
+ },
744
+ async resolve(e) {
745
+ let t = C(e);
746
+ if (t) return t;
747
+ let n = [...x.values()].filter(({ info: t }) => t.family.toLowerCase() === e.family.toLowerCase() && t.weight === e.weight && t.italic === e.italic), r = n.length === 1 ? a(n[0].info.embedding, e.purpose) : void 0;
748
+ return r ? {
749
+ ok: !1,
750
+ reason: r,
751
+ faceId: n[0].info.id
752
+ } : n.length === 1 ? {
753
+ ok: !0,
754
+ value: S(n[0].info)
755
+ } : {
756
+ ok: !1,
757
+ reason: n.length ? "ambiguous-face" : "face-unavailable"
758
+ };
759
+ },
760
+ async embedding(e, t) {
761
+ let n = await w(e, t);
762
+ return n.ok ? {
763
+ ok: !0,
764
+ value: {
765
+ info: n.value.info,
766
+ bytes: n.value.bytes.slice()
767
+ }
768
+ } : n;
769
+ },
770
+ async faceInfo(e, t) {
771
+ let n = await w(e, t);
772
+ return n.ok ? {
773
+ ok: !0,
774
+ value: n.value.info
775
+ } : n;
776
+ },
777
+ shape: T.shape,
778
+ outline: T.outline,
779
+ release(e) {
780
+ return x.delete(e) ? (p.add(e), T.release(e), !0) : !1;
781
+ },
782
+ state() {
783
+ return {
784
+ disposed: t,
785
+ retainedFontBytes: [...x.values()].reduce((e, t) => e + t.bytes.length, 0),
786
+ reservedFontBytes: i,
787
+ pendingRegistrations: f.size,
788
+ faces: x.size
789
+ };
790
+ },
791
+ dispose() {
792
+ t = !0, T.dispose(), s.abort(), x.clear(), p.clear();
793
+ }
794
+ };
795
+ }
796
+ export { d as i, g as n, p as r, x as t };