pdf-codec 1.5.0 → 1.7.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 (214) hide show
  1. package/README.md +100 -9
  2. package/dist/assets/caladea-bold.cjs +5 -0
  3. package/dist/assets/caladea-bold.d.cts +4 -0
  4. package/dist/assets/caladea-bold.d.ts +4 -0
  5. package/dist/assets/caladea-bold.js +4 -0
  6. package/dist/assets/caladea-bolditalic.cjs +5 -0
  7. package/dist/assets/caladea-bolditalic.d.cts +4 -0
  8. package/dist/assets/caladea-bolditalic.d.ts +4 -0
  9. package/dist/assets/caladea-bolditalic.js +4 -0
  10. package/dist/assets/caladea-italic.cjs +5 -0
  11. package/dist/assets/caladea-italic.d.cts +4 -0
  12. package/dist/assets/caladea-italic.d.ts +4 -0
  13. package/dist/assets/caladea-italic.js +4 -0
  14. package/dist/assets/caladea-regular.cjs +5 -0
  15. package/dist/assets/caladea-regular.d.cts +4 -0
  16. package/dist/assets/caladea-regular.d.ts +4 -0
  17. package/dist/assets/caladea-regular.js +4 -0
  18. package/dist/assets/carlito-bold.cjs +5 -0
  19. package/dist/assets/carlito-bold.d.cts +4 -0
  20. package/dist/assets/carlito-bold.d.ts +4 -0
  21. package/dist/assets/carlito-bold.js +4 -0
  22. package/dist/assets/carlito-bolditalic.cjs +5 -0
  23. package/dist/assets/carlito-bolditalic.d.cts +4 -0
  24. package/dist/assets/carlito-bolditalic.d.ts +4 -0
  25. package/dist/assets/carlito-bolditalic.js +4 -0
  26. package/dist/assets/carlito-italic.cjs +5 -0
  27. package/dist/assets/carlito-italic.d.cts +4 -0
  28. package/dist/assets/carlito-italic.d.ts +4 -0
  29. package/dist/assets/carlito-italic.js +4 -0
  30. package/dist/assets/carlito-regular.cjs +5 -0
  31. package/dist/assets/carlito-regular.d.cts +4 -0
  32. package/dist/assets/carlito-regular.d.ts +4 -0
  33. package/dist/assets/carlito-regular.js +4 -0
  34. package/dist/cff-bounds.cjs +432 -0
  35. package/dist/cff-bounds.d.cts +9 -0
  36. package/dist/cff-bounds.d.ts +9 -0
  37. package/dist/cff-bounds.js +431 -0
  38. package/dist/cff-probe.cjs +35 -0
  39. package/dist/cff-probe.d.cts +10 -0
  40. package/dist/cff-probe.d.ts +10 -0
  41. package/dist/cff-probe.js +34 -0
  42. package/dist/cff.cjs +158 -0
  43. package/dist/cff.d.cts +17 -0
  44. package/dist/cff.d.ts +17 -0
  45. package/dist/cff.js +150 -0
  46. package/dist/cmap-table.cjs +108 -0
  47. package/dist/cmap-table.d.cts +6 -0
  48. package/dist/cmap-table.d.ts +6 -0
  49. package/dist/cmap-table.js +107 -0
  50. package/dist/content-write.cjs +34 -14
  51. package/dist/content-write.d.cts +9 -2
  52. package/dist/content-write.d.ts +9 -2
  53. package/dist/content-write.js +34 -14
  54. package/dist/embedded-font-CLedn-mT.d.cts +42 -0
  55. package/dist/embedded-font-CbqkKgBl.d.ts +42 -0
  56. package/dist/embedded-font-write.cjs +92 -0
  57. package/dist/embedded-font-write.d.cts +22 -0
  58. package/dist/embedded-font-write.d.ts +22 -0
  59. package/dist/embedded-font-write.js +90 -0
  60. package/dist/embedded-font.cjs +142 -0
  61. package/dist/embedded-font.d.cts +2 -0
  62. package/dist/embedded-font.d.ts +2 -0
  63. package/dist/embedded-font.js +138 -0
  64. package/dist/filters.cjs +45 -2
  65. package/dist/filters.d.cts +4 -3
  66. package/dist/filters.d.ts +4 -3
  67. package/dist/filters.js +45 -2
  68. package/dist/font-registry-Cn7P9lAh.d.ts +38 -0
  69. package/dist/font-registry-yby02snZ.d.cts +38 -0
  70. package/dist/font-registry.cjs +152 -0
  71. package/dist/font-registry.d.cts +2 -0
  72. package/dist/font-registry.d.ts +2 -0
  73. package/dist/font-registry.js +150 -0
  74. package/dist/font-substitutes.cjs +13 -0
  75. package/dist/font-substitutes.d.cts +5 -0
  76. package/dist/font-substitutes.d.ts +5 -0
  77. package/dist/font-substitutes.js +12 -0
  78. package/dist/font-tables.cjs +127 -0
  79. package/dist/font-tables.d.cts +43 -0
  80. package/dist/font-tables.d.ts +43 -0
  81. package/dist/font-tables.js +122 -0
  82. package/dist/fonts.cjs +1 -0
  83. package/dist/fonts.d.cts +2 -1
  84. package/dist/fonts.d.ts +2 -1
  85. package/dist/fonts.js +1 -1
  86. package/dist/formula.d.cts +1 -1
  87. package/dist/formula.d.ts +1 -1
  88. package/dist/glyf.cjs +183 -0
  89. package/dist/glyf.d.cts +33 -0
  90. package/dist/glyf.d.ts +33 -0
  91. package/dist/glyf.js +181 -0
  92. package/dist/glyph-bounds-BV_Z40KS.d.cts +10 -0
  93. package/dist/glyph-bounds-BV_Z40KS.d.ts +10 -0
  94. package/dist/glyph-bounds.cjs +12 -0
  95. package/dist/glyph-bounds.d.cts +2 -0
  96. package/dist/glyph-bounds.d.ts +2 -0
  97. package/dist/glyph-bounds.js +11 -0
  98. package/dist/{math-hmtx.cjs → hmtx-table.cjs} +3 -3
  99. package/dist/{math-hmtx.d.ts → hmtx-table.d.cts} +2 -2
  100. package/dist/{math-hmtx.d.cts → hmtx-table.d.ts} +2 -2
  101. package/dist/{math-hmtx.js → hmtx-table.js} +3 -3
  102. package/dist/image/jbig2-arith.cjs +432 -0
  103. package/dist/image/jbig2-arith.d.cts +23 -0
  104. package/dist/image/jbig2-arith.d.ts +23 -0
  105. package/dist/image/jbig2-arith.js +426 -0
  106. package/dist/image/jbig2-bitmap.cjs +80 -0
  107. package/dist/image/jbig2-bitmap.d.cts +20 -0
  108. package/dist/image/jbig2-bitmap.d.ts +20 -0
  109. package/dist/image/jbig2-bitmap.js +72 -0
  110. package/dist/image/jbig2-errors.cjs +17 -0
  111. package/dist/image/jbig2-errors.d.cts +2 -0
  112. package/dist/image/jbig2-errors.d.ts +2 -0
  113. package/dist/image/jbig2-errors.js +15 -0
  114. package/dist/image/jbig2-generic.cjs +242 -0
  115. package/dist/image/jbig2-generic.d.cts +27 -0
  116. package/dist/image/jbig2-generic.d.ts +27 -0
  117. package/dist/image/jbig2-generic.js +237 -0
  118. package/dist/image/jbig2-text.cjs +175 -0
  119. package/dist/image/jbig2-text.d.cts +58 -0
  120. package/dist/image/jbig2-text.d.ts +58 -0
  121. package/dist/image/jbig2-text.js +170 -0
  122. package/dist/image/jbig2.cjs +333 -0
  123. package/dist/image/jbig2.d.cts +15 -0
  124. package/dist/image/jbig2.d.ts +15 -0
  125. package/dist/image/jbig2.js +332 -0
  126. package/dist/image/jp2-boxes.cjs +148 -0
  127. package/dist/image/jp2-boxes.d.cts +26 -0
  128. package/dist/image/jp2-boxes.d.ts +26 -0
  129. package/dist/image/jp2-boxes.js +146 -0
  130. package/dist/image/jpeg2000-codestream.cjs +309 -0
  131. package/dist/image/jpeg2000-codestream.d.cts +78 -0
  132. package/dist/image/jpeg2000-codestream.d.ts +78 -0
  133. package/dist/image/jpeg2000-codestream.js +308 -0
  134. package/dist/image/jpeg2000-dwt.cjs +148 -0
  135. package/dist/image/jpeg2000-dwt.d.cts +34 -0
  136. package/dist/image/jpeg2000-dwt.d.ts +34 -0
  137. package/dist/image/jpeg2000-dwt.js +145 -0
  138. package/dist/image/jpeg2000-errors.cjs +17 -0
  139. package/dist/image/jpeg2000-errors.d.cts +9 -0
  140. package/dist/image/jpeg2000-errors.d.ts +9 -0
  141. package/dist/image/jpeg2000-errors.js +15 -0
  142. package/dist/image/jpeg2000-t1.cjs +254 -0
  143. package/dist/image/jpeg2000-t1.d.cts +18 -0
  144. package/dist/image/jpeg2000-t1.d.ts +18 -0
  145. package/dist/image/jpeg2000-t1.js +253 -0
  146. package/dist/image/jpeg2000-t2.cjs +316 -0
  147. package/dist/image/jpeg2000-t2.d.cts +79 -0
  148. package/dist/image/jpeg2000-t2.d.ts +79 -0
  149. package/dist/image/jpeg2000-t2.js +311 -0
  150. package/dist/image/jpeg2000-tagtree.cjs +105 -0
  151. package/dist/image/jpeg2000-tagtree.d.cts +29 -0
  152. package/dist/image/jpeg2000-tagtree.d.ts +29 -0
  153. package/dist/image/jpeg2000-tagtree.js +103 -0
  154. package/dist/image/jpeg2000.cjs +322 -0
  155. package/dist/image/jpeg2000.d.cts +54 -0
  156. package/dist/image/jpeg2000.d.ts +54 -0
  157. package/dist/image/jpeg2000.js +320 -0
  158. package/dist/images-read.cjs +78 -1
  159. package/dist/images-read.js +78 -1
  160. package/dist/index.cjs +22 -0
  161. package/dist/index.d.cts +14 -3
  162. package/dist/index.d.ts +14 -3
  163. package/dist/index.js +9 -2
  164. package/dist/jbig2-errors-Bj6MPxrx.d.cts +9 -0
  165. package/dist/jbig2-errors-Bj6MPxrx.d.ts +9 -0
  166. package/dist/math-font-write.cjs +2 -31
  167. package/dist/math-font-write.js +1 -30
  168. package/dist/math-font.cjs +50 -23
  169. package/dist/math-font.d.cts +8 -1
  170. package/dist/math-font.d.ts +8 -1
  171. package/dist/math-font.js +48 -21
  172. package/dist/math-stretch-Bwk_bxh1.d.ts +24 -0
  173. package/dist/math-stretch-DXWjs8gL.d.cts +24 -0
  174. package/dist/math-stretch.cjs +96 -0
  175. package/dist/math-stretch.d.cts +2 -0
  176. package/dist/math-stretch.d.ts +2 -0
  177. package/dist/math-stretch.js +94 -0
  178. package/dist/math-table-DhPrNoPa.d.ts +70 -0
  179. package/dist/math-table-gFNB8DmQ.d.cts +70 -0
  180. package/dist/math-table.cjs +69 -1
  181. package/dist/math-table.d.cts +2 -45
  182. package/dist/math-table.d.ts +2 -45
  183. package/dist/math-table.js +69 -1
  184. package/dist/{math-types-Ba8qAf1p.d.cts → math-types-YSQUTviw.d.cts} +2 -0
  185. package/dist/{math-types-Ba8qAf1p.d.ts → math-types-YSQUTviw.d.ts} +2 -0
  186. package/dist/math-types.d.cts +1 -1
  187. package/dist/math-types.d.ts +1 -1
  188. package/dist/measure.cjs +65 -14
  189. package/dist/measure.d.cts +8 -1
  190. package/dist/measure.d.ts +8 -1
  191. package/dist/measure.js +64 -15
  192. package/dist/sfnt-V08bb5ut.d.cts +21 -0
  193. package/dist/sfnt-V08bb5ut.d.ts +21 -0
  194. package/dist/sfnt-subset.cjs +250 -0
  195. package/dist/sfnt-subset.d.cts +11 -0
  196. package/dist/sfnt-subset.d.ts +11 -0
  197. package/dist/sfnt-subset.js +249 -0
  198. package/dist/sfnt.cjs +50 -4
  199. package/dist/sfnt.d.cts +2 -17
  200. package/dist/sfnt.d.ts +2 -17
  201. package/dist/sfnt.js +47 -5
  202. package/dist/tounicode.cjs +34 -0
  203. package/dist/tounicode.d.cts +5 -0
  204. package/dist/tounicode.d.ts +5 -0
  205. package/dist/tounicode.js +33 -0
  206. package/dist/write.cjs +80 -10
  207. package/dist/write.d.cts +6 -0
  208. package/dist/write.d.ts +6 -0
  209. package/dist/write.js +81 -11
  210. package/package.json +1 -1
  211. package/dist/math-cmap.cjs +0 -81
  212. package/dist/math-cmap.d.cts +0 -6
  213. package/dist/math-cmap.d.ts +0 -6
  214. package/dist/math-cmap.js +0 -80
@@ -0,0 +1,431 @@
1
+ import { hasBytes, u16, u32, u8 } from "./sfnt.js";
2
+ import { parseCffDict, readCffIndex } from "./cff.js";
3
+ //#region src/cff-bounds.ts
4
+ const CFF_HEADER_MIN_SIZE = 4;
5
+ const CFF_MAJOR_VERSION = 1;
6
+ const CFF_HEADER_SIZE_OFFSET = 2;
7
+ const CS_OPERAND_INT16 = 28;
8
+ const CS_OPERAND_FIXED = 255;
9
+ const CS_OPERAND_SMALL_FIRST = 32;
10
+ const CS_OPERAND_SMALL_LAST = 246;
11
+ const CS_OPERAND_MEDIUM_FIRST = 247;
12
+ const CS_OPERAND_MEDIUM_LAST = 250;
13
+ const CS_OPERAND_NEGATIVE_MEDIUM_FIRST = 251;
14
+ const CS_OPERAND_NEGATIVE_MEDIUM_LAST = 254;
15
+ const CS_OPERAND_SMALL_BIAS = 139;
16
+ const CS_OPERAND_MEDIUM_BIAS = 108;
17
+ const CS_OPERAND_MEDIUM_FIRST_BYTE_BIAS = 247;
18
+ const CS_OPERAND_NEGATIVE_MEDIUM_FIRST_BYTE_BIAS = 251;
19
+ const BYTE_RADIX = 256;
20
+ const FIXED_POINT_SCALE = 65536;
21
+ const OP_HSTEM = 1;
22
+ const OP_VSTEM = 3;
23
+ const OP_VMOVETO = 4;
24
+ const OP_RLINETO = 5;
25
+ const OP_HLINETO = 6;
26
+ const OP_VLINETO = 7;
27
+ const OP_RRCURVETO = 8;
28
+ const OP_CALLSUBR = 10;
29
+ const OP_RETURN = 11;
30
+ const OP_ESCAPE = 12;
31
+ const OP_ENDCHAR = 14;
32
+ const OP_HSTEMHM = 18;
33
+ const OP_HINTMASK = 19;
34
+ const OP_CNTRMASK = 20;
35
+ const OP_RMOVETO = 21;
36
+ const OP_HMOVETO = 22;
37
+ const OP_VSTEMHM = 23;
38
+ const OP_RCURVELINE = 24;
39
+ const OP_RLINECURVE = 25;
40
+ const OP_VVCURVETO = 26;
41
+ const OP_HHCURVETO = 27;
42
+ const OP_CALLGSUBR = 29;
43
+ const OP_VHCURVETO = 30;
44
+ const OP_HVCURVETO = 31;
45
+ const CHARSTRING_OPERATOR_LIMIT = 31;
46
+ const ESC_HFLEX = 34;
47
+ const ESC_FLEX = 35;
48
+ const ESC_HFLEX1 = 36;
49
+ const ESC_FLEX1 = 37;
50
+ const SUBR_BIAS_SMALL_LIMIT = 1240;
51
+ const SUBR_BIAS_MEDIUM_LIMIT = 33900;
52
+ const SUBR_BIAS_SMALL = 107;
53
+ const SUBR_BIAS_MEDIUM = 1131;
54
+ const SUBR_BIAS_LARGE = 32768;
55
+ const HINT_MASK_BITS_PER_BYTE = 8;
56
+ const STEM_ARGS_PER_STEM = 2;
57
+ const MAX_OPERAND_STACK = 48;
58
+ const MAX_SUBR_DEPTH = 10;
59
+ const MAX_OPERATIONS_PER_GLYPH = 1e5;
60
+ const ENDCHAR_SEAC_ARG_COUNT = 4;
61
+ function subrBias(count) {
62
+ if (count < SUBR_BIAS_SMALL_LIMIT) return SUBR_BIAS_SMALL;
63
+ if (count < SUBR_BIAS_MEDIUM_LIMIT) return SUBR_BIAS_MEDIUM;
64
+ return SUBR_BIAS_LARGE;
65
+ }
66
+ function includePoint(box, x, y) {
67
+ box.minX = Math.min(box.minX, x);
68
+ box.minY = Math.min(box.minY, y);
69
+ box.maxX = Math.max(box.maxX, x);
70
+ box.maxY = Math.max(box.maxY, y);
71
+ box.drawn = true;
72
+ }
73
+ function cubicAt(p0, p1, p2, p3, t) {
74
+ const s = 1 - t;
75
+ return s * s * s * p0 + 3 * s * s * t * p1 + 3 * s * t * t * p2 + t * t * t * p3;
76
+ }
77
+ function includeCubicAxis(p0, p1, p2, p3, apply) {
78
+ apply(p0);
79
+ apply(p3);
80
+ const a = -p0 + 3 * p1 - 3 * p2 + p3;
81
+ const b = 2 * (p0 - 2 * p1 + p2);
82
+ const c = p1 - p0;
83
+ const roots = [];
84
+ if (a === 0) {
85
+ if (b !== 0) roots.push(-c / b);
86
+ } else {
87
+ const discriminant = b * b - 4 * a * c;
88
+ if (discriminant >= 0) {
89
+ const root = Math.sqrt(discriminant);
90
+ roots.push((-b + root) / (2 * a), (-b - root) / (2 * a));
91
+ }
92
+ }
93
+ for (const t of roots) if (t > 0 && t < 1) apply(cubicAt(p0, p1, p2, p3, t));
94
+ }
95
+ function includeCubic(box, x0, y0, x1, y1, x2, y2, x3, y3) {
96
+ includeCubicAxis(x0, x1, x2, x3, (value) => {
97
+ box.minX = Math.min(box.minX, value);
98
+ box.maxX = Math.max(box.maxX, value);
99
+ });
100
+ includeCubicAxis(y0, y1, y2, y3, (value) => {
101
+ box.minY = Math.min(box.minY, value);
102
+ box.maxY = Math.max(box.maxY, value);
103
+ });
104
+ box.drawn = true;
105
+ }
106
+ function curveTo(state, dx1, dy1, dx2, dy2, dx3, dy3) {
107
+ const x0 = state.x;
108
+ const y0 = state.y;
109
+ const x1 = x0 + dx1;
110
+ const y1 = y0 + dy1;
111
+ const x2 = x1 + dx2;
112
+ const y2 = y1 + dy2;
113
+ const x3 = x2 + dx3;
114
+ const y3 = y2 + dy3;
115
+ includeCubic(state.box, x0, y0, x1, y1, x2, y2, x3, y3);
116
+ state.x = x3;
117
+ state.y = y3;
118
+ }
119
+ function lineTo(state, dx, dy) {
120
+ includePoint(state.box, state.x, state.y);
121
+ state.x += dx;
122
+ state.y += dy;
123
+ includePoint(state.box, state.x, state.y);
124
+ }
125
+ function moveTo(state, dx, dy) {
126
+ state.x += dx;
127
+ state.y += dy;
128
+ }
129
+ function takeWidth(state, evenArgs, expected) {
130
+ if (state.widthParsed) return;
131
+ state.widthParsed = true;
132
+ if (evenArgs ? state.stack.length % STEM_ARGS_PER_STEM !== 0 : state.stack.length > expected) state.stack.shift();
133
+ }
134
+ function readOperand(code, offset) {
135
+ const b0 = code[offset];
136
+ if (b0 === CS_OPERAND_INT16) {
137
+ if (!hasBytes(code, offset + 1, 2)) return;
138
+ const raw = u16(code, offset + 1);
139
+ return {
140
+ value: raw >= 32768 ? raw - 65536 : raw,
141
+ endOffset: offset + 3
142
+ };
143
+ }
144
+ if (b0 === CS_OPERAND_FIXED) {
145
+ if (!hasBytes(code, offset + 1, 4)) return;
146
+ return {
147
+ value: (u32(code, offset + 1) | 0) / FIXED_POINT_SCALE,
148
+ endOffset: offset + 5
149
+ };
150
+ }
151
+ if (b0 >= CS_OPERAND_SMALL_FIRST && b0 <= CS_OPERAND_SMALL_LAST) return {
152
+ value: b0 - CS_OPERAND_SMALL_BIAS,
153
+ endOffset: offset + 1
154
+ };
155
+ if (b0 >= CS_OPERAND_MEDIUM_FIRST && b0 <= CS_OPERAND_MEDIUM_LAST) {
156
+ if (!hasBytes(code, offset + 1, 1)) return;
157
+ return {
158
+ value: (b0 - CS_OPERAND_MEDIUM_FIRST_BYTE_BIAS) * BYTE_RADIX + u8(code, offset + 1) + CS_OPERAND_MEDIUM_BIAS,
159
+ endOffset: offset + 2
160
+ };
161
+ }
162
+ if (b0 >= CS_OPERAND_NEGATIVE_MEDIUM_FIRST && b0 <= CS_OPERAND_NEGATIVE_MEDIUM_LAST) {
163
+ if (!hasBytes(code, offset + 1, 1)) return;
164
+ return {
165
+ value: -(b0 - CS_OPERAND_NEGATIVE_MEDIUM_FIRST_BYTE_BIAS) * BYTE_RADIX - u8(code, offset + 1) - CS_OPERAND_MEDIUM_BIAS,
166
+ endOffset: offset + 2
167
+ };
168
+ }
169
+ }
170
+ function execute(code, state, context, depth) {
171
+ if (depth > MAX_SUBR_DEPTH) return false;
172
+ const stack = state.stack;
173
+ let i = 0;
174
+ while (i < code.length) {
175
+ state.operations += 1;
176
+ if (state.operations > MAX_OPERATIONS_PER_GLYPH) return false;
177
+ const b0 = code[i];
178
+ const operand = readOperand(code, i);
179
+ if (operand !== void 0) {
180
+ if (stack.length >= MAX_OPERAND_STACK) return false;
181
+ stack.push(operand.value);
182
+ i = operand.endOffset;
183
+ continue;
184
+ }
185
+ if (b0 > CHARSTRING_OPERATOR_LIMIT) return false;
186
+ i += 1;
187
+ switch (b0) {
188
+ case OP_HSTEM:
189
+ case OP_VSTEM:
190
+ case OP_HSTEMHM:
191
+ case OP_VSTEMHM:
192
+ takeWidth(state, true, 0);
193
+ state.stems += Math.floor(stack.length / STEM_ARGS_PER_STEM);
194
+ stack.length = 0;
195
+ break;
196
+ case OP_HINTMASK:
197
+ case OP_CNTRMASK: {
198
+ takeWidth(state, true, 0);
199
+ state.stems += Math.floor(stack.length / STEM_ARGS_PER_STEM);
200
+ stack.length = 0;
201
+ const maskBytes = Math.ceil(state.stems / HINT_MASK_BITS_PER_BYTE);
202
+ if (!hasBytes(code, i, maskBytes)) return false;
203
+ i += maskBytes;
204
+ break;
205
+ }
206
+ case OP_RMOVETO:
207
+ takeWidth(state, false, 2);
208
+ if (stack.length < 2) return false;
209
+ moveTo(state, stack[stack.length - 2], stack[stack.length - 1]);
210
+ stack.length = 0;
211
+ break;
212
+ case OP_HMOVETO:
213
+ case OP_VMOVETO: {
214
+ takeWidth(state, false, 1);
215
+ if (stack.length < 1) return false;
216
+ const delta = stack[stack.length - 1];
217
+ moveTo(state, b0 === OP_HMOVETO ? delta : 0, b0 === OP_HMOVETO ? 0 : delta);
218
+ stack.length = 0;
219
+ break;
220
+ }
221
+ case OP_RLINETO:
222
+ for (let k = 0; k + 1 < stack.length; k += 2) lineTo(state, stack[k], stack[k + 1]);
223
+ stack.length = 0;
224
+ break;
225
+ case OP_HLINETO:
226
+ case OP_VLINETO: {
227
+ let horizontal = b0 === OP_HLINETO;
228
+ for (const delta of stack) {
229
+ lineTo(state, horizontal ? delta : 0, horizontal ? 0 : delta);
230
+ horizontal = !horizontal;
231
+ }
232
+ stack.length = 0;
233
+ break;
234
+ }
235
+ case OP_RRCURVETO:
236
+ for (let k = 0; k + 5 < stack.length; k += 6) curveTo(state, stack[k], stack[k + 1], stack[k + 2], stack[k + 3], stack[k + 4], stack[k + 5]);
237
+ stack.length = 0;
238
+ break;
239
+ case OP_RCURVELINE: {
240
+ let k = 0;
241
+ for (; k + 5 < stack.length - 2; k += 6) curveTo(state, stack[k], stack[k + 1], stack[k + 2], stack[k + 3], stack[k + 4], stack[k + 5]);
242
+ if (k + 1 < stack.length) lineTo(state, stack[k], stack[k + 1]);
243
+ stack.length = 0;
244
+ break;
245
+ }
246
+ case OP_RLINECURVE: {
247
+ let k = 0;
248
+ for (; k + 1 < stack.length - 6; k += 2) lineTo(state, stack[k], stack[k + 1]);
249
+ if (k + 5 < stack.length) curveTo(state, stack[k], stack[k + 1], stack[k + 2], stack[k + 3], stack[k + 4], stack[k + 5]);
250
+ stack.length = 0;
251
+ break;
252
+ }
253
+ case OP_VVCURVETO:
254
+ case OP_HHCURVETO: {
255
+ let k = 0;
256
+ let firstCross = 0;
257
+ if (stack.length % 4 === 1) {
258
+ firstCross = stack[0];
259
+ k = 1;
260
+ }
261
+ for (; k + 3 < stack.length; k += 4) {
262
+ const cross = k <= 1 ? firstCross : 0;
263
+ if (b0 === OP_VVCURVETO) curveTo(state, cross, stack[k], stack[k + 1], stack[k + 2], 0, stack[k + 3]);
264
+ else curveTo(state, stack[k], cross, stack[k + 1], stack[k + 2], stack[k + 3], 0);
265
+ }
266
+ stack.length = 0;
267
+ break;
268
+ }
269
+ case OP_VHCURVETO:
270
+ case OP_HVCURVETO: {
271
+ let horizontal = b0 === OP_HVCURVETO;
272
+ let k = 0;
273
+ while (stack.length - k >= 4) {
274
+ const extra = stack.length - k === 5 ? stack[k + 4] : 0;
275
+ if (horizontal) curveTo(state, stack[k], 0, stack[k + 1], stack[k + 2], extra, stack[k + 3]);
276
+ else curveTo(state, 0, stack[k], stack[k + 1], stack[k + 2], stack[k + 3], extra);
277
+ k += 4;
278
+ horizontal = !horizontal;
279
+ }
280
+ stack.length = 0;
281
+ break;
282
+ }
283
+ case OP_CALLSUBR:
284
+ case OP_CALLGSUBR: {
285
+ const index = stack.pop();
286
+ if (index === void 0) return false;
287
+ const subrs = b0 === OP_CALLSUBR ? context.localSubrs : context.globalSubrs;
288
+ const bias = b0 === OP_CALLSUBR ? context.localBias : context.globalBias;
289
+ const code2 = subrs?.entry(index + bias);
290
+ if (code2 === void 0) return false;
291
+ if (!execute(code2, state, context, depth + 1)) return false;
292
+ break;
293
+ }
294
+ case OP_RETURN: return true;
295
+ case OP_ENDCHAR:
296
+ if (!state.widthParsed) {
297
+ state.widthParsed = true;
298
+ if (stack.length === 1 || stack.length === 5) stack.shift();
299
+ }
300
+ return stack.length < ENDCHAR_SEAC_ARG_COUNT;
301
+ case OP_ESCAPE: {
302
+ if (i >= code.length) return false;
303
+ const b1 = code[i];
304
+ i += 1;
305
+ if (!executeEscaped(b1, state)) return false;
306
+ break;
307
+ }
308
+ default: return false;
309
+ }
310
+ }
311
+ return true;
312
+ }
313
+ function executeEscaped(operator, state) {
314
+ const stack = state.stack;
315
+ const startY = state.y;
316
+ if (operator === ESC_FLEX) {
317
+ if (stack.length < 13) return false;
318
+ curveTo(state, stack[0], stack[1], stack[2], stack[3], stack[4], stack[5]);
319
+ curveTo(state, stack[6], stack[7], stack[8], stack[9], stack[10], stack[11]);
320
+ stack.length = 0;
321
+ return true;
322
+ }
323
+ if (operator === ESC_HFLEX) {
324
+ if (stack.length < 7) return false;
325
+ curveTo(state, stack[0], 0, stack[1], stack[2], stack[3], 0);
326
+ curveTo(state, stack[4], 0, stack[5], -stack[2], stack[6], 0);
327
+ stack.length = 0;
328
+ return true;
329
+ }
330
+ if (operator === ESC_HFLEX1) {
331
+ if (stack.length < 9) return false;
332
+ curveTo(state, stack[0], stack[1], stack[2], stack[3], stack[4], 0);
333
+ const dy5 = stack[7];
334
+ curveTo(state, stack[5], 0, stack[6], dy5, stack[8], startY - (state.y + dy5));
335
+ stack.length = 0;
336
+ return true;
337
+ }
338
+ if (operator === ESC_FLEX1) {
339
+ if (stack.length < 11) return false;
340
+ const startX = state.x;
341
+ let dx = 0;
342
+ let dy = 0;
343
+ for (let k = 0; k < 10; k += 2) {
344
+ dx += stack[k];
345
+ dy += stack[k + 1];
346
+ }
347
+ curveTo(state, stack[0], stack[1], stack[2], stack[3], stack[4], stack[5]);
348
+ const controlX = state.x + stack[6] + stack[8];
349
+ const controlY = state.y + stack[7] + stack[9];
350
+ if (Math.abs(dx) > Math.abs(dy)) curveTo(state, stack[6], stack[7], stack[8], stack[9], stack[10], startY - controlY);
351
+ else curveTo(state, stack[6], stack[7], stack[8], stack[9], startX - controlX, stack[10]);
352
+ stack.length = 0;
353
+ return true;
354
+ }
355
+ return false;
356
+ }
357
+ function readPrivateSubrs(bytes, privateOperands) {
358
+ if (privateOperands === void 0 || privateOperands.length < 2) return;
359
+ const size = privateOperands[0];
360
+ const offset = privateOperands[1];
361
+ if (!Number.isInteger(size) || !Number.isInteger(offset) || !hasBytes(bytes, offset, size)) return;
362
+ const subrsOffset = parseCffDict(bytes.subarray(offset, offset + size))?.get(19)?.[0];
363
+ if (subrsOffset === void 0 || !Number.isInteger(subrsOffset)) return;
364
+ return readCffIndex(bytes, offset + subrsOffset);
365
+ }
366
+ function parseCffGlyphBounds(bytes) {
367
+ if (!hasBytes(bytes, 0, CFF_HEADER_MIN_SIZE) || u8(bytes, 0) !== CFF_MAJOR_VERSION) return;
368
+ const headerSize = u8(bytes, CFF_HEADER_SIZE_OFFSET);
369
+ if (headerSize < CFF_HEADER_MIN_SIZE) return;
370
+ const nameIndex = readCffIndex(bytes, headerSize);
371
+ if (nameIndex === void 0) return;
372
+ const topDictIndex = readCffIndex(bytes, nameIndex.endOffset);
373
+ const topDictBytes = topDictIndex?.entry(0);
374
+ if (topDictIndex === void 0 || topDictBytes === void 0) return;
375
+ const topDict = parseCffDict(topDictBytes);
376
+ if (topDict === void 0 || topDict.has(1230)) return;
377
+ const stringIndex = readCffIndex(bytes, topDictIndex.endOffset);
378
+ if (stringIndex === void 0) return;
379
+ const globalSubrs = readCffIndex(bytes, stringIndex.endOffset);
380
+ if (globalSubrs === void 0) return;
381
+ const charStringsOffset = topDict.get(17)?.[0];
382
+ if (charStringsOffset === void 0 || !Number.isInteger(charStringsOffset)) return;
383
+ const charStrings = readCffIndex(bytes, charStringsOffset);
384
+ if (charStrings === void 0) return;
385
+ const localSubrs = readPrivateSubrs(bytes, topDict.get(18));
386
+ const context = {
387
+ charStrings,
388
+ globalSubrs,
389
+ localSubrs,
390
+ globalBias: subrBias(globalSubrs.count),
391
+ localBias: localSubrs === void 0 ? 0 : subrBias(localSubrs.count)
392
+ };
393
+ const memo = /* @__PURE__ */ new Map();
394
+ return {
395
+ numGlyphs: charStrings.count,
396
+ bounds(glyphId) {
397
+ if (memo.has(glyphId)) return memo.get(glyphId);
398
+ const computed = computeBounds(glyphId, context);
399
+ memo.set(glyphId, computed);
400
+ return computed;
401
+ }
402
+ };
403
+ }
404
+ function computeBounds(glyphId, context) {
405
+ const code = context.charStrings.entry(glyphId);
406
+ if (code === void 0) return;
407
+ const state = {
408
+ x: 0,
409
+ y: 0,
410
+ stack: [],
411
+ stems: 0,
412
+ widthParsed: false,
413
+ operations: 0,
414
+ box: {
415
+ minX: Infinity,
416
+ minY: Infinity,
417
+ maxX: -Infinity,
418
+ maxY: -Infinity,
419
+ drawn: false
420
+ }
421
+ };
422
+ if (!execute(code, state, context, 0) || !state.box.drawn) return;
423
+ return {
424
+ xMin: state.box.minX,
425
+ yMin: state.box.minY,
426
+ xMax: state.box.maxX,
427
+ yMax: state.box.maxY
428
+ };
429
+ }
430
+ //#endregion
431
+ export { parseCffGlyphBounds };
@@ -0,0 +1,35 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_sfnt = require("./sfnt.cjs");
3
+ const require_cff = require("./cff.cjs");
4
+ //#region src/cff-probe.ts
5
+ const CFF_HEADER_SIZE = 4;
6
+ const CFF_MAJOR_VERSION = 1;
7
+ const CFF_HEADER_SIZE_OFFSET = 2;
8
+ function decodeAscii(bytes) {
9
+ let text = "";
10
+ for (const byte of bytes) text += String.fromCharCode(byte);
11
+ return text;
12
+ }
13
+ function probeCff(bytes) {
14
+ if (!require_sfnt.hasBytes(bytes, 0, CFF_HEADER_SIZE)) return;
15
+ const majorVersion = require_sfnt.u8(bytes, 0);
16
+ const minorVersion = require_sfnt.u8(bytes, 1);
17
+ const headerSize = require_sfnt.u8(bytes, CFF_HEADER_SIZE_OFFSET);
18
+ if (majorVersion !== CFF_MAJOR_VERSION || headerSize < CFF_HEADER_SIZE) return;
19
+ const nameIndex = require_cff.readCffIndex(bytes, headerSize);
20
+ if (nameIndex === void 0 || nameIndex.count === 0) return;
21
+ const nameBytes = nameIndex.entry(0);
22
+ if (nameBytes === void 0) return;
23
+ const topDictBytes = require_cff.readCffIndex(bytes, nameIndex.endOffset)?.entry(0);
24
+ if (topDictBytes === void 0) return;
25
+ const topDict = require_cff.parseCffDict(topDictBytes);
26
+ if (topDict === void 0) return;
27
+ return {
28
+ majorVersion,
29
+ minorVersion,
30
+ name: decodeAscii(nameBytes),
31
+ cidKeyed: topDict.has(require_cff.CFF_DICT_OP_ROS)
32
+ };
33
+ }
34
+ //#endregion
35
+ exports.probeCff = probeCff;
@@ -0,0 +1,10 @@
1
+ //#region src/cff-probe.d.ts
2
+ interface CffProbeResult {
3
+ readonly majorVersion: number;
4
+ readonly minorVersion: number;
5
+ readonly name: string;
6
+ readonly cidKeyed: boolean;
7
+ }
8
+ declare function probeCff(bytes: Uint8Array<ArrayBuffer>): CffProbeResult | undefined;
9
+ //#endregion
10
+ export { CffProbeResult, probeCff };
@@ -0,0 +1,10 @@
1
+ //#region src/cff-probe.d.ts
2
+ interface CffProbeResult {
3
+ readonly majorVersion: number;
4
+ readonly minorVersion: number;
5
+ readonly name: string;
6
+ readonly cidKeyed: boolean;
7
+ }
8
+ declare function probeCff(bytes: Uint8Array<ArrayBuffer>): CffProbeResult | undefined;
9
+ //#endregion
10
+ export { CffProbeResult, probeCff };
@@ -0,0 +1,34 @@
1
+ import { hasBytes, u8 } from "./sfnt.js";
2
+ import { CFF_DICT_OP_ROS, parseCffDict, readCffIndex } from "./cff.js";
3
+ //#region src/cff-probe.ts
4
+ const CFF_HEADER_SIZE = 4;
5
+ const CFF_MAJOR_VERSION = 1;
6
+ const CFF_HEADER_SIZE_OFFSET = 2;
7
+ function decodeAscii(bytes) {
8
+ let text = "";
9
+ for (const byte of bytes) text += String.fromCharCode(byte);
10
+ return text;
11
+ }
12
+ function probeCff(bytes) {
13
+ if (!hasBytes(bytes, 0, CFF_HEADER_SIZE)) return;
14
+ const majorVersion = u8(bytes, 0);
15
+ const minorVersion = u8(bytes, 1);
16
+ const headerSize = u8(bytes, CFF_HEADER_SIZE_OFFSET);
17
+ if (majorVersion !== CFF_MAJOR_VERSION || headerSize < CFF_HEADER_SIZE) return;
18
+ const nameIndex = readCffIndex(bytes, headerSize);
19
+ if (nameIndex === void 0 || nameIndex.count === 0) return;
20
+ const nameBytes = nameIndex.entry(0);
21
+ if (nameBytes === void 0) return;
22
+ const topDictBytes = readCffIndex(bytes, nameIndex.endOffset)?.entry(0);
23
+ if (topDictBytes === void 0) return;
24
+ const topDict = parseCffDict(topDictBytes);
25
+ if (topDict === void 0) return;
26
+ return {
27
+ majorVersion,
28
+ minorVersion,
29
+ name: decodeAscii(nameBytes),
30
+ cidKeyed: topDict.has(CFF_DICT_OP_ROS)
31
+ };
32
+ }
33
+ //#endregion
34
+ export { probeCff };
package/dist/cff.cjs ADDED
@@ -0,0 +1,158 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_sfnt = require("./sfnt.cjs");
3
+ //#region src/cff.ts
4
+ const CFF_ESCAPED_OPERATOR_BASE = 1200;
5
+ const CFF_DICT_OP_CHARSET = 15;
6
+ const CFF_DICT_OP_CHARSTRINGS = 17;
7
+ const CFF_DICT_OP_PRIVATE = 18;
8
+ const CFF_DICT_OP_SUBRS = 19;
9
+ const CFF_DICT_OP_ROS = 1230;
10
+ const INDEX_COUNT_SIZE = 2;
11
+ const INDEX_OFF_SIZE_SIZE = 1;
12
+ const MIN_OFF_SIZE = 1;
13
+ const MAX_OFF_SIZE = 4;
14
+ const DICT_OPERATOR_MAX = 21;
15
+ const DICT_OPERATOR_ESCAPE = 12;
16
+ const DICT_OPERAND_INT16 = 28;
17
+ const DICT_OPERAND_INT32 = 29;
18
+ const DICT_OPERAND_REAL = 30;
19
+ const DICT_OPERAND_SMALL_FIRST = 32;
20
+ const DICT_OPERAND_SMALL_LAST = 246;
21
+ const DICT_OPERAND_MEDIUM_FIRST = 247;
22
+ const DICT_OPERAND_MEDIUM_LAST = 250;
23
+ const DICT_OPERAND_NEGATIVE_MEDIUM_FIRST = 251;
24
+ const DICT_OPERAND_NEGATIVE_MEDIUM_LAST = 254;
25
+ const DICT_OPERAND_SMALL_BIAS = 139;
26
+ const DICT_OPERAND_MEDIUM_BIAS = 108;
27
+ const DICT_OPERAND_MEDIUM_FIRST_BYTE_BIAS = 247;
28
+ const DICT_OPERAND_NEGATIVE_MEDIUM_FIRST_BYTE_BIAS = 251;
29
+ const BYTE_RADIX = 256;
30
+ const REAL_NIBBLE_DECIMAL_POINT = 10;
31
+ const REAL_NIBBLE_EXPONENT = 11;
32
+ const REAL_NIBBLE_NEGATIVE_EXPONENT = 12;
33
+ const REAL_NIBBLE_RESERVED = 13;
34
+ const REAL_NIBBLE_MINUS = 14;
35
+ const REAL_NIBBLE_TERMINATOR = 15;
36
+ const NIBBLES_PER_BYTE = 2;
37
+ const HIGH_NIBBLE_SHIFT = 4;
38
+ const LOW_NIBBLE_MASK = 15;
39
+ function readOffsetAt(bytes, offset, offSize) {
40
+ if (offSize === 1) return require_sfnt.u8(bytes, offset);
41
+ if (offSize === 2) return require_sfnt.u16(bytes, offset);
42
+ if (offSize === 3) return require_sfnt.u24(bytes, offset);
43
+ return require_sfnt.u32(bytes, offset);
44
+ }
45
+ function readCffIndex(bytes, offset) {
46
+ if (!require_sfnt.hasBytes(bytes, offset, INDEX_COUNT_SIZE)) return;
47
+ const count = require_sfnt.u16(bytes, offset);
48
+ if (count === 0) return {
49
+ count: 0,
50
+ endOffset: offset + INDEX_COUNT_SIZE,
51
+ entry: () => void 0
52
+ };
53
+ if (!require_sfnt.hasBytes(bytes, offset + INDEX_COUNT_SIZE, INDEX_OFF_SIZE_SIZE)) return;
54
+ const offSize = require_sfnt.u8(bytes, offset + INDEX_COUNT_SIZE);
55
+ if (offSize < MIN_OFF_SIZE || offSize > MAX_OFF_SIZE) return;
56
+ const offsetArrayStart = offset + INDEX_COUNT_SIZE + INDEX_OFF_SIZE_SIZE;
57
+ const offsetArrayLength = (count + 1) * offSize;
58
+ if (!require_sfnt.hasBytes(bytes, offsetArrayStart, offsetArrayLength)) return;
59
+ const offsets = [];
60
+ for (let i = 0; i <= count; i++) offsets.push(readOffsetAt(bytes, offsetArrayStart + i * offSize, offSize));
61
+ if (offsets[0] !== 1) return;
62
+ for (let i = 1; i <= count; i++) if (offsets[i] < offsets[i - 1]) return;
63
+ const dataOrigin = offsetArrayStart + offsetArrayLength - 1;
64
+ const dataLength = offsets[count] - 1;
65
+ if (!require_sfnt.hasBytes(bytes, dataOrigin + 1, dataLength)) return;
66
+ return {
67
+ count,
68
+ endOffset: dataOrigin + 1 + dataLength,
69
+ entry: (index) => index < 0 || index >= count ? void 0 : bytes.subarray(dataOrigin + offsets[index], dataOrigin + offsets[index + 1])
70
+ };
71
+ }
72
+ function readRealOperand(data, start) {
73
+ let text = "";
74
+ for (let i = start; i < data.length; i++) {
75
+ const byte = data[i];
76
+ for (let n = 0; n < NIBBLES_PER_BYTE; n++) {
77
+ const nibble = n === 0 ? byte >> HIGH_NIBBLE_SHIFT : byte & LOW_NIBBLE_MASK;
78
+ if (nibble === REAL_NIBBLE_TERMINATOR) return {
79
+ value: Number(text),
80
+ endOffset: i + 1
81
+ };
82
+ if (nibble === REAL_NIBBLE_RESERVED) return;
83
+ if (nibble <= 9) text += String(nibble);
84
+ else if (nibble === REAL_NIBBLE_DECIMAL_POINT) text += ".";
85
+ else if (nibble === REAL_NIBBLE_EXPONENT) text += "E";
86
+ else if (nibble === REAL_NIBBLE_NEGATIVE_EXPONENT) text += "E-";
87
+ else if (nibble === REAL_NIBBLE_MINUS) text += "-";
88
+ }
89
+ }
90
+ }
91
+ function parseCffDict(data) {
92
+ const dict = /* @__PURE__ */ new Map();
93
+ let operands = [];
94
+ let i = 0;
95
+ while (i < data.length) {
96
+ const b0 = data[i];
97
+ if (b0 <= DICT_OPERATOR_MAX) {
98
+ let operator = b0;
99
+ i += 1;
100
+ if (b0 === DICT_OPERATOR_ESCAPE) {
101
+ if (i >= data.length) return;
102
+ operator = CFF_ESCAPED_OPERATOR_BASE + data[i];
103
+ i += 1;
104
+ }
105
+ dict.set(operator, operands);
106
+ operands = [];
107
+ continue;
108
+ }
109
+ if (b0 === DICT_OPERAND_INT16) {
110
+ if (!require_sfnt.hasBytes(data, i + 1, 2)) return;
111
+ const raw = require_sfnt.u16(data, i + 1);
112
+ operands.push(raw >= 32768 ? raw - 65536 : raw);
113
+ i += 3;
114
+ continue;
115
+ }
116
+ if (b0 === DICT_OPERAND_INT32) {
117
+ if (!require_sfnt.hasBytes(data, i + 1, 4)) return;
118
+ operands.push(require_sfnt.u32(data, i + 1) | 0);
119
+ i += 5;
120
+ continue;
121
+ }
122
+ if (b0 === DICT_OPERAND_REAL) {
123
+ const real = readRealOperand(data, i + 1);
124
+ if (real === void 0) return;
125
+ operands.push(real.value);
126
+ i = real.endOffset;
127
+ continue;
128
+ }
129
+ if (b0 >= DICT_OPERAND_SMALL_FIRST && b0 <= DICT_OPERAND_SMALL_LAST) {
130
+ operands.push(b0 - DICT_OPERAND_SMALL_BIAS);
131
+ i += 1;
132
+ continue;
133
+ }
134
+ if (b0 >= DICT_OPERAND_MEDIUM_FIRST && b0 <= DICT_OPERAND_MEDIUM_LAST) {
135
+ if (!require_sfnt.hasBytes(data, i + 1, 1)) return;
136
+ operands.push((b0 - DICT_OPERAND_MEDIUM_FIRST_BYTE_BIAS) * BYTE_RADIX + require_sfnt.u8(data, i + 1) + DICT_OPERAND_MEDIUM_BIAS);
137
+ i += 2;
138
+ continue;
139
+ }
140
+ if (b0 >= DICT_OPERAND_NEGATIVE_MEDIUM_FIRST && b0 <= DICT_OPERAND_NEGATIVE_MEDIUM_LAST) {
141
+ if (!require_sfnt.hasBytes(data, i + 1, 1)) return;
142
+ operands.push(-(b0 - DICT_OPERAND_NEGATIVE_MEDIUM_FIRST_BYTE_BIAS) * BYTE_RADIX - require_sfnt.u8(data, i + 1) - DICT_OPERAND_MEDIUM_BIAS);
143
+ i += 2;
144
+ continue;
145
+ }
146
+ return;
147
+ }
148
+ return dict;
149
+ }
150
+ //#endregion
151
+ exports.CFF_DICT_OP_CHARSET = CFF_DICT_OP_CHARSET;
152
+ exports.CFF_DICT_OP_CHARSTRINGS = CFF_DICT_OP_CHARSTRINGS;
153
+ exports.CFF_DICT_OP_PRIVATE = CFF_DICT_OP_PRIVATE;
154
+ exports.CFF_DICT_OP_ROS = CFF_DICT_OP_ROS;
155
+ exports.CFF_DICT_OP_SUBRS = CFF_DICT_OP_SUBRS;
156
+ exports.CFF_ESCAPED_OPERATOR_BASE = CFF_ESCAPED_OPERATOR_BASE;
157
+ exports.parseCffDict = parseCffDict;
158
+ exports.readCffIndex = readCffIndex;
package/dist/cff.d.cts ADDED
@@ -0,0 +1,17 @@
1
+ //#region src/cff.d.ts
2
+ interface CffIndex {
3
+ readonly count: number;
4
+ readonly endOffset: number;
5
+ entry(index: number): Uint8Array<ArrayBuffer> | undefined;
6
+ }
7
+ type CffDict = ReadonlyMap<number, readonly number[]>;
8
+ declare const CFF_ESCAPED_OPERATOR_BASE = 1200;
9
+ declare const CFF_DICT_OP_CHARSET = 15;
10
+ declare const CFF_DICT_OP_CHARSTRINGS = 17;
11
+ declare const CFF_DICT_OP_PRIVATE = 18;
12
+ declare const CFF_DICT_OP_SUBRS = 19;
13
+ declare const CFF_DICT_OP_ROS: number;
14
+ declare function readCffIndex(bytes: Uint8Array<ArrayBuffer>, offset: number): CffIndex | undefined;
15
+ declare function parseCffDict(data: Uint8Array<ArrayBuffer>): CffDict | undefined;
16
+ //#endregion
17
+ export { CFF_DICT_OP_CHARSET, CFF_DICT_OP_CHARSTRINGS, CFF_DICT_OP_PRIVATE, CFF_DICT_OP_ROS, CFF_DICT_OP_SUBRS, CFF_ESCAPED_OPERATOR_BASE, CffDict, CffIndex, parseCffDict, readCffIndex };