From 4bda6ba1b8180b07508e06be644035ccb625acbc Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Mon, 1 Sep 2014 03:22:24 +0200 Subject: [PATCH 1/2] Add basic support for ZapfDingbats --- src/core/evaluator.js | 11 ++- src/core/fonts.js | 50 +++++++---- src/core/glyphlist.js | 205 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 246 insertions(+), 20 deletions(-) diff --git a/src/core/evaluator.js b/src/core/evaluator.js index e48348dc2..753d248c8 100644 --- a/src/core/evaluator.js +++ b/src/core/evaluator.js @@ -1306,9 +1306,14 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { // The Symbolic attribute can be misused for regular fonts // Heuristic: we have to check if the font is a standard one also if (!!(properties.flags & FontFlags.Symbolic)) { - encoding = (!properties.file && /Symbol/i.test(properties.name) ? - Encodings.SymbolSetEncoding : - Encodings.MacRomanEncoding); + encoding = Encodings.MacRomanEncoding; + if (!properties.file) { + if (/Symbol/i.test(properties.name)) { + encoding = Encodings.SymbolSetEncoding; + } else if (/Dingbats/i.test(properties.name)) { + encoding = Encodings.ZapfDingbatsEncoding; + } + } } properties.defaultEncoding = encoding; } diff --git a/src/core/fonts.js b/src/core/fonts.js index c30285f94..d0df9502b 100644 --- a/src/core/fonts.js +++ b/src/core/fonts.js @@ -18,7 +18,7 @@ readUint32, Stream, FontRendererFactory, shadow, stringToBytes, bytesToString, info, assert, IdentityCMap, Name, CMapFactory, PDFJS, isNum, Lexer, isArray, ISOAdobeCharset, ExpertCharset, - ExpertSubsetCharset, Util */ + ExpertSubsetCharset, Util, DingbatsGlyphsUnicode */ 'use strict'; @@ -262,7 +262,7 @@ var Encodings = { 'parenrighttp', 'parenrightex', 'parenrightbt', 'bracketrighttp', 'bracketrightex', 'bracketrightbt', 'bracerighttp', 'bracerightmid', 'bracerightbt'], - zapfDingbatsEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', + ZapfDingbatsEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'space', 'a1', 'a2', 'a202', 'a3', 'a4', 'a5', 'a119', 'a118', 'a117', 'a11', 'a12', 'a13', 'a14', 'a15', 'a16', 'a105', 'a17', 'a18', 'a19', @@ -273,19 +273,19 @@ var Encodings = { 'a57', 'a58', 'a59', 'a60', 'a61', 'a62', 'a63', 'a64', 'a65', 'a66', 'a67', 'a68', 'a69', 'a70', 'a71', 'a72', 'a73', 'a74', 'a203', 'a75', 'a204', 'a76', 'a77', 'a78', 'a79', 'a81', 'a82', 'a83', 'a84', 'a97', - 'a98', 'a99', 'a100', '', '', '', '', '', '', '', '', '', '', '', '', '', - '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - '', '', 'a101', 'a102', 'a103', 'a104', 'a106', 'a107', 'a108', 'a112', - 'a111', 'a110', 'a109', 'a120', 'a121', 'a122', 'a123', 'a124', 'a125', - 'a126', 'a127', 'a128', 'a129', 'a130', 'a131', 'a132', 'a133', 'a134', - 'a135', 'a136', 'a137', 'a138', 'a139', 'a140', 'a141', 'a142', 'a143', - 'a144', 'a145', 'a146', 'a147', 'a148', 'a149', 'a150', 'a151', 'a152', - 'a153', 'a154', 'a155', 'a156', 'a157', 'a158', 'a159', 'a160', 'a161', - 'a163', 'a164', 'a196', 'a165', 'a192', 'a166', 'a167', 'a168', 'a169', - 'a170', 'a171', 'a172', 'a173', 'a162', 'a174', 'a175', 'a176', 'a177', - 'a178', 'a179', 'a193', 'a180', 'a199', 'a181', 'a200', 'a182', '', 'a201', - 'a183', 'a184', 'a197', 'a185', 'a194', 'a198', 'a186', 'a195', 'a187', - 'a188', 'a189', 'a190', 'a191'] + 'a98', 'a99', 'a100', '', 'a89', 'a90', 'a93', 'a94', 'a91', 'a92', 'a205', + 'a85', 'a206', 'a86', 'a87', 'a88', 'a95', 'a96', '', '', '', '', '', '', + '', '', '', '', '', '', '', '', '', '', '', '', '', 'a101', 'a102', 'a103', + 'a104', 'a106', 'a107', 'a108', 'a112', 'a111', 'a110', 'a109', 'a120', + 'a121', 'a122', 'a123', 'a124', 'a125', 'a126', 'a127', 'a128', 'a129', + 'a130', 'a131', 'a132', 'a133', 'a134', 'a135', 'a136', 'a137', 'a138', + 'a139', 'a140', 'a141', 'a142', 'a143', 'a144', 'a145', 'a146', 'a147', + 'a148', 'a149', 'a150', 'a151', 'a152', 'a153', 'a154', 'a155', 'a156', + 'a157', 'a158', 'a159', 'a160', 'a161', 'a163', 'a164', 'a196', 'a165', + 'a192', 'a166', 'a167', 'a168', 'a169', 'a170', 'a171', 'a172', 'a173', + 'a162', 'a174', 'a175', 'a176', 'a177', 'a178', 'a179', 'a193', 'a180', + 'a199', 'a181', 'a200', 'a182', '', 'a201', 'a183', 'a184', 'a197', 'a185', + 'a194', 'a198', 'a186', 'a195', 'a187', 'a188', 'a189', 'a190', 'a191'] }; /** @@ -2374,7 +2374,7 @@ var OpenTypeFileBuilder = (function OpenTypeFileBuilderClosure() { */ var Font = (function FontClosure() { function Font(name, file, properties) { - var charCode, glyphName; + var charCode, glyphName, fontChar; this.name = name; this.loadedName = properties.loadedName; @@ -2464,7 +2464,23 @@ var Font = (function FontClosure() { } else if (/Symbol/i.test(fontName)) { var symbols = Encodings.SymbolSetEncoding; for (charCode in symbols) { - var fontChar = GlyphsUnicode[symbols[charCode]]; + fontChar = GlyphsUnicode[symbols[charCode]]; + if (!fontChar) { + continue; + } + this.toFontChar[charCode] = fontChar; + } + } else if (/Dingbats/i.test(fontName)) { + var dingbats = Encodings.ZapfDingbatsEncoding; + for (charCode in dingbats) { + fontChar = DingbatsGlyphsUnicode[dingbats[charCode]]; + if (!fontChar) { + continue; + } + this.toFontChar[charCode] = fontChar; + } + for (charCode in properties.differences) { + fontChar = DingbatsGlyphsUnicode[properties.differences[charCode]]; if (!fontChar) { continue; } diff --git a/src/core/glyphlist.js b/src/core/glyphlist.js index cd31a9f87..b2752c5b3 100644 --- a/src/core/glyphlist.js +++ b/src/core/glyphlist.js @@ -4224,3 +4224,208 @@ var GlyphsUnicode = { '.notdef': 0x0000 }; +var DingbatsGlyphsUnicode = { + space: 0x0020, + a1: 0x2701, + a2: 0x2702, + a202: 0x2703, + a3: 0x2704, + a4: 0x260E, + a5: 0x2706, + a119: 0x2707, + a118: 0x2708, + a117: 0x2709, + a11: 0x261B, + a12: 0x261E, + a13: 0x270C, + a14: 0x270D, + a15: 0x270E, + a16: 0x270F, + a105: 0x2710, + a17: 0x2711, + a18: 0x2712, + a19: 0x2713, + a20: 0x2714, + a21: 0x2715, + a22: 0x2716, + a23: 0x2717, + a24: 0x2718, + a25: 0x2719, + a26: 0x271A, + a27: 0x271B, + a28: 0x271C, + a6: 0x271D, + a7: 0x271E, + a8: 0x271F, + a9: 0x2720, + a10: 0x2721, + a29: 0x2722, + a30: 0x2723, + a31: 0x2724, + a32: 0x2725, + a33: 0x2726, + a34: 0x2727, + a35: 0x2605, + a36: 0x2729, + a37: 0x272A, + a38: 0x272B, + a39: 0x272C, + a40: 0x272D, + a41: 0x272E, + a42: 0x272F, + a43: 0x2730, + a44: 0x2731, + a45: 0x2732, + a46: 0x2733, + a47: 0x2734, + a48: 0x2735, + a49: 0x2736, + a50: 0x2737, + a51: 0x2738, + a52: 0x2739, + a53: 0x273A, + a54: 0x273B, + a55: 0x273C, + a56: 0x273D, + a57: 0x273E, + a58: 0x273F, + a59: 0x2740, + a60: 0x2741, + a61: 0x2742, + a62: 0x2743, + a63: 0x2744, + a64: 0x2745, + a65: 0x2746, + a66: 0x2747, + a67: 0x2748, + a68: 0x2749, + a69: 0x274A, + a70: 0x274B, + a71: 0x25CF, + a72: 0x274D, + a73: 0x25A0, + a74: 0x274F, + a203: 0x2750, + a75: 0x2751, + a204: 0x2752, + a76: 0x25B2, + a77: 0x25BC, + a78: 0x25C6, + a79: 0x2756, + a81: 0x25D7, + a82: 0x2758, + a83: 0x2759, + a84: 0x275A, + a97: 0x275B, + a98: 0x275C, + a99: 0x275D, + a100: 0x275E, + a101: 0x2761, + a102: 0x2762, + a103: 0x2763, + a104: 0x2764, + a106: 0x2765, + a107: 0x2766, + a108: 0x2767, + a112: 0x2663, + a111: 0x2666, + a110: 0x2665, + a109: 0x2660, + a120: 0x2460, + a121: 0x2461, + a122: 0x2462, + a123: 0x2463, + a124: 0x2464, + a125: 0x2465, + a126: 0x2466, + a127: 0x2467, + a128: 0x2468, + a129: 0x2469, + a130: 0x2776, + a131: 0x2777, + a132: 0x2778, + a133: 0x2779, + a134: 0x277A, + a135: 0x277B, + a136: 0x277C, + a137: 0x277D, + a138: 0x277E, + a139: 0x277F, + a140: 0x2780, + a141: 0x2781, + a142: 0x2782, + a143: 0x2783, + a144: 0x2784, + a145: 0x2785, + a146: 0x2786, + a147: 0x2787, + a148: 0x2788, + a149: 0x2789, + a150: 0x278A, + a151: 0x278B, + a152: 0x278C, + a153: 0x278D, + a154: 0x278E, + a155: 0x278F, + a156: 0x2790, + a157: 0x2791, + a158: 0x2792, + a159: 0x2793, + a160: 0x2794, + a161: 0x2192, + a163: 0x2194, + a164: 0x2195, + a196: 0x2798, + a165: 0x2799, + a192: 0x279A, + a166: 0x279B, + a167: 0x279C, + a168: 0x279D, + a169: 0x279E, + a170: 0x279F, + a171: 0x27A0, + a172: 0x27A1, + a173: 0x27A2, + a162: 0x27A3, + a174: 0x27A4, + a175: 0x27A5, + a176: 0x27A6, + a177: 0x27A7, + a178: 0x27A8, + a179: 0x27A9, + a193: 0x27AA, + a180: 0x27AB, + a199: 0x27AC, + a181: 0x27AD, + a200: 0x27AE, + a182: 0x27AF, + a201: 0x27B1, + a183: 0x27B2, + a184: 0x27B3, + a197: 0x27B4, + a185: 0x27B5, + a194: 0x27B6, + a198: 0x27B7, + a186: 0x27B8, + a195: 0x27B9, + a187: 0x27BA, + a188: 0x27BB, + a189: 0x27BC, + a190: 0x27BD, + a191: 0x27BE, + a89: 0x2768, // 0xF8D7 + a90: 0x2769, // 0xF8D8 + a93: 0x276A, // 0xF8D9 + a94: 0x276B, // 0xF8DA + a91: 0x276C, // 0xF8DB + a92: 0x276D, // 0xF8DC + a205: 0x276E, // 0xF8DD + a85: 0x276F, // 0xF8DE + a206: 0x2770, // 0xF8DF + a86: 0x2771, // 0xF8E0 + a87: 0x2772, // 0xF8E1 + a88: 0x2773, // 0xF8E2 + a95: 0x2774, // 0xF8E3 + a96: 0x2775, // 0xF8E4 + '.notdef': 0x0000 +}; From 3ca2c3f4a76798a78c4e88b880699a4b1831dea8 Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Wed, 3 Sep 2014 21:57:57 +0200 Subject: [PATCH 2/2] Add ZapfDingbats testcase --- test/pdfs/.gitignore | 1 + test/pdfs/ZapfDingbats.pdf | Bin 0 -> 17602 bytes test/test_manifest.json | 7 +++++++ 3 files changed, 8 insertions(+) create mode 100644 test/pdfs/ZapfDingbats.pdf diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index 4c9ea5764..04c618195 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -75,6 +75,7 @@ !noembed-eucjp.pdf !noembed-sjis.pdf !vertical.pdf +!ZapfDingbats.pdf !bug878026.pdf !issue5010.pdf !issue4934.pdf diff --git a/test/pdfs/ZapfDingbats.pdf b/test/pdfs/ZapfDingbats.pdf new file mode 100644 index 0000000000000000000000000000000000000000..bab369dd094b17cae0d178dab6f66266547bc276 GIT binary patch literal 17602 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