diff --git a/bower.json b/bower.json index d55998c0e..ef98aeda5 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "pdfjs-dist", - "version": "1.0.521", + "version": "1.0.524", "keywords": [ "Mozilla", "pdf", diff --git a/build/pdf.combined.js b/build/pdf.combined.js index fe661140b..53dc04a3a 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.521'; -PDFJS.build = 'bdf1c51'; +PDFJS.version = '1.0.524'; +PDFJS.build = 'ad2ea78'; (function pdfjsWrapper() { // Use strict in our context only - users might not want it @@ -15814,10 +15814,10 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { var cmapObj = toUnicode; if (isName(cmapObj)) { return CMapFactory.create(cmapObj, - { url: PDFJS.cMapUrl, packed: PDFJS.cMapPacked }, null).map; + { url: PDFJS.cMapUrl, packed: PDFJS.cMapPacked }, null).getMap(); } else if (isStream(cmapObj)) { var cmap = CMapFactory.create(cmapObj, - { url: PDFJS.cMapUrl, packed: PDFJS.cMapPacked }, null).map; + { url: PDFJS.cMapUrl, packed: PDFJS.cMapPacked }, null).getMap(); // Convert UTF-16BE // NOTE: cmap can be a sparse array, so use forEach instead of for(;;) // to iterate over all keys. @@ -17206,7 +17206,7 @@ var CMap = (function CMapClosure() { // where nBytePairs are ranges e.g. [low1, high1, low2, high2, ...] this.codespaceRanges = [[], [], [], []]; this.numCodespaceRanges = 0; - this.map = []; + this._map = []; this.vertical = false; this.useCMap = null; this.builtInCMap = builtInCMap; @@ -17220,7 +17220,7 @@ var CMap = (function CMapClosure() { mapRange: function(low, high, dstLow) { var lastByte = dstLow.length - 1; while (low <= high) { - this.map[low] = dstLow; + this._map[low] = dstLow; // Only the last byte has to be incremented. dstLow = dstLow.substr(0, lastByte) + String.fromCharCode(dstLow.charCodeAt(lastByte) + 1); @@ -17231,17 +17231,51 @@ var CMap = (function CMapClosure() { mapRangeToArray: function(low, high, array) { var i = 0, ii = array.length; while (low <= high && i < ii) { - this.map[low] = array[i++]; + this._map[low] = array[i++]; ++low; } }, mapOne: function(src, dst) { - this.map[src] = dst; + this._map[src] = dst; }, lookup: function(code) { - return this.map[code]; + return this._map[code]; + }, + + contains: function(code) { + return this._map[code] !== undefined; + }, + + forEach: function(callback) { + // Most maps have fewer than 65536 entries, and for those we use normal + // array iteration. But really sparse tables are possible -- e.g. with + // indices in the *billions*. For such tables we use for..in, which isn't + // ideal because it stringifies the indices for all present elements, but + // it does avoid iterating over every undefined entry. + var map = this._map; + var length = map.length; + var i; + if (length <= 0x10000) { + for (i = 0; i < length; i++) { + if (map[i] !== undefined) { + callback(i, map[i]); + } + } + } else { + for (i in this._map) { + callback(i, map[i]); + } + } + }, + + charCodeOf: function(value) { + return this._map.indexOf(value); + }, + + getMap: function() { + return this._map; }, readCharCode: function(str, offset) { @@ -17796,12 +17830,11 @@ var CMapFactory = (function CMapFactoryClosure() { } // Merge the map into the current one, making sure not to override // any previously defined entries. - for (var key in cMap.useCMap.map) { - if (key in cMap.map) { - continue; + cMap.useCMap.forEach(function(key, value) { + if (!cMap.contains(key)) { + cMap.mapOne(key, cMap.useCMap.lookup(key)); } - cMap.map[key] = cMap.useCMap.map[key]; - } + }); } function parseBinaryCMap(name, builtInCMapParams) { @@ -21737,10 +21770,7 @@ var Font = (function FontClosure() { if (properties.type === 'CIDFontType2') { var cidToGidMap = properties.cidToGidMap || []; var cidToGidMapLength = cidToGidMap.length; - var cMap = properties.cMap.map; - for (charCode in cMap) { - charCode |= 0; - var cid = cMap[charCode]; + properties.cMap.forEach(function(charCode, cid) { assert(cid.length === 1, 'Max size of CID is 65,535'); cid = cid.charCodeAt(0); var glyphId = -1; @@ -21752,7 +21782,7 @@ var Font = (function FontClosure() { if (glyphId >= 0 && glyphId < numGlyphs) { charCodeToGlyphId[charCode] = glyphId; } - } + }); if (dupFirstEntry) { charCodeToGlyphId[0] = numGlyphs - 1; } @@ -21810,7 +21840,7 @@ var Font = (function FontClosure() { if (!found && properties.glyphNames) { // Try to map using the post table. There are currently no known // pdfs that this fixes. - glyphId = properties.glyphNames.indexOf(glyphName); + var glyphId = properties.glyphNames.indexOf(glyphName); if (glyphId > 0) { charCodeToGlyphId[charCode] = glyphId; } @@ -22211,18 +22241,17 @@ var Font = (function FontClosure() { { url: PDFJS.cMapUrl, packed: PDFJS.cMapPacked }, null); var cMap = properties.cMap; toUnicode = []; - for (charcode in cMap.map) { - var cid = cMap.map[charcode]; + cMap.forEach(function(charcode, cid) { assert(cid.length === 1, 'Max size of CID is 65,535'); // e) Map the CID obtained in step (a) according to the CMap obtained // in step (d), producing a Unicode value. - var ucs2 = ucs2CMap.map[cid.charCodeAt(0)]; - if (!ucs2) { - continue; + var ucs2 = ucs2CMap.lookup(cid.charCodeAt(0)); + if (ucs2) { + toUnicode[charcode] = + String.fromCharCode((ucs2.charCodeAt(0) << 8) + + ucs2.charCodeAt(1)); } - toUnicode[charcode] = String.fromCharCode((ucs2.charCodeAt(0) << 8) + - ucs2.charCodeAt(1)); - } + }); map.toUnicode = toUnicode; return map; } @@ -22257,7 +22286,7 @@ var Font = (function FontClosure() { // finding the charcode via unicodeToCID map var charcode = 0; if (this.composite) { - if (glyphUnicode in this.cMap.map) { + if (this.cMap.contains(glyphUnicode)) { charcode = this.cMap.lookup(glyphUnicode).charCodeAt(0); } } @@ -22286,8 +22315,8 @@ var Font = (function FontClosure() { var fontCharCode, width, operatorListId; var widthCode = charcode; - if (this.cMap && charcode in this.cMap.map) { - widthCode = this.cMap.map[charcode].charCodeAt(0); + if (this.cMap && this.cMap.contains(charcode)) { + widthCode = this.cMap.lookup(charcode).charCodeAt(0); } width = this.widths[widthCode]; width = isNum(width) ? width : this.defaultWidth; @@ -23470,7 +23499,7 @@ var CFFFont = (function CFFFontClosure() { // to map CIDs to GIDs. for (glyphId = 0; glyphId < charsets.length; glyphId++) { var cidString = String.fromCharCode(charsets[glyphId]); - var charCode = properties.cMap.map.indexOf(cidString); + var charCode = properties.cMap.charCodeOf(cidString); charCodeToGlyphId[charCode] = glyphId; } } else { diff --git a/build/pdf.js b/build/pdf.js index e5946fd97..0d5bc4565 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.521'; -PDFJS.build = 'bdf1c51'; +PDFJS.version = '1.0.524'; +PDFJS.build = 'ad2ea78'; (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 9eebd54a9..dff111318 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.521'; -PDFJS.build = 'bdf1c51'; +PDFJS.version = '1.0.524'; +PDFJS.build = 'ad2ea78'; (function pdfjsWrapper() { // Use strict in our context only - users might not want it @@ -10956,10 +10956,10 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { var cmapObj = toUnicode; if (isName(cmapObj)) { return CMapFactory.create(cmapObj, - { url: PDFJS.cMapUrl, packed: PDFJS.cMapPacked }, null).map; + { url: PDFJS.cMapUrl, packed: PDFJS.cMapPacked }, null).getMap(); } else if (isStream(cmapObj)) { var cmap = CMapFactory.create(cmapObj, - { url: PDFJS.cMapUrl, packed: PDFJS.cMapPacked }, null).map; + { url: PDFJS.cMapUrl, packed: PDFJS.cMapPacked }, null).getMap(); // Convert UTF-16BE // NOTE: cmap can be a sparse array, so use forEach instead of for(;;) // to iterate over all keys. @@ -12348,7 +12348,7 @@ var CMap = (function CMapClosure() { // where nBytePairs are ranges e.g. [low1, high1, low2, high2, ...] this.codespaceRanges = [[], [], [], []]; this.numCodespaceRanges = 0; - this.map = []; + this._map = []; this.vertical = false; this.useCMap = null; this.builtInCMap = builtInCMap; @@ -12362,7 +12362,7 @@ var CMap = (function CMapClosure() { mapRange: function(low, high, dstLow) { var lastByte = dstLow.length - 1; while (low <= high) { - this.map[low] = dstLow; + this._map[low] = dstLow; // Only the last byte has to be incremented. dstLow = dstLow.substr(0, lastByte) + String.fromCharCode(dstLow.charCodeAt(lastByte) + 1); @@ -12373,17 +12373,51 @@ var CMap = (function CMapClosure() { mapRangeToArray: function(low, high, array) { var i = 0, ii = array.length; while (low <= high && i < ii) { - this.map[low] = array[i++]; + this._map[low] = array[i++]; ++low; } }, mapOne: function(src, dst) { - this.map[src] = dst; + this._map[src] = dst; }, lookup: function(code) { - return this.map[code]; + return this._map[code]; + }, + + contains: function(code) { + return this._map[code] !== undefined; + }, + + forEach: function(callback) { + // Most maps have fewer than 65536 entries, and for those we use normal + // array iteration. But really sparse tables are possible -- e.g. with + // indices in the *billions*. For such tables we use for..in, which isn't + // ideal because it stringifies the indices for all present elements, but + // it does avoid iterating over every undefined entry. + var map = this._map; + var length = map.length; + var i; + if (length <= 0x10000) { + for (i = 0; i < length; i++) { + if (map[i] !== undefined) { + callback(i, map[i]); + } + } + } else { + for (i in this._map) { + callback(i, map[i]); + } + } + }, + + charCodeOf: function(value) { + return this._map.indexOf(value); + }, + + getMap: function() { + return this._map; }, readCharCode: function(str, offset) { @@ -12938,12 +12972,11 @@ var CMapFactory = (function CMapFactoryClosure() { } // Merge the map into the current one, making sure not to override // any previously defined entries. - for (var key in cMap.useCMap.map) { - if (key in cMap.map) { - continue; + cMap.useCMap.forEach(function(key, value) { + if (!cMap.contains(key)) { + cMap.mapOne(key, cMap.useCMap.lookup(key)); } - cMap.map[key] = cMap.useCMap.map[key]; - } + }); } function parseBinaryCMap(name, builtInCMapParams) { @@ -16879,10 +16912,7 @@ var Font = (function FontClosure() { if (properties.type === 'CIDFontType2') { var cidToGidMap = properties.cidToGidMap || []; var cidToGidMapLength = cidToGidMap.length; - var cMap = properties.cMap.map; - for (charCode in cMap) { - charCode |= 0; - var cid = cMap[charCode]; + properties.cMap.forEach(function(charCode, cid) { assert(cid.length === 1, 'Max size of CID is 65,535'); cid = cid.charCodeAt(0); var glyphId = -1; @@ -16894,7 +16924,7 @@ var Font = (function FontClosure() { if (glyphId >= 0 && glyphId < numGlyphs) { charCodeToGlyphId[charCode] = glyphId; } - } + }); if (dupFirstEntry) { charCodeToGlyphId[0] = numGlyphs - 1; } @@ -16952,7 +16982,7 @@ var Font = (function FontClosure() { if (!found && properties.glyphNames) { // Try to map using the post table. There are currently no known // pdfs that this fixes. - glyphId = properties.glyphNames.indexOf(glyphName); + var glyphId = properties.glyphNames.indexOf(glyphName); if (glyphId > 0) { charCodeToGlyphId[charCode] = glyphId; } @@ -17353,18 +17383,17 @@ var Font = (function FontClosure() { { url: PDFJS.cMapUrl, packed: PDFJS.cMapPacked }, null); var cMap = properties.cMap; toUnicode = []; - for (charcode in cMap.map) { - var cid = cMap.map[charcode]; + cMap.forEach(function(charcode, cid) { assert(cid.length === 1, 'Max size of CID is 65,535'); // e) Map the CID obtained in step (a) according to the CMap obtained // in step (d), producing a Unicode value. - var ucs2 = ucs2CMap.map[cid.charCodeAt(0)]; - if (!ucs2) { - continue; + var ucs2 = ucs2CMap.lookup(cid.charCodeAt(0)); + if (ucs2) { + toUnicode[charcode] = + String.fromCharCode((ucs2.charCodeAt(0) << 8) + + ucs2.charCodeAt(1)); } - toUnicode[charcode] = String.fromCharCode((ucs2.charCodeAt(0) << 8) + - ucs2.charCodeAt(1)); - } + }); map.toUnicode = toUnicode; return map; } @@ -17399,7 +17428,7 @@ var Font = (function FontClosure() { // finding the charcode via unicodeToCID map var charcode = 0; if (this.composite) { - if (glyphUnicode in this.cMap.map) { + if (this.cMap.contains(glyphUnicode)) { charcode = this.cMap.lookup(glyphUnicode).charCodeAt(0); } } @@ -17428,8 +17457,8 @@ var Font = (function FontClosure() { var fontCharCode, width, operatorListId; var widthCode = charcode; - if (this.cMap && charcode in this.cMap.map) { - widthCode = this.cMap.map[charcode].charCodeAt(0); + if (this.cMap && this.cMap.contains(charcode)) { + widthCode = this.cMap.lookup(charcode).charCodeAt(0); } width = this.widths[widthCode]; width = isNum(width) ? width : this.defaultWidth; @@ -18612,7 +18641,7 @@ var CFFFont = (function CFFFontClosure() { // to map CIDs to GIDs. for (glyphId = 0; glyphId < charsets.length; glyphId++) { var cidString = String.fromCharCode(charsets[glyphId]); - var charCode = properties.cMap.map.indexOf(cidString); + var charCode = properties.cMap.charCodeOf(cidString); charCodeToGlyphId[charCode] = glyphId; } } else { diff --git a/package.json b/package.json index 80cfbfe09..9f868f07d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pdfjs-dist", - "version": "1.0.521", + "version": "1.0.524", "description": "Generic build of Mozilla's PDF.js library.", "keywords": [ "Mozilla",