From 440b4b6eeb41ea8ea1dcd01ded4cd9fd0c6b7cb2 Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Mon, 20 May 2024 12:00:42 +0200 Subject: [PATCH] Support charCodes larger than 32-bit in `adjustMapping` (issue 18117) This also required changing the initial `charCodeToGlyphId`-data to an Object, which seems generally correct since it's consistent with existing code in the `src\core\{cff_font, type1_font}.js` files. --- src/core/fonts.js | 5 ++--- test/pdfs/.gitignore | 1 + test/pdfs/issue18117.pdf | Bin 0 -> 19929 bytes test/test_manifest.json | 14 ++++++++++++++ 4 files changed, 17 insertions(+), 3 deletions(-) create mode 100644 test/pdfs/issue18117.pdf diff --git a/src/core/fonts.js b/src/core/fonts.js index 5825a1470..993d3340b 100644 --- a/src/core/fonts.js +++ b/src/core/fonts.js @@ -484,8 +484,7 @@ function adjustMapping(charCodeToGlyphId, hasGlyph, newGlyphZeroId, toUnicode) { const isInPrivateArea = code => (PRIVATE_USE_AREAS[0][0] <= code && code <= PRIVATE_USE_AREAS[0][1]) || (PRIVATE_USE_AREAS[1][0] <= code && code <= PRIVATE_USE_AREAS[1][1]); - for (let originalCharCode in charCodeToGlyphId) { - originalCharCode |= 0; + for (const originalCharCode in charCodeToGlyphId) { let glyphId = charCodeToGlyphId[originalCharCode]; // For missing glyphs don't create the mappings so the glyph isn't // drawn. @@ -2834,7 +2833,7 @@ class Font { data: createPostTable(properties), }; - const charCodeToGlyphId = []; + const charCodeToGlyphId = Object.create(null); // Helper function to try to skip mapping of empty glyphs. function hasGlyph(glyphId) { diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index e458cc908..733a26e08 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -242,6 +242,7 @@ !ContentStreamNoCycleType3insideType3.pdf !ContentStreamCycleType3insideType3.pdf !issue2074.pdf +!issue18117.pdf !scan-bad.pdf !issue13561_reduced.pdf !bug847420.pdf diff --git a/test/pdfs/issue18117.pdf b/test/pdfs/issue18117.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2dd6038b927a4a3f10c0abdca328025b1fc680ee GIT binary patch literal 19929 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