pdf-parser.js 5.2.26 → 5.2.28

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 (221) hide show
  1. package/dist/{afm-widths-BYiX2L9D.cjs → afm-widths-BHD2HZIL.cjs} +553 -642
  2. package/dist/{afm-widths-blUDDjlI.js → afm-widths-B_IGbGky.js} +553 -642
  3. package/dist/afm-widths.cjs +1 -1
  4. package/dist/afm-widths.js +1 -1
  5. package/dist/annotations.cjs +5 -3
  6. package/dist/annotations.d.cts +2 -2
  7. package/dist/annotations.d.ts +2 -2
  8. package/dist/annotations.js +5 -3
  9. package/dist/attachments.d.cts +2 -2
  10. package/dist/attachments.d.ts +2 -2
  11. package/dist/builtin-encoding.cjs +17 -6
  12. package/dist/builtin-encoding.js +17 -6
  13. package/dist/bytes/crc32.cjs +5 -3
  14. package/dist/bytes/crc32.js +5 -3
  15. package/dist/bytes/flate.cjs +0 -1
  16. package/dist/bytes/flate.js +0 -1
  17. package/dist/cff-bounds.cjs +73 -45
  18. package/dist/cff-bounds.js +73 -45
  19. package/dist/cff.cjs +13 -6
  20. package/dist/cff.js +13 -6
  21. package/dist/cmap-table.cjs +54 -26
  22. package/dist/cmap-table.js +54 -26
  23. package/dist/cmap.cjs +5 -3
  24. package/dist/cmap.js +5 -3
  25. package/dist/content-read.d.cts +1 -1
  26. package/dist/content-read.d.ts +1 -1
  27. package/dist/content-write.cjs +21 -14
  28. package/dist/content-write.d.cts +2 -2
  29. package/dist/content-write.d.ts +2 -2
  30. package/dist/content-write.js +21 -14
  31. package/dist/crypto/aes.cjs +76 -55
  32. package/dist/crypto/aes.js +76 -55
  33. package/dist/crypto/md5.cjs +345 -149
  34. package/dist/crypto/md5.js +345 -149
  35. package/dist/crypto/rc4.cjs +5 -4
  36. package/dist/crypto/rc4.js +5 -4
  37. package/dist/crypto/sha2.cjs +92 -43
  38. package/dist/crypto/sha2.js +92 -43
  39. package/dist/document.cjs +17 -11
  40. package/dist/document.d.cts +1 -1
  41. package/dist/document.d.ts +1 -1
  42. package/dist/document.js +17 -11
  43. package/dist/{embedded-font-Bnhh4juV.d.ts → embedded-font-ByD7ZiQS.d.ts} +1 -1
  44. package/dist/{embedded-font-CEf-zBCA.d.cts → embedded-font-DgVBedw6.d.cts} +1 -1
  45. package/dist/embedded-font-write.d.cts +2 -2
  46. package/dist/embedded-font-write.d.ts +2 -2
  47. package/dist/embedded-font.cjs +4 -2
  48. package/dist/embedded-font.d.cts +1 -1
  49. package/dist/embedded-font.d.ts +1 -1
  50. package/dist/embedded-font.js +4 -2
  51. package/dist/encoding.cjs +1 -1
  52. package/dist/encoding.js +1 -1
  53. package/dist/encrypt-write.cjs +25 -21
  54. package/dist/encrypt-write.d.cts +1 -1
  55. package/dist/encrypt-write.d.ts +1 -1
  56. package/dist/encrypt-write.js +25 -21
  57. package/dist/encrypt.cjs +43 -64
  58. package/dist/encrypt.d.cts +1 -1
  59. package/dist/encrypt.d.ts +1 -1
  60. package/dist/encrypt.js +43 -64
  61. package/dist/filters.cjs +46 -26
  62. package/dist/filters.d.cts +1 -1
  63. package/dist/filters.d.ts +1 -1
  64. package/dist/filters.js +46 -26
  65. package/dist/font-face.cjs +2 -1
  66. package/dist/font-face.js +2 -1
  67. package/dist/font-read.cjs +12 -6
  68. package/dist/font-read.d.cts +1 -1
  69. package/dist/font-read.d.ts +1 -1
  70. package/dist/font-read.js +12 -6
  71. package/dist/font-registry.d.cts +3 -3
  72. package/dist/font-registry.d.ts +3 -3
  73. package/dist/font-tables.cjs +55 -28
  74. package/dist/font-tables.js +55 -28
  75. package/dist/form.cjs +13 -8
  76. package/dist/form.d.cts +2 -2
  77. package/dist/form.d.ts +2 -2
  78. package/dist/form.js +13 -8
  79. package/dist/gdef-table.cjs +6 -3
  80. package/dist/gdef-table.js +6 -3
  81. package/dist/{glyf-contours-C0epBNqP.d.ts → glyf-contours-B1PsI9oA.d.ts} +1 -1
  82. package/dist/{glyf-contours-BRpvd0rt.d.cts → glyf-contours-NHBpgks-.d.cts} +1 -1
  83. package/dist/glyf-contours.cjs +3 -1
  84. package/dist/glyf-contours.d.cts +1 -1
  85. package/dist/glyf-contours.d.ts +1 -1
  86. package/dist/glyf-contours.js +3 -1
  87. package/dist/glyf.cjs +22 -11
  88. package/dist/glyf.js +22 -11
  89. package/dist/gpos-table.cjs +37 -19
  90. package/dist/gpos-table.js +37 -19
  91. package/dist/gsub-table.cjs +40 -25
  92. package/dist/gsub-table.js +40 -25
  93. package/dist/hmtx-table.cjs +5 -3
  94. package/dist/hmtx-table.js +5 -3
  95. package/dist/image/ccitt-encode.cjs +8 -5
  96. package/dist/image/ccitt-encode.js +8 -5
  97. package/dist/image/ccitt.cjs +801 -209
  98. package/dist/image/ccitt.js +801 -209
  99. package/dist/image/jbig2-arith.cjs +340 -306
  100. package/dist/image/jbig2-arith.js +340 -306
  101. package/dist/image/jbig2-bitmap.cjs +8 -5
  102. package/dist/image/jbig2-bitmap.js +8 -5
  103. package/dist/image/jbig2-generic.cjs +240 -69
  104. package/dist/image/jbig2-generic.js +240 -69
  105. package/dist/image/jbig2-text.cjs +4 -2
  106. package/dist/image/jbig2-text.js +4 -2
  107. package/dist/image/jbig2.cjs +69 -31
  108. package/dist/image/jbig2.js +69 -31
  109. package/dist/image/jp2-boxes.cjs +52 -27
  110. package/dist/image/jp2-boxes.js +52 -27
  111. package/dist/image/jpeg-info.cjs +29 -24
  112. package/dist/image/jpeg-info.js +29 -24
  113. package/dist/image/jpeg2000-codestream.cjs +61 -32
  114. package/dist/image/jpeg2000-codestream.js +61 -32
  115. package/dist/image/jpeg2000-dwt.cjs +2 -1
  116. package/dist/image/jpeg2000-dwt.js +2 -1
  117. package/dist/image/jpeg2000-t1.cjs +21 -11
  118. package/dist/image/jpeg2000-t1.js +21 -11
  119. package/dist/image/jpeg2000-t2.cjs +12 -5
  120. package/dist/image/jpeg2000-t2.js +12 -5
  121. package/dist/image/jpeg2000-tagtree.cjs +8 -4
  122. package/dist/image/jpeg2000-tagtree.js +8 -4
  123. package/dist/image/jpeg2000.cjs +11 -6
  124. package/dist/image/jpeg2000.js +11 -6
  125. package/dist/image/png-decode.cjs +62 -39
  126. package/dist/image/png-decode.d.cts +3 -2
  127. package/dist/image/png-decode.d.ts +3 -2
  128. package/dist/image/png-decode.js +62 -39
  129. package/dist/image/png-filter.cjs +23 -15
  130. package/dist/image/png-filter.js +23 -15
  131. package/dist/images-read.cjs +41 -36
  132. package/dist/images-read.d.cts +2 -2
  133. package/dist/images-read.d.ts +2 -2
  134. package/dist/images-read.js +41 -36
  135. package/dist/index.cjs +1 -1
  136. package/dist/index.d.cts +1 -1
  137. package/dist/index.d.ts +1 -1
  138. package/dist/index.js +1 -1
  139. package/dist/interpret.cjs +68 -40
  140. package/dist/interpret.d.cts +1 -1
  141. package/dist/interpret.d.ts +1 -1
  142. package/dist/interpret.js +68 -40
  143. package/dist/lexer.cjs +86 -51
  144. package/dist/lexer.js +86 -51
  145. package/dist/math-content-write.cjs +9 -5
  146. package/dist/math-content-write.js +9 -5
  147. package/dist/math-font-write.cjs +2 -1
  148. package/dist/math-font-write.d.cts +1 -1
  149. package/dist/math-font-write.d.ts +1 -1
  150. package/dist/math-font-write.js +2 -1
  151. package/dist/math-font.cjs +16 -7
  152. package/dist/math-font.js +16 -7
  153. package/dist/math-table.cjs +25 -13
  154. package/dist/math-table.js +25 -13
  155. package/dist/matrix.cjs +3 -2
  156. package/dist/matrix.js +3 -2
  157. package/dist/measure.cjs +1 -1
  158. package/dist/measure.js +1 -1
  159. package/dist/names.cjs +7 -7
  160. package/dist/names.d.cts +2 -2
  161. package/dist/names.d.ts +2 -2
  162. package/dist/names.js +7 -7
  163. package/dist/navigation.cjs +16 -12
  164. package/dist/navigation.d.cts +4 -4
  165. package/dist/navigation.d.ts +4 -4
  166. package/dist/navigation.js +16 -12
  167. package/dist/{objects-B7HdMeWS.d.cts → objects-e2RS3-yT.d.cts} +3 -3
  168. package/dist/{objects-B7HdMeWS.d.ts → objects-e2RS3-yT.d.ts} +3 -3
  169. package/dist/objects.d.cts +1 -1
  170. package/dist/objects.d.ts +1 -1
  171. package/dist/optional-content.d.cts +2 -2
  172. package/dist/optional-content.d.ts +2 -2
  173. package/dist/ot-layout-common.cjs +22 -15
  174. package/dist/ot-layout-common.js +22 -15
  175. package/dist/parse.cjs +7 -5
  176. package/dist/parse.d.cts +1 -1
  177. package/dist/parse.d.ts +1 -1
  178. package/dist/parse.js +7 -5
  179. package/dist/pdf-text.cjs +5 -2
  180. package/dist/pdf-text.js +5 -2
  181. package/dist/predictors.cjs +14 -9
  182. package/dist/predictors.d.cts +1 -1
  183. package/dist/predictors.d.ts +1 -1
  184. package/dist/predictors.js +14 -9
  185. package/dist/raster.cjs +30 -19
  186. package/dist/raster.d.cts +8 -8
  187. package/dist/raster.d.ts +8 -8
  188. package/dist/raster.js +30 -19
  189. package/dist/read.cjs +29 -16
  190. package/dist/read.js +29 -16
  191. package/dist/serialize.cjs +6 -2
  192. package/dist/serialize.d.cts +1 -1
  193. package/dist/serialize.d.ts +1 -1
  194. package/dist/serialize.js +6 -2
  195. package/dist/sfnt-subset.cjs +25 -13
  196. package/dist/sfnt-subset.d.cts +1 -1
  197. package/dist/sfnt-subset.d.ts +1 -1
  198. package/dist/sfnt-subset.js +25 -13
  199. package/dist/sfnt.cjs +20 -10
  200. package/dist/sfnt.js +20 -10
  201. package/dist/structure.d.cts +2 -2
  202. package/dist/structure.d.ts +2 -2
  203. package/dist/text-group.cjs +0 -1
  204. package/dist/text-group.js +0 -1
  205. package/dist/text-layout.d.cts +1 -1
  206. package/dist/text-layout.d.ts +1 -1
  207. package/dist/tounicode.cjs +4 -2
  208. package/dist/tounicode.d.cts +1 -1
  209. package/dist/tounicode.d.ts +1 -1
  210. package/dist/tounicode.js +4 -2
  211. package/dist/winansi.cjs +1 -1
  212. package/dist/winansi.js +1 -1
  213. package/dist/write.cjs +20 -12
  214. package/dist/write.d.cts +1 -1
  215. package/dist/write.d.ts +1 -1
  216. package/dist/write.js +20 -12
  217. package/dist/xref.cjs +5 -2
  218. package/dist/xref.d.cts +1 -1
  219. package/dist/xref.d.ts +1 -1
  220. package/dist/xref.js +5 -2
  221. package/package.json +1 -1
@@ -16,6 +16,11 @@ const CS_OPERAND_MEDIUM_BIAS = 108;
16
16
  const CS_OPERAND_MEDIUM_FIRST_BYTE_BIAS = 247;
17
17
  const CS_OPERAND_NEGATIVE_MEDIUM_FIRST_BYTE_BIAS = 251;
18
18
  const BYTE_RADIX = 256;
19
+ const INT16_SIGN_BIT = 32768;
20
+ const INT16_MODULUS = 65536;
21
+ const CS_OPERAND_INT16_TOTAL_LENGTH = 3;
22
+ const CS_OPERAND_FIXED_BYTE_LENGTH = 4;
23
+ const CS_OPERAND_FIXED_TOTAL_LENGTH = 5;
19
24
  const FIXED_POINT_SCALE = 65536;
20
25
  const OP_HSTEM = 1;
21
26
  const OP_VSTEM = 3;
@@ -52,6 +57,13 @@ const SUBR_BIAS_MEDIUM = 1131;
52
57
  const SUBR_BIAS_LARGE = 32768;
53
58
  const HINT_MASK_BITS_PER_BYTE = 8;
54
59
  const STEM_ARGS_PER_STEM = 2;
60
+ const CURVE_ARG_COUNT = 6;
61
+ const CURVE_DY2_OFFSET = 3;
62
+ const CURVE_DX3_OFFSET = 4;
63
+ const CURVE_DY3_OFFSET = 5;
64
+ const QUAD_CURVE_ARG_COUNT = 4;
65
+ const QUAD_CURVE_LAST_OFFSET = 3;
66
+ const QUAD_CURVE_WITH_EXTRA_ARG_COUNT = 5;
55
67
  const MAX_OPERAND_STACK = 48;
56
68
  const MAX_SUBR_DEPTH = 10;
57
69
  const MAX_OPERATIONS_PER_GLYPH = 1e5;
@@ -61,28 +73,48 @@ function subrBias(count) {
61
73
  if (count < SUBR_BIAS_MEDIUM_LIMIT) return SUBR_BIAS_MEDIUM;
62
74
  return SUBR_BIAS_LARGE;
63
75
  }
64
- function includePoint(box, x, y) {
65
- box.minX = Math.min(box.minX, x);
66
- box.minY = Math.min(box.minY, y);
67
- box.maxX = Math.max(box.maxX, x);
68
- box.maxY = Math.max(box.maxY, y);
69
- box.drawn = true;
70
- }
76
+ var BoundsBox = class {
77
+ minX = Infinity;
78
+ minY = Infinity;
79
+ maxX = -Infinity;
80
+ maxY = -Infinity;
81
+ drawn = false;
82
+ includePoint(x, y) {
83
+ this.minX = Math.min(this.minX, x);
84
+ this.minY = Math.min(this.minY, y);
85
+ this.maxX = Math.max(this.maxX, x);
86
+ this.maxY = Math.max(this.maxY, y);
87
+ this.drawn = true;
88
+ }
89
+ includeXExtent(value) {
90
+ this.minX = Math.min(this.minX, value);
91
+ this.maxX = Math.max(this.maxX, value);
92
+ }
93
+ includeYExtent(value) {
94
+ this.minY = Math.min(this.minY, value);
95
+ this.maxY = Math.max(this.maxY, value);
96
+ }
97
+ markDrawn() {
98
+ this.drawn = true;
99
+ }
100
+ };
101
+ const CUBIC_BERNSTEIN_COEFFICIENT = 3;
102
+ const QUADRATIC_FORMULA_COEFFICIENT = 4;
71
103
  function cubicAt(p0, p1, p2, p3, t) {
72
104
  const s = 1 - t;
73
- return s * s * s * p0 + 3 * s * s * t * p1 + 3 * s * t * t * p2 + t * t * t * p3;
105
+ return s * s * s * p0 + CUBIC_BERNSTEIN_COEFFICIENT * s * s * t * p1 + CUBIC_BERNSTEIN_COEFFICIENT * s * t * t * p2 + t * t * t * p3;
74
106
  }
75
107
  function includeCubicAxis(p0, p1, p2, p3, apply) {
76
108
  apply(p0);
77
109
  apply(p3);
78
- const a = -p0 + 3 * p1 - 3 * p2 + p3;
110
+ const a = -p0 + CUBIC_BERNSTEIN_COEFFICIENT * p1 - CUBIC_BERNSTEIN_COEFFICIENT * p2 + p3;
79
111
  const b = 2 * (p0 - 2 * p1 + p2);
80
112
  const c = p1 - p0;
81
113
  const roots = [];
82
114
  if (a === 0) {
83
115
  if (b !== 0) roots.push(-c / b);
84
116
  } else {
85
- const discriminant = b * b - 4 * a * c;
117
+ const discriminant = b * b - QUADRATIC_FORMULA_COEFFICIENT * a * c;
86
118
  if (discriminant >= 0) {
87
119
  const root = Math.sqrt(discriminant);
88
120
  roots.push((-b + root) / (2 * a), (-b - root) / (2 * a));
@@ -92,14 +124,12 @@ function includeCubicAxis(p0, p1, p2, p3, apply) {
92
124
  }
93
125
  function includeCubic(box, x0, y0, x1, y1, x2, y2, x3, y3) {
94
126
  includeCubicAxis(x0, x1, x2, x3, (value) => {
95
- box.minX = Math.min(box.minX, value);
96
- box.maxX = Math.max(box.maxX, value);
127
+ box.includeXExtent(value);
97
128
  });
98
129
  includeCubicAxis(y0, y1, y2, y3, (value) => {
99
- box.minY = Math.min(box.minY, value);
100
- box.maxY = Math.max(box.maxY, value);
130
+ box.includeYExtent(value);
101
131
  });
102
- box.drawn = true;
132
+ box.markDrawn();
103
133
  }
104
134
  function curveTo(state, dx1, dy1, dx2, dy2, dx3, dy3) {
105
135
  const x0 = state.x;
@@ -115,10 +145,10 @@ function curveTo(state, dx1, dy1, dx2, dy2, dx3, dy3) {
115
145
  state.y = y3;
116
146
  }
117
147
  function lineTo(state, dx, dy) {
118
- includePoint(state.box, state.x, state.y);
148
+ state.box.includePoint(state.x, state.y);
119
149
  state.x += dx;
120
150
  state.y += dy;
121
- includePoint(state.box, state.x, state.y);
151
+ state.box.includePoint(state.x, state.y);
122
152
  }
123
153
  function moveTo(state, dx, dy) {
124
154
  state.x += dx;
@@ -135,15 +165,15 @@ function readOperand(code, offset) {
135
165
  if (!hasBytes(code, offset + 1, 2)) return;
136
166
  const raw = u16(code, offset + 1);
137
167
  return {
138
- value: raw >= 32768 ? raw - 65536 : raw,
139
- endOffset: offset + 3
168
+ value: raw >= INT16_SIGN_BIT ? raw - INT16_MODULUS : raw,
169
+ endOffset: offset + CS_OPERAND_INT16_TOTAL_LENGTH
140
170
  };
141
171
  }
142
172
  if (b0 === CS_OPERAND_FIXED) {
143
- if (!hasBytes(code, offset + 1, 4)) return;
173
+ if (!hasBytes(code, offset + 1, CS_OPERAND_FIXED_BYTE_LENGTH)) return;
144
174
  return {
145
175
  value: (u32(code, offset + 1) | 0) / FIXED_POINT_SCALE,
146
- endOffset: offset + 5
176
+ endOffset: offset + CS_OPERAND_FIXED_TOTAL_LENGTH
147
177
  };
148
178
  }
149
179
  if (b0 >= CS_OPERAND_SMALL_FIRST && b0 <= CS_OPERAND_SMALL_LAST) return {
@@ -230,20 +260,20 @@ function execute(code, state, context, depth) {
230
260
  break;
231
261
  }
232
262
  case OP_RRCURVETO:
233
- 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]);
263
+ for (let k = 0; k + CURVE_DY3_OFFSET < stack.length; k += CURVE_ARG_COUNT) curveTo(state, stack[k], stack[k + 1], stack[k + 2], stack[k + CURVE_DY2_OFFSET], stack[k + CURVE_DX3_OFFSET], stack[k + CURVE_DY3_OFFSET]);
234
264
  stack.length = 0;
235
265
  break;
236
266
  case OP_RCURVELINE: {
237
267
  let k = 0;
238
- 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]);
268
+ for (; k + CURVE_DY3_OFFSET < stack.length - 2; k += CURVE_ARG_COUNT) curveTo(state, stack[k], stack[k + 1], stack[k + 2], stack[k + CURVE_DY2_OFFSET], stack[k + CURVE_DX3_OFFSET], stack[k + CURVE_DY3_OFFSET]);
239
269
  if (k + 1 < stack.length) lineTo(state, stack[k], stack[k + 1]);
240
270
  stack.length = 0;
241
271
  break;
242
272
  }
243
273
  case OP_RLINECURVE: {
244
274
  let k = 0;
245
- for (; k + 1 < stack.length - 6; k += 2) lineTo(state, stack[k], stack[k + 1]);
246
- if (k + 5 < stack.length) curveTo(state, stack[k], stack[k + 1], stack[k + 2], stack[k + 3], stack[k + 4], stack[k + 5]);
275
+ for (; k + 1 < stack.length - CURVE_ARG_COUNT; k += 2) lineTo(state, stack[k], stack[k + 1]);
276
+ if (k + CURVE_DY3_OFFSET < stack.length) curveTo(state, stack[k], stack[k + 1], stack[k + 2], stack[k + CURVE_DY2_OFFSET], stack[k + CURVE_DX3_OFFSET], stack[k + CURVE_DY3_OFFSET]);
247
277
  stack.length = 0;
248
278
  break;
249
279
  }
@@ -251,14 +281,14 @@ function execute(code, state, context, depth) {
251
281
  case OP_HHCURVETO: {
252
282
  let k = 0;
253
283
  let firstCross = 0;
254
- if (stack.length % 4 === 1) {
284
+ if (stack.length % QUAD_CURVE_ARG_COUNT === 1) {
255
285
  firstCross = stack[0];
256
286
  k = 1;
257
287
  }
258
- for (; k + 3 < stack.length; k += 4) {
288
+ for (; k + QUAD_CURVE_LAST_OFFSET < stack.length; k += QUAD_CURVE_ARG_COUNT) {
259
289
  const cross = k <= 1 ? firstCross : 0;
260
- if (b0 === OP_VVCURVETO) curveTo(state, cross, stack[k], stack[k + 1], stack[k + 2], 0, stack[k + 3]);
261
- else curveTo(state, stack[k], cross, stack[k + 1], stack[k + 2], stack[k + 3], 0);
290
+ if (b0 === OP_VVCURVETO) curveTo(state, cross, stack[k], stack[k + 1], stack[k + 2], 0, stack[k + QUAD_CURVE_LAST_OFFSET]);
291
+ else curveTo(state, stack[k], cross, stack[k + 1], stack[k + 2], stack[k + QUAD_CURVE_LAST_OFFSET], 0);
262
292
  }
263
293
  stack.length = 0;
264
294
  break;
@@ -267,11 +297,11 @@ function execute(code, state, context, depth) {
267
297
  case OP_HVCURVETO: {
268
298
  let horizontal = b0 === OP_HVCURVETO;
269
299
  let k = 0;
270
- while (stack.length - k >= 4) {
271
- const extra = stack.length - k === 5 ? stack[k + 4] : 0;
272
- if (horizontal) curveTo(state, stack[k], 0, stack[k + 1], stack[k + 2], extra, stack[k + 3]);
273
- else curveTo(state, 0, stack[k], stack[k + 1], stack[k + 2], stack[k + 3], extra);
274
- k += 4;
300
+ while (stack.length - k >= QUAD_CURVE_ARG_COUNT) {
301
+ const extra = stack.length - k === QUAD_CURVE_WITH_EXTRA_ARG_COUNT ? stack[k + QUAD_CURVE_ARG_COUNT] : 0;
302
+ if (horizontal) curveTo(state, stack[k], 0, stack[k + 1], stack[k + 2], extra, stack[k + QUAD_CURVE_LAST_OFFSET]);
303
+ else curveTo(state, 0, stack[k], stack[k + 1], stack[k + 2], stack[k + QUAD_CURVE_LAST_OFFSET], extra);
304
+ k += QUAD_CURVE_ARG_COUNT;
275
305
  horizontal = !horizontal;
276
306
  }
277
307
  stack.length = 0;
@@ -306,25 +336,29 @@ function execute(code, state, context, depth) {
306
336
  }
307
337
  return true;
308
338
  }
339
+ const FLEX_ARG_COUNT = 13;
340
+ const HFLEX_ARG_COUNT = 7;
341
+ const HFLEX1_ARG_COUNT = 9;
342
+ const FLEX1_ARG_COUNT = 11;
309
343
  function executeEscaped(operator, state) {
310
344
  const stack = state.stack;
311
345
  const startY = state.y;
312
346
  if (operator === ESC_FLEX) {
313
- if (stack.length < 13) return false;
347
+ if (stack.length < FLEX_ARG_COUNT) return false;
314
348
  curveTo(state, stack[0], stack[1], stack[2], stack[3], stack[4], stack[5]);
315
349
  curveTo(state, stack[6], stack[7], stack[8], stack[9], stack[10], stack[11]);
316
350
  stack.length = 0;
317
351
  return true;
318
352
  }
319
353
  if (operator === ESC_HFLEX) {
320
- if (stack.length < 7) return false;
354
+ if (stack.length < HFLEX_ARG_COUNT) return false;
321
355
  curveTo(state, stack[0], 0, stack[1], stack[2], stack[3], 0);
322
356
  curveTo(state, stack[4], 0, stack[5], -stack[2], stack[6], 0);
323
357
  stack.length = 0;
324
358
  return true;
325
359
  }
326
360
  if (operator === ESC_HFLEX1) {
327
- if (stack.length < 9) return false;
361
+ if (stack.length < HFLEX1_ARG_COUNT) return false;
328
362
  curveTo(state, stack[0], stack[1], stack[2], stack[3], stack[4], 0);
329
363
  const dy5 = stack[7];
330
364
  curveTo(state, stack[5], 0, stack[6], dy5, stack[8], startY - (state.y + dy5));
@@ -332,7 +366,7 @@ function executeEscaped(operator, state) {
332
366
  return true;
333
367
  }
334
368
  if (operator === ESC_FLEX1) {
335
- if (stack.length < 11) return false;
369
+ if (stack.length < FLEX1_ARG_COUNT) return false;
336
370
  const startX = state.x;
337
371
  let dx = 0;
338
372
  let dy = 0;
@@ -407,13 +441,7 @@ function computeBounds(glyphId, context) {
407
441
  stems: 0,
408
442
  widthParsed: false,
409
443
  operations: 0,
410
- box: {
411
- minX: Infinity,
412
- minY: Infinity,
413
- maxX: -Infinity,
414
- maxY: -Infinity,
415
- drawn: false
416
- }
444
+ box: new BoundsBox()
417
445
  };
418
446
  if (!execute(code, state, context, 0) || !state.box.drawn) return;
419
447
  return {
package/dist/cff.cjs CHANGED
@@ -12,6 +12,7 @@ const INDEX_COUNT_SIZE = 2;
12
12
  const INDEX_OFF_SIZE_SIZE = 1;
13
13
  const MIN_OFF_SIZE = 1;
14
14
  const MAX_OFF_SIZE = 4;
15
+ const OFF_SIZE_3_BYTES = 3;
15
16
  const DICT_OPERATOR_MAX = 21;
16
17
  const DICT_OPERATOR_ESCAPE = 12;
17
18
  const DICT_OPERAND_INT16 = 28;
@@ -28,6 +29,12 @@ const DICT_OPERAND_MEDIUM_BIAS = 108;
28
29
  const DICT_OPERAND_MEDIUM_FIRST_BYTE_BIAS = 247;
29
30
  const DICT_OPERAND_NEGATIVE_MEDIUM_FIRST_BYTE_BIAS = 251;
30
31
  const BYTE_RADIX = 256;
32
+ const INT16_SIGN_BIT = 32768;
33
+ const UINT16_MODULUS = 65536;
34
+ const DICT_OPERAND_INT16_TOTAL_SIZE = 3;
35
+ const INT32_SIZE_BYTES = 4;
36
+ const DICT_OPERAND_INT32_TOTAL_SIZE = 5;
37
+ const REAL_NIBBLE_DIGIT_MAX = 9;
31
38
  const REAL_NIBBLE_DECIMAL_POINT = 10;
32
39
  const REAL_NIBBLE_EXPONENT = 11;
33
40
  const REAL_NIBBLE_NEGATIVE_EXPONENT = 12;
@@ -39,7 +46,7 @@ const LOW_NIBBLE_MASK = 15;
39
46
  function readOffsetAt(bytes, offset, offSize) {
40
47
  if (offSize === 1) return require_sfnt.u8(bytes, offset);
41
48
  if (offSize === 2) return require_sfnt.u16(bytes, offset);
42
- if (offSize === 3) return require_sfnt.u24(bytes, offset);
49
+ if (offSize === OFF_SIZE_3_BYTES) return require_sfnt.u24(bytes, offset);
43
50
  return require_sfnt.u32(bytes, offset);
44
51
  }
45
52
  function readCffIndex(bytes, offset) {
@@ -80,7 +87,7 @@ function readRealOperand(data, start) {
80
87
  endOffset: i + 1
81
88
  };
82
89
  if (nibble === REAL_NIBBLE_RESERVED) return;
83
- if (nibble <= 9) text += String(nibble);
90
+ if (nibble <= REAL_NIBBLE_DIGIT_MAX) text += String(nibble);
84
91
  else if (nibble === REAL_NIBBLE_DECIMAL_POINT) text += ".";
85
92
  else if (nibble === REAL_NIBBLE_EXPONENT) text += "E";
86
93
  else if (nibble === REAL_NIBBLE_NEGATIVE_EXPONENT) text += "E-";
@@ -109,14 +116,14 @@ function parseCffDict(data) {
109
116
  if (b0 === DICT_OPERAND_INT16) {
110
117
  if (!require_sfnt.hasBytes(data, i + 1, 2)) return;
111
118
  const raw = require_sfnt.u16(data, i + 1);
112
- operands.push(raw >= 32768 ? raw - 65536 : raw);
113
- i += 3;
119
+ operands.push(raw >= INT16_SIGN_BIT ? raw - UINT16_MODULUS : raw);
120
+ i += DICT_OPERAND_INT16_TOTAL_SIZE;
114
121
  continue;
115
122
  }
116
123
  if (b0 === DICT_OPERAND_INT32) {
117
- if (!require_sfnt.hasBytes(data, i + 1, 4)) return;
124
+ if (!require_sfnt.hasBytes(data, i + 1, INT32_SIZE_BYTES)) return;
118
125
  operands.push(require_sfnt.u32(data, i + 1) | 0);
119
- i += 5;
126
+ i += DICT_OPERAND_INT32_TOTAL_SIZE;
120
127
  continue;
121
128
  }
122
129
  if (b0 === DICT_OPERAND_REAL) {
package/dist/cff.js CHANGED
@@ -11,6 +11,7 @@ const INDEX_COUNT_SIZE = 2;
11
11
  const INDEX_OFF_SIZE_SIZE = 1;
12
12
  const MIN_OFF_SIZE = 1;
13
13
  const MAX_OFF_SIZE = 4;
14
+ const OFF_SIZE_3_BYTES = 3;
14
15
  const DICT_OPERATOR_MAX = 21;
15
16
  const DICT_OPERATOR_ESCAPE = 12;
16
17
  const DICT_OPERAND_INT16 = 28;
@@ -27,6 +28,12 @@ const DICT_OPERAND_MEDIUM_BIAS = 108;
27
28
  const DICT_OPERAND_MEDIUM_FIRST_BYTE_BIAS = 247;
28
29
  const DICT_OPERAND_NEGATIVE_MEDIUM_FIRST_BYTE_BIAS = 251;
29
30
  const BYTE_RADIX = 256;
31
+ const INT16_SIGN_BIT = 32768;
32
+ const UINT16_MODULUS = 65536;
33
+ const DICT_OPERAND_INT16_TOTAL_SIZE = 3;
34
+ const INT32_SIZE_BYTES = 4;
35
+ const DICT_OPERAND_INT32_TOTAL_SIZE = 5;
36
+ const REAL_NIBBLE_DIGIT_MAX = 9;
30
37
  const REAL_NIBBLE_DECIMAL_POINT = 10;
31
38
  const REAL_NIBBLE_EXPONENT = 11;
32
39
  const REAL_NIBBLE_NEGATIVE_EXPONENT = 12;
@@ -38,7 +45,7 @@ const LOW_NIBBLE_MASK = 15;
38
45
  function readOffsetAt(bytes, offset, offSize) {
39
46
  if (offSize === 1) return u8(bytes, offset);
40
47
  if (offSize === 2) return u16(bytes, offset);
41
- if (offSize === 3) return u24(bytes, offset);
48
+ if (offSize === OFF_SIZE_3_BYTES) return u24(bytes, offset);
42
49
  return u32(bytes, offset);
43
50
  }
44
51
  function readCffIndex(bytes, offset) {
@@ -79,7 +86,7 @@ function readRealOperand(data, start) {
79
86
  endOffset: i + 1
80
87
  };
81
88
  if (nibble === REAL_NIBBLE_RESERVED) return;
82
- if (nibble <= 9) text += String(nibble);
89
+ if (nibble <= REAL_NIBBLE_DIGIT_MAX) text += String(nibble);
83
90
  else if (nibble === REAL_NIBBLE_DECIMAL_POINT) text += ".";
84
91
  else if (nibble === REAL_NIBBLE_EXPONENT) text += "E";
85
92
  else if (nibble === REAL_NIBBLE_NEGATIVE_EXPONENT) text += "E-";
@@ -108,14 +115,14 @@ function parseCffDict(data) {
108
115
  if (b0 === DICT_OPERAND_INT16) {
109
116
  if (!hasBytes(data, i + 1, 2)) return;
110
117
  const raw = u16(data, i + 1);
111
- operands.push(raw >= 32768 ? raw - 65536 : raw);
112
- i += 3;
118
+ operands.push(raw >= INT16_SIGN_BIT ? raw - UINT16_MODULUS : raw);
119
+ i += DICT_OPERAND_INT16_TOTAL_SIZE;
113
120
  continue;
114
121
  }
115
122
  if (b0 === DICT_OPERAND_INT32) {
116
- if (!hasBytes(data, i + 1, 4)) return;
123
+ if (!hasBytes(data, i + 1, INT32_SIZE_BYTES)) return;
117
124
  operands.push(u32(data, i + 1) | 0);
118
- i += 5;
125
+ i += DICT_OPERAND_INT32_TOTAL_SIZE;
119
126
  continue;
120
127
  }
121
128
  if (b0 === DICT_OPERAND_REAL) {
@@ -4,17 +4,28 @@ const require_sfnt = require("./sfnt.cjs");
4
4
  const CMAP_HEADER_SIZE = 4;
5
5
  const SUBTABLE_RECORD_SIZE = 8;
6
6
  const MAX_UNICODE_CODE_POINT = 1114111;
7
+ const SUBTABLE_RECORD_OFFSET_FIELD = 4;
8
+ const CMAP_FORMAT_4 = 4;
9
+ const CMAP_FORMAT_6 = 6;
10
+ const CMAP_FORMAT_12 = 12;
11
+ const INT16_SIGN_BIT = 32768;
12
+ const UINT16_MODULUS = 65536;
13
+ const UINT16_MASK = 65535;
7
14
  const FORMAT_4_HEADER_SIZE = 14;
15
+ const FORMAT_4_SEG_COUNT_X2_FIELD = 6;
16
+ const FORMAT_4_PARALLEL_ARRAY_COUNT = 4;
17
+ const MAX_BMP_CODE_POINT = 65535;
18
+ const LAST_MAPPABLE_BMP_CODE = 65534;
8
19
  function parseFormat4(bytes, subtableOffset) {
9
20
  if (!require_sfnt.hasBytes(bytes, subtableOffset, FORMAT_4_HEADER_SIZE)) return;
10
- const segCountX2 = require_sfnt.u16(bytes, subtableOffset + 6);
21
+ const segCountX2 = require_sfnt.u16(bytes, subtableOffset + FORMAT_4_SEG_COUNT_X2_FIELD);
11
22
  if (segCountX2 === 0 || segCountX2 % 2 !== 0) return;
12
23
  const segCount = segCountX2 / 2;
13
24
  const endCodesOffset = subtableOffset + FORMAT_4_HEADER_SIZE;
14
25
  const startCodesOffset = endCodesOffset + segCountX2 + 2;
15
26
  const idDeltasOffset = startCodesOffset + segCountX2;
16
27
  const idRangeOffsetsOffset = idDeltasOffset + segCountX2;
17
- if (!require_sfnt.hasBytes(bytes, endCodesOffset, segCountX2 * 4 + 2)) return;
28
+ if (!require_sfnt.hasBytes(bytes, endCodesOffset, segCountX2 * FORMAT_4_PARALLEL_ARRAY_COUNT + 2)) return;
18
29
  const segments = [];
19
30
  for (let i = 0; i < segCount; i++) {
20
31
  const idRangeOffsetPos = idRangeOffsetsOffset + i * 2;
@@ -22,27 +33,27 @@ function parseFormat4(bytes, subtableOffset) {
22
33
  segments.push({
23
34
  endCode: require_sfnt.u16(bytes, endCodesOffset + i * 2),
24
35
  startCode: require_sfnt.u16(bytes, startCodesOffset + i * 2),
25
- idDelta: rawDelta >= 32768 ? rawDelta - 65536 : rawDelta,
36
+ idDelta: rawDelta >= INT16_SIGN_BIT ? rawDelta - UINT16_MODULUS : rawDelta,
26
37
  idRangeOffsetPos,
27
38
  idRangeOffset: require_sfnt.u16(bytes, idRangeOffsetPos)
28
39
  });
29
40
  }
30
41
  const lookup = (codePoint) => {
31
- if (codePoint > 65535) return;
42
+ if (codePoint > MAX_BMP_CODE_POINT) return;
32
43
  for (const segment of segments) {
33
44
  if (codePoint < segment.startCode || codePoint > segment.endCode) continue;
34
- if (segment.idRangeOffset === 0) return codePoint + segment.idDelta & 65535;
45
+ if (segment.idRangeOffset === 0) return codePoint + segment.idDelta & UINT16_MASK;
35
46
  const glyphIndexAddress = segment.idRangeOffsetPos + segment.idRangeOffset + (codePoint - segment.startCode) * 2;
36
47
  if (!require_sfnt.hasBytes(bytes, glyphIndexAddress, 2)) return;
37
48
  const glyphId = require_sfnt.u16(bytes, glyphIndexAddress);
38
- return glyphId === 0 ? void 0 : glyphId + segment.idDelta & 65535;
49
+ return glyphId === 0 ? void 0 : glyphId + segment.idDelta & UINT16_MASK;
39
50
  }
40
51
  };
41
52
  return {
42
53
  lookup,
43
54
  forEachMapping(visit) {
44
55
  for (const segment of segments) {
45
- const end = Math.min(segment.endCode, 65534);
56
+ const end = Math.min(segment.endCode, LAST_MAPPABLE_BMP_CODE);
46
57
  for (let code = segment.startCode; code <= end; code++) {
47
58
  const glyphId = lookup(code);
48
59
  if (glyphId !== void 0 && glyphId !== 0) visit(code, glyphId);
@@ -52,10 +63,13 @@ function parseFormat4(bytes, subtableOffset) {
52
63
  };
53
64
  }
54
65
  const FORMAT_12_HEADER_SIZE = 16;
66
+ const FORMAT_12_NUM_GROUPS_FIELD = 12;
55
67
  const FORMAT_12_GROUP_SIZE = 12;
68
+ const FORMAT_12_GROUP_END_CHAR_CODE_FIELD = 4;
69
+ const FORMAT_12_GROUP_START_GLYPH_ID_FIELD = 8;
56
70
  function parseFormat12(bytes, subtableOffset) {
57
71
  if (!require_sfnt.hasBytes(bytes, subtableOffset, FORMAT_12_HEADER_SIZE)) return;
58
- const numGroups = require_sfnt.u32(bytes, subtableOffset + 12);
72
+ const numGroups = require_sfnt.u32(bytes, subtableOffset + FORMAT_12_NUM_GROUPS_FIELD);
59
73
  const groupsOffset = subtableOffset + FORMAT_12_HEADER_SIZE;
60
74
  if (!require_sfnt.hasBytes(bytes, groupsOffset, numGroups * FORMAT_12_GROUP_SIZE)) return;
61
75
  const groups = [];
@@ -63,8 +77,8 @@ function parseFormat12(bytes, subtableOffset) {
63
77
  const recordOffset = groupsOffset + i * FORMAT_12_GROUP_SIZE;
64
78
  groups.push({
65
79
  startCharCode: require_sfnt.u32(bytes, recordOffset),
66
- endCharCode: require_sfnt.u32(bytes, recordOffset + 4),
67
- startGlyphId: require_sfnt.u32(bytes, recordOffset + 8)
80
+ endCharCode: require_sfnt.u32(bytes, recordOffset + FORMAT_12_GROUP_END_CHAR_CODE_FIELD),
81
+ startGlyphId: require_sfnt.u32(bytes, recordOffset + FORMAT_12_GROUP_START_GLYPH_ID_FIELD)
68
82
  });
69
83
  }
70
84
  return {
@@ -80,18 +94,20 @@ function parseFormat12(bytes, subtableOffset) {
80
94
  };
81
95
  }
82
96
  const FORMAT_0_SIZE = 262;
97
+ const FORMAT_0_GLYPH_ID_ARRAY_OFFSET = 6;
98
+ const MAX_FORMAT_0_CODE = 255;
83
99
  function parseFormat0(bytes, subtableOffset) {
84
100
  if (!require_sfnt.hasBytes(bytes, subtableOffset, FORMAT_0_SIZE)) return;
85
- const glyphIdArrayOffset = subtableOffset + 6;
101
+ const glyphIdArrayOffset = subtableOffset + FORMAT_0_GLYPH_ID_ARRAY_OFFSET;
86
102
  const lookup = (codePoint) => {
87
- if (codePoint < 0 || codePoint > 255) return;
103
+ if (codePoint < 0 || codePoint > MAX_FORMAT_0_CODE) return;
88
104
  const glyphId = require_sfnt.u8(bytes, glyphIdArrayOffset + codePoint);
89
105
  return glyphId === 0 ? void 0 : glyphId;
90
106
  };
91
107
  return {
92
108
  lookup,
93
109
  forEachMapping(visit) {
94
- for (let code = 0; code <= 255; code++) {
110
+ for (let code = 0; code <= MAX_FORMAT_0_CODE; code++) {
95
111
  const glyphId = lookup(code);
96
112
  if (glyphId !== void 0) visit(code, glyphId);
97
113
  }
@@ -99,10 +115,12 @@ function parseFormat0(bytes, subtableOffset) {
99
115
  };
100
116
  }
101
117
  const FORMAT_6_HEADER_SIZE = 10;
118
+ const FORMAT_6_FIRST_CODE_FIELD = 6;
119
+ const FORMAT_6_ENTRY_COUNT_FIELD = 8;
102
120
  function parseFormat6(bytes, subtableOffset) {
103
121
  if (!require_sfnt.hasBytes(bytes, subtableOffset, FORMAT_6_HEADER_SIZE)) return;
104
- const firstCode = require_sfnt.u16(bytes, subtableOffset + 6);
105
- const entryCount = require_sfnt.u16(bytes, subtableOffset + 8);
122
+ const firstCode = require_sfnt.u16(bytes, subtableOffset + FORMAT_6_FIRST_CODE_FIELD);
123
+ const entryCount = require_sfnt.u16(bytes, subtableOffset + FORMAT_6_ENTRY_COUNT_FIELD);
106
124
  const glyphIdArrayOffset = subtableOffset + FORMAT_6_HEADER_SIZE;
107
125
  if (!require_sfnt.hasBytes(bytes, glyphIdArrayOffset, entryCount * 2)) return;
108
126
  const lookup = (codePoint) => {
@@ -122,19 +140,29 @@ function parseFormat6(bytes, subtableOffset) {
122
140
  }
123
141
  };
124
142
  }
143
+ const PLATFORM_WINDOWS = 3;
144
+ const PLATFORM_UNICODE = 0;
145
+ const ENCODING_WINDOWS_UCS4 = 10;
146
+ const ENCODING_WINDOWS_UNICODE_BMP = 1;
147
+ const RANK_WINDOWS_UCS4_FORMAT_12 = 0;
148
+ const RANK_UNICODE_FORMAT_12 = 1;
149
+ const RANK_OTHER_FORMAT_12 = 2;
150
+ const RANK_WINDOWS_BMP_FORMAT_4 = 3;
151
+ const RANK_OTHER_FORMAT_4 = 4;
152
+ const RANK_FORMAT_6 = 5;
125
153
  function preferenceRank(subtable) {
126
- if (subtable.format === 12) {
127
- if (subtable.platformId === 3 && subtable.encodingId === 10) return 0;
128
- if (subtable.platformId === 0) return 1;
129
- return 2;
154
+ if (subtable.format === CMAP_FORMAT_12) {
155
+ if (subtable.platformId === PLATFORM_WINDOWS && subtable.encodingId === ENCODING_WINDOWS_UCS4) return RANK_WINDOWS_UCS4_FORMAT_12;
156
+ if (subtable.platformId === PLATFORM_UNICODE) return RANK_UNICODE_FORMAT_12;
157
+ return RANK_OTHER_FORMAT_12;
130
158
  }
131
- if (subtable.format === 4) return subtable.platformId === 3 && subtable.encodingId === 1 ? 3 : 4;
132
- return 5;
159
+ if (subtable.format === CMAP_FORMAT_4) return subtable.platformId === PLATFORM_WINDOWS && subtable.encodingId === ENCODING_WINDOWS_UNICODE_BMP ? RANK_WINDOWS_BMP_FORMAT_4 : RANK_OTHER_FORMAT_4;
160
+ return RANK_FORMAT_6;
133
161
  }
134
162
  function parseSubtable(bytes, record) {
135
- if (record.format === 12) return parseFormat12(bytes, record.offset);
136
- if (record.format === 4) return parseFormat4(bytes, record.offset);
137
- if (record.format === 6) return parseFormat6(bytes, record.offset);
163
+ if (record.format === CMAP_FORMAT_12) return parseFormat12(bytes, record.offset);
164
+ if (record.format === CMAP_FORMAT_4) return parseFormat4(bytes, record.offset);
165
+ if (record.format === CMAP_FORMAT_6) return parseFormat6(bytes, record.offset);
138
166
  return record.format === 0 ? parseFormat0(bytes, record.offset) : void 0;
139
167
  }
140
168
  function readCmapSubtables(font) {
@@ -145,7 +173,7 @@ function readCmapSubtables(font) {
145
173
  const subtables = [];
146
174
  for (let i = 0; i < numTables; i++) {
147
175
  const recordOffset = CMAP_HEADER_SIZE + i * SUBTABLE_RECORD_SIZE;
148
- const offset = require_sfnt.u32(cmapBytes, recordOffset + 4);
176
+ const offset = require_sfnt.u32(cmapBytes, recordOffset + SUBTABLE_RECORD_OFFSET_FIELD);
149
177
  if (!require_sfnt.hasBytes(cmapBytes, offset, 2)) continue;
150
178
  const record = {
151
179
  platformId: require_sfnt.u16(cmapBytes, recordOffset),
@@ -164,7 +192,7 @@ function readCmapSubtables(font) {
164
192
  return subtables;
165
193
  }
166
194
  function buildCmapLookup(font) {
167
- return readCmapSubtables(font).filter((s) => s.format === 4 || s.format === 6 || s.format === 12).sort((a, b) => preferenceRank(a) - preferenceRank(b))[0]?.lookup;
195
+ return readCmapSubtables(font).filter((s) => s.format === CMAP_FORMAT_4 || s.format === CMAP_FORMAT_6 || s.format === CMAP_FORMAT_12).sort((a, b) => preferenceRank(a) - preferenceRank(b))[0]?.lookup;
168
196
  }
169
197
  //#endregion
170
198
  exports.buildCmapLookup = buildCmapLookup;