From 172dadb0084bbb122bbe7e463bb045769f75ac85 Mon Sep 17 00:00:00 2001 From: Vivien Nicolas <21@vingtetun.org> Date: Fri, 17 Jun 2011 13:55:42 +0200 Subject: [PATCH 1/7] Clean up some debug leftovers --- fonts.js | 158 +++++++++++++++++++++---------------------------------- pdf.js | 17 ++++-- 2 files changed, 71 insertions(+), 104 deletions(-) diff --git a/fonts.js b/fonts.js index 5390abba4..b9ef5b330 100644 --- a/fonts.js +++ b/fonts.js @@ -31,7 +31,7 @@ var fontCount = 0; var Fonts = { _active: null, get active() { - return this._active || { encoding: [] }; + return this._active; }, set active(aName) { @@ -39,8 +39,11 @@ var Fonts = { }, unicodeFromCode: function fonts_unicodeFromCode(aCode) { - var unicode = GlyphsUnicode[this.active.encoding[aCode]]; - return unicode ? unicode : aCode; + var active = this._active; + if (!active || !active.properties.encoding) + return aCode; + + return GlyphsUnicode[active.properties.encoding[aCode]]; } }; @@ -49,16 +52,10 @@ var Fonts = { * decoding logics whatever type it is (assuming the font type is supported). * * For example to read a Type1 font and to attach it to the document: - * var type1Font = new Font("MyFontName", binaryData, aFontEncoding, "Type1"); + * var type1Font = new Font("MyFontName", binaryFile, propertiesObject); * type1Font.bind(); - * - * As an improvment the last parameter can be replaced by an automatic guess - * of the font type based on the first byte of the file. - * - * FIXME There is now too many parameters, this should be turned into an - * object containing all the required informations about the font */ -var Font = function(aName, aFile, aEncoding, aCharset, aBBox, aType) { +var Font = function(aName, aFile, aProperties) { this.name = aName; // If the font has already been decoded simply return @@ -68,41 +65,40 @@ var Font = function(aName, aFile, aEncoding, aCharset, aBBox, aType) { } fontCount++; - var start = Date.now(); - switch (aType) { + switch (aProperties.type) { case "Type1": - var cff = new CFF(aName, aBBox, aFile); + var cff = new CFF(aName, aFile, aProperties); this.mimetype = "font/otf"; // Wrap the CFF data inside an OTF font file - this.font = this.cover(cff); + this.font = this.cover(cff, aProperties); break; case "TrueType": + // TrueType is disabled for the moment since the sanitizer prevent it + // from loading because of an overdated cmap table return Fonts[aName] = { data: null, - encoding: {}, - charset: null, + properties: { + encoding: {}, + charset: null + }, loading: false }; - // TrueType is disabled for the moment since the sanitizer prevent it - // from loading this.mimetype = "font/ttf"; var ttf = new TrueType(aFile); this.font = ttf.data; break; default: - warn("Font " + aType + " is not supported"); + warn("Font " + aProperties.type + " is not supported"); break; } - var end = Date.now(); Fonts[aName] = { data: this.font, - encoding: aEncoding, - charset: aCharset ? aCharset.slice() : null, + properties: aProperties, loading: true } @@ -204,7 +200,7 @@ Font.prototype = { if (debug) ctx.fillText(testString, 20, 50); - }, 20, this); + }, 50, this); /** Hack end */ @@ -355,7 +351,7 @@ Font.prototype = { idDeltas, idRangeOffsets, glyphsIdsArray); }, - cover: function font_cover(aFont) { + cover: function font_cover(aFont, aProperties) { var otf = new Uint8Array(kMaxFontFileSize); // Required Tables @@ -431,7 +427,7 @@ Font.prototype = { this._createTableEntry(otf, offsets, "OS/2", OS2); //XXX Getting charstrings here seems wrong since this is another CFF glue - var charstrings = aFont.getOrderedCharStrings(aFont.glyphs); + var charstrings = aFont.getOrderedCharStrings(aProperties.glyphs); /** CMAP */ cmap = this._createCMAPTable(charstrings); @@ -715,22 +711,11 @@ var TrueType = function(aFile) { ttf.set(tableData, offsets.currentOffset); offsets.currentOffset += tableData.length; - if (0) { - var data = []; - for (var j = 0; j < tableData.length; j++) - d.push(tableData[j]); - log("data for table: " + table.tag + ": " + data); - } - // 4-byte aligned data while (offsets.currentOffset & 3) offsets.currentOffset++; } - var fontData = []; - for (var i = 0; i < ttf.length; i++) - fontData.push(ttf[i]); - this.data = ttf; return; } else if (requiredTables.lenght) { @@ -844,17 +829,11 @@ TrueType.prototype = { /** - * This dictionary holds decoded fonts data. + * Type1Parser encapsulate the needed code for parsing a Type1 font + * program. + * Some of its logic depends on the Type2 charstrings structure. */ var Type1Parser = function() { - // Turn on this flag for additional debugging logs - var debug = false; - - var dump = function(aData) { - if (debug) - log(aData); - }; - /* * Decrypt a Sequence of Ciphertext Bytes to Produce the Original Sequence * of Plaintext Bytes. The function took a key as a parameter which can be @@ -863,8 +842,7 @@ var Type1Parser = function() { var kEexecEncryptionKey = 55665; var kCharStringsEncryptionKey = 4330; - function decrypt(aStream, aKey, aDiscardNumber, aByteArray) { - var start = Date.now(); + function decrypt(aStream, aKey, aDiscardNumber) { var r = aKey, c1 = 52845, c2 = 22719; var decryptedString = []; @@ -872,14 +850,9 @@ var Type1Parser = function() { var count = aStream.length; for (var i = 0; i < count; i++) { value = aStream[i]; - if (aByteArray) - decryptedString[i] = value ^ (r >> 8); - else - decryptedString[i] = String.fromCharCode(value ^ (r >> 8)); + decryptedString[i] = value ^ (r >> 8); r = ((value + r) * c1 + c2) & ((1 << 16) - 1); } - var end = Date.now(); - dump("Time to decrypt string of length " + count + " is " + (end - start)); return decryptedString.slice(aDiscardNumber); }; @@ -1014,8 +987,7 @@ var Type1Parser = function() { } else if (!command) { break; } else if (command == -1) { - log("decodeCharstring: " + charString); - error("Support for Type1 command " + value + " (" + escape + ") is not implemented"); + error("Support for Type1 command " + value + " (" + escape + ") is not implemented in charstring: " + charString); } value = command; @@ -1042,8 +1014,8 @@ var Type1Parser = function() { * Returns an object containing a Subrs array and a CharStrings array * extracted from and eexec encrypted block of data */ - this.extractFontInfo = function(aStream) { - var eexecString = decrypt(aStream, kEexecEncryptionKey, 4, true); + this.extractFontProgram = function t1_extractFontProgram(aStream) { + var eexecString = decrypt(aStream, kEexecEncryptionKey, 4); var subrs = [], glyphs = []; var inSubrs = inGlyphs = false; var glyph = ""; @@ -1052,15 +1024,15 @@ var Type1Parser = function() { var index = 0; var length = 0; - var count = eexecString.length; var c = ""; + var count = eexecString.length; for (var i = 0; i < count; i++) { var c = eexecString[i]; if (inSubrs && c == 0x52) { length = parseInt(length); var data = eexecString.slice(i + 3, i + 3 + length); - var encodedSubr = decrypt(data, kCharStringsEncryptionKey, 4, true); + var encodedSubr = decrypt(data, kCharStringsEncryptionKey, 4); var subr = decodeCharString(encodedSubr); subrs.push(subr); @@ -1068,7 +1040,7 @@ var Type1Parser = function() { } else if (inGlyphs && c == 0x52) { length = parseInt(length); var data = eexecString.slice(i + 3, i + 3 + length); - var encodedCharstring = decrypt(data, kCharStringsEncryptionKey, 4, true); + var encodedCharstring = decrypt(data, kCharStringsEncryptionKey, 4); var subr = decodeCharString(encodedCharstring); glyphs.push({ @@ -1104,36 +1076,37 @@ var Type1Parser = function() { } }; -var CFF = function(aFontName, aFontBBox, aFontFile) { +/** + * Take a Type1 file as input and wrap it into a Compact Font Format (CFF) + * wrapping Type2 charstrings. + */ +var CFF = function(aName, aFile, aProperties) { // Get the data block containing glyphs and subrs informations - var length1 = aFontFile.dict.get("Length1"); - var length2 = aFontFile.dict.get("Length2"); - aFontFile.skip(length1); - var eexecBlock = aFontFile.getBytes(length2); + var length1 = aFile.dict.get("Length1"); + var length2 = aFile.dict.get("Length2"); + aFile.skip(length1); + var eexecBlock = aFile.getBytes(length2); - // Extract informations from it - var start = Date.now(); + // Decrypt the data blocks and retrieve the informations from it var parser = new Type1Parser(); - var fontInfo = parser.extractFontInfo(eexecBlock); - fontInfo.name = aFontName; - fontInfo.bbox = aFontBBox; + var fontInfo = parser.extractFontProgram(eexecBlock); - // XXX This hold the glyph data as if, this should be improved - this.glyphs = fontInfo.charstrings; - - this.data = this.convertToCFF(fontInfo); - var end = Date.now(); + aProperties.subrs = fontInfo.subrs; + aProperties.glyphs = fontInfo.charstrings; + this.data = this.wrap(aName, aProperties); }; CFF.prototype = { createCFFIndexHeader: function(aObjects, aIsByte) { - var data = []; - // First 2 bytes contains the number of objects contained into this index var count = aObjects.length; - if (count ==0) + + // If there is no object, just create an array saying that with another + // offset byte. + if (count == 0) return [0x00, 0x00, 0x00]; + var data = []; var bytes = FontsUtils.integerToBytes(count, 2); for (var i = 0; i < bytes.length; i++) data.push(bytes[i]); @@ -1164,10 +1137,9 @@ CFF.prototype = { encodeNumber: function(aValue) { var x = 0; if (aValue >= -32768 && aValue <= 32767) { - return [ 28, aValue >> 8, aValue ]; + return [ 28, aValue >> 8, aValue & 0xFF ]; } else if (aValue >= (-2147483647-1) && aValue <= 2147483647) { - return [ - 0xFF, aValue >> 24, Value >> 16, aValue >> 8, aValue ]; + return [ 0xFF, aValue >> 24, Value >> 16, aValue >> 8, aValue & 0xFF ]; } else { error("Value: " + aValue + " is not allowed"); } @@ -1220,7 +1192,6 @@ CFF.prototype = { }, flattenCharstring: function(aGlyph, aCharstring, aSubrs) { - var original = aCharstring.slice(); var i = 0; while (true) { var obj = aCharstring[i]; @@ -1324,17 +1295,10 @@ CFF.prototype = { error("failing with i = " + i + " in charstring:" + aCharstring + "(" + aCharstring.length + ")"); }, - convertToCFF: function(aFontInfo) { - var debug = false; - function dump(aMsg) { - if (debug) - log(aMsg); - }; - - var charstrings = this.getOrderedCharStrings(aFontInfo.charstrings); + wrap: function(aName, aProperties) { + var charstrings = this.getOrderedCharStrings(aProperties.glyphs); // Starts the conversion of the Type1 charstrings to Type2 - var start = Date.now(); var charstringsCount = 0; var charstringsDataLength = 0; var glyphs = []; @@ -1342,16 +1306,12 @@ CFF.prototype = { var charstring = charstrings[i].charstring.slice(); var glyph = charstrings[i].glyph; - var flattened = this.flattenCharstring(glyph, charstring, aFontInfo.subrs); + var flattened = this.flattenCharstring(glyph, charstring, aProperties.subrs); glyphs.push(flattened); charstringsCount++; charstringsDataLength += flattened.length; } - var end = Date.now(); - dump("There is " + charstringsCount + " glyphs (size: " + charstringsDataLength + ")"); - dump("Time to flatten the strings is : " + (end -start)); - // Create a CFF font data var cff = new Uint8Array(kMaxFontFileSize); var currentOffset = 0; @@ -1362,7 +1322,7 @@ CFF.prototype = { cff.set(header); // Names Index - var nameIndex = this.createCFFIndexHeader([aFontInfo.name]); + var nameIndex = this.createCFFIndexHeader([aName]); cff.set(nameIndex, currentOffset); currentOffset += nameIndex.length; @@ -1406,7 +1366,7 @@ CFF.prototype = { 248, 31, 4 // Weight ]; - var fontBBox = aFontInfo.bbox; + var fontBBox = aProperties.bbox; for (var i = 0; i < fontBBox.length; i++) topDictIndex = topDictIndex.concat(this.encodeNumber(fontBBox[i])); topDictIndex.push(5) // FontBBox; diff --git a/pdf.js b/pdf.js index fe636bcf9..b8f32226b 100644 --- a/pdf.js +++ b/pdf.js @@ -1737,6 +1737,7 @@ var CanvasGraphics = (function() { // Generate the custom cmap of the font if needed var encodingMap = {}; if (fontDict.has("Encoding")) { + var encoding = xref.fetchIfRef(fontDict.get("Encoding")); if (IsDict(encoding)) { // Build an map between codes and glyphs @@ -1749,6 +1750,7 @@ var CanvasGraphics = (function() { // Get the font charset var charset = descriptor.get("CharSet").split("/"); + } else if (IsName(encoding)) { var encoding = Encodings[encoding]; var widths = xref.fetchIfRef(fontDict.get("Widths")); @@ -1757,15 +1759,20 @@ var CanvasGraphics = (function() { var charset = []; for (var j = 0; j < widths.length; j++) { var index = widths[j]; - if (index) - charset.push(encoding[j + firstchar]); + if (!index) + continue; + charset.push(encoding[j + firstchar]); } } } - var fontBBox = descriptor.get("FontBBox"); - var subtype = fontDict.get("Subtype").name; - new Font(fontName, fontFile, encodingMap, charset, fontBBox, subtype); + var properties = { + type: fontDict.get("Subtype").name, + encoding: encodingMap, + charset: charset, + bbox: descriptor.get("FontBBox") + }; + new Font(fontName, fontFile, properties); } return Fonts[fontName]; }, From 4bd3308b7838ef346c450205c16ea4f398eb50dc Mon Sep 17 00:00:00 2001 From: Vivien Nicolas <21@vingtetun.org> Date: Fri, 17 Jun 2011 20:29:34 +0200 Subject: [PATCH 2/7] Do not assume charset is defined and move some fonts timing to the right place --- pdf.js | 77 ++++++++++++++++++++++++++++++--------------------------- test.js | 55 +++++++++++++++++++++++++---------------- 2 files changed, 75 insertions(+), 57 deletions(-) diff --git a/pdf.js b/pdf.js index b8f32226b..1a1714647 100644 --- a/pdf.js +++ b/pdf.js @@ -1729,52 +1729,57 @@ var CanvasGraphics = (function() { var fontName = descriptor.get("FontName").name; fontName = fontName.replace("+", "_"); - var font = Fonts[fontName]; - if (!font) { - var fontFile = descriptor.get2("FontFile", "FontFile2"); - fontFile = xref.fetchIfRef(fontFile); + var fontFile = descriptor.get2("FontFile", "FontFile2"); + if (!fontFile) + errort("FontFile not found for font: " + fontName); + fontFile = xref.fetchIfRef(fontFile); - // Generate the custom cmap of the font if needed - var encodingMap = {}; - if (fontDict.has("Encoding")) { + // Generate the custom cmap of the font if needed + var encodingMap = {}; + if (fontDict.has("Encoding")) { + var encoding = xref.fetchIfRef(fontDict.get("Encoding")); + if (IsDict(encoding)) { + // Build an map between codes and glyphs + var differences = encoding.get("Differences"); + var index = 0; + for (var j = 0; j < differences.length; j++) { + var data = differences[j]; + IsNum(data) ? index = data : encodingMap[index++] = data; + } - var encoding = xref.fetchIfRef(fontDict.get("Encoding")); - if (IsDict(encoding)) { - // Build an map between codes and glyphs - var differences = encoding.get("Differences"); - var index = 0; - for (var j = 0; j < differences.length; j++) { - var data = differences[j]; - IsNum(data) ? index = data : encodingMap[index++] = data; - } + // Get the font charset if any + var charset = descriptor.get("CharSet"); + if (charset) + charset = charset.split("/"); - // Get the font charset - var charset = descriptor.get("CharSet").split("/"); + } else if (IsName(encoding)) { + var encoding = Encodings[encoding]; + var widths = xref.fetchIfRef(fontDict.get("Widths")); + var firstchar = xref.fetchIfRef(fontDict.get("FirstChar")); - } else if (IsName(encoding)) { - var encoding = Encodings[encoding]; - var widths = xref.fetchIfRef(fontDict.get("Widths")); - var firstchar = xref.fetchIfRef(fontDict.get("FirstChar")); + var charset = []; + for (var j = 0; j < widths.length; j++) { + var index = widths[j]; + if (!index) + continue; - var charset = []; - for (var j = 0; j < widths.length; j++) { - var index = widths[j]; - if (!index) - continue; - charset.push(encoding[j + firstchar]); - } - } - } + charset.push(encoding[j + firstchar]); + } + } + } - var properties = { + var properties = { type: fontDict.get("Subtype").name, encoding: encodingMap, charset: charset, bbox: descriptor.get("FontBBox") - }; - new Font(fontName, fontFile, properties); - } - return Fonts[fontName]; + }; + + return { + name: fontName, + file: fontFile, + properties: properties + } }, beginDrawing: function(mediaBox) { diff --git a/test.js b/test.js index cbfd70c65..59d8167a2 100644 --- a/test.js +++ b/test.js @@ -74,30 +74,43 @@ function displayPage(num) { page.compile(gfx, fonts); var t2 = Date.now(); - var interval = 0; - for (var i = 0; i < fonts.length; i++) { - if (fonts[i].loading) { - interval = 10; - break; + var fontsReady = true; + + // Inspect fonts and translate the missing one + var count = fonts.length; + for (var i = 0; i < count; i++) { + var font = fonts[i]; + if (Fonts[font.name]) { + fontsReady = fontsReady && !Fonts[font.name].loading; + continue; } + + new Font(font.name, font.file, font.properties); + fontsReady = false; + } + + function delayLoadFont() { + for (var i = 0; i < count; i++) { + if (Fonts[font.name].loading) + return; + } + clearInterval(pageInterval); + + var t3 = Date.now(); + + page.display(gfx); + + var t4 = Date.now(); + + var infoDisplay = document.getElementById("info"); + infoDisplay.innerHTML = "Time to load/compile/fonts/render: "+ (t1 - t0) + "/" + (t2 - t1) + "/" + (t3 - t2) + "/" + (t4 - t3) + " ms"; }; - // FIXME This need to be replaced by an event - pageInterval = setInterval(function() { - for (var i = 0; i < fonts.length; i++) { - if (fonts[i].loading) - return; - } - var t3 = Date.now(); - - clearInterval(pageInterval); - page.display(gfx); - - var t4 = Date.now(); - - var infoDisplay = document.getElementById("info"); - infoDisplay.innerHTML = "Time to load/compile/fonts/render: "+ (t1 - t0) + "/" + (t2 - t1) + "/" + (t3 - t2) + "/" + (t4 - t3) + " ms"; - }, interval); + if (fontsReady) { + delayLoadFont(); + } else { + pageInterval = setInterval(delayLoadFont, 10); + } } function nextPage() { From 1db4812c00b7dc44474f395dceacd5a7cc2c025e Mon Sep 17 00:00:00 2001 From: Andreas Gal Date: Fri, 17 Jun 2011 15:48:17 -0700 Subject: [PATCH 3/7] inline Encodings table into pdf.js and use getters for lazy construction --- Encodings.js | 1552 -------------------------------------------------- pdf.js | 192 ++++++- test.html | 1 - 3 files changed, 184 insertions(+), 1561 deletions(-) delete mode 100644 Encodings.js diff --git a/Encodings.js b/Encodings.js deleted file mode 100644 index d32a399c8..000000000 --- a/Encodings.js +++ /dev/null @@ -1,1552 +0,0 @@ - -var Encodings = { - ExpertEncoding: [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - "space", - "exclamsmall", - "Hungarumlautsmall", - null, - "dollaroldstyle", - "dollarsuperior", - "ampersandsmall", - "Acutesmall", - "parenleftsuperior", - "parenrightsuperior", - "twodotenleader", - "onedotenleader", - "comma", - "hyphen", - "period", - "fraction", - "zerooldstyle", - "oneoldstyle", - "twooldstyle", - "threeoldstyle", - "fouroldstyle", - "fiveoldstyle", - "sixoldstyle", - "sevenoldstyle", - "eightoldstyle", - "nineoldstyle", - "colon", - "semicolon", - "commasuperior", - "threequartersemdash", - "periodsuperior", - "questionsmall", - null, - "asuperior", - "bsuperior", - "centsuperior", - "dsuperior", - "esuperior", - null, - null, - null, - "isuperior", - null, - null, - "lsuperior", - "msuperior", - "nsuperior", - "osuperior", - null, - null, - "rsuperior", - "ssuperior", - "tsuperior", - null, - "ff", - "fi", - "fl", - "ffi", - "ffl", - "parenleftinferior", - null, - "parenrightinferior", - "Circumflexsmall", - "hyphensuperior", - "Gravesmall", - "Asmall", - "Bsmall", - "Csmall", - "Dsmall", - "Esmall", - "Fsmall", - "Gsmall", - "Hsmall", - "Ismall", - "Jsmall", - "Ksmall", - "Lsmall", - "Msmall", - "Nsmall", - "Osmall", - "Psmall", - "Qsmall", - "Rsmall", - "Ssmall", - "Tsmall", - "Usmall", - "Vsmall", - "Wsmall", - "Xsmall", - "Ysmall", - "Zsmall", - "colonmonetary", - "onefitted", - "rupiah", - "Tildesmall", - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - "exclamdownsmall", - "centoldstyle", - "Lslashsmall", - null, - null, - "Scaronsmall", - "Zcaronsmall", - "Dieresissmall", - "Brevesmall", - "Caronsmall", - null, - "Dotaccentsmall", - null, - null, - "Macronsmall", - null, - null, - "figuredash", - "hypheninferior", - null, - null, - "Ogoneksmall", - "Ringsmall", - "Cedillasmall", - null, - null, - null, - "onequarter", - "onehalf", - "threequarters", - "questiondownsmall", - "oneeighth", - "threeeighths", - "fiveeighths", - "seveneighths", - "onethird", - "twothirds", - null, - null, - "zerosuperior", - "onesuperior", - "twosuperior", - "threesuperior", - "foursuperior", - "fivesuperior", - "sixsuperior", - "sevensuperior", - "eightsuperior", - "ninesuperior", - "zeroinferior", - "oneinferior", - "twoinferior", - "threeinferior", - "fourinferior", - "fiveinferior", - "sixinferior", - "seveninferior", - "eightinferior", - "nineinferior", - "centinferior", - "dollarinferior", - "periodinferior", - "commainferior", - "Agravesmall", - "Aacutesmall", - "Acircumflexsmall", - "Atildesmall", - "Adieresissmall", - "Aringsmall", - "AEsmall", - "Ccedillasmall", - "Egravesmall", - "Eacutesmall", - "Ecircumflexsmall", - "Edieresissmall", - "Igravesmall", - "Iacutesmall", - "Icircumflexsmall", - "Idieresissmall", - "Ethsmall", - "Ntildesmall", - "Ogravesmall", - "Oacutesmall", - "Ocircumflexsmall", - "Otildesmall", - "Odieresissmall", - "OEsmall", - "Oslashsmall", - "Ugravesmall", - "Uacutesmall", - "Ucircumflexsmall", - "Udieresissmall", - "Yacutesmall", - "Thornsmall", - "Ydieresissmall" - ], - MacExpertEncoding: [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - "space", - "exclamsmall", - "Hungarumlautsmall", - "centoldstyle", - "dollaroldstyle", - "dollarsuperior", - "ampersandsmall", - "Acutesmall", - "parenleftsuperior", - "parenrightsuperior", - "twodotenleader", - "onedotenleader", - "comma", - "hyphen", - "period", - "fraction", - "zerooldstyle", - "oneoldstyle", - "twooldstyle", - "threeoldstyle", - "fouroldstyle", - "fiveoldstyle", - "sixoldstyle", - "sevenoldstyle", - "eightoldstyle", - "nineoldstyle", - "colon", - "semicolon", - null, - "threequartersemdash", - null, - "questionsmall", - null, - null, - null, - null, - "Ethsmall", - null, - null, - "onequarter", - "onehalf", - "threequarters", - "oneeighth", - "threeeighths", - "fiveeighths", - "seveneighths", - "onethird", - "twothirds", - null, - null, - null, - null, - null, - null, - "ff", - "fi", - "fl", - "ffi", - "ffl", - "parenleftinferior", - null, - "parenrightinferior", - "Circumflexsmall", - "hypheninferior", - "Gravesmall", - "Asmall", - "Bsmall", - "Csmall", - "Dsmall", - "Esmall", - "Fsmall", - "Gsmall", - "Hsmall", - "Ismall", - "Jsmall", - "Ksmall", - "Lsmall", - "Msmall", - "Nsmall", - "Osmall", - "Psmall", - "Qsmall", - "Rsmall", - "Ssmall", - "Tsmall", - "Usmall", - "Vsmall", - "Wsmall", - "Xsmall", - "Ysmall", - "Zsmall", - "colonmonetary", - "onefitted", - "rupiah", - "Tildesmall", - null, - null, - "asuperior", - "centsuperior", - null, - null, - null, - null, - "Aacutesmall", - "Agravesmall", - "Acircumflexsmall", - "Adieresissmall", - "Atildesmall", - "Aringsmall", - "Ccedillasmall", - "Eacutesmall", - "Egravesmall", - "Ecircumflexsmall", - "Edieresissmall", - "Iacutesmall", - "Igravesmall", - "Icircumflexsmall", - "Idieresissmall", - "Ntildesmall", - "Oacutesmall", - "Ogravesmall", - "Ocircumflexsmall", - "Odieresissmall", - "Otildesmall", - "Uacutesmall", - "Ugravesmall", - "Ucircumflexsmall", - "Udieresissmall", - null, - "eightsuperior", - "fourinferior", - "threeinferior", - "sixinferior", - "eightinferior", - "seveninferior", - "Scaronsmall", - null, - "centinferior", - "twoinferior", - null, - "Dieresissmall", - null, - "Caronsmall", - "osuperior", - "fiveinferior", - null, - "commainferior", - "periodinferior", - "Yacutesmall", - null, - "dollarinferior", - null, - null, - "Thornsmall", - null, - "nineinferior", - "zeroinferior", - "Zcaronsmall", - "AEsmall", - "Oslashsmall", - "questiondownsmall", - "oneinferior", - "Lslashsmall", - null, - null, - null, - null, - null, - null, - "Cedillasmall", - null, - null, - null, - null, - null, - "OEsmall", - "figuredash", - "hyphensuperior", - null, - null, - null, - null, - "exclamdownsmall", - null, - "Ydieresissmall", - null, - "onesuperior", - "twosuperior", - "threesuperior", - "foursuperior", - "fivesuperior", - "sixsuperior", - "sevensuperior", - "ninesuperior", - "zerosuperior", - null, - "esuperior", - "rsuperior", - "tsuperior", - null, - null, - "isuperior", - "ssuperior", - "dsuperior", - null, - null, - null, - null, - null, - "lsuperior", - "Ogoneksmall", - "Brevesmall", - "Macronsmall", - "bsuperior", - "nsuperior", - "msuperior", - "commasuperior", - "periodsuperior", - "Dotaccentsmall", - "Ringsmall", - null, - null, - null, - null - ], - MacRomanEncoding: [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - "space", - "exclam", - "quotedbl", - "numbersign", - "dollar", - "percent", - "ampersand", - "quotesingle", - "parenleft", - "parenright", - "asterisk", - "plus", - "comma", - "hyphen", - "period", - "slash", - "zero", - "one", - "two", - "three", - "four", - "five", - "six", - "seven", - "eight", - "nine", - "colon", - "semicolon", - "less", - "equal", - "greater", - "question", - "at", - "A", - "B", - "C", - "D", - "E", - "F", - "G", - "H", - "I", - "J", - "K", - "L", - "M", - "N", - "O", - "P", - "Q", - "R", - "S", - "T", - "U", - "V", - "W", - "X", - "Y", - "Z", - "bracketleft", - "backslash", - "bracketright", - "asciicircum", - "underscore", - "grave", - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "braceleft", - "bar", - "braceright", - "asciitilde", - null, - "Adieresis", - "Aring", - "Ccedilla", - "Eacute", - "Ntilde", - "Odieresis", - "Udieresis", - "aacute", - "agrave", - "acircumflex", - "adieresis", - "atilde", - "aring", - "ccedilla", - "eacute", - "egrave", - "ecircumflex", - "edieresis", - "iacute", - "igrave", - "icircumflex", - "idieresis", - "ntilde", - "oacute", - "ograve", - "ocircumflex", - "odieresis", - "otilde", - "uacute", - "ugrave", - "ucircumflex", - "udieresis", - "dagger", - "degree", - "cent", - "sterling", - "section", - "bullet", - "paragraph", - "germandbls", - "registered", - "copyright", - "trademark", - "acute", - "dieresis", - "notequal", - "AE", - "Oslash", - "infinity", - "plusminus", - "lessequal", - "greaterequal", - "yen", - "mu", - "partialdiff", - "summation", - "product", - "pi", - "integral", - "ordfeminine", - "ordmasculine", - "Omega", - "ae", - "oslash", - "questiondown", - "exclamdown", - "logicalnot", - "radical", - "florin", - "approxequal", - "Delta", - "guillemotleft", - "guillemotright", - "ellipsis", - "space", - "Agrave", - "Atilde", - "Otilde", - "OE", - "oe", - "endash", - "emdash", - "quotedblleft", - "quotedblright", - "quoteleft", - "quoteright", - "divide", - "lozenge", - "ydieresis", - "Ydieresis", - "fraction", - "currency", - "guilsinglleft", - "guilsinglright", - "fi", - "fl", - "daggerdbl", - "periodcentered", - "quotesinglbase", - "quotedblbase", - "perthousand", - "Acircumflex", - "Ecircumflex", - "Aacute", - "Edieresis", - "Egrave", - "Iacute", - "Icircumflex", - "Idieresis", - "Igrave", - "Oacute", - "Ocircumflex", - "apple", - "Ograve", - "Uacute", - "Ucircumflex", - "Ugrave", - "dotlessi", - "circumflex", - "tilde", - "macron", - "breve", - "dotaccent", - "ring", - "cedilla", - "hungarumlaut", - "ogonek", - "caron" - ], - StandardEncoding: [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - "space", - "exclam", - "quotedbl", - "numbersign", - "dollar", - "percent", - "ampersand", - "quoteright", - "parenleft", - "parenright", - "asterisk", - "plus", - "comma", - "hyphen", - "period", - "slash", - "zero", - "one", - "two", - "three", - "four", - "five", - "six", - "seven", - "eight", - "nine", - "colon", - "semicolon", - "less", - "equal", - "greater", - "question", - "at", - "A", - "B", - "C", - "D", - "E", - "F", - "G", - "H", - "I", - "J", - "K", - "L", - "M", - "N", - "O", - "P", - "Q", - "R", - "S", - "T", - "U", - "V", - "W", - "X", - "Y", - "Z", - "bracketleft", - "backslash", - "bracketright", - "asciicircum", - "underscore", - "quoteleft", - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "braceleft", - "bar", - "braceright", - "asciitilde", - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - "exclamdown", - "cent", - "sterling", - "fraction", - "yen", - "florin", - "section", - "currency", - "quotesingle", - "quotedblleft", - "guillemotleft", - "guilsinglleft", - "guilsinglright", - "fi", - "fl", - null, - "endash", - "dagger", - "daggerdbl", - "periodcentered", - null, - "paragraph", - "bullet", - "quotesinglbase", - "quotedblbase", - "quotedblright", - "guillemotright", - "ellipsis", - "perthousand", - null, - "questiondown", - null, - "grave", - "acute", - "circumflex", - "tilde", - "macron", - "breve", - "dotaccent", - "dieresis", - null, - "ring", - "cedilla", - null, - "hungarumlaut", - "ogonek", - "caron", - "emdash", - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - "AE", - null, - "ordfeminine", - null, - null, - null, - null, - "Lslash", - "Oslash", - "OE", - "ordmasculine", - null, - null, - null, - null, - null, - "ae", - null, - null, - null, - "dotlessi", - null, - null, - "lslash", - "oslash", - "oe", - "germandbls", - null, - null, - null, - null - ], - WinAnsiEncoding: [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - "space", - "exclam", - "quotedbl", - "numbersign", - "dollar", - "percent", - "ampersand", - "quotesingle", - "parenleft", - "parenright", - "asterisk", - "plus", - "comma", - "hyphen", - "period", - "slash", - "zero", - "one", - "two", - "three", - "four", - "five", - "six", - "seven", - "eight", - "nine", - "colon", - "semicolon", - "less", - "equal", - "greater", - "question", - "at", - "A", - "B", - "C", - "D", - "E", - "F", - "G", - "H", - "I", - "J", - "K", - "L", - "M", - "N", - "O", - "P", - "Q", - "R", - "S", - "T", - "U", - "V", - "W", - "X", - "Y", - "Z", - "bracketleft", - "backslash", - "bracketright", - "asciicircum", - "underscore", - "grave", - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "braceleft", - "bar", - "braceright", - "asciitilde", - "bullet", - "Euro", - "bullet", - "quotesinglbase", - "florin", - "quotedblbase", - "ellipsis", - "dagger", - "daggerdbl", - "circumflex", - "perthousand", - "Scaron", - "guilsinglleft", - "OE", - "bullet", - "Zcaron", - "bullet", - "bullet", - "quoteleft", - "quoteright", - "quotedblleft", - "quotedblright", - "bullet", - "endash", - "emdash", - "tilde", - "trademark", - "scaron", - "guilsinglright", - "oe", - "bullet", - "zcaron", - "Ydieresis", - "space", - "exclamdown", - "cent", - "sterling", - "currency", - "yen", - "brokenbar", - "section", - "dieresis", - "copyright", - "ordfeminine", - "guillemotleft", - "logicalnot", - "hyphen", - "registered", - "macron", - "degree", - "plusminus", - "twosuperior", - "threesuperior", - "acute", - "mu", - "paragraph", - "periodcentered", - "cedilla", - "onesuperior", - "ordmasculine", - "guillemotright", - "onequarter", - "onehalf", - "threequarters", - "questiondown", - "Agrave", - "Aacute", - "Acircumflex", - "Atilde", - "Adieresis", - "Aring", - "AE", - "Ccedilla", - "Egrave", - "Eacute", - "Ecircumflex", - "Edieresis", - "Igrave", - "Iacute", - "Icircumflex", - "Idieresis", - "Eth", - "Ntilde", - "Ograve", - "Oacute", - "Ocircumflex", - "Otilde", - "Odieresis", - "multiply", - "Oslash", - "Ugrave", - "Uacute", - "Ucircumflex", - "Udieresis", - "Yacute", - "Thorn", - "germandbls", - "agrave", - "aacute", - "acircumflex", - "atilde", - "adieresis", - "aring", - "ae", - "ccedilla", - "egrave", - "eacute", - "ecircumflex", - "edieresis", - "igrave", - "iacute", - "icircumflex", - "idieresis", - "eth", - "ntilde", - "ograve", - "oacute", - "ocircumflex", - "otilde", - "odieresis", - "divide", - "oslash", - "ugrave", - "uacute", - "ucircumflex", - "udieresis", - "yacute", - "thorn", - "ydieresis" - ], - zapfDingbatsEncoding: [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - "space", - "a1", - "a2", - "a202", - "a3", - "a4", - "a5", - "a119", - "a118", - "a117", - "a11", - "a12", - "a13", - "a14", - "a15", - "a16", - "a105", - "a17", - "a18", - "a19", - "a20", - "a21", - "a22", - "a23", - "a24", - "a25", - "a26", - "a27", - "a28", - "a6", - "a7", - "a8", - "a9", - "a10", - "a29", - "a30", - "a31", - "a32", - "a33", - "a34", - "a35", - "a36", - "a37", - "a38", - "a39", - "a40", - "a41", - "a42", - "a43", - "a44", - "a45", - "a46", - "a47", - "a48", - "a49", - "a50", - "a51", - "a52", - "a53", - "a54", - "a55", - "a56", - "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", - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - "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", - null, - "a201", - "a183", - "a184", - "a197", - "a185", - "a194", - "a198", - "a186", - "a195", - "a187", - "a188", - "a189", - "a190", - "a191", - null - ] -}; - diff --git a/pdf.js b/pdf.js index 1a1714647..0a6345799 100644 --- a/pdf.js +++ b/pdf.js @@ -1615,6 +1615,180 @@ var CanvasExtraState = (function() { return constructor; })(); +const Encodings = { + get ExpertEncoding() { + return shadow(this, "ExpertEncoding", [ + "space","exclamsmall","Hungarumlautsmall",,"dollaroldstyle","dollarsuperior", + "ampersandsmall","Acutesmall","parenleftsuperior","parenrightsuperior", + "twodotenleader","onedotenleader","comma","hyphen","period","fraction", + "zerooldstyle","oneoldstyle","twooldstyle","threeoldstyle","fouroldstyle", + "fiveoldstyle","sixoldstyle","sevenoldstyle","eightoldstyle","nineoldstyle", + "colon","semicolon","commasuperior","threequartersemdash","periodsuperior", + "questionsmall",,"asuperior","bsuperior","centsuperior","dsuperior","esuperior",,, + "isuperior",,,"lsuperior","msuperior","nsuperior","osuperior",,,"rsuperior", + "ssuperior","tsuperior",,"ff","fi","fl","ffi","ffl","parenleftinferior",, + "parenrightinferior","Circumflexsmall","hyphensuperior","Gravesmall","Asmall", + "Bsmall","Csmall","Dsmall","Esmall","Fsmall","Gsmall","Hsmall","Ismall","Jsmall", + "Ksmall","Lsmall","Msmall","Nsmall","Osmall","Psmall","Qsmall","Rsmall","Ssmall", + "Tsmall","Usmall","Vsmall","Wsmall","Xsmall","Ysmall","Zsmall","colonmonetary", + "onefitted","rupiah","Tildesmall",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + "exclamdownsmall","centoldstyle","Lslashsmall",,,"Scaronsmall","Zcaronsmall", + "Dieresissmall","Brevesmall","Caronsmall",,"Dotaccentsmall",,,"Macronsmall",,, + "figuredash","hypheninferior",,,"Ogoneksmall","Ringsmall","Cedillasmall",,,, + "onequarter","onehalf","threequarters","questiondownsmall","oneeighth", + "threeeighths","fiveeighths","seveneighths","onethird","twothirds",,, + "zerosuperior","onesuperior","twosuperior","threesuperior","foursuperior", + "fivesuperior","sixsuperior","sevensuperior","eightsuperior","ninesuperior", + "zeroinferior","oneinferior","twoinferior","threeinferior","fourinferior", + "fiveinferior","sixinferior","seveninferior","eightinferior","nineinferior", + "centinferior","dollarinferior","periodinferior","commainferior","Agravesmall", + "Aacutesmall","Acircumflexsmall","Atildesmall","Adieresissmall","Aringsmall", + "AEsmall","Ccedillasmall","Egravesmall","Eacutesmall","Ecircumflexsmall", + "Edieresissmall","Igravesmall","Iacutesmall","Icircumflexsmall","Idieresissmall", + "Ethsmall","Ntildesmall","Ogravesmall","Oacutesmall","Ocircumflexsmall", + "Otildesmall","Odieresissmall","OEsmall","Oslashsmall","Ugravesmall", + "Uacutesmall","Ucircumflexsmall","Udieresissmall","Yacutesmall","Thornsmall", + "Ydieresissmall" + ]); + }, + get MacExpertEncoding() { + return shadow(this, "MacExpertEncoding", [ + "space","exclamsmall","Hungarumlautsmall","centoldstyle","dollaroldstyle", + "dollarsuperior","ampersandsmall","Acutesmall","parenleftsuperior", + "parenrightsuperior","twodotenleader","onedotenleader","comma","hyphen","period", + "fraction","zerooldstyle","oneoldstyle","twooldstyle","threeoldstyle", + "fouroldstyle","fiveoldstyle","sixoldstyle","sevenoldstyle","eightoldstyle", + "nineoldstyle","colon","semicolon",,"threequartersemdash",,"questionsmall",,,,, + "Ethsmall",,,"onequarter","onehalf","threequarters","oneeighth","threeeighths", + "fiveeighths","seveneighths","onethird","twothirds",,,,,,,"ff","fi","fl","ffi", + "ffl","parenleftinferior",,"parenrightinferior","Circumflexsmall", + "hypheninferior","Gravesmall","Asmall","Bsmall","Csmall","Dsmall","Esmall", + "Fsmall","Gsmall","Hsmall","Ismall","Jsmall","Ksmall","Lsmall","Msmall","Nsmall", + "Osmall","Psmall","Qsmall","Rsmall","Ssmall","Tsmall","Usmall","Vsmall","Wsmall", + "Xsmall","Ysmall","Zsmall","colonmonetary","onefitted","rupiah","Tildesmall",,, + "asuperior","centsuperior",,,,,"Aacutesmall","Agravesmall","Acircumflexsmall", + "Adieresissmall","Atildesmall","Aringsmall","Ccedillasmall","Eacutesmall", + "Egravesmall","Ecircumflexsmall","Edieresissmall","Iacutesmall","Igravesmall", + "Icircumflexsmall","Idieresissmall","Ntildesmall","Oacutesmall","Ogravesmall", + "Ocircumflexsmall","Odieresissmall","Otildesmall","Uacutesmall","Ugravesmall", + "Ucircumflexsmall","Udieresissmall",,"eightsuperior","fourinferior", + "threeinferior","sixinferior","eightinferior","seveninferior","Scaronsmall",, + "centinferior","twoinferior",,"Dieresissmall",,"Caronsmall","osuperior", + "fiveinferior",,"commainferior","periodinferior","Yacutesmall",,"dollarinferior",, + "Thornsmall",,"nineinferior","zeroinferior","Zcaronsmall","AEsmall","Oslashsmall", + "questiondownsmall","oneinferior","Lslashsmall",,,,,,,"Cedillasmall",,,,,, + "OEsmall","figuredash","hyphensuperior",,,,,"exclamdownsmall",,"Ydieresissmall",, + "onesuperior","twosuperior","threesuperior","foursuperior","fivesuperior", + "sixsuperior","sevensuperior","ninesuperior","zerosuperior",,"esuperior", + "rsuperior","tsuperior",,,"isuperior","ssuperior","dsuperior",,,,,,"lsuperior", + "Ogoneksmall","Brevesmall","Macronsmall","bsuperior","nsuperior","msuperior", + "commasuperior","periodsuperior","Dotaccentsmall","Ringsmall",,, + ]); + }, + get MacRomanEncoding() { + return shadow(this, "MacRomanEncoding", [ + "space","exclam","quotedbl","numbersign","dollar","percent","ampersand", + "quotesingle","parenleft","parenright","asterisk","plus","comma","hyphen", + "period","slash","zero","one","two","three","four","five","six","seven","eight", + "nine","colon","semicolon","less","equal","greater","question","at","A","B","C", + "D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W", + "X","Y","Z","bracketleft","backslash","bracketright","asciicircum","underscore", + "grave","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r", + "s","t","u","v","w","x","y","z","braceleft","bar","braceright","asciitilde",, + "Adieresis","Aring","Ccedilla","Eacute","Ntilde","Odieresis","Udieresis","aacute", + "agrave","acircumflex","adieresis","atilde","aring","ccedilla","eacute","egrave", + "ecircumflex","edieresis","iacute","igrave","icircumflex","idieresis","ntilde", + "oacute","ograve","ocircumflex","odieresis","otilde","uacute","ugrave", + "ucircumflex","udieresis","dagger","degree","cent","sterling","section","bullet", + "paragraph","germandbls","registered","copyright","trademark","acute","dieresis", + "notequal","AE","Oslash","infinity","plusminus","lessequal","greaterequal","yen", + "mu","partialdiff","summation","product","pi","integral","ordfeminine", + "ordmasculine","Omega","ae","oslash","questiondown","exclamdown","logicalnot", + "radical","florin","approxequal","Delta","guillemotleft","guillemotright", + "ellipsis","space","Agrave","Atilde","Otilde","OE","oe","endash","emdash", + "quotedblleft","quotedblright","quoteleft","quoteright","divide","lozenge", + "ydieresis","Ydieresis","fraction","currency","guilsinglleft","guilsinglright", + "fi","fl","daggerdbl","periodcentered","quotesinglbase","quotedblbase", + "perthousand","Acircumflex","Ecircumflex","Aacute","Edieresis","Egrave","Iacute", + "Icircumflex","Idieresis","Igrave","Oacute","Ocircumflex","apple","Ograve", + "Uacute","Ucircumflex","Ugrave","dotlessi","circumflex","tilde","macron","breve", + "dotaccent","ring","cedilla","hungarumlaut","ogonek","caron" + ]); + }, + get StandardEncoding() { + return shadow(this, "StandardEncoding", [ + "space","exclam","quotedbl","numbersign","dollar","percent","ampersand", + "quoteright","parenleft","parenright","asterisk","plus","comma","hyphen","period", + "slash","zero","one","two","three","four","five","six","seven","eight","nine", + "colon","semicolon","less","equal","greater","question","at","A","B","C","D","E", + "F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y", + "Z","bracketleft","backslash","bracketright","asciicircum","underscore", + "quoteleft","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q", + "r","s","t","u","v","w","x","y","z","braceleft","bar","braceright","asciitilde",,, + "exclamdown","cent","sterling","fraction","yen","florin","section","currency", + "quotesingle","quotedblleft","guillemotleft","guilsinglleft","guilsinglright", + "fi","fl",,"endash","dagger","daggerdbl","periodcentered",,"paragraph","bullet", + "quotesinglbase","quotedblbase","quotedblright","guillemotright","ellipsis", + "perthousand",,"questiondown",,"grave","acute","circumflex","tilde","macron", + "breve","dotaccent","dieresis",,"ring","cedilla",,"hungarumlaut","ogonek","caron", + "emdash",,,,,,,,,,,,,,,,,"AE",,"ordfeminine",,,,,"Lslash","Oslash","OE", + "ordmasculine",,,,,,"ae",,,,"dotlessi",,,"lslash","oslash","oe","germandbls",,, + ]); + }, + get WinAnsiEncoding() { + return shadow(this, "WinAnsiEncoding", [ + "space","exclam","quotedbl","numbersign","dollar","percent","ampersand", + "quotesingle","parenleft","parenright","asterisk","plus","comma","hyphen", + "period","slash","zero","one","two","three","four","five","six","seven","eight", + "nine","colon","semicolon","less","equal","greater","question","at","A","B","C", + "D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W", + "X","Y","Z","bracketleft","backslash","bracketright","asciicircum","underscore", + "grave","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r", + "s","t","u","v","w","x","y","z","braceleft","bar","braceright","asciitilde", + "bullet","Euro","bullet","quotesinglbase","florin","quotedblbase","ellipsis", + "dagger","daggerdbl","circumflex","perthousand","Scaron","guilsinglleft","OE", + "bullet","Zcaron","bullet","bullet","quoteleft","quoteright","quotedblleft", + "quotedblright","bullet","endash","emdash","tilde","trademark","scaron", + "guilsinglright","oe","bullet","zcaron","Ydieresis","space","exclamdown","cent", + "sterling","currency","yen","brokenbar","section","dieresis","copyright", + "ordfeminine","guillemotleft","logicalnot","hyphen","registered","macron", + "degree","plusminus","twosuperior","threesuperior","acute","mu","paragraph", + "periodcentered","cedilla","onesuperior","ordmasculine","guillemotright", + "onequarter","onehalf","threequarters","questiondown","Agrave","Aacute", + "Acircumflex","Atilde","Adieresis","Aring","AE","Ccedilla","Egrave","Eacute", + "Ecircumflex","Edieresis","Igrave","Iacute","Icircumflex","Idieresis","Eth", + "Ntilde","Ograve","Oacute","Ocircumflex","Otilde","Odieresis","multiply","Oslash", + "Ugrave","Uacute","Ucircumflex","Udieresis","Yacute","Thorn","germandbls", + "agrave","aacute","acircumflex","atilde","adieresis","aring","ae","ccedilla", + "egrave","eacute","ecircumflex","edieresis","igrave","iacute","icircumflex", + "idieresis","eth","ntilde","ograve","oacute","ocircumflex","otilde","odieresis", + "divide","oslash","ugrave","uacute","ucircumflex","udieresis","yacute","thorn", + "ydieresis" + ]); + }, + get zapfDingbatsEncoding() { + return shadow(this, "zapfDingbatsEncoding", [ + "space","a1","a2","a202","a3","a4","a5","a119","a118","a117","a11","a12","a13", + "a14","a15","a16","a105","a17","a18","a19","a20","a21","a22","a23","a24","a25", + "a26","a27","a28","a6","a7","a8","a9","a10","a29","a30","a31","a32","a33","a34", + "a35","a36","a37","a38","a39","a40","a41","a42","a43","a44","a45","a46","a47", + "a48","a49","a50","a51","a52","a53","a54","a55","a56","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" + ]); + } +}; + var CanvasGraphics = (function() { function constructor(canvasCtx) { this.ctx = canvasCtx; @@ -1731,7 +1905,7 @@ var CanvasGraphics = (function() { var fontFile = descriptor.get2("FontFile", "FontFile2"); if (!fontFile) - errort("FontFile not found for font: " + fontName); + error("FontFile not found for font: " + fontName); fontFile = xref.fetchIfRef(fontFile); // Generate the custom cmap of the font if needed @@ -1754,16 +1928,18 @@ var CanvasGraphics = (function() { } else if (IsName(encoding)) { var encoding = Encodings[encoding]; - var widths = xref.fetchIfRef(fontDict.get("Widths")); - var firstchar = xref.fetchIfRef(fontDict.get("FirstChar")); + if (!encoding) + error("Unknown encoding"); + var widths = xref.fetchIfRef(fontDict.get("Widths")); + var firstChar = xref.fetchIfRef(fontDict.get("FirstChar")); + alert(firstchar); + assertWellFormed(IsArray(widths) && IsInteger(firstChar), + "invalid Widths or FirstChar"); var charset = []; for (var j = 0; j < widths.length; j++) { - var index = widths[j]; - if (!index) - continue; - - charset.push(encoding[j + firstchar]); + if (widths[j]) + charset.push(encoding[j + firstChar]); } } } diff --git a/test.html b/test.html index 458c50268..dfe422e64 100644 --- a/test.html +++ b/test.html @@ -7,7 +7,6 @@ - From 735bfa5972546e49065e4ba2fc0334e98ad18830 Mon Sep 17 00:00:00 2001 From: Andreas Gal Date: Fri, 17 Jun 2011 16:07:09 -0700 Subject: [PATCH 4/7] move cffStandardStrings into utils/ along with font_utils.js --- fonts.js | 58 +++++++++++++++++++ test.html | 1 - .../cffStandardStrings.js | 0 fonts_utils.js => utils/fonts_utils.js | 0 4 files changed, 58 insertions(+), 1 deletion(-) rename cffStandardStrings.js => utils/cffStandardStrings.js (100%) rename fonts_utils.js => utils/fonts_utils.js (100%) diff --git a/fonts.js b/fonts.js index b9ef5b330..be4007d24 100644 --- a/fonts.js +++ b/fonts.js @@ -1076,6 +1076,64 @@ var Type1Parser = function() { } }; +const CFFStrings = [ + ".notdef","space","exclam","quotedbl","numbersign","dollar","percent","ampersand", + "quoteright","parenleft","parenright","asterisk","plus","comma","hyphen","period", + "slash","zero","one","two","three","four","five","six","seven","eight","nine", + "colon","semicolon","less","equal","greater","question","at","A","B","C","D","E", + "F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y", + "Z","bracketleft","backslash","bracketright","asciicircum","underscore", + "quoteleft","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q", + "r","s","t","u","v","w","x","y","z","braceleft","bar","braceright","asciitilde", + "exclamdown","cent","sterling","fraction","yen","florin","section","currency", + "quotesingle","quotedblleft","guillemotleft","guilsinglleft","guilsinglright", + "fi","fl","endash","dagger","daggerdbl","periodcentered","paragraph","bullet", + "quotesinglbase","quotedblbase","quotedblright","guillemotright","ellipsis", + "perthousand","questiondown","grave","acute","circumflex","tilde","macron", + "breve","dotaccent","dieresis","ring","cedilla","hungarumlaut","ogonek","caron", + "emdash","AE","ordfeminine","Lslash","Oslash","OE","ordmasculine","ae","dotlessi", + "lslash","oslash","oe","germandbls","onesuperior","logicalnot","mu","trademark", + "Eth","onehalf","plusminus","Thorn","onequarter","divide","brokenbar","degree", + "thorn","threequarters","twosuperior","registered","minus","eth","multiply", + "threesuperior","copyright","Aacute","Acircumflex","Adieresis","Agrave","Aring", + "Atilde","Ccedilla","Eacute","Ecircumflex","Edieresis","Egrave","Iacute", + "Icircumflex","Idieresis","Igrave","Ntilde","Oacute","Ocircumflex","Odieresis", + "Ograve","Otilde","Scaron","Uacute","Ucircumflex","Udieresis","Ugrave","Yacute", + "Ydieresis","Zcaron","aacute","acircumflex","adieresis","agrave","aring","atilde", + "ccedilla","eacute","ecircumflex","edieresis","egrave","iacute","icircumflex", + "idieresis","igrave","ntilde","oacute","ocircumflex","odieresis","ograve", + "otilde","scaron","uacute","ucircumflex","udieresis","ugrave","yacute", + "ydieresis","zcaron","exclamsmall","Hungarumlautsmall","dollaroldstyle", + "dollarsuperior","ampersandsmall","Acutesmall","parenleftsuperior", + "parenrightsuperior","266 ff","onedotenleader","zerooldstyle","oneoldstyle", + "twooldstyle","threeoldstyle","fouroldstyle","fiveoldstyle","sixoldstyle", + "sevenoldstyle","eightoldstyle","nineoldstyle","commasuperior", + "threequartersemdash","periodsuperior","questionsmall","asuperior","bsuperior", + "centsuperior","dsuperior","esuperior","isuperior","lsuperior","msuperior", + "nsuperior","osuperior","rsuperior","ssuperior","tsuperior","ff","ffi","ffl", + "parenleftinferior","parenrightinferior","Circumflexsmall","hyphensuperior", + "Gravesmall","Asmall","Bsmall","Csmall","Dsmall","Esmall","Fsmall","Gsmall", + "Hsmall","Ismall","Jsmall","Ksmall","Lsmall","Msmall","Nsmall","Osmall","Psmall", + "Qsmall","Rsmall","Ssmall","Tsmall","Usmall","Vsmall","Wsmall","Xsmall","Ysmall", + "Zsmall","colonmonetary","onefitted","rupiah","Tildesmall","exclamdownsmall", + "centoldstyle","Lslashsmall","Scaronsmall","Zcaronsmall","Dieresissmall", + "Brevesmall","Caronsmall","Dotaccentsmall","Macronsmall","figuredash", + "hypheninferior","Ogoneksmall","Ringsmall","Cedillasmall","questiondownsmall", + "oneeighth","threeeighths","fiveeighths","seveneighths","onethird","twothirds", + "zerosuperior","foursuperior","fivesuperior","sixsuperior","sevensuperior", + "eightsuperior","ninesuperior","zeroinferior","oneinferior","twoinferior", + "threeinferior","fourinferior","fiveinferior","sixinferior","seveninferior", + "eightinferior","nineinferior","centinferior","dollarinferior","periodinferior", + "commainferior","Agravesmall","Aacutesmall","Acircumflexsmall","Atildesmall", + "Adieresissmall","Aringsmall","AEsmall","Ccedillasmall","Egravesmall", + "Eacutesmall","Ecircumflexsmall","Edieresissmall","Igravesmall","Iacutesmall", + "Icircumflexsmall","Idieresissmall","Ethsmall","Ntildesmall","Ogravesmall", + "Oacutesmall","Ocircumflexsmall","Otildesmall","Odieresissmall","OEsmall", + "Oslashsmall","Ugravesmall","Uacutesmall","Ucircumflexsmall","Udieresissmall", + "Yacutesmall","Thornsmall","Ydieresissmall","001.000","001.001","001.002", + "001.003","Black","Bold","Book","Light","Medium","Regular","Roman","Semibold" +]; + /** * Take a Type1 file as input and wrap it into a Compact Font Format (CFF) * wrapping Type2 charstrings. diff --git a/test.html b/test.html index dfe422e64..600ff3c57 100644 --- a/test.html +++ b/test.html @@ -6,7 +6,6 @@ - diff --git a/cffStandardStrings.js b/utils/cffStandardStrings.js similarity index 100% rename from cffStandardStrings.js rename to utils/cffStandardStrings.js diff --git a/fonts_utils.js b/utils/fonts_utils.js similarity index 100% rename from fonts_utils.js rename to utils/fonts_utils.js From 22efbb3af3ca1216fcb6bc2eec05cb47aaa07da6 Mon Sep 17 00:00:00 2001 From: Andreas Gal Date: Fri, 17 Jun 2011 16:20:13 -0700 Subject: [PATCH 5/7] rename test.html to viewer.html --- glyphlist.js | 8 ++++---- test.css => viewer.css | 0 test.html => viewer.html | 4 ++-- test.js => viewer.js | 0 4 files changed, 6 insertions(+), 6 deletions(-) rename test.css => viewer.css (100%) rename test.html => viewer.html (90%) rename test.js => viewer.js (100%) diff --git a/glyphlist.js b/glyphlist.js index f5a11b522..1a0190133 100644 --- a/glyphlist.js +++ b/glyphlist.js @@ -4282,8 +4282,8 @@ var GlyphsUnicode = { zukatakana: 0x30BA }; -// Add missing glyphs from the original Adobe's list -GlyphsUnicode["angbracketleft"] = 0x3008; -GlyphsUnicode["angbracketright"] = 0x3009; -GlyphsUnicode["circlecopyrt"] = 0x00A9; +// Add missing glyphs from the Adobe's original list +GlyphsUnicode.angbracketleft = 0x3008; +GlyphsUnicode.angbracketright = 0x3009; +GlyphsUnicode.circlecopyrt = 0x00A9; diff --git a/test.css b/viewer.css similarity index 100% rename from test.css rename to viewer.css diff --git a/test.html b/viewer.html similarity index 90% rename from test.html rename to viewer.html index 600ff3c57..6e733319e 100644 --- a/test.html +++ b/viewer.html @@ -1,9 +1,9 @@ Simple pdf.js page viewer - + - + diff --git a/test.js b/viewer.js similarity index 100% rename from test.js rename to viewer.js From 050acaf5e07ddddcea4892b649fe7f4352333429 Mon Sep 17 00:00:00 2001 From: Andreas Gal Date: Fri, 17 Jun 2011 16:29:48 -0700 Subject: [PATCH 6/7] add more error checking for font translation --- pdf.js | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/pdf.js b/pdf.js index 0a6345799..d656db87b 100644 --- a/pdf.js +++ b/pdf.js @@ -1900,8 +1900,10 @@ var CanvasGraphics = (function() { constructor.prototype = { translateFont: function(fontDict, xref, resources) { var descriptor = xref.fetch(fontDict.get("FontDescriptor")); - var fontName = descriptor.get("FontName").name; - fontName = fontName.replace("+", "_"); + + var fontName = descriptor.get("FontName"); + assertWellFormed(IsName(fontName), "invalid font name"); + fontName = fontName.name.replace("+", "_"); var fontFile = descriptor.get2("FontFile", "FontFile2"); if (!fontFile) @@ -1923,17 +1925,16 @@ var CanvasGraphics = (function() { // Get the font charset if any var charset = descriptor.get("CharSet"); - if (charset) - charset = charset.split("/"); + assertWellFormed(IsString(charset), "invalid charset"); + charset = charset.split("/"); } else if (IsName(encoding)) { - var encoding = Encodings[encoding]; + var encoding = Encodings[encoding.name]; if (!encoding) error("Unknown encoding"); var widths = xref.fetchIfRef(fontDict.get("Widths")); var firstChar = xref.fetchIfRef(fontDict.get("FirstChar")); - alert(firstchar); assertWellFormed(IsArray(widths) && IsInteger(firstChar), "invalid Widths or FirstChar"); var charset = []; @@ -1953,8 +1954,8 @@ var CanvasGraphics = (function() { return { name: fontName, - file: fontFile, - properties: properties + file: fontFile, + properties: properties } }, From a4e1fba9eca17ff8ed03ea87bc53c4c990ac1cbe Mon Sep 17 00:00:00 2001 From: Andreas Gal Date: Fri, 17 Jun 2011 16:34:29 -0700 Subject: [PATCH 7/7] even more error checking for font translation --- pdf.js | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/pdf.js b/pdf.js index d656db87b..56ab89017 100644 --- a/pdf.js +++ b/pdf.js @@ -1931,12 +1931,12 @@ var CanvasGraphics = (function() { } else if (IsName(encoding)) { var encoding = Encodings[encoding.name]; if (!encoding) - error("Unknown encoding"); + error("Unknown font encoding"); var widths = xref.fetchIfRef(fontDict.get("Widths")); var firstChar = xref.fetchIfRef(fontDict.get("FirstChar")); assertWellFormed(IsArray(widths) && IsInteger(firstChar), - "invalid Widths or FirstChar"); + "invalid font Widths or FirstChar"); var charset = []; for (var j = 0; j < widths.length; j++) { if (widths[j]) @@ -1945,11 +1945,16 @@ var CanvasGraphics = (function() { } } + var subType = fontDict.get("Subtype"); + var bbox = descriptor.get("FontBBox"); + assertWellFormed(IsName(subType) && IsArray(bbox), + "invalid font Subtype or FontBBox"); + var properties = { - type: fontDict.get("Subtype").name, + type: subType.name, encoding: encodingMap, charset: charset, - bbox: descriptor.get("FontBBox") + bbox: bbox }; return {