From 0787182e6fdb1e0b537f644cdb0cfcb3b354b4bb Mon Sep 17 00:00:00 2001 From: Yury Delendik Date: Thu, 2 Jul 2015 16:47:47 -0500 Subject: [PATCH] Adds more characters to the PUA range --- src/core/fonts.js | 63 +++++++++++++++++++++++----------------- test/pdfs/.gitignore | 1 + test/pdfs/issue5540.pdf | Bin 0 -> 17459 bytes test/test_manifest.json | 6 ++++ 4 files changed, 44 insertions(+), 26 deletions(-) create mode 100644 test/pdfs/issue5540.pdf diff --git a/src/core/fonts.js b/src/core/fonts.js index 996dbf98d..246d1d630 100644 --- a/src/core/fonts.js +++ b/src/core/fonts.js @@ -2396,6 +2396,32 @@ var OpenTypeFileBuilder = (function OpenTypeFileBuilderClosure() { return OpenTypeFileBuilder; })(); +// Problematic Unicode characters in the fonts that needs to be moved to avoid +// issues when they are painted on the canvas, e.g. complex-script shaping or +// control/whitespace characters. The ranges are listed in pairs: the first item +// is a code of the first problematic code, the second one is the next +// non-problematic code. The ranges must be in sorted order. +var ProblematicCharRanges = new Int32Array([ + // Control characters. + 0x0000, 0x0020, + 0x007F, 0x00A1, + 0x00AD, 0x00AE, + // Chars that is used in complex-script shaping. + 0x0600, 0x0780, + 0x08A0, 0x10A0, + 0x1780, 0x1800, + // General punctuation chars. + 0x2000, 0x2010, + 0x2011, 0x2012, + 0x2028, 0x2030, + 0x205F, 0x2070, + 0x25CC, 0x25CD, + // Chars that is used in complex-script shaping. + 0xAA60, 0xAA80, + // Specials Unicode block. + 0xFFF0, 0x10000 +]); + /** * 'Font' is the class the outside world should use, it encapsulate all the font * decoding logics whatever type it is (assuming the font type is supported). @@ -2679,33 +2705,18 @@ var Font = (function FontClosure() { * @return {boolean} */ function isProblematicUnicodeLocation(code) { - if (code <= 0x1F) { // Control chars - return true; + // Using binary search to find a range start. + var i = 0, j = ProblematicCharRanges.length - 1; + while (i < j) { + var c = (i + j + 1) >> 1; + if (code < ProblematicCharRanges[c]) { + j = c - 1; + } else { + i = c; + } } - if (code >= 0x80 && code <= 0x9F) { // Control chars - return true; - } - if ((code >= 0x2000 && code <= 0x200F) || // General punctuation chars - (code >= 0x2028 && code <= 0x202F) || - (code >= 0x2060 && code <= 0x206F)) { - return true; - } - if (code >= 0xFFF0 && code <= 0xFFFF) { // Specials Unicode block - return true; - } - switch (code) { - case 0x7F: // Control char - case 0xA0: // Non breaking space - case 0xAD: // Soft hyphen - case 0x2011: // Non breaking hyphen - case 0x205F: // Medium mathematical space - case 0x25CC: // Dotted circle (combining mark) - return true; - } - if ((code & ~0xFF) === 0x0E00) { // Thai/Lao chars (with combining mark) - return true; - } - return false; + // Even index means code in problematic range. + return !(i & 1); } /** diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index 70e09390b..ca614c71c 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -130,6 +130,7 @@ !issue4800.pdf !issue4801.pdf !issue5334.pdf +!issue5540.pdf !issue5549.pdf !issue5475.pdf !annotation-border-styles.pdf diff --git a/test/pdfs/issue5540.pdf b/test/pdfs/issue5540.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3c62879a7552e7ae67dca043b57c43eb3e7bcb0f GIT binary patch literal 17459 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