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.
- package/dist/{afm-widths-BYiX2L9D.cjs → afm-widths-BHD2HZIL.cjs} +553 -642
- package/dist/{afm-widths-blUDDjlI.js → afm-widths-B_IGbGky.js} +553 -642
- package/dist/afm-widths.cjs +1 -1
- package/dist/afm-widths.js +1 -1
- package/dist/annotations.cjs +5 -3
- package/dist/annotations.d.cts +2 -2
- package/dist/annotations.d.ts +2 -2
- package/dist/annotations.js +5 -3
- package/dist/attachments.d.cts +2 -2
- package/dist/attachments.d.ts +2 -2
- package/dist/builtin-encoding.cjs +17 -6
- package/dist/builtin-encoding.js +17 -6
- package/dist/bytes/crc32.cjs +5 -3
- package/dist/bytes/crc32.js +5 -3
- package/dist/bytes/flate.cjs +0 -1
- package/dist/bytes/flate.js +0 -1
- package/dist/cff-bounds.cjs +73 -45
- package/dist/cff-bounds.js +73 -45
- package/dist/cff.cjs +13 -6
- package/dist/cff.js +13 -6
- package/dist/cmap-table.cjs +54 -26
- package/dist/cmap-table.js +54 -26
- package/dist/cmap.cjs +5 -3
- package/dist/cmap.js +5 -3
- package/dist/content-read.d.cts +1 -1
- package/dist/content-read.d.ts +1 -1
- package/dist/content-write.cjs +21 -14
- package/dist/content-write.d.cts +2 -2
- package/dist/content-write.d.ts +2 -2
- package/dist/content-write.js +21 -14
- package/dist/crypto/aes.cjs +76 -55
- package/dist/crypto/aes.js +76 -55
- package/dist/crypto/md5.cjs +345 -149
- package/dist/crypto/md5.js +345 -149
- package/dist/crypto/rc4.cjs +5 -4
- package/dist/crypto/rc4.js +5 -4
- package/dist/crypto/sha2.cjs +92 -43
- package/dist/crypto/sha2.js +92 -43
- package/dist/document.cjs +17 -11
- package/dist/document.d.cts +1 -1
- package/dist/document.d.ts +1 -1
- package/dist/document.js +17 -11
- package/dist/{embedded-font-Bnhh4juV.d.ts → embedded-font-ByD7ZiQS.d.ts} +1 -1
- package/dist/{embedded-font-CEf-zBCA.d.cts → embedded-font-DgVBedw6.d.cts} +1 -1
- package/dist/embedded-font-write.d.cts +2 -2
- package/dist/embedded-font-write.d.ts +2 -2
- package/dist/embedded-font.cjs +4 -2
- package/dist/embedded-font.d.cts +1 -1
- package/dist/embedded-font.d.ts +1 -1
- package/dist/embedded-font.js +4 -2
- package/dist/encoding.cjs +1 -1
- package/dist/encoding.js +1 -1
- package/dist/encrypt-write.cjs +25 -21
- package/dist/encrypt-write.d.cts +1 -1
- package/dist/encrypt-write.d.ts +1 -1
- package/dist/encrypt-write.js +25 -21
- package/dist/encrypt.cjs +43 -64
- package/dist/encrypt.d.cts +1 -1
- package/dist/encrypt.d.ts +1 -1
- package/dist/encrypt.js +43 -64
- package/dist/filters.cjs +46 -26
- package/dist/filters.d.cts +1 -1
- package/dist/filters.d.ts +1 -1
- package/dist/filters.js +46 -26
- package/dist/font-face.cjs +2 -1
- package/dist/font-face.js +2 -1
- package/dist/font-read.cjs +12 -6
- package/dist/font-read.d.cts +1 -1
- package/dist/font-read.d.ts +1 -1
- package/dist/font-read.js +12 -6
- package/dist/font-registry.d.cts +3 -3
- package/dist/font-registry.d.ts +3 -3
- package/dist/font-tables.cjs +55 -28
- package/dist/font-tables.js +55 -28
- package/dist/form.cjs +13 -8
- package/dist/form.d.cts +2 -2
- package/dist/form.d.ts +2 -2
- package/dist/form.js +13 -8
- package/dist/gdef-table.cjs +6 -3
- package/dist/gdef-table.js +6 -3
- package/dist/{glyf-contours-C0epBNqP.d.ts → glyf-contours-B1PsI9oA.d.ts} +1 -1
- package/dist/{glyf-contours-BRpvd0rt.d.cts → glyf-contours-NHBpgks-.d.cts} +1 -1
- package/dist/glyf-contours.cjs +3 -1
- package/dist/glyf-contours.d.cts +1 -1
- package/dist/glyf-contours.d.ts +1 -1
- package/dist/glyf-contours.js +3 -1
- package/dist/glyf.cjs +22 -11
- package/dist/glyf.js +22 -11
- package/dist/gpos-table.cjs +37 -19
- package/dist/gpos-table.js +37 -19
- package/dist/gsub-table.cjs +40 -25
- package/dist/gsub-table.js +40 -25
- package/dist/hmtx-table.cjs +5 -3
- package/dist/hmtx-table.js +5 -3
- package/dist/image/ccitt-encode.cjs +8 -5
- package/dist/image/ccitt-encode.js +8 -5
- package/dist/image/ccitt.cjs +801 -209
- package/dist/image/ccitt.js +801 -209
- package/dist/image/jbig2-arith.cjs +340 -306
- package/dist/image/jbig2-arith.js +340 -306
- package/dist/image/jbig2-bitmap.cjs +8 -5
- package/dist/image/jbig2-bitmap.js +8 -5
- package/dist/image/jbig2-generic.cjs +240 -69
- package/dist/image/jbig2-generic.js +240 -69
- package/dist/image/jbig2-text.cjs +4 -2
- package/dist/image/jbig2-text.js +4 -2
- package/dist/image/jbig2.cjs +69 -31
- package/dist/image/jbig2.js +69 -31
- package/dist/image/jp2-boxes.cjs +52 -27
- package/dist/image/jp2-boxes.js +52 -27
- package/dist/image/jpeg-info.cjs +29 -24
- package/dist/image/jpeg-info.js +29 -24
- package/dist/image/jpeg2000-codestream.cjs +61 -32
- package/dist/image/jpeg2000-codestream.js +61 -32
- package/dist/image/jpeg2000-dwt.cjs +2 -1
- package/dist/image/jpeg2000-dwt.js +2 -1
- package/dist/image/jpeg2000-t1.cjs +21 -11
- package/dist/image/jpeg2000-t1.js +21 -11
- package/dist/image/jpeg2000-t2.cjs +12 -5
- package/dist/image/jpeg2000-t2.js +12 -5
- package/dist/image/jpeg2000-tagtree.cjs +8 -4
- package/dist/image/jpeg2000-tagtree.js +8 -4
- package/dist/image/jpeg2000.cjs +11 -6
- package/dist/image/jpeg2000.js +11 -6
- package/dist/image/png-decode.cjs +62 -39
- package/dist/image/png-decode.d.cts +3 -2
- package/dist/image/png-decode.d.ts +3 -2
- package/dist/image/png-decode.js +62 -39
- package/dist/image/png-filter.cjs +23 -15
- package/dist/image/png-filter.js +23 -15
- package/dist/images-read.cjs +41 -36
- package/dist/images-read.d.cts +2 -2
- package/dist/images-read.d.ts +2 -2
- package/dist/images-read.js +41 -36
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/interpret.cjs +68 -40
- package/dist/interpret.d.cts +1 -1
- package/dist/interpret.d.ts +1 -1
- package/dist/interpret.js +68 -40
- package/dist/lexer.cjs +86 -51
- package/dist/lexer.js +86 -51
- package/dist/math-content-write.cjs +9 -5
- package/dist/math-content-write.js +9 -5
- package/dist/math-font-write.cjs +2 -1
- package/dist/math-font-write.d.cts +1 -1
- package/dist/math-font-write.d.ts +1 -1
- package/dist/math-font-write.js +2 -1
- package/dist/math-font.cjs +16 -7
- package/dist/math-font.js +16 -7
- package/dist/math-table.cjs +25 -13
- package/dist/math-table.js +25 -13
- package/dist/matrix.cjs +3 -2
- package/dist/matrix.js +3 -2
- package/dist/measure.cjs +1 -1
- package/dist/measure.js +1 -1
- package/dist/names.cjs +7 -7
- package/dist/names.d.cts +2 -2
- package/dist/names.d.ts +2 -2
- package/dist/names.js +7 -7
- package/dist/navigation.cjs +16 -12
- package/dist/navigation.d.cts +4 -4
- package/dist/navigation.d.ts +4 -4
- package/dist/navigation.js +16 -12
- package/dist/{objects-B7HdMeWS.d.cts → objects-e2RS3-yT.d.cts} +3 -3
- package/dist/{objects-B7HdMeWS.d.ts → objects-e2RS3-yT.d.ts} +3 -3
- package/dist/objects.d.cts +1 -1
- package/dist/objects.d.ts +1 -1
- package/dist/optional-content.d.cts +2 -2
- package/dist/optional-content.d.ts +2 -2
- package/dist/ot-layout-common.cjs +22 -15
- package/dist/ot-layout-common.js +22 -15
- package/dist/parse.cjs +7 -5
- package/dist/parse.d.cts +1 -1
- package/dist/parse.d.ts +1 -1
- package/dist/parse.js +7 -5
- package/dist/pdf-text.cjs +5 -2
- package/dist/pdf-text.js +5 -2
- package/dist/predictors.cjs +14 -9
- package/dist/predictors.d.cts +1 -1
- package/dist/predictors.d.ts +1 -1
- package/dist/predictors.js +14 -9
- package/dist/raster.cjs +30 -19
- package/dist/raster.d.cts +8 -8
- package/dist/raster.d.ts +8 -8
- package/dist/raster.js +30 -19
- package/dist/read.cjs +29 -16
- package/dist/read.js +29 -16
- package/dist/serialize.cjs +6 -2
- package/dist/serialize.d.cts +1 -1
- package/dist/serialize.d.ts +1 -1
- package/dist/serialize.js +6 -2
- package/dist/sfnt-subset.cjs +25 -13
- package/dist/sfnt-subset.d.cts +1 -1
- package/dist/sfnt-subset.d.ts +1 -1
- package/dist/sfnt-subset.js +25 -13
- package/dist/sfnt.cjs +20 -10
- package/dist/sfnt.js +20 -10
- package/dist/structure.d.cts +2 -2
- package/dist/structure.d.ts +2 -2
- package/dist/text-group.cjs +0 -1
- package/dist/text-group.js +0 -1
- package/dist/text-layout.d.cts +1 -1
- package/dist/text-layout.d.ts +1 -1
- package/dist/tounicode.cjs +4 -2
- package/dist/tounicode.d.cts +1 -1
- package/dist/tounicode.d.ts +1 -1
- package/dist/tounicode.js +4 -2
- package/dist/winansi.cjs +1 -1
- package/dist/winansi.js +1 -1
- package/dist/write.cjs +20 -12
- package/dist/write.d.cts +1 -1
- package/dist/write.d.ts +1 -1
- package/dist/write.js +20 -12
- package/dist/xref.cjs +5 -2
- package/dist/xref.d.cts +1 -1
- package/dist/xref.d.ts +1 -1
- package/dist/xref.js +5 -2
- package/package.json +1 -1
package/dist/cff-bounds.js
CHANGED
|
@@ -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
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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 +
|
|
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 +
|
|
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 -
|
|
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.
|
|
96
|
-
box.maxX = Math.max(box.maxX, value);
|
|
127
|
+
box.includeXExtent(value);
|
|
97
128
|
});
|
|
98
129
|
includeCubicAxis(y0, y1, y2, y3, (value) => {
|
|
99
|
-
box.
|
|
100
|
-
box.maxY = Math.max(box.maxY, value);
|
|
130
|
+
box.includeYExtent(value);
|
|
101
131
|
});
|
|
102
|
-
box.
|
|
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
|
-
|
|
148
|
+
state.box.includePoint(state.x, state.y);
|
|
119
149
|
state.x += dx;
|
|
120
150
|
state.y += dy;
|
|
121
|
-
|
|
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 >=
|
|
139
|
-
endOffset: offset +
|
|
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,
|
|
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 +
|
|
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 +
|
|
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 +
|
|
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 -
|
|
246
|
-
if (k +
|
|
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 %
|
|
284
|
+
if (stack.length % QUAD_CURVE_ARG_COUNT === 1) {
|
|
255
285
|
firstCross = stack[0];
|
|
256
286
|
k = 1;
|
|
257
287
|
}
|
|
258
|
-
for (; k +
|
|
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 +
|
|
261
|
-
else curveTo(state, stack[k], cross, stack[k + 1], stack[k + 2], stack[k +
|
|
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 >=
|
|
271
|
-
const extra = stack.length - k ===
|
|
272
|
-
if (horizontal) curveTo(state, stack[k], 0, stack[k + 1], stack[k + 2], extra, stack[k +
|
|
273
|
-
else curveTo(state, 0, stack[k], stack[k + 1], stack[k + 2], stack[k +
|
|
274
|
-
k +=
|
|
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 <
|
|
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 <
|
|
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 <
|
|
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 <
|
|
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 ===
|
|
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 <=
|
|
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 >=
|
|
113
|
-
i +=
|
|
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,
|
|
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 +=
|
|
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 ===
|
|
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 <=
|
|
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 >=
|
|
112
|
-
i +=
|
|
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,
|
|
123
|
+
if (!hasBytes(data, i + 1, INT32_SIZE_BYTES)) return;
|
|
117
124
|
operands.push(u32(data, i + 1) | 0);
|
|
118
|
-
i +=
|
|
125
|
+
i += DICT_OPERAND_INT32_TOTAL_SIZE;
|
|
119
126
|
continue;
|
|
120
127
|
}
|
|
121
128
|
if (b0 === DICT_OPERAND_REAL) {
|
package/dist/cmap-table.cjs
CHANGED
|
@@ -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 +
|
|
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 *
|
|
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 >=
|
|
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 >
|
|
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 &
|
|
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 &
|
|
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,
|
|
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 +
|
|
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 +
|
|
67
|
-
startGlyphId: require_sfnt.u32(bytes, recordOffset +
|
|
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 +
|
|
101
|
+
const glyphIdArrayOffset = subtableOffset + FORMAT_0_GLYPH_ID_ARRAY_OFFSET;
|
|
86
102
|
const lookup = (codePoint) => {
|
|
87
|
-
if (codePoint < 0 || codePoint >
|
|
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 <=
|
|
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 +
|
|
105
|
-
const entryCount = require_sfnt.u16(bytes, subtableOffset +
|
|
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 ===
|
|
127
|
-
if (subtable.platformId ===
|
|
128
|
-
if (subtable.platformId ===
|
|
129
|
-
return
|
|
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 ===
|
|
132
|
-
return
|
|
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 ===
|
|
136
|
-
if (record.format ===
|
|
137
|
-
if (record.format ===
|
|
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 +
|
|
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 ===
|
|
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;
|