pdf-parser.js 5.2.27 → 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 (145) 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.js +5 -3
  7. package/dist/builtin-encoding.cjs +17 -6
  8. package/dist/builtin-encoding.js +17 -6
  9. package/dist/bytes/crc32.cjs +5 -3
  10. package/dist/bytes/crc32.js +5 -3
  11. package/dist/bytes/flate.cjs +0 -1
  12. package/dist/bytes/flate.js +0 -1
  13. package/dist/cff-bounds.cjs +42 -24
  14. package/dist/cff-bounds.js +42 -24
  15. package/dist/cff.cjs +13 -6
  16. package/dist/cff.js +13 -6
  17. package/dist/cmap-table.cjs +54 -26
  18. package/dist/cmap-table.js +54 -26
  19. package/dist/cmap.cjs +5 -3
  20. package/dist/cmap.js +5 -3
  21. package/dist/content-write.cjs +3 -2
  22. package/dist/content-write.js +3 -2
  23. package/dist/crypto/aes.cjs +76 -55
  24. package/dist/crypto/aes.js +76 -55
  25. package/dist/crypto/md5.cjs +345 -149
  26. package/dist/crypto/md5.js +345 -149
  27. package/dist/crypto/rc4.cjs +5 -4
  28. package/dist/crypto/rc4.js +5 -4
  29. package/dist/crypto/sha2.cjs +92 -43
  30. package/dist/crypto/sha2.js +92 -43
  31. package/dist/embedded-font.cjs +4 -2
  32. package/dist/embedded-font.js +4 -2
  33. package/dist/encoding.cjs +1 -1
  34. package/dist/encoding.js +1 -1
  35. package/dist/encrypt-write.cjs +25 -21
  36. package/dist/encrypt-write.js +25 -21
  37. package/dist/encrypt.cjs +43 -64
  38. package/dist/encrypt.js +43 -64
  39. package/dist/filters.cjs +40 -20
  40. package/dist/filters.js +40 -20
  41. package/dist/font-face.cjs +2 -1
  42. package/dist/font-face.js +2 -1
  43. package/dist/font-read.cjs +12 -6
  44. package/dist/font-read.js +12 -6
  45. package/dist/font-tables.cjs +55 -28
  46. package/dist/font-tables.js +55 -28
  47. package/dist/gdef-table.cjs +6 -3
  48. package/dist/gdef-table.js +6 -3
  49. package/dist/glyf-contours.cjs +3 -1
  50. package/dist/glyf-contours.js +3 -1
  51. package/dist/glyf.cjs +22 -11
  52. package/dist/glyf.js +22 -11
  53. package/dist/gpos-table.cjs +37 -19
  54. package/dist/gpos-table.js +37 -19
  55. package/dist/gsub-table.cjs +28 -17
  56. package/dist/gsub-table.js +28 -17
  57. package/dist/hmtx-table.cjs +5 -3
  58. package/dist/hmtx-table.js +5 -3
  59. package/dist/image/ccitt-encode.cjs +8 -5
  60. package/dist/image/ccitt-encode.js +8 -5
  61. package/dist/image/ccitt.cjs +801 -209
  62. package/dist/image/ccitt.js +801 -209
  63. package/dist/image/jbig2-arith.cjs +340 -306
  64. package/dist/image/jbig2-arith.js +340 -306
  65. package/dist/image/jbig2-bitmap.cjs +8 -5
  66. package/dist/image/jbig2-bitmap.js +8 -5
  67. package/dist/image/jbig2-generic.cjs +240 -69
  68. package/dist/image/jbig2-generic.js +240 -69
  69. package/dist/image/jbig2-text.cjs +4 -2
  70. package/dist/image/jbig2-text.js +4 -2
  71. package/dist/image/jbig2.cjs +69 -31
  72. package/dist/image/jbig2.js +69 -31
  73. package/dist/image/jp2-boxes.cjs +52 -27
  74. package/dist/image/jp2-boxes.js +52 -27
  75. package/dist/image/jpeg-info.cjs +29 -24
  76. package/dist/image/jpeg-info.js +29 -24
  77. package/dist/image/jpeg2000-codestream.cjs +44 -24
  78. package/dist/image/jpeg2000-codestream.js +44 -24
  79. package/dist/image/jpeg2000-dwt.cjs +2 -1
  80. package/dist/image/jpeg2000-dwt.js +2 -1
  81. package/dist/image/jpeg2000-t1.cjs +21 -11
  82. package/dist/image/jpeg2000-t1.js +21 -11
  83. package/dist/image/jpeg2000-t2.cjs +12 -5
  84. package/dist/image/jpeg2000-t2.js +12 -5
  85. package/dist/image/jpeg2000-tagtree.cjs +8 -4
  86. package/dist/image/jpeg2000-tagtree.js +8 -4
  87. package/dist/image/jpeg2000.cjs +11 -6
  88. package/dist/image/jpeg2000.js +11 -6
  89. package/dist/image/png-decode.cjs +62 -39
  90. package/dist/image/png-decode.d.cts +3 -2
  91. package/dist/image/png-decode.d.ts +3 -2
  92. package/dist/image/png-decode.js +62 -39
  93. package/dist/image/png-filter.cjs +23 -15
  94. package/dist/image/png-filter.js +23 -15
  95. package/dist/images-read.cjs +41 -36
  96. package/dist/images-read.js +41 -36
  97. package/dist/index.cjs +1 -1
  98. package/dist/index.js +1 -1
  99. package/dist/interpret.cjs +39 -24
  100. package/dist/interpret.js +39 -24
  101. package/dist/lexer.cjs +86 -51
  102. package/dist/lexer.js +86 -51
  103. package/dist/math-content-write.cjs +9 -5
  104. package/dist/math-content-write.js +9 -5
  105. package/dist/math-font-write.cjs +2 -1
  106. package/dist/math-font-write.js +2 -1
  107. package/dist/math-font.cjs +16 -7
  108. package/dist/math-font.js +16 -7
  109. package/dist/math-table.cjs +25 -13
  110. package/dist/math-table.js +25 -13
  111. package/dist/matrix.cjs +3 -2
  112. package/dist/matrix.js +3 -2
  113. package/dist/measure.cjs +1 -1
  114. package/dist/measure.js +1 -1
  115. package/dist/navigation.cjs +10 -5
  116. package/dist/navigation.js +10 -5
  117. package/dist/ot-layout-common.cjs +4 -2
  118. package/dist/ot-layout-common.js +4 -2
  119. package/dist/parse.cjs +7 -5
  120. package/dist/parse.js +7 -5
  121. package/dist/pdf-text.cjs +5 -2
  122. package/dist/pdf-text.js +5 -2
  123. package/dist/predictors.cjs +14 -9
  124. package/dist/predictors.js +14 -9
  125. package/dist/raster.cjs +30 -19
  126. package/dist/raster.js +30 -19
  127. package/dist/read.cjs +17 -8
  128. package/dist/read.js +17 -8
  129. package/dist/serialize.cjs +6 -2
  130. package/dist/serialize.js +6 -2
  131. package/dist/sfnt-subset.cjs +25 -13
  132. package/dist/sfnt-subset.js +25 -13
  133. package/dist/sfnt.cjs +20 -10
  134. package/dist/sfnt.js +20 -10
  135. package/dist/text-group.cjs +0 -1
  136. package/dist/text-group.js +0 -1
  137. package/dist/tounicode.cjs +4 -2
  138. package/dist/tounicode.js +4 -2
  139. package/dist/winansi.cjs +1 -1
  140. package/dist/winansi.js +1 -1
  141. package/dist/write.cjs +20 -12
  142. package/dist/write.js +20 -12
  143. package/dist/xref.cjs +5 -2
  144. package/dist/xref.js +5 -2
  145. package/package.json +1 -1
@@ -12,17 +12,28 @@ const DEFAULT_GSUB_FEATURE_TAGS = [
12
12
  ];
13
13
  const GSUB_OPT_IN_FEATURE_TAGS = ["smcp", "dlig"];
14
14
  const GSUB_HEADER_SIZE = 10;
15
+ const GSUB_HEADER_SCRIPT_LIST_OFFSET = 4;
16
+ const GSUB_HEADER_FEATURE_LIST_OFFSET = 6;
17
+ const GSUB_HEADER_LOOKUP_LIST_OFFSET = 8;
15
18
  const SCRIPT_RECORD_SIZE = 6;
19
+ const SCRIPT_RECORD_OFFSET_FIELD_OFFSET = 4;
16
20
  const FEATURE_RECORD_SIZE = 6;
21
+ const FEATURE_RECORD_OFFSET_FIELD_OFFSET = 4;
17
22
  const LANG_SYS_HEADER_SIZE = 6;
23
+ const LANG_SYS_FEATURE_INDEX_COUNT_OFFSET = 4;
18
24
  const FEATURE_HEADER_SIZE = 4;
19
25
  const LOOKUP_HEADER_SIZE = 6;
26
+ const LOOKUP_HEADER_SUBTABLE_COUNT_OFFSET = 4;
20
27
  const LOOKUP_TYPE_SINGLE_SUBST = 1;
21
28
  const LOOKUP_TYPE_LIGATURE_SUBST = 4;
22
29
  const LOOKUP_TYPE_CONTEXT_SUBST = 5;
23
30
  const LOOKUP_TYPE_CHAIN_CONTEXT_SUBST = 6;
24
31
  const LOOKUP_TYPE_EXTENSION_SUBST = 7;
25
32
  const EXTENSION_SUBST_HEADER_SIZE = 8;
33
+ const EXTENSION_SUBST_OFFSET_FIELD_OFFSET = 4;
34
+ const BITS_PER_BYTE = 8;
35
+ const BYTE_MASK = 255;
36
+ const SUBST_FORMAT_AND_COVERAGE_SIZE = 4;
26
37
  const LOOKUP_FLAG_IGNORE_BASE_GLYPHS = 2;
27
38
  const LOOKUP_FLAG_IGNORE_LIGATURES = 4;
28
39
  const LOOKUP_FLAG_IGNORE_MARKS = 8;
@@ -31,14 +42,14 @@ const LOOKUP_FLAG_MARK_ATTACHMENT_TYPE = 65280;
31
42
  const MAX_LOOKUP_NESTING_DEPTH = 6;
32
43
  const PREFERRED_SCRIPT_TAGS = ["latn", "DFLT"];
33
44
  function readTag(bytes, offset) {
34
- return String.fromCharCode(require_sfnt.u16(bytes, offset) >> 8, require_sfnt.u16(bytes, offset) & 255, require_sfnt.u16(bytes, offset + 2) >> 8, require_sfnt.u16(bytes, offset + 2) & 255);
45
+ return String.fromCharCode(require_sfnt.u16(bytes, offset) >> BITS_PER_BYTE, require_sfnt.u16(bytes, offset) & BYTE_MASK, require_sfnt.u16(bytes, offset + 2) >> BITS_PER_BYTE, require_sfnt.u16(bytes, offset + 2) & BYTE_MASK);
35
46
  }
36
47
  function glyphSkipper(lookupFlag, markFilteringSet, gdef) {
37
48
  if (gdef === void 0 || lookupFlag === 0) return () => false;
38
49
  const ignoreBase = (lookupFlag & LOOKUP_FLAG_IGNORE_BASE_GLYPHS) !== 0;
39
50
  const ignoreLigatures = (lookupFlag & LOOKUP_FLAG_IGNORE_LIGATURES) !== 0;
40
51
  const ignoreMarks = (lookupFlag & LOOKUP_FLAG_IGNORE_MARKS) !== 0;
41
- const markAttachmentType = (lookupFlag & LOOKUP_FLAG_MARK_ATTACHMENT_TYPE) >> 8;
52
+ const markAttachmentType = (lookupFlag & LOOKUP_FLAG_MARK_ATTACHMENT_TYPE) >> BITS_PER_BYTE;
42
53
  const useMarkFilteringSet = (lookupFlag & LOOKUP_FLAG_USE_MARK_FILTERING_SET) !== 0;
43
54
  return (glyphId) => {
44
55
  const glyphClass = gdef.glyphClass(glyphId);
@@ -61,7 +72,7 @@ function parseSingleSubstFormat1(bytes, subtableOffset, skip) {
61
72
  if (!require_sfnt.hasBytes(bytes, subtableOffset, SINGLE_SUBST_FORMAT_1_SIZE)) return;
62
73
  const coverage = require_ot_layout_common.parseCoverage(bytes, subtableOffset + require_sfnt.u16(bytes, subtableOffset + 2));
63
74
  if (coverage === void 0) return;
64
- const delta = require_sfnt.i16(bytes, subtableOffset + 4);
75
+ const delta = require_sfnt.i16(bytes, subtableOffset + SUBST_FORMAT_AND_COVERAGE_SIZE);
65
76
  return (slots, index) => {
66
77
  const slot = slots[index];
67
78
  if (skip(slot.glyphId)) return;
@@ -80,7 +91,7 @@ function parseSingleSubstFormat2(bytes, subtableOffset, skip) {
80
91
  if (!require_sfnt.hasBytes(bytes, subtableOffset, SINGLE_SUBST_FORMAT_2_HEADER_SIZE)) return;
81
92
  const coverage = require_ot_layout_common.parseCoverage(bytes, subtableOffset + require_sfnt.u16(bytes, subtableOffset + 2));
82
93
  if (coverage === void 0) return;
83
- const glyphCount = require_sfnt.u16(bytes, subtableOffset + 4);
94
+ const glyphCount = require_sfnt.u16(bytes, subtableOffset + SUBST_FORMAT_AND_COVERAGE_SIZE);
84
95
  const substitutesOffset = subtableOffset + SINGLE_SUBST_FORMAT_2_HEADER_SIZE;
85
96
  if (!require_sfnt.hasBytes(bytes, substitutesOffset, glyphCount * 2)) return;
86
97
  return (slots, index) => {
@@ -104,7 +115,7 @@ function parseLigatureSubstFormat1(bytes, subtableOffset, skip) {
104
115
  if (!require_sfnt.hasBytes(bytes, subtableOffset, LIGATURE_SUBST_FORMAT_1_HEADER_SIZE)) return;
105
116
  const coverage = require_ot_layout_common.parseCoverage(bytes, subtableOffset + require_sfnt.u16(bytes, subtableOffset + 2));
106
117
  if (coverage === void 0) return;
107
- const ligSetCount = require_sfnt.u16(bytes, subtableOffset + 4);
118
+ const ligSetCount = require_sfnt.u16(bytes, subtableOffset + SUBST_FORMAT_AND_COVERAGE_SIZE);
108
119
  const ligSetOffsetsOffset = subtableOffset + LIGATURE_SUBST_FORMAT_1_HEADER_SIZE;
109
120
  if (!require_sfnt.hasBytes(bytes, ligSetOffsetsOffset, ligSetCount * 2)) return;
110
121
  return (slots, index) => {
@@ -360,7 +371,7 @@ function parseSubtable(bytes, lookupType, subtableOffset, skip, lookupOf) {
360
371
  if (!require_sfnt.hasBytes(bytes, subtableOffset, EXTENSION_SUBST_HEADER_SIZE) || require_sfnt.u16(bytes, subtableOffset) !== 1) return;
361
372
  const extensionLookupType = require_sfnt.u16(bytes, subtableOffset + 2);
362
373
  if (extensionLookupType === LOOKUP_TYPE_EXTENSION_SUBST) return;
363
- return parseSubtable(bytes, extensionLookupType, subtableOffset + require_sfnt.u32(bytes, subtableOffset + 4), skip, lookupOf);
374
+ return parseSubtable(bytes, extensionLookupType, subtableOffset + require_sfnt.u32(bytes, subtableOffset + EXTENSION_SUBST_OFFSET_FIELD_OFFSET), skip, lookupOf);
364
375
  }
365
376
  if (lookupType === LOOKUP_TYPE_SINGLE_SUBST) {
366
377
  if (!require_sfnt.hasBytes(bytes, subtableOffset, 2)) return;
@@ -388,7 +399,7 @@ function parseContextualSubtable(bytes, chained, subtableOffset, skip, lookupOf)
388
399
  if (!require_sfnt.hasBytes(bytes, subtableOffset, prefixSize)) return;
389
400
  const coverage = require_ot_layout_common.parseCoverage(bytes, subtableOffset + require_sfnt.u16(bytes, subtableOffset + 2));
390
401
  if (coverage === void 0) return;
391
- const setCount = require_sfnt.u16(bytes, subtableOffset + 4);
402
+ const setCount = require_sfnt.u16(bytes, subtableOffset + SUBST_FORMAT_AND_COVERAGE_SIZE);
392
403
  const setOffsetsOffset = subtableOffset + prefixSize;
393
404
  if (!require_sfnt.hasBytes(bytes, setOffsetsOffset, setCount * 2)) return;
394
405
  const glyphEquality = (expected) => (glyphId) => glyphId === expected;
@@ -404,10 +415,10 @@ function parseContextualSubtable(bytes, chained, subtableOffset, skip, lookupOf)
404
415
  if (!require_sfnt.hasBytes(bytes, subtableOffset, prefixSize)) return;
405
416
  const coverage = require_ot_layout_common.parseCoverage(bytes, subtableOffset + require_sfnt.u16(bytes, subtableOffset + 2));
406
417
  if (coverage === void 0) return;
407
- const inputClassDefOffset = chained ? require_sfnt.u16(bytes, subtableOffset + 6) : require_sfnt.u16(bytes, subtableOffset + 4);
418
+ const inputClassDefOffset = chained ? require_sfnt.u16(bytes, subtableOffset + 6) : require_sfnt.u16(bytes, subtableOffset + SUBST_FORMAT_AND_COVERAGE_SIZE);
408
419
  const inputClassDef = inputClassDefOffset === 0 ? constantZeroClassDef : require_ot_layout_common.parseClassDef(bytes, subtableOffset + inputClassDefOffset);
409
420
  const readAuxClassDef = (offset) => offset === 0 ? constantZeroClassDef : require_ot_layout_common.parseClassDef(bytes, subtableOffset + offset);
410
- const backtrackClassDef = chained ? readAuxClassDef(require_sfnt.u16(bytes, subtableOffset + 4)) : constantZeroClassDef;
421
+ const backtrackClassDef = chained ? readAuxClassDef(require_sfnt.u16(bytes, subtableOffset + SUBST_FORMAT_AND_COVERAGE_SIZE)) : constantZeroClassDef;
411
422
  const lookaheadClassDef = chained ? readAuxClassDef(require_sfnt.u16(bytes, subtableOffset + 8)) : constantZeroClassDef;
412
423
  if (inputClassDef === void 0 || backtrackClassDef === void 0 || lookaheadClassDef === void 0) return;
413
424
  const setCount = require_sfnt.u16(bytes, subtableOffset + prefixSize - 2);
@@ -429,9 +440,9 @@ function findScriptOffset(bytes, scriptListOffset) {
429
440
  if (!require_sfnt.hasBytes(bytes, recordsOffset, scriptCount * SCRIPT_RECORD_SIZE) || scriptCount === 0) return;
430
441
  for (const wanted of PREFERRED_SCRIPT_TAGS) for (let i = 0; i < scriptCount; i++) {
431
442
  const recordOffset = recordsOffset + i * SCRIPT_RECORD_SIZE;
432
- if (readTag(bytes, recordOffset) === wanted) return scriptListOffset + require_sfnt.u16(bytes, recordOffset + 4);
443
+ if (readTag(bytes, recordOffset) === wanted) return scriptListOffset + require_sfnt.u16(bytes, recordOffset + SCRIPT_RECORD_OFFSET_FIELD_OFFSET);
433
444
  }
434
- return scriptListOffset + require_sfnt.u16(bytes, recordsOffset + 4);
445
+ return scriptListOffset + require_sfnt.u16(bytes, recordsOffset + SCRIPT_RECORD_OFFSET_FIELD_OFFSET);
435
446
  }
436
447
  function parseDefaultLangSysFeatureIndices(bytes, scriptOffset) {
437
448
  if (!require_sfnt.hasBytes(bytes, scriptOffset, 2)) return [];
@@ -439,7 +450,7 @@ function parseDefaultLangSysFeatureIndices(bytes, scriptOffset) {
439
450
  if (defaultLangSysOffset === 0) return [];
440
451
  const langSysOffset = scriptOffset + defaultLangSysOffset;
441
452
  if (!require_sfnt.hasBytes(bytes, langSysOffset, LANG_SYS_HEADER_SIZE)) return [];
442
- const featureIndexCount = require_sfnt.u16(bytes, langSysOffset + 4);
453
+ const featureIndexCount = require_sfnt.u16(bytes, langSysOffset + LANG_SYS_FEATURE_INDEX_COUNT_OFFSET);
443
454
  const indicesOffset = langSysOffset + LANG_SYS_HEADER_SIZE;
444
455
  if (!require_sfnt.hasBytes(bytes, indicesOffset, featureIndexCount * 2)) return [];
445
456
  const indices = [];
@@ -457,7 +468,7 @@ function collectLookupIndices(bytes, featureListOffset, featureIndices, featureT
457
468
  if (featureIndex >= featureCount) continue;
458
469
  const recordOffset = recordsOffset + featureIndex * FEATURE_RECORD_SIZE;
459
470
  if (!featureTags.includes(readTag(bytes, recordOffset))) continue;
460
- const featureOffset = featureListOffset + require_sfnt.u16(bytes, recordOffset + 4);
471
+ const featureOffset = featureListOffset + require_sfnt.u16(bytes, recordOffset + FEATURE_RECORD_OFFSET_FIELD_OFFSET);
461
472
  if (!require_sfnt.hasBytes(bytes, featureOffset, FEATURE_HEADER_SIZE)) continue;
462
473
  const lookupIndexCount = require_sfnt.u16(bytes, featureOffset + 2);
463
474
  const indicesOffset = featureOffset + FEATURE_HEADER_SIZE;
@@ -475,12 +486,12 @@ function collectLookupIndices(bytes, featureListOffset, featureIndices, featureT
475
486
  function buildGsubShaper(font, options = {}) {
476
487
  const bytes = require_sfnt.sfntTableBytes(font, "GSUB");
477
488
  if (bytes === void 0 || !require_sfnt.hasBytes(bytes, 0, GSUB_HEADER_SIZE) || require_sfnt.u16(bytes, 0) !== 1) return;
478
- const scriptOffset = findScriptOffset(bytes, require_sfnt.u16(bytes, 4));
489
+ const scriptOffset = findScriptOffset(bytes, require_sfnt.u16(bytes, GSUB_HEADER_SCRIPT_LIST_OFFSET));
479
490
  if (scriptOffset === void 0) return;
480
491
  const featureTags = [...DEFAULT_GSUB_FEATURE_TAGS, ...options.optInFeatures ?? []];
481
- const lookupIndices = collectLookupIndices(bytes, require_sfnt.u16(bytes, 6), parseDefaultLangSysFeatureIndices(bytes, scriptOffset), featureTags);
492
+ const lookupIndices = collectLookupIndices(bytes, require_sfnt.u16(bytes, GSUB_HEADER_FEATURE_LIST_OFFSET), parseDefaultLangSysFeatureIndices(bytes, scriptOffset), featureTags);
482
493
  if (lookupIndices.length === 0) return;
483
- const lookupListOffset = require_sfnt.u16(bytes, 8);
494
+ const lookupListOffset = require_sfnt.u16(bytes, GSUB_HEADER_LOOKUP_LIST_OFFSET);
484
495
  if (!require_sfnt.hasBytes(bytes, lookupListOffset, 2)) return;
485
496
  const lookupCount = require_sfnt.u16(bytes, lookupListOffset);
486
497
  const lookupOffsetsOffset = lookupListOffset + 2;
@@ -496,7 +507,7 @@ function buildGsubShaper(font, options = {}) {
496
507
  }
497
508
  const lookupFlag = require_sfnt.u16(bytes, lookupOffset + 2);
498
509
  const lookupType = require_sfnt.u16(bytes, lookupOffset);
499
- const subTableCount = require_sfnt.u16(bytes, lookupOffset + 4);
510
+ const subTableCount = require_sfnt.u16(bytes, lookupOffset + LOOKUP_HEADER_SUBTABLE_COUNT_OFFSET);
500
511
  const subtableOffsetsOffset = lookupOffset + LOOKUP_HEADER_SIZE;
501
512
  const markFilteringSetWidth = (lookupFlag & LOOKUP_FLAG_USE_MARK_FILTERING_SET) !== 0 ? 2 : 0;
502
513
  if (!require_sfnt.hasBytes(bytes, subtableOffsetsOffset, subTableCount * 2 + markFilteringSetWidth)) {
@@ -11,17 +11,28 @@ const DEFAULT_GSUB_FEATURE_TAGS = [
11
11
  ];
12
12
  const GSUB_OPT_IN_FEATURE_TAGS = ["smcp", "dlig"];
13
13
  const GSUB_HEADER_SIZE = 10;
14
+ const GSUB_HEADER_SCRIPT_LIST_OFFSET = 4;
15
+ const GSUB_HEADER_FEATURE_LIST_OFFSET = 6;
16
+ const GSUB_HEADER_LOOKUP_LIST_OFFSET = 8;
14
17
  const SCRIPT_RECORD_SIZE = 6;
18
+ const SCRIPT_RECORD_OFFSET_FIELD_OFFSET = 4;
15
19
  const FEATURE_RECORD_SIZE = 6;
20
+ const FEATURE_RECORD_OFFSET_FIELD_OFFSET = 4;
16
21
  const LANG_SYS_HEADER_SIZE = 6;
22
+ const LANG_SYS_FEATURE_INDEX_COUNT_OFFSET = 4;
17
23
  const FEATURE_HEADER_SIZE = 4;
18
24
  const LOOKUP_HEADER_SIZE = 6;
25
+ const LOOKUP_HEADER_SUBTABLE_COUNT_OFFSET = 4;
19
26
  const LOOKUP_TYPE_SINGLE_SUBST = 1;
20
27
  const LOOKUP_TYPE_LIGATURE_SUBST = 4;
21
28
  const LOOKUP_TYPE_CONTEXT_SUBST = 5;
22
29
  const LOOKUP_TYPE_CHAIN_CONTEXT_SUBST = 6;
23
30
  const LOOKUP_TYPE_EXTENSION_SUBST = 7;
24
31
  const EXTENSION_SUBST_HEADER_SIZE = 8;
32
+ const EXTENSION_SUBST_OFFSET_FIELD_OFFSET = 4;
33
+ const BITS_PER_BYTE = 8;
34
+ const BYTE_MASK = 255;
35
+ const SUBST_FORMAT_AND_COVERAGE_SIZE = 4;
25
36
  const LOOKUP_FLAG_IGNORE_BASE_GLYPHS = 2;
26
37
  const LOOKUP_FLAG_IGNORE_LIGATURES = 4;
27
38
  const LOOKUP_FLAG_IGNORE_MARKS = 8;
@@ -30,14 +41,14 @@ const LOOKUP_FLAG_MARK_ATTACHMENT_TYPE = 65280;
30
41
  const MAX_LOOKUP_NESTING_DEPTH = 6;
31
42
  const PREFERRED_SCRIPT_TAGS = ["latn", "DFLT"];
32
43
  function readTag(bytes, offset) {
33
- return String.fromCharCode(u16(bytes, offset) >> 8, u16(bytes, offset) & 255, u16(bytes, offset + 2) >> 8, u16(bytes, offset + 2) & 255);
44
+ return String.fromCharCode(u16(bytes, offset) >> BITS_PER_BYTE, u16(bytes, offset) & BYTE_MASK, u16(bytes, offset + 2) >> BITS_PER_BYTE, u16(bytes, offset + 2) & BYTE_MASK);
34
45
  }
35
46
  function glyphSkipper(lookupFlag, markFilteringSet, gdef) {
36
47
  if (gdef === void 0 || lookupFlag === 0) return () => false;
37
48
  const ignoreBase = (lookupFlag & LOOKUP_FLAG_IGNORE_BASE_GLYPHS) !== 0;
38
49
  const ignoreLigatures = (lookupFlag & LOOKUP_FLAG_IGNORE_LIGATURES) !== 0;
39
50
  const ignoreMarks = (lookupFlag & LOOKUP_FLAG_IGNORE_MARKS) !== 0;
40
- const markAttachmentType = (lookupFlag & LOOKUP_FLAG_MARK_ATTACHMENT_TYPE) >> 8;
51
+ const markAttachmentType = (lookupFlag & LOOKUP_FLAG_MARK_ATTACHMENT_TYPE) >> BITS_PER_BYTE;
41
52
  const useMarkFilteringSet = (lookupFlag & LOOKUP_FLAG_USE_MARK_FILTERING_SET) !== 0;
42
53
  return (glyphId) => {
43
54
  const glyphClass = gdef.glyphClass(glyphId);
@@ -60,7 +71,7 @@ function parseSingleSubstFormat1(bytes, subtableOffset, skip) {
60
71
  if (!hasBytes(bytes, subtableOffset, SINGLE_SUBST_FORMAT_1_SIZE)) return;
61
72
  const coverage = parseCoverage(bytes, subtableOffset + u16(bytes, subtableOffset + 2));
62
73
  if (coverage === void 0) return;
63
- const delta = i16(bytes, subtableOffset + 4);
74
+ const delta = i16(bytes, subtableOffset + SUBST_FORMAT_AND_COVERAGE_SIZE);
64
75
  return (slots, index) => {
65
76
  const slot = slots[index];
66
77
  if (skip(slot.glyphId)) return;
@@ -79,7 +90,7 @@ function parseSingleSubstFormat2(bytes, subtableOffset, skip) {
79
90
  if (!hasBytes(bytes, subtableOffset, SINGLE_SUBST_FORMAT_2_HEADER_SIZE)) return;
80
91
  const coverage = parseCoverage(bytes, subtableOffset + u16(bytes, subtableOffset + 2));
81
92
  if (coverage === void 0) return;
82
- const glyphCount = u16(bytes, subtableOffset + 4);
93
+ const glyphCount = u16(bytes, subtableOffset + SUBST_FORMAT_AND_COVERAGE_SIZE);
83
94
  const substitutesOffset = subtableOffset + SINGLE_SUBST_FORMAT_2_HEADER_SIZE;
84
95
  if (!hasBytes(bytes, substitutesOffset, glyphCount * 2)) return;
85
96
  return (slots, index) => {
@@ -103,7 +114,7 @@ function parseLigatureSubstFormat1(bytes, subtableOffset, skip) {
103
114
  if (!hasBytes(bytes, subtableOffset, LIGATURE_SUBST_FORMAT_1_HEADER_SIZE)) return;
104
115
  const coverage = parseCoverage(bytes, subtableOffset + u16(bytes, subtableOffset + 2));
105
116
  if (coverage === void 0) return;
106
- const ligSetCount = u16(bytes, subtableOffset + 4);
117
+ const ligSetCount = u16(bytes, subtableOffset + SUBST_FORMAT_AND_COVERAGE_SIZE);
107
118
  const ligSetOffsetsOffset = subtableOffset + LIGATURE_SUBST_FORMAT_1_HEADER_SIZE;
108
119
  if (!hasBytes(bytes, ligSetOffsetsOffset, ligSetCount * 2)) return;
109
120
  return (slots, index) => {
@@ -359,7 +370,7 @@ function parseSubtable(bytes, lookupType, subtableOffset, skip, lookupOf) {
359
370
  if (!hasBytes(bytes, subtableOffset, EXTENSION_SUBST_HEADER_SIZE) || u16(bytes, subtableOffset) !== 1) return;
360
371
  const extensionLookupType = u16(bytes, subtableOffset + 2);
361
372
  if (extensionLookupType === LOOKUP_TYPE_EXTENSION_SUBST) return;
362
- return parseSubtable(bytes, extensionLookupType, subtableOffset + u32(bytes, subtableOffset + 4), skip, lookupOf);
373
+ return parseSubtable(bytes, extensionLookupType, subtableOffset + u32(bytes, subtableOffset + EXTENSION_SUBST_OFFSET_FIELD_OFFSET), skip, lookupOf);
363
374
  }
364
375
  if (lookupType === LOOKUP_TYPE_SINGLE_SUBST) {
365
376
  if (!hasBytes(bytes, subtableOffset, 2)) return;
@@ -387,7 +398,7 @@ function parseContextualSubtable(bytes, chained, subtableOffset, skip, lookupOf)
387
398
  if (!hasBytes(bytes, subtableOffset, prefixSize)) return;
388
399
  const coverage = parseCoverage(bytes, subtableOffset + u16(bytes, subtableOffset + 2));
389
400
  if (coverage === void 0) return;
390
- const setCount = u16(bytes, subtableOffset + 4);
401
+ const setCount = u16(bytes, subtableOffset + SUBST_FORMAT_AND_COVERAGE_SIZE);
391
402
  const setOffsetsOffset = subtableOffset + prefixSize;
392
403
  if (!hasBytes(bytes, setOffsetsOffset, setCount * 2)) return;
393
404
  const glyphEquality = (expected) => (glyphId) => glyphId === expected;
@@ -403,10 +414,10 @@ function parseContextualSubtable(bytes, chained, subtableOffset, skip, lookupOf)
403
414
  if (!hasBytes(bytes, subtableOffset, prefixSize)) return;
404
415
  const coverage = parseCoverage(bytes, subtableOffset + u16(bytes, subtableOffset + 2));
405
416
  if (coverage === void 0) return;
406
- const inputClassDefOffset = chained ? u16(bytes, subtableOffset + 6) : u16(bytes, subtableOffset + 4);
417
+ const inputClassDefOffset = chained ? u16(bytes, subtableOffset + 6) : u16(bytes, subtableOffset + SUBST_FORMAT_AND_COVERAGE_SIZE);
407
418
  const inputClassDef = inputClassDefOffset === 0 ? constantZeroClassDef : parseClassDef(bytes, subtableOffset + inputClassDefOffset);
408
419
  const readAuxClassDef = (offset) => offset === 0 ? constantZeroClassDef : parseClassDef(bytes, subtableOffset + offset);
409
- const backtrackClassDef = chained ? readAuxClassDef(u16(bytes, subtableOffset + 4)) : constantZeroClassDef;
420
+ const backtrackClassDef = chained ? readAuxClassDef(u16(bytes, subtableOffset + SUBST_FORMAT_AND_COVERAGE_SIZE)) : constantZeroClassDef;
410
421
  const lookaheadClassDef = chained ? readAuxClassDef(u16(bytes, subtableOffset + 8)) : constantZeroClassDef;
411
422
  if (inputClassDef === void 0 || backtrackClassDef === void 0 || lookaheadClassDef === void 0) return;
412
423
  const setCount = u16(bytes, subtableOffset + prefixSize - 2);
@@ -428,9 +439,9 @@ function findScriptOffset(bytes, scriptListOffset) {
428
439
  if (!hasBytes(bytes, recordsOffset, scriptCount * SCRIPT_RECORD_SIZE) || scriptCount === 0) return;
429
440
  for (const wanted of PREFERRED_SCRIPT_TAGS) for (let i = 0; i < scriptCount; i++) {
430
441
  const recordOffset = recordsOffset + i * SCRIPT_RECORD_SIZE;
431
- if (readTag(bytes, recordOffset) === wanted) return scriptListOffset + u16(bytes, recordOffset + 4);
442
+ if (readTag(bytes, recordOffset) === wanted) return scriptListOffset + u16(bytes, recordOffset + SCRIPT_RECORD_OFFSET_FIELD_OFFSET);
432
443
  }
433
- return scriptListOffset + u16(bytes, recordsOffset + 4);
444
+ return scriptListOffset + u16(bytes, recordsOffset + SCRIPT_RECORD_OFFSET_FIELD_OFFSET);
434
445
  }
435
446
  function parseDefaultLangSysFeatureIndices(bytes, scriptOffset) {
436
447
  if (!hasBytes(bytes, scriptOffset, 2)) return [];
@@ -438,7 +449,7 @@ function parseDefaultLangSysFeatureIndices(bytes, scriptOffset) {
438
449
  if (defaultLangSysOffset === 0) return [];
439
450
  const langSysOffset = scriptOffset + defaultLangSysOffset;
440
451
  if (!hasBytes(bytes, langSysOffset, LANG_SYS_HEADER_SIZE)) return [];
441
- const featureIndexCount = u16(bytes, langSysOffset + 4);
452
+ const featureIndexCount = u16(bytes, langSysOffset + LANG_SYS_FEATURE_INDEX_COUNT_OFFSET);
442
453
  const indicesOffset = langSysOffset + LANG_SYS_HEADER_SIZE;
443
454
  if (!hasBytes(bytes, indicesOffset, featureIndexCount * 2)) return [];
444
455
  const indices = [];
@@ -456,7 +467,7 @@ function collectLookupIndices(bytes, featureListOffset, featureIndices, featureT
456
467
  if (featureIndex >= featureCount) continue;
457
468
  const recordOffset = recordsOffset + featureIndex * FEATURE_RECORD_SIZE;
458
469
  if (!featureTags.includes(readTag(bytes, recordOffset))) continue;
459
- const featureOffset = featureListOffset + u16(bytes, recordOffset + 4);
470
+ const featureOffset = featureListOffset + u16(bytes, recordOffset + FEATURE_RECORD_OFFSET_FIELD_OFFSET);
460
471
  if (!hasBytes(bytes, featureOffset, FEATURE_HEADER_SIZE)) continue;
461
472
  const lookupIndexCount = u16(bytes, featureOffset + 2);
462
473
  const indicesOffset = featureOffset + FEATURE_HEADER_SIZE;
@@ -474,12 +485,12 @@ function collectLookupIndices(bytes, featureListOffset, featureIndices, featureT
474
485
  function buildGsubShaper(font, options = {}) {
475
486
  const bytes = sfntTableBytes(font, "GSUB");
476
487
  if (bytes === void 0 || !hasBytes(bytes, 0, GSUB_HEADER_SIZE) || u16(bytes, 0) !== 1) return;
477
- const scriptOffset = findScriptOffset(bytes, u16(bytes, 4));
488
+ const scriptOffset = findScriptOffset(bytes, u16(bytes, GSUB_HEADER_SCRIPT_LIST_OFFSET));
478
489
  if (scriptOffset === void 0) return;
479
490
  const featureTags = [...DEFAULT_GSUB_FEATURE_TAGS, ...options.optInFeatures ?? []];
480
- const lookupIndices = collectLookupIndices(bytes, u16(bytes, 6), parseDefaultLangSysFeatureIndices(bytes, scriptOffset), featureTags);
491
+ const lookupIndices = collectLookupIndices(bytes, u16(bytes, GSUB_HEADER_FEATURE_LIST_OFFSET), parseDefaultLangSysFeatureIndices(bytes, scriptOffset), featureTags);
481
492
  if (lookupIndices.length === 0) return;
482
- const lookupListOffset = u16(bytes, 8);
493
+ const lookupListOffset = u16(bytes, GSUB_HEADER_LOOKUP_LIST_OFFSET);
483
494
  if (!hasBytes(bytes, lookupListOffset, 2)) return;
484
495
  const lookupCount = u16(bytes, lookupListOffset);
485
496
  const lookupOffsetsOffset = lookupListOffset + 2;
@@ -495,7 +506,7 @@ function buildGsubShaper(font, options = {}) {
495
506
  }
496
507
  const lookupFlag = u16(bytes, lookupOffset + 2);
497
508
  const lookupType = u16(bytes, lookupOffset);
498
- const subTableCount = u16(bytes, lookupOffset + 4);
509
+ const subTableCount = u16(bytes, lookupOffset + LOOKUP_HEADER_SUBTABLE_COUNT_OFFSET);
499
510
  const subtableOffsetsOffset = lookupOffset + LOOKUP_HEADER_SIZE;
500
511
  const markFilteringSetWidth = (lookupFlag & LOOKUP_FLAG_USE_MARK_FILTERING_SET) !== 0 ? 2 : 0;
501
512
  if (!hasBytes(bytes, subtableOffsetsOffset, subTableCount * 2 + markFilteringSetWidth)) {
@@ -1,15 +1,17 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_sfnt = require("./sfnt.cjs");
3
3
  //#region src/hmtx-table.ts
4
+ const HHEA_NUMBER_OF_H_METRICS_OFFSET = 34;
5
+ const HMTX_LONG_HOR_METRIC_SIZE_BYTES = 4;
4
6
  function parseHmtx(font) {
5
7
  const hheaBytes = require_sfnt.sfntTableBytes(font, "hhea");
6
8
  const hmtxBytes = require_sfnt.sfntTableBytes(font, "hmtx");
7
9
  if (hheaBytes === void 0 || hmtxBytes === void 0) throw new Error("font has no hhea/hmtx table");
8
- const numberOfHMetrics = require_sfnt.u16(hheaBytes, 34);
10
+ const numberOfHMetrics = require_sfnt.u16(hheaBytes, HHEA_NUMBER_OF_H_METRICS_OFFSET);
9
11
  if (numberOfHMetrics === 0) throw new Error("font hhea numberOfHMetrics is zero");
10
- const lastWidth = require_sfnt.u16(hmtxBytes, (numberOfHMetrics - 1) * 4);
12
+ const lastWidth = require_sfnt.u16(hmtxBytes, (numberOfHMetrics - 1) * HMTX_LONG_HOR_METRIC_SIZE_BYTES);
11
13
  return { advanceWidth(glyphId) {
12
- if (glyphId < numberOfHMetrics) return require_sfnt.u16(hmtxBytes, glyphId * 4);
14
+ if (glyphId < numberOfHMetrics) return require_sfnt.u16(hmtxBytes, glyphId * HMTX_LONG_HOR_METRIC_SIZE_BYTES);
13
15
  return lastWidth;
14
16
  } };
15
17
  }
@@ -1,14 +1,16 @@
1
1
  import { sfntTableBytes, u16 } from "./sfnt.js";
2
2
  //#region src/hmtx-table.ts
3
+ const HHEA_NUMBER_OF_H_METRICS_OFFSET = 34;
4
+ const HMTX_LONG_HOR_METRIC_SIZE_BYTES = 4;
3
5
  function parseHmtx(font) {
4
6
  const hheaBytes = sfntTableBytes(font, "hhea");
5
7
  const hmtxBytes = sfntTableBytes(font, "hmtx");
6
8
  if (hheaBytes === void 0 || hmtxBytes === void 0) throw new Error("font has no hhea/hmtx table");
7
- const numberOfHMetrics = u16(hheaBytes, 34);
9
+ const numberOfHMetrics = u16(hheaBytes, HHEA_NUMBER_OF_H_METRICS_OFFSET);
8
10
  if (numberOfHMetrics === 0) throw new Error("font hhea numberOfHMetrics is zero");
9
- const lastWidth = u16(hmtxBytes, (numberOfHMetrics - 1) * 4);
11
+ const lastWidth = u16(hmtxBytes, (numberOfHMetrics - 1) * HMTX_LONG_HOR_METRIC_SIZE_BYTES);
10
12
  return { advanceWidth(glyphId) {
11
- if (glyphId < numberOfHMetrics) return u16(hmtxBytes, glyphId * 4);
13
+ if (glyphId < numberOfHMetrics) return u16(hmtxBytes, glyphId * HMTX_LONG_HOR_METRIC_SIZE_BYTES);
12
14
  return lastWidth;
13
15
  } };
14
16
  }
@@ -22,6 +22,9 @@ const VERTICAL_MODES = /* @__PURE__ */ new Map([
22
22
  ]);
23
23
  const LARGEST_MAKEUP_RUN = 2560;
24
24
  const MAKEUP_GRANULARITY = 64;
25
+ const BITS_PER_BYTE = 8;
26
+ const BYTE_INDEX_SHIFT = 3;
27
+ const BYTE_BIT_MASK = 7;
25
28
  var BitWriter = class {
26
29
  bytes = [];
27
30
  current = 0;
@@ -33,7 +36,7 @@ var BitWriter = class {
33
36
  for (const char of bits) {
34
37
  this.current = this.current << 1 | (char === "1" ? 1 : 0);
35
38
  this.used++;
36
- if (this.used === 8) {
39
+ if (this.used === BITS_PER_BYTE) {
37
40
  this.bytes.push(this.current);
38
41
  this.current = 0;
39
42
  this.used = 0;
@@ -41,7 +44,7 @@ var BitWriter = class {
41
44
  }
42
45
  }
43
46
  finish() {
44
- if (this.used > 0) this.bytes.push(this.current << 8 - this.used);
47
+ if (this.used > 0) this.bytes.push(this.current << BITS_PER_BYTE - this.used);
45
48
  return new Uint8Array(this.bytes);
46
49
  }
47
50
  };
@@ -59,7 +62,7 @@ function changingElements(bitmap, rowByteOffset, columns) {
59
62
  const changes = [];
60
63
  let previous = 1;
61
64
  for (let x = 0; x < columns; x++) {
62
- const pixel = (bitmap[rowByteOffset + (x >> 3)] ?? 0) >> 7 - (x & 7) & 1;
65
+ const pixel = (bitmap[rowByteOffset + (x >> BYTE_INDEX_SHIFT)] ?? 0) >> BYTE_BIT_MASK - (x & BYTE_BIT_MASK) & 1;
63
66
  if (pixel !== previous) {
64
67
  changes.push(x);
65
68
  previous = pixel;
@@ -70,7 +73,7 @@ function changingElements(bitmap, rowByteOffset, columns) {
70
73
  function encodeCcittFax(bitmap, options) {
71
74
  const { columns, rows, maxBytes } = options;
72
75
  if (columns <= 0 || rows <= 0) return /* @__PURE__ */ new Uint8Array(0);
73
- const rowBytes = columns + 7 >> 3;
76
+ const rowBytes = columns + BYTE_BIT_MASK >> BYTE_INDEX_SHIFT;
74
77
  const writer = new BitWriter();
75
78
  let reference = [];
76
79
  for (let y = 0; y < rows; y++) {
@@ -109,7 +112,7 @@ function encodeCcittFax(bitmap, options) {
109
112
  ci += 2;
110
113
  }
111
114
  }
112
- if (a0 < columns) white = ((bitmap[offset + (a0 >> 3)] ?? 0) >> 7 - (a0 & 7) & 1) === 1;
115
+ if (a0 < columns) white = ((bitmap[offset + (a0 >> BYTE_INDEX_SHIFT)] ?? 0) >> BYTE_BIT_MASK - (a0 & BYTE_BIT_MASK) & 1) === 1;
113
116
  }
114
117
  reference = current;
115
118
  }
@@ -21,6 +21,9 @@ const VERTICAL_MODES = /* @__PURE__ */ new Map([
21
21
  ]);
22
22
  const LARGEST_MAKEUP_RUN = 2560;
23
23
  const MAKEUP_GRANULARITY = 64;
24
+ const BITS_PER_BYTE = 8;
25
+ const BYTE_INDEX_SHIFT = 3;
26
+ const BYTE_BIT_MASK = 7;
24
27
  var BitWriter = class {
25
28
  bytes = [];
26
29
  current = 0;
@@ -32,7 +35,7 @@ var BitWriter = class {
32
35
  for (const char of bits) {
33
36
  this.current = this.current << 1 | (char === "1" ? 1 : 0);
34
37
  this.used++;
35
- if (this.used === 8) {
38
+ if (this.used === BITS_PER_BYTE) {
36
39
  this.bytes.push(this.current);
37
40
  this.current = 0;
38
41
  this.used = 0;
@@ -40,7 +43,7 @@ var BitWriter = class {
40
43
  }
41
44
  }
42
45
  finish() {
43
- if (this.used > 0) this.bytes.push(this.current << 8 - this.used);
46
+ if (this.used > 0) this.bytes.push(this.current << BITS_PER_BYTE - this.used);
44
47
  return new Uint8Array(this.bytes);
45
48
  }
46
49
  };
@@ -58,7 +61,7 @@ function changingElements(bitmap, rowByteOffset, columns) {
58
61
  const changes = [];
59
62
  let previous = 1;
60
63
  for (let x = 0; x < columns; x++) {
61
- const pixel = (bitmap[rowByteOffset + (x >> 3)] ?? 0) >> 7 - (x & 7) & 1;
64
+ const pixel = (bitmap[rowByteOffset + (x >> BYTE_INDEX_SHIFT)] ?? 0) >> BYTE_BIT_MASK - (x & BYTE_BIT_MASK) & 1;
62
65
  if (pixel !== previous) {
63
66
  changes.push(x);
64
67
  previous = pixel;
@@ -69,7 +72,7 @@ function changingElements(bitmap, rowByteOffset, columns) {
69
72
  function encodeCcittFax(bitmap, options) {
70
73
  const { columns, rows, maxBytes } = options;
71
74
  if (columns <= 0 || rows <= 0) return /* @__PURE__ */ new Uint8Array(0);
72
- const rowBytes = columns + 7 >> 3;
75
+ const rowBytes = columns + BYTE_BIT_MASK >> BYTE_INDEX_SHIFT;
73
76
  const writer = new BitWriter();
74
77
  let reference = [];
75
78
  for (let y = 0; y < rows; y++) {
@@ -108,7 +111,7 @@ function encodeCcittFax(bitmap, options) {
108
111
  ci += 2;
109
112
  }
110
113
  }
111
- if (a0 < columns) white = ((bitmap[offset + (a0 >> 3)] ?? 0) >> 7 - (a0 & 7) & 1) === 1;
114
+ if (a0 < columns) white = ((bitmap[offset + (a0 >> BYTE_INDEX_SHIFT)] ?? 0) >> BYTE_BIT_MASK - (a0 & BYTE_BIT_MASK) & 1) === 1;
112
115
  }
113
116
  reference = current;
114
117
  }