From 17037b5e512da1f9fecb7b6587e7e25ea6aeb622 Mon Sep 17 00:00:00 2001 From: Brendan Dahl Date: Sun, 29 Oct 2017 19:07:02 -0700 Subject: [PATCH] Overwrite glyphs contour count if it's less than -1. The test pdf has a contour count of -70, but OTS doesn't like values less than -1. Fixes issue #7562. --- src/core/fonts.js | 12 ++++++++++-- test/pdfs/.gitignore | 1 + test/pdfs/PDFJS-7562-reduced.pdf | Bin 0 -> 13653 bytes test/test_manifest.json | 6 ++++++ 4 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 test/pdfs/PDFJS-7562-reduced.pdf diff --git a/src/core/fonts.js b/src/core/fonts.js index ecd68f8f9..4d7354648 100644 --- a/src/core/fonts.js +++ b/src/core/fonts.js @@ -649,6 +649,11 @@ var Font = (function FontClosure() { return (b0 << 8) + b1; } + function writeSignedInt16(bytes, index, value) { + bytes[index + 1] = value; + bytes[index] = value >>> 8; + } + function signedInt16(b0, b1) { var value = (b0 << 8) + b1; return value & (1 << 15) ? value - 0x10000 : value; @@ -1577,8 +1582,11 @@ var Font = (function FontClosure() { return glyphProfile; } var glyf = source.subarray(sourceStart, sourceEnd); - var contoursCount = (glyf[0] << 8) | glyf[1]; - if (contoursCount & 0x8000) { + var contoursCount = signedInt16(glyf[0], glyf[1]); + if (contoursCount < 0) { + // OTS doesn't like contour count to be less than -1. + contoursCount = -1; + writeSignedInt16(glyf, 0, contoursCount); // complex glyph, writing as is dest.set(glyf, destStart); glyphProfile.length = glyf.length; diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index 07539309b..0d667048c 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -188,6 +188,7 @@ !issue2840.pdf !issue4061.pdf !issue4668.pdf +!PDFJS-7562-reduced.pdf !issue5039.pdf !issue5070.pdf !issue5238.pdf diff --git a/test/pdfs/PDFJS-7562-reduced.pdf b/test/pdfs/PDFJS-7562-reduced.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3ec04370680212b5b0222394d8ae095b6a0ef29a GIT binary patch literal 13653 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