diff --git a/bower.json b/bower.json index 5992ded2f..397e13f04 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "pdfjs-dist", - "version": "1.0.629", + "version": "1.0.633", "keywords": [ "Mozilla", "pdf", diff --git a/build/pdf.combined.js b/build/pdf.combined.js index fa5706fe1..769dd77d6 100644 --- a/build/pdf.combined.js +++ b/build/pdf.combined.js @@ -22,8 +22,8 @@ if (typeof PDFJS === 'undefined') { (typeof window !== 'undefined' ? window : this).PDFJS = {}; } -PDFJS.version = '1.0.629'; -PDFJS.build = 'a353f88'; +PDFJS.version = '1.0.633'; +PDFJS.build = '4ce1b1e'; (function pdfjsWrapper() { // Use strict in our context only - users might not want it @@ -16183,12 +16183,13 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { }, readToUnicode: function PartialEvaluator_readToUnicode(toUnicode) { - var cmapObj = toUnicode; + var cmap, cmapObj = toUnicode; if (isName(cmapObj)) { - return CMapFactory.create(cmapObj, + cmap = CMapFactory.create(cmapObj, { url: PDFJS.cMapUrl, packed: PDFJS.cMapPacked }, null).getMap(); + return new ToUnicodeMap(cmap); } else if (isStream(cmapObj)) { - var cmap = CMapFactory.create(cmapObj, + cmap = CMapFactory.create(cmapObj, { url: PDFJS.cMapUrl, packed: PDFJS.cMapPacked }, null).getMap(); // Convert UTF-16BE // NOTE: cmap can be a sparse array, so use forEach instead of for(;;) @@ -16207,7 +16208,7 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { } cmap[i] = String.fromCharCode.apply(String, str); }); - return cmap; + return new ToUnicodeMap(cmap); } return null; }, @@ -20554,6 +20555,68 @@ var Glyph = (function GlyphClosure() { return Glyph; })(); +var ToUnicodeMap = (function ToUnicodeMapClosure() { + function ToUnicodeMap(cmap) { + // The elements of this._map can be integers or strings, depending on how + // |cmap| was created. + this._map = cmap; + } + + ToUnicodeMap.prototype = { + get length() { + return this._map.length; + }, + + forEach: function(callback) { + for (var charCode in this._map) { + callback(charCode, this._map[charCode].charCodeAt(0)); + } + }, + + get: function(i) { + return this._map[i]; + }, + + charCodeOf: function(v) { + return this._map.indexOf(v); + } + }; + + return ToUnicodeMap; +})(); + +var IdentityToUnicodeMap = (function IdentityToUnicodeMapClosure() { + function IdentityToUnicodeMap(firstChar, lastChar) { + this.firstChar = firstChar; + this.lastChar = lastChar; + } + + IdentityToUnicodeMap.prototype = { + get length() { + error('should not access .length'); + }, + + forEach: function(callback) { + for (var i = this.firstChar, ii = this.lastChar; i <= ii; i++) { + callback(i, i); + } + }, + + get: function(i) { + if (this.firstChar <= i && i <= this.lastChar) { + return String.fromCharCode(i); + } + return undefined; + }, + + charCodeOf: function(v) { + error('should not call .charCodeOf'); + } + }; + + return IdentityToUnicodeMap; +})(); + /** * '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). @@ -20597,9 +20660,7 @@ var Font = (function FontClosure() { this.descent = properties.descent / PDF_GLYPH_SPACE_UNITS; this.fontMatrix = properties.fontMatrix; - var unicode = this.buildToUnicode(properties); - this.toUnicode = properties.toUnicode = unicode.toUnicode; - this.isIdentityUnicode = properties.isIdentityUnicode = unicode.isIdentity; + this.toUnicode = properties.toUnicode = this.buildToUnicode(properties); this.toFontChar = []; @@ -20652,7 +20713,7 @@ var Font = (function FontClosure() { map[+code] = GlyphMapForStandardFonts[code]; } this.toFontChar = map; - this.toUnicode = map; + this.toUnicode = new ToUnicodeMap(map); } else if (/Symbol/i.test(fontName)) { var symbols = Encodings.SymbolSetEncoding; for (charCode in symbols) { @@ -20671,15 +20732,14 @@ var Font = (function FontClosure() { } } else { var unicodeCharCode, notCidFont = (type.indexOf('CIDFontType') === -1); - for (charCode in this.toUnicode) { - unicodeCharCode = this.toUnicode[charCode].charCodeAt(0); + this.toUnicode.forEach(function(charCode, unicodeCharCode) { if (notCidFont) { glyphName = (properties.differences[charCode] || properties.defaultEncoding[charCode]); unicodeCharCode = (GlyphsUnicode[glyphName] || unicodeCharCode); } this.toFontChar[charCode] = unicodeCharCode; - } + }.bind(this)); } this.loadedName = fontName.split('-')[0]; this.loading = false; @@ -20892,7 +20952,8 @@ var Font = (function FontClosure() { function adjustMapping(charCodeToGlyphId, properties) { var toUnicode = properties.toUnicode; var isSymbolic = !!(properties.flags & FontFlags.Symbolic); - var isIdentityUnicode = properties.isIdentityUnicode; + var isIdentityUnicode = + properties.toUnicode instanceof IdentityToUnicodeMap; var isCidFontType2 = (properties.type === 'CIDFontType2'); var newMap = Object.create(null); var toFontChar = []; @@ -20905,8 +20966,8 @@ var Font = (function FontClosure() { // First try to map the value to a unicode position if a non identity map // was created. if (!isIdentityUnicode) { - if (toUnicode[originalCharCode] !== undefined) { - var unicode = toUnicode[fontCharCode]; + if (toUnicode.get(originalCharCode) !== undefined) { + var unicode = toUnicode.get(fontCharCode); // TODO: Try to map ligatures to the correct spot. if (unicode.length === 1) { fontCharCode = unicode.charCodeAt(0); @@ -22245,7 +22306,7 @@ var Font = (function FontClosure() { var dupFirstEntry = false; if (properties.type === 'CIDFontType2' && properties.toUnicode && - properties.toUnicode[0] > '\u0000') { + properties.toUnicode.get(0) > '\u0000') { // oracle's defect (see 3427), duplicating first entry dupFirstEntry = true; numGlyphs++; @@ -22691,19 +22752,12 @@ var Font = (function FontClosure() { /** * Builds a char code to unicode map based on section 9.10 of the spec. * @param {Object} properties Font properties object. - * @return {Object} Has two properties: 'toUnicode' which maps char codes to - * unicode (string) values and 'isIdentity' which is true if an identity map - * is used. + * @return {Object} A ToUnicodeMap object. */ buildToUnicode: function Font_buildToUnicode(properties) { - var map = { - isIdentity: false, - toUnicode: null - }; // Section 9.10.2 Mapping Character Codes to Unicode Values if (properties.toUnicode && properties.toUnicode.length !== 0) { - map.toUnicode = properties.toUnicode; - return map; + return properties.toUnicode; } // According to the spec if the font is a simple font we should only map // to unicode if the base encoding is MacRoman, MacExpert, or WinAnsi or @@ -22768,8 +22822,7 @@ var Font = (function FontClosure() { } toUnicode[charcode] = String.fromCharCode(GlyphsUnicode[glyphName]); } - map.toUnicode = toUnicode; - return map; + return new ToUnicodeMap(toUnicode); } // If the font is a composite font that uses one of the predefined CMaps // listed in Table 118 (except Identity–H and Identity–V) or whose @@ -22812,19 +22865,12 @@ var Font = (function FontClosure() { ucs2.charCodeAt(1)); } }); - map.toUnicode = toUnicode; - return map; + return new ToUnicodeMap(toUnicode); } // The viewer's choice, just use an identity map. - toUnicode = []; - var firstChar = properties.firstChar, lastChar = properties.lastChar; - for (var i = firstChar; i <= lastChar; i++) { - toUnicode[i] = String.fromCharCode(i); - } - map.isIdentity = true; - map.toUnicode = toUnicode; - return map; + return new IdentityToUnicodeMap(properties.firstChar, + properties.lastChar); }, get spaceWidth() { @@ -22852,7 +22898,7 @@ var Font = (function FontClosure() { } // ... via toUnicode map if (!charcode && 'toUnicode' in this) { - charcode = this.toUnicode.indexOf(glyphUnicode); + charcode = this.toUnicode.charCodeOf(glyphUnicode); } // setting it to unicode if negative or undefined if (charcode <= 0) { @@ -22882,7 +22928,7 @@ var Font = (function FontClosure() { width = isNum(width) ? width : this.defaultWidth; var vmetric = this.vmetrics && this.vmetrics[widthCode]; - var unicode = this.toUnicode[charcode] || charcode; + var unicode = this.toUnicode.get(charcode) || charcode; if (typeof unicode === 'number') { unicode = String.fromCharCode(unicode); } diff --git a/build/pdf.js b/build/pdf.js index 748265417..6059d439b 100644 --- a/build/pdf.js +++ b/build/pdf.js @@ -22,8 +22,8 @@ if (typeof PDFJS === 'undefined') { (typeof window !== 'undefined' ? window : this).PDFJS = {}; } -PDFJS.version = '1.0.629'; -PDFJS.build = 'a353f88'; +PDFJS.version = '1.0.633'; +PDFJS.build = '4ce1b1e'; (function pdfjsWrapper() { // Use strict in our context only - users might not want it diff --git a/build/pdf.worker.js b/build/pdf.worker.js index a44d5b5f9..7899e5db5 100644 --- a/build/pdf.worker.js +++ b/build/pdf.worker.js @@ -22,8 +22,8 @@ if (typeof PDFJS === 'undefined') { (typeof window !== 'undefined' ? window : this).PDFJS = {}; } -PDFJS.version = '1.0.629'; -PDFJS.build = 'a353f88'; +PDFJS.version = '1.0.633'; +PDFJS.build = '4ce1b1e'; (function pdfjsWrapper() { // Use strict in our context only - users might not want it @@ -11326,12 +11326,13 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { }, readToUnicode: function PartialEvaluator_readToUnicode(toUnicode) { - var cmapObj = toUnicode; + var cmap, cmapObj = toUnicode; if (isName(cmapObj)) { - return CMapFactory.create(cmapObj, + cmap = CMapFactory.create(cmapObj, { url: PDFJS.cMapUrl, packed: PDFJS.cMapPacked }, null).getMap(); + return new ToUnicodeMap(cmap); } else if (isStream(cmapObj)) { - var cmap = CMapFactory.create(cmapObj, + cmap = CMapFactory.create(cmapObj, { url: PDFJS.cMapUrl, packed: PDFJS.cMapPacked }, null).getMap(); // Convert UTF-16BE // NOTE: cmap can be a sparse array, so use forEach instead of for(;;) @@ -11350,7 +11351,7 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { } cmap[i] = String.fromCharCode.apply(String, str); }); - return cmap; + return new ToUnicodeMap(cmap); } return null; }, @@ -15697,6 +15698,68 @@ var Glyph = (function GlyphClosure() { return Glyph; })(); +var ToUnicodeMap = (function ToUnicodeMapClosure() { + function ToUnicodeMap(cmap) { + // The elements of this._map can be integers or strings, depending on how + // |cmap| was created. + this._map = cmap; + } + + ToUnicodeMap.prototype = { + get length() { + return this._map.length; + }, + + forEach: function(callback) { + for (var charCode in this._map) { + callback(charCode, this._map[charCode].charCodeAt(0)); + } + }, + + get: function(i) { + return this._map[i]; + }, + + charCodeOf: function(v) { + return this._map.indexOf(v); + } + }; + + return ToUnicodeMap; +})(); + +var IdentityToUnicodeMap = (function IdentityToUnicodeMapClosure() { + function IdentityToUnicodeMap(firstChar, lastChar) { + this.firstChar = firstChar; + this.lastChar = lastChar; + } + + IdentityToUnicodeMap.prototype = { + get length() { + error('should not access .length'); + }, + + forEach: function(callback) { + for (var i = this.firstChar, ii = this.lastChar; i <= ii; i++) { + callback(i, i); + } + }, + + get: function(i) { + if (this.firstChar <= i && i <= this.lastChar) { + return String.fromCharCode(i); + } + return undefined; + }, + + charCodeOf: function(v) { + error('should not call .charCodeOf'); + } + }; + + return IdentityToUnicodeMap; +})(); + /** * '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). @@ -15740,9 +15803,7 @@ var Font = (function FontClosure() { this.descent = properties.descent / PDF_GLYPH_SPACE_UNITS; this.fontMatrix = properties.fontMatrix; - var unicode = this.buildToUnicode(properties); - this.toUnicode = properties.toUnicode = unicode.toUnicode; - this.isIdentityUnicode = properties.isIdentityUnicode = unicode.isIdentity; + this.toUnicode = properties.toUnicode = this.buildToUnicode(properties); this.toFontChar = []; @@ -15795,7 +15856,7 @@ var Font = (function FontClosure() { map[+code] = GlyphMapForStandardFonts[code]; } this.toFontChar = map; - this.toUnicode = map; + this.toUnicode = new ToUnicodeMap(map); } else if (/Symbol/i.test(fontName)) { var symbols = Encodings.SymbolSetEncoding; for (charCode in symbols) { @@ -15814,15 +15875,14 @@ var Font = (function FontClosure() { } } else { var unicodeCharCode, notCidFont = (type.indexOf('CIDFontType') === -1); - for (charCode in this.toUnicode) { - unicodeCharCode = this.toUnicode[charCode].charCodeAt(0); + this.toUnicode.forEach(function(charCode, unicodeCharCode) { if (notCidFont) { glyphName = (properties.differences[charCode] || properties.defaultEncoding[charCode]); unicodeCharCode = (GlyphsUnicode[glyphName] || unicodeCharCode); } this.toFontChar[charCode] = unicodeCharCode; - } + }.bind(this)); } this.loadedName = fontName.split('-')[0]; this.loading = false; @@ -16035,7 +16095,8 @@ var Font = (function FontClosure() { function adjustMapping(charCodeToGlyphId, properties) { var toUnicode = properties.toUnicode; var isSymbolic = !!(properties.flags & FontFlags.Symbolic); - var isIdentityUnicode = properties.isIdentityUnicode; + var isIdentityUnicode = + properties.toUnicode instanceof IdentityToUnicodeMap; var isCidFontType2 = (properties.type === 'CIDFontType2'); var newMap = Object.create(null); var toFontChar = []; @@ -16048,8 +16109,8 @@ var Font = (function FontClosure() { // First try to map the value to a unicode position if a non identity map // was created. if (!isIdentityUnicode) { - if (toUnicode[originalCharCode] !== undefined) { - var unicode = toUnicode[fontCharCode]; + if (toUnicode.get(originalCharCode) !== undefined) { + var unicode = toUnicode.get(fontCharCode); // TODO: Try to map ligatures to the correct spot. if (unicode.length === 1) { fontCharCode = unicode.charCodeAt(0); @@ -17388,7 +17449,7 @@ var Font = (function FontClosure() { var dupFirstEntry = false; if (properties.type === 'CIDFontType2' && properties.toUnicode && - properties.toUnicode[0] > '\u0000') { + properties.toUnicode.get(0) > '\u0000') { // oracle's defect (see 3427), duplicating first entry dupFirstEntry = true; numGlyphs++; @@ -17834,19 +17895,12 @@ var Font = (function FontClosure() { /** * Builds a char code to unicode map based on section 9.10 of the spec. * @param {Object} properties Font properties object. - * @return {Object} Has two properties: 'toUnicode' which maps char codes to - * unicode (string) values and 'isIdentity' which is true if an identity map - * is used. + * @return {Object} A ToUnicodeMap object. */ buildToUnicode: function Font_buildToUnicode(properties) { - var map = { - isIdentity: false, - toUnicode: null - }; // Section 9.10.2 Mapping Character Codes to Unicode Values if (properties.toUnicode && properties.toUnicode.length !== 0) { - map.toUnicode = properties.toUnicode; - return map; + return properties.toUnicode; } // According to the spec if the font is a simple font we should only map // to unicode if the base encoding is MacRoman, MacExpert, or WinAnsi or @@ -17911,8 +17965,7 @@ var Font = (function FontClosure() { } toUnicode[charcode] = String.fromCharCode(GlyphsUnicode[glyphName]); } - map.toUnicode = toUnicode; - return map; + return new ToUnicodeMap(toUnicode); } // If the font is a composite font that uses one of the predefined CMaps // listed in Table 118 (except Identity–H and Identity–V) or whose @@ -17955,19 +18008,12 @@ var Font = (function FontClosure() { ucs2.charCodeAt(1)); } }); - map.toUnicode = toUnicode; - return map; + return new ToUnicodeMap(toUnicode); } // The viewer's choice, just use an identity map. - toUnicode = []; - var firstChar = properties.firstChar, lastChar = properties.lastChar; - for (var i = firstChar; i <= lastChar; i++) { - toUnicode[i] = String.fromCharCode(i); - } - map.isIdentity = true; - map.toUnicode = toUnicode; - return map; + return new IdentityToUnicodeMap(properties.firstChar, + properties.lastChar); }, get spaceWidth() { @@ -17995,7 +18041,7 @@ var Font = (function FontClosure() { } // ... via toUnicode map if (!charcode && 'toUnicode' in this) { - charcode = this.toUnicode.indexOf(glyphUnicode); + charcode = this.toUnicode.charCodeOf(glyphUnicode); } // setting it to unicode if negative or undefined if (charcode <= 0) { @@ -18025,7 +18071,7 @@ var Font = (function FontClosure() { width = isNum(width) ? width : this.defaultWidth; var vmetric = this.vmetrics && this.vmetrics[widthCode]; - var unicode = this.toUnicode[charcode] || charcode; + var unicode = this.toUnicode.get(charcode) || charcode; if (typeof unicode === 'number') { unicode = String.fromCharCode(unicode); } diff --git a/package.json b/package.json index 82bd71b26..f28c2c706 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pdfjs-dist", - "version": "1.0.629", + "version": "1.0.633", "description": "Generic build of Mozilla's PDF.js library.", "keywords": [ "Mozilla",