diff --git a/bower.json b/bower.json index 95ba9684a..961de9dd4 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "pdfjs-dist", - "version": "1.2.61", + "version": "1.2.64", "main": [ "build/pdf.js", "build/pdf.worker.js" diff --git a/build/pdf.combined.js b/build/pdf.combined.js index 8b7a6a3a6..fce96d471 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.2.61'; -PDFJS.build = 'cbce05b'; +PDFJS.version = '1.2.64'; +PDFJS.build = '7e8dacf'; (function pdfjsWrapper() { // Use strict in our context only - users might not want it @@ -4822,16 +4822,13 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { var x = 0, i; for (i = 0; i < glyphsLength; ++i) { var glyph = glyphs[i]; - if (glyph === null) { - // word break - x += fontDirection * wordSpacing; - continue; - } else if (isNum(glyph)) { + if (isNum(glyph)) { x += spacingDir * glyph * fontSize / 1000; continue; } var restoreNeeded = false; + var spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing; var character = glyph.fontChar; var accent = glyph.accent; var scaledX, scaledY, scaledAccentX, scaledAccentY; @@ -4875,7 +4872,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { } } - var charWidth = width * widthAdvanceScale + charSpacing * fontDirection; + var charWidth = width * widthAdvanceScale + spacing * fontDirection; x += charWidth; if (restoreNeeded) { @@ -4920,18 +4917,14 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { for (i = 0; i < glyphsLength; ++i) { glyph = glyphs[i]; - if (glyph === null) { - // word break - this.ctx.translate(wordSpacing, 0); - current.x += wordSpacing * textHScale; - continue; - } else if (isNum(glyph)) { + if (isNum(glyph)) { spacingLength = spacingDir * glyph * fontSize / 1000; this.ctx.translate(spacingLength, 0); current.x += spacingLength * textHScale; continue; } + var spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing; var operatorList = font.charProcOperatorList[glyph.operatorListId]; if (!operatorList) { warn('Type3 character \"' + glyph.operatorListId + @@ -4946,7 +4939,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { this.restore(); var transformed = Util.applyTransform([glyph.width, 0], fontMatrix); - width = transformed[0] * fontSize + charSpacing; + width = transformed[0] * fontSize + spacing; ctx.translate(width, 0); current.x += width * textHScale; @@ -17739,9 +17732,6 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { for (var i = 0, ii = glyphs.length; i < ii; i++) { var glyph = glyphs[i]; - if (glyph === null) { - continue; - } buildPath(glyph.fontChar); // If the glyph has an accent we need to build a path for its @@ -18401,10 +18391,6 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { var defaultVMetrics = font.defaultVMetrics; for (var i = 0; i < glyphs.length; i++) { var glyph = glyphs[i]; - if (!glyph) { // Previous glyph was a space. - width += textState.wordSpacing * textState.textHScale; - continue; - } var vMetricX = null; var vMetricY = null; var glyphWidth = null; @@ -18440,11 +18426,14 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { // var x = pt[0]; // var y = pt[1]; - var charSpacing = 0; - if (textChunk.str.length > 0) { - // Apply char spacing only when there are chars. - // As a result there is only spacing between glyphs. - charSpacing = textState.charSpacing; + var charSpacing = textState.charSpacing; + if (glyph.isSpace) { + var wordSpacing = textState.wordSpacing; + charSpacing += wordSpacing; + if (wordSpacing > 0) { + addFakeSpaces(wordSpacing * 1000 / textState.fontSize, + textChunk.str); + } } var tx = 0; @@ -18478,6 +18467,22 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { return textChunk; } + function addFakeSpaces(width, strBuf) { + var spaceWidth = textState.font.spaceWidth; + if (spaceWidth <= 0) { + return; + } + var fakeSpaces = width / spaceWidth; + if (fakeSpaces > MULTI_SPACE_FACTOR) { + fakeSpaces = Math.round(fakeSpaces); + while (fakeSpaces--) { + strBuf.push(' '); + } + } else if (fakeSpaces > SPACE_FACTOR) { + strBuf.push(' '); + } + } + var timeSlotManager = new TimeSlotManager(); return new Promise(function next(resolve, reject) { @@ -18556,29 +18561,26 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { // In the default coordinate system, a positive adjustment // has the effect of moving the next glyph painted either to // the left or down by the given amount. - var val = items[j] * textState.fontSize / 1000; + var advance = items[j]; + var val = advance * textState.fontSize / 1000; if (textState.font.vertical) { - offset = val * textState.textMatrix[3]; - textState.translateTextMatrix(0, offset); + offset = val * + (textState.textHScale * textState.textMatrix[2] + + textState.textMatrix[3]); + textState.translateTextMatrix(0, val); // Value needs to be added to height to paint down. textChunk.height += offset; } else { - offset = val * textState.textHScale * - textState.textMatrix[0]; - textState.translateTextMatrix(offset, 0); + offset = val * ( + textState.textHScale * textState.textMatrix[0] + + textState.textMatrix[1]); + textState.translateTextMatrix(-val, 0); // Value needs to be subtracted from width to paint left. textChunk.width -= offset; + advance = -advance; } - if (items[j] < 0 && textState.font.spaceWidth > 0) { - var fakeSpaces = -items[j] / textState.font.spaceWidth; - if (fakeSpaces > MULTI_SPACE_FACTOR) { - fakeSpaces = Math.round(fakeSpaces); - while (fakeSpaces--) { - textChunk.str.push(' '); - } - } else if (fakeSpaces > SPACE_FACTOR) { - textChunk.str.push(' '); - } + if (advance > 0) { + addFakeSpaces(advance, textChunk.str); } } } @@ -23259,23 +23261,26 @@ function getFontType(type, subtype) { } var Glyph = (function GlyphClosure() { - function Glyph(fontChar, unicode, accent, width, vmetric, operatorListId) { + function Glyph(fontChar, unicode, accent, width, vmetric, operatorListId, + isSpace) { this.fontChar = fontChar; this.unicode = unicode; this.accent = accent; this.width = width; this.vmetric = vmetric; this.operatorListId = operatorListId; + this.isSpace = isSpace; } - Glyph.prototype.matchesForCache = - function(fontChar, unicode, accent, width, vmetric, operatorListId) { + Glyph.prototype.matchesForCache = function(fontChar, unicode, accent, width, + vmetric, operatorListId, isSpace) { return this.fontChar === fontChar && this.unicode === unicode && this.accent === accent && this.width === width && this.vmetric === vmetric && - this.operatorListId === operatorListId; + this.operatorListId === operatorListId && + this.isSpace === isSpace; }; return Glyph; @@ -25790,7 +25795,7 @@ var Font = (function FontClosure() { return width; }, - charToGlyph: function Font_charToGlyph(charcode) { + charToGlyph: function Font_charToGlyph(charcode, isSpace) { var fontCharCode, width, operatorListId; var widthCode = charcode; @@ -25833,9 +25838,9 @@ var Font = (function FontClosure() { var glyph = this.glyphCache[charcode]; if (!glyph || !glyph.matchesForCache(fontChar, unicode, accent, width, vmetric, - operatorListId)) { + operatorListId, isSpace)) { glyph = new Glyph(fontChar, unicode, accent, width, vmetric, - operatorListId); + operatorListId, isSpace); this.glyphCache[charcode] = glyph; } return glyph; @@ -25871,22 +25876,16 @@ var Font = (function FontClosure() { charcode = c.charcode; var length = c.length; i += length; - glyph = this.charToGlyph(charcode); + // Space is char with code 0x20 and length 1 in multiple-byte codes. + var isSpace = length === 1 && chars.charCodeAt(i - 1) === 0x20; + glyph = this.charToGlyph(charcode, isSpace); glyphs.push(glyph); - // placing null after each word break charcode (ASCII SPACE) - // Ignore occurences of 0x20 in multiple-byte codes. - if (length === 1 && chars.charCodeAt(i - 1) === 0x20) { - glyphs.push(null); - } } } else { for (i = 0, ii = chars.length; i < ii; ++i) { charcode = chars.charCodeAt(i); - glyph = this.charToGlyph(charcode); + glyph = this.charToGlyph(charcode, charcode === 0x20); glyphs.push(glyph); - if (charcode === 0x20) { - glyphs.push(null); - } } } diff --git a/build/pdf.js b/build/pdf.js index 04856aecc..591bde785 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.2.61'; -PDFJS.build = 'cbce05b'; +PDFJS.version = '1.2.64'; +PDFJS.build = '7e8dacf'; (function pdfjsWrapper() { // Use strict in our context only - users might not want it @@ -4875,16 +4875,13 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { var x = 0, i; for (i = 0; i < glyphsLength; ++i) { var glyph = glyphs[i]; - if (glyph === null) { - // word break - x += fontDirection * wordSpacing; - continue; - } else if (isNum(glyph)) { + if (isNum(glyph)) { x += spacingDir * glyph * fontSize / 1000; continue; } var restoreNeeded = false; + var spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing; var character = glyph.fontChar; var accent = glyph.accent; var scaledX, scaledY, scaledAccentX, scaledAccentY; @@ -4928,7 +4925,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { } } - var charWidth = width * widthAdvanceScale + charSpacing * fontDirection; + var charWidth = width * widthAdvanceScale + spacing * fontDirection; x += charWidth; if (restoreNeeded) { @@ -4973,18 +4970,14 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { for (i = 0; i < glyphsLength; ++i) { glyph = glyphs[i]; - if (glyph === null) { - // word break - this.ctx.translate(wordSpacing, 0); - current.x += wordSpacing * textHScale; - continue; - } else if (isNum(glyph)) { + if (isNum(glyph)) { spacingLength = spacingDir * glyph * fontSize / 1000; this.ctx.translate(spacingLength, 0); current.x += spacingLength * textHScale; continue; } + var spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing; var operatorList = font.charProcOperatorList[glyph.operatorListId]; if (!operatorList) { warn('Type3 character \"' + glyph.operatorListId + @@ -4999,7 +4992,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { this.restore(); var transformed = Util.applyTransform([glyph.width, 0], fontMatrix); - width = transformed[0] * fontSize + charSpacing; + width = transformed[0] * fontSize + spacing; ctx.translate(width, 0); current.x += width * textHScale; diff --git a/build/pdf.worker.js b/build/pdf.worker.js index 252c9edba..dcbac4152 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.2.61'; -PDFJS.build = 'cbce05b'; +PDFJS.version = '1.2.64'; +PDFJS.build = '7e8dacf'; (function pdfjsWrapper() { // Use strict in our context only - users might not want it @@ -11154,9 +11154,6 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { for (var i = 0, ii = glyphs.length; i < ii; i++) { var glyph = glyphs[i]; - if (glyph === null) { - continue; - } buildPath(glyph.fontChar); // If the glyph has an accent we need to build a path for its @@ -11816,10 +11813,6 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { var defaultVMetrics = font.defaultVMetrics; for (var i = 0; i < glyphs.length; i++) { var glyph = glyphs[i]; - if (!glyph) { // Previous glyph was a space. - width += textState.wordSpacing * textState.textHScale; - continue; - } var vMetricX = null; var vMetricY = null; var glyphWidth = null; @@ -11855,11 +11848,14 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { // var x = pt[0]; // var y = pt[1]; - var charSpacing = 0; - if (textChunk.str.length > 0) { - // Apply char spacing only when there are chars. - // As a result there is only spacing between glyphs. - charSpacing = textState.charSpacing; + var charSpacing = textState.charSpacing; + if (glyph.isSpace) { + var wordSpacing = textState.wordSpacing; + charSpacing += wordSpacing; + if (wordSpacing > 0) { + addFakeSpaces(wordSpacing * 1000 / textState.fontSize, + textChunk.str); + } } var tx = 0; @@ -11893,6 +11889,22 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { return textChunk; } + function addFakeSpaces(width, strBuf) { + var spaceWidth = textState.font.spaceWidth; + if (spaceWidth <= 0) { + return; + } + var fakeSpaces = width / spaceWidth; + if (fakeSpaces > MULTI_SPACE_FACTOR) { + fakeSpaces = Math.round(fakeSpaces); + while (fakeSpaces--) { + strBuf.push(' '); + } + } else if (fakeSpaces > SPACE_FACTOR) { + strBuf.push(' '); + } + } + var timeSlotManager = new TimeSlotManager(); return new Promise(function next(resolve, reject) { @@ -11971,29 +11983,26 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { // In the default coordinate system, a positive adjustment // has the effect of moving the next glyph painted either to // the left or down by the given amount. - var val = items[j] * textState.fontSize / 1000; + var advance = items[j]; + var val = advance * textState.fontSize / 1000; if (textState.font.vertical) { - offset = val * textState.textMatrix[3]; - textState.translateTextMatrix(0, offset); + offset = val * + (textState.textHScale * textState.textMatrix[2] + + textState.textMatrix[3]); + textState.translateTextMatrix(0, val); // Value needs to be added to height to paint down. textChunk.height += offset; } else { - offset = val * textState.textHScale * - textState.textMatrix[0]; - textState.translateTextMatrix(offset, 0); + offset = val * ( + textState.textHScale * textState.textMatrix[0] + + textState.textMatrix[1]); + textState.translateTextMatrix(-val, 0); // Value needs to be subtracted from width to paint left. textChunk.width -= offset; + advance = -advance; } - if (items[j] < 0 && textState.font.spaceWidth > 0) { - var fakeSpaces = -items[j] / textState.font.spaceWidth; - if (fakeSpaces > MULTI_SPACE_FACTOR) { - fakeSpaces = Math.round(fakeSpaces); - while (fakeSpaces--) { - textChunk.str.push(' '); - } - } else if (fakeSpaces > SPACE_FACTOR) { - textChunk.str.push(' '); - } + if (advance > 0) { + addFakeSpaces(advance, textChunk.str); } } } @@ -16674,23 +16683,26 @@ function getFontType(type, subtype) { } var Glyph = (function GlyphClosure() { - function Glyph(fontChar, unicode, accent, width, vmetric, operatorListId) { + function Glyph(fontChar, unicode, accent, width, vmetric, operatorListId, + isSpace) { this.fontChar = fontChar; this.unicode = unicode; this.accent = accent; this.width = width; this.vmetric = vmetric; this.operatorListId = operatorListId; + this.isSpace = isSpace; } - Glyph.prototype.matchesForCache = - function(fontChar, unicode, accent, width, vmetric, operatorListId) { + Glyph.prototype.matchesForCache = function(fontChar, unicode, accent, width, + vmetric, operatorListId, isSpace) { return this.fontChar === fontChar && this.unicode === unicode && this.accent === accent && this.width === width && this.vmetric === vmetric && - this.operatorListId === operatorListId; + this.operatorListId === operatorListId && + this.isSpace === isSpace; }; return Glyph; @@ -19205,7 +19217,7 @@ var Font = (function FontClosure() { return width; }, - charToGlyph: function Font_charToGlyph(charcode) { + charToGlyph: function Font_charToGlyph(charcode, isSpace) { var fontCharCode, width, operatorListId; var widthCode = charcode; @@ -19248,9 +19260,9 @@ var Font = (function FontClosure() { var glyph = this.glyphCache[charcode]; if (!glyph || !glyph.matchesForCache(fontChar, unicode, accent, width, vmetric, - operatorListId)) { + operatorListId, isSpace)) { glyph = new Glyph(fontChar, unicode, accent, width, vmetric, - operatorListId); + operatorListId, isSpace); this.glyphCache[charcode] = glyph; } return glyph; @@ -19286,22 +19298,16 @@ var Font = (function FontClosure() { charcode = c.charcode; var length = c.length; i += length; - glyph = this.charToGlyph(charcode); + // Space is char with code 0x20 and length 1 in multiple-byte codes. + var isSpace = length === 1 && chars.charCodeAt(i - 1) === 0x20; + glyph = this.charToGlyph(charcode, isSpace); glyphs.push(glyph); - // placing null after each word break charcode (ASCII SPACE) - // Ignore occurences of 0x20 in multiple-byte codes. - if (length === 1 && chars.charCodeAt(i - 1) === 0x20) { - glyphs.push(null); - } } } else { for (i = 0, ii = chars.length; i < ii; ++i) { charcode = chars.charCodeAt(i); - glyph = this.charToGlyph(charcode); + glyph = this.charToGlyph(charcode, charcode === 0x20); glyphs.push(glyph); - if (charcode === 0x20) { - glyphs.push(null); - } } } diff --git a/package.json b/package.json index ba977f328..e8ab4b96e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pdfjs-dist", - "version": "1.2.61", + "version": "1.2.64", "description": "Generic build of Mozilla's PDF.js library.", "keywords": [ "Mozilla",