From 6c5d2ac88bf986170e3627f7919e4fae444af44f Mon Sep 17 00:00:00 2001 From: Artur Adib Date: Fri, 28 Oct 2011 12:16:17 -0400 Subject: [PATCH 01/68] progress --- web/viewer.css | 15 +++++++++++++++ web/viewer.js | 6 +++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/web/viewer.css b/web/viewer.css index 27ad0638a..52852d591 100644 --- a/web/viewer.css +++ b/web/viewer.css @@ -231,6 +231,21 @@ canvas { -webkit-box-shadow: 0px 2px 10px #ff0; } +.textLayer { + position: absolute; + left: 0; + top: 0; + right: 0; + bottom: 0; + color: #000; +} + +.textLayer > div { + color: transparent; + position: absolute; + line-height:1.3; +} + #viewer { margin: 44px 0px 0px; padding: 8px 0px; diff --git a/web/viewer.js b/web/viewer.js index 1ab2c555c..63215a6d8 100644 --- a/web/viewer.js +++ b/web/viewer.js @@ -475,6 +475,10 @@ var PageView = function pageView(container, content, id, pageWidth, pageHeight, canvas.mozOpaque = true; div.appendChild(canvas); + var textDiv = document.createElement('div'); + textDiv.className = 'textLayer'; + div.appendChild(textDiv); + var scale = this.scale; canvas.width = pageWidth * scale; canvas.height = pageHeight * scale; @@ -487,7 +491,7 @@ var PageView = function pageView(container, content, id, pageWidth, pageHeight, ctx.translate(-this.x * scale, -this.y * scale); stats.begin = Date.now(); - this.content.startRendering(ctx, this.updateStats); + this.content.startRendering(ctx, this.updateStats, textDiv, scale); setupLinks(this.content, this.scale); div.setAttribute('data-loaded', true); From e7d08e3a98cfbd978c1ddfb9e8af9396d311e603 Mon Sep 17 00:00:00 2001 From: Artur Adib Date: Fri, 28 Oct 2011 17:37:55 -0400 Subject: [PATCH 02/68] Selection working --- src/canvas.js | 118 ++++++++++++++++++++++++++++++++++++++++++------- src/core.js | 7 ++- web/viewer.css | 6 +++ web/viewer.js | 8 ++-- 4 files changed, 117 insertions(+), 22 deletions(-) diff --git a/src/canvas.js b/src/canvas.js index 70dd65e3d..d771fa15e 100644 --- a/src/canvas.js +++ b/src/canvas.js @@ -60,7 +60,7 @@ var CanvasGraphics = (function canvasGraphics() { // if we execute longer then `kExecutionTime`. var kExecutionTimeCheck = 500; - function constructor(canvasCtx, objs) { + function constructor(canvasCtx, objs, textLayer, textScale) { this.ctx = canvasCtx; this.current = new CanvasExtraState(); this.stateStack = []; @@ -69,6 +69,8 @@ var CanvasGraphics = (function canvasGraphics() { this.xobjs = null; this.ScratchCanvas = ScratchCanvas; this.objs = objs; + this.textLayer = textLayer; + this.textScale = textScale; } var LINE_CAP_STYLES = ['butt', 'round', 'square']; @@ -95,6 +97,7 @@ var CanvasGraphics = (function canvasGraphics() { break; } this.ctx.scale(cw / mediaBox.width, ch / mediaBox.height); + this.textDivs = []; }, executeIRQueue: function canvasGraphicsExecuteIRQueue(codeIR, @@ -150,6 +153,17 @@ var CanvasGraphics = (function canvasGraphics() { endDrawing: function canvasGraphicsEndDrawing() { this.ctx.restore(); + + // Text selection-specific + var textLayer = this.textLayer; + var textDivs = this.textDivs; + for (var i = 0, length = textDivs.length; i < length; ++i) { + if (textDivs[i].dataset.textLength>1) { // avoid div by zero + textLayer.appendChild(textDivs[i]); + // Adjust div width to match canvas text width + textDivs[i].style.letterSpacing = ((textDivs[i].dataset.canvasWidth - textDivs[i].offsetWidth)/(textDivs[i].dataset.textLength-1)) + 'px'; + } + } }, // Graphics state @@ -414,6 +428,12 @@ var CanvasGraphics = (function canvasGraphics() { this.moveText(0, this.current.leading); }, showText: function canvasGraphicsShowText(text) { + function unicodeToChar(unicode) { + return (unicode >= 0x10000) ? + String.fromCharCode(0xD800 | ((unicode - 0x10000) >> 10), + 0xDC00 | (unicode & 0x3FF)) : String.fromCharCode(unicode); + }; + var ctx = this.ctx; var current = this.current; var font = current.font; @@ -423,6 +443,8 @@ var CanvasGraphics = (function canvasGraphics() { var wordSpacing = current.wordSpacing; var textHScale = current.textHScale; var glyphsLength = glyphs.length; + var text = { chars:'', width:0 }; + if (font.coded) { ctx.save(); ctx.transform.apply(ctx, current.textMatrix); @@ -446,11 +468,12 @@ var CanvasGraphics = (function canvasGraphics() { this.restore(); var transformed = Util.applyTransform([glyph.width, 0], fontMatrix); - var width = transformed[0] * fontSize + charSpacing; - - ctx.translate(width, 0); - current.x += width; + var charWidth = transformed[0] * fontSize + charSpacing; + ctx.translate(charWidth, 0); + current.x += charWidth; + text.chars += unicodeToChar(glyph.unicode); + text.width += charWidth; } ctx.restore(); } else { @@ -459,7 +482,6 @@ var CanvasGraphics = (function canvasGraphics() { ctx.scale(1, -1); ctx.translate(current.x, -1 * current.y); ctx.transform.apply(ctx, font.fontMatrix || IDENTITY_MATRIX); - ctx.scale(1 / textHScale, 1); var width = 0; @@ -471,36 +493,100 @@ var CanvasGraphics = (function canvasGraphics() { continue; } - var unicode = glyph.unicode; - var char = (unicode >= 0x10000) ? - String.fromCharCode(0xD800 | ((unicode - 0x10000) >> 10), - 0xDC00 | (unicode & 0x3FF)) : String.fromCharCode(unicode); - + var char = unicodeToChar(glyph.unicode); + var charWidth = glyph.width * fontSize * 0.001 + charSpacing; ctx.fillText(char, width, 0); - width += glyph.width * fontSize * 0.001 + charSpacing; + width += charWidth; + + text.chars += char; + text.width += charWidth; } current.x += width; - ctx.restore(); } + return text; }, - showSpacedText: function canvasGraphicsShowSpacedText(arr) { var ctx = this.ctx; var current = this.current; var fontSize = current.fontSize; var textHScale = current.textHScale; var arrLength = arr.length; + var textLayer = this.textLayer; + var font = current.font; + var text = {str:'', length:0, canvasWidth:0, spaceWidth:0, geom:{}}; + + // Text selection-specific + text.spaceWidth = this.current.font.charsToGlyphs(' ')[0].width; + if (!text.spaceWidth>0) { + // Hack (space is sometimes not encoded) + text.spaceWidth = this.current.font.charsToGlyphs('i')[0].width; + } + + // Compute text.geom + // TODO: refactor the series of transformations below, and share it with showText() + ctx.save(); + ctx.transform.apply(ctx, current.textMatrix); + ctx.scale(1, -1); + ctx.translate(current.x, -1 * current.y); + ctx.transform.apply(ctx, font.fontMatrix || IDENTITY_MATRIX); + ctx.scale(1 / textHScale, 1); + var inv = ctx.mozCurrentTransform; + if (inv) { + var bl = Util.applyTransform([0, 0], inv); + var tr = Util.applyTransform([1, 1], inv); + text.geom.x = bl[0]; + text.geom.y = bl[1]; + text.geom.xFactor = tr[0] - bl[0]; + text.geom.yFactor = tr[1] - bl[1]; + } + ctx.restore(); + for (var i = 0; i < arrLength; ++i) { var e = arr[i]; if (isNum(e)) { - current.x -= e * 0.001 * fontSize * textHScale; + var spacingLength = -e * 0.001 * fontSize * textHScale; + current.x += spacingLength; + + // Text selection-specific + // Emulate arbitrary spacing via HTML spaces + text.canvasWidth += spacingLength; + if (e<0 && text.spaceWidth>0) { // avoid div by zero + var numFakeSpaces = Math.round(-e / text.spaceWidth); + for (var j = 0; j < numFakeSpaces; ++j) + text.str += ' '; + text.length += numFakeSpaces>0 ? 1 : 0; + } } else if (isString(e)) { - this.showText(e); + var shownText = this.showText(e); + + // Text selection-specific + if (shownText.chars === ' ') { + text.str += ' '; + } else { + text.str += shownText.chars; + } + text.canvasWidth += shownText.width; + text.length += e.length; } else { malformed('TJ array element ' + e + ' is not string or num'); } } + + if (textLayer) { + var div = document.createElement('div'); + var fontHeight = text.geom.yFactor * fontSize; + div.style.fontSize = fontHeight + 'px'; + // TODO: family should be '= font.loadedName', but some fonts don't + // have spacing info (cf. fonts.js > Font > fields > htmx) + div.style.fontFamily = 'serif'; + div.style.left = text.geom.x + 'px'; + div.style.top = (text.geom.y - fontHeight) + 'px'; + div.innerHTML = text.str; + div.dataset.canvasWidth = text.canvasWidth * text.geom.xFactor; + div.dataset.textLength = text.length; + this.textDivs.push(div); + } }, nextLineShowText: function canvasGraphicsNextLineShowText(text) { this.nextLine(); diff --git a/src/core.js b/src/core.js index 4b411cff5..7e7bb6ea8 100644 --- a/src/core.js +++ b/src/core.js @@ -157,7 +157,7 @@ var Page = (function pagePage() { IRQueue, fonts) { var self = this; this.IRQueue = IRQueue; - var gfx = new CanvasGraphics(this.ctx, this.objs); + var gfx = new CanvasGraphics(this.ctx, this.objs, this.textLayer, this.textScale); var startTime = Date.now(); var displayContinuation = function pageDisplayContinuation() { @@ -243,6 +243,7 @@ var Page = (function pagePage() { startIdx = gfx.executeIRQueue(IRQueue, startIdx, next); if (startIdx == length) { self.stats.render = Date.now(); + gfx.endDrawing(); if (callback) callback(); } } @@ -305,9 +306,11 @@ var Page = (function pagePage() { } return links; }, - startRendering: function(ctx, callback) { + startRendering: function(ctx, callback, textLayer, textScale) { this.ctx = ctx; this.callback = callback; + this.textLayer = textLayer; + this.textScale = textScale; this.startRenderingTime = Date.now(); this.pdf.startRendering(this); diff --git a/web/viewer.css b/web/viewer.css index 52852d591..19895ac27 100644 --- a/web/viewer.css +++ b/web/viewer.css @@ -246,6 +246,12 @@ canvas { line-height:1.3; } +::selection { background:rgba(0,0,255,0.3); } +::-moz-selection { background:rgba(0,0,255,0.3); } +/* TODO: file FF bug to support ::-moz-selection:window-inactive + so we can override the opaque grey background when the window is inactive; + see also http://css-tricks.com/9288-window-inactive-styling */ + #viewer { margin: 44px 0px 0px; padding: 8px 0px; diff --git a/web/viewer.js b/web/viewer.js index 63215a6d8..523b7dc56 100644 --- a/web/viewer.js +++ b/web/viewer.js @@ -475,9 +475,9 @@ var PageView = function pageView(container, content, id, pageWidth, pageHeight, canvas.mozOpaque = true; div.appendChild(canvas); - var textDiv = document.createElement('div'); - textDiv.className = 'textLayer'; - div.appendChild(textDiv); + var textLayer = document.createElement('div'); + textLayer.className = 'textLayer'; + div.appendChild(textLayer); var scale = this.scale; canvas.width = pageWidth * scale; @@ -491,7 +491,7 @@ var PageView = function pageView(container, content, id, pageWidth, pageHeight, ctx.translate(-this.x * scale, -this.y * scale); stats.begin = Date.now(); - this.content.startRendering(ctx, this.updateStats, textDiv, scale); + this.content.startRendering(ctx, this.updateStats, textLayer, scale); setupLinks(this.content, this.scale); div.setAttribute('data-loaded', true); From 98f3bab65c58fb4d1080cf57c1410209c9626502 Mon Sep 17 00:00:00 2001 From: Artur Adib Date: Mon, 31 Oct 2011 16:49:18 -0400 Subject: [PATCH 03/68] Lazy rendering --- src/canvas.js | 122 ++++++++++++++++++++++++++++++-------------------- src/core.js | 7 ++- web/viewer.js | 2 +- 3 files changed, 78 insertions(+), 53 deletions(-) diff --git a/src/canvas.js b/src/canvas.js index d771fa15e..d5db79446 100644 --- a/src/canvas.js +++ b/src/canvas.js @@ -60,7 +60,7 @@ var CanvasGraphics = (function canvasGraphics() { // if we execute longer then `kExecutionTime`. var kExecutionTimeCheck = 500; - function constructor(canvasCtx, objs, textLayer, textScale) { + function constructor(canvasCtx, objs, textLayer) { this.ctx = canvasCtx; this.current = new CanvasExtraState(); this.stateStack = []; @@ -70,7 +70,6 @@ var CanvasGraphics = (function canvasGraphics() { this.ScratchCanvas = ScratchCanvas; this.objs = objs; this.textLayer = textLayer; - this.textScale = textScale; } var LINE_CAP_STYLES = ['butt', 'round', 'square']; @@ -98,6 +97,10 @@ var CanvasGraphics = (function canvasGraphics() { } this.ctx.scale(cw / mediaBox.width, ch / mediaBox.height); this.textDivs = []; + this.textLayerQueue = []; + // Prevent textLayerQueue to be rendered while rendering a new page + if (this.textLayerTimer) + clearTimeout(this.textLayerTimer); }, executeIRQueue: function canvasGraphicsExecuteIRQueue(codeIR, @@ -152,17 +155,37 @@ var CanvasGraphics = (function canvasGraphics() { }, endDrawing: function canvasGraphicsEndDrawing() { + var self = this; this.ctx.restore(); - // Text selection-specific - var textLayer = this.textLayer; - var textDivs = this.textDivs; - for (var i = 0, length = textDivs.length; i < length; ++i) { - if (textDivs[i].dataset.textLength>1) { // avoid div by zero - textLayer.appendChild(textDivs[i]); - // Adjust div width to match canvas text width - textDivs[i].style.letterSpacing = ((textDivs[i].dataset.canvasWidth - textDivs[i].offsetWidth)/(textDivs[i].dataset.textLength-1)) + 'px'; + var textLayer = self.textLayer; + if (textLayer) { + var renderTextLayer = function canvasRenderTextLayer() { + var textDivs = self.textDivs; + for (var i = 0, length = textDivs.length; i < length; ++i) { + if (textDivs[i].dataset.textLength>1) { // avoid div by zero + textLayer.appendChild(textDivs[i]); + // Adjust div width (via letterSpacing) to match canvas text + // Due to the .offsetWidth calls, this is slow + textDivs[i].style.letterSpacing = + ((textDivs[i].dataset.canvasWidth + - textDivs[i].offsetWidth)/(textDivs[i].dataset.textLength-1)) + + 'px'; + } + } } + var textLayerQueue = self.textLayerQueue; + textLayerQueue.push(renderTextLayer); + + // Lazy textLayer rendering (to prevent UI hangs) + // Only render queue if activity has stopped, where "no activity" == + // "no beginDrawing() calls in the last N ms" + self.textLayerTimer = setTimeout(function renderTextLayerQueue(){ + // Render most recent (==most relevant) layers first + for (var i=textLayerQueue.length-1; i>=0; i--) { + textLayerQueue.pop().call(); + } + }, 500); } }, @@ -516,31 +539,32 @@ var CanvasGraphics = (function canvasGraphics() { var font = current.font; var text = {str:'', length:0, canvasWidth:0, spaceWidth:0, geom:{}}; - // Text selection-specific - text.spaceWidth = this.current.font.charsToGlyphs(' ')[0].width; - if (!text.spaceWidth>0) { - // Hack (space is sometimes not encoded) - text.spaceWidth = this.current.font.charsToGlyphs('i')[0].width; - } + if (textLayer) { + text.spaceWidth = this.current.font.charsToGlyphs(' ')[0].width; + if (!text.spaceWidth>0) { + // Hack (space is sometimes not encoded) + text.spaceWidth = this.current.font.charsToGlyphs('i')[0].width; + } - // Compute text.geom - // TODO: refactor the series of transformations below, and share it with showText() - ctx.save(); - ctx.transform.apply(ctx, current.textMatrix); - ctx.scale(1, -1); - ctx.translate(current.x, -1 * current.y); - ctx.transform.apply(ctx, font.fontMatrix || IDENTITY_MATRIX); - ctx.scale(1 / textHScale, 1); - var inv = ctx.mozCurrentTransform; - if (inv) { - var bl = Util.applyTransform([0, 0], inv); - var tr = Util.applyTransform([1, 1], inv); - text.geom.x = bl[0]; - text.geom.y = bl[1]; - text.geom.xFactor = tr[0] - bl[0]; - text.geom.yFactor = tr[1] - bl[1]; + // Compute text.geom + // TODO: refactor the series of transformations below, and share it with showText() + ctx.save(); + ctx.transform.apply(ctx, current.textMatrix); + ctx.scale(1, -1); + ctx.translate(current.x, -1 * current.y); + ctx.transform.apply(ctx, font.fontMatrix || IDENTITY_MATRIX); + ctx.scale(1 / textHScale, 1); + var inv = ctx.mozCurrentTransform; + if (inv) { + var bl = Util.applyTransform([0, 0], inv); + var tr = Util.applyTransform([1, 1], inv); + text.geom.x = bl[0]; + text.geom.y = bl[1]; + text.geom.xFactor = tr[0] - bl[0]; + text.geom.yFactor = tr[1] - bl[1]; + } + ctx.restore(); } - ctx.restore(); for (var i = 0; i < arrLength; ++i) { var e = arr[i]; @@ -548,26 +572,28 @@ var CanvasGraphics = (function canvasGraphics() { var spacingLength = -e * 0.001 * fontSize * textHScale; current.x += spacingLength; - // Text selection-specific - // Emulate arbitrary spacing via HTML spaces - text.canvasWidth += spacingLength; - if (e<0 && text.spaceWidth>0) { // avoid div by zero - var numFakeSpaces = Math.round(-e / text.spaceWidth); - for (var j = 0; j < numFakeSpaces; ++j) - text.str += ' '; - text.length += numFakeSpaces>0 ? 1 : 0; + if (textLayer) { + // Emulate precise spacing via HTML spaces + text.canvasWidth += spacingLength; + if (e<0 && text.spaceWidth>0) { // avoid div by zero + var numFakeSpaces = Math.round(-e / text.spaceWidth); + for (var j = 0; j < numFakeSpaces; ++j) + text.str += ' '; + text.length += numFakeSpaces>0 ? 1 : 0; + } } } else if (isString(e)) { var shownText = this.showText(e); - // Text selection-specific - if (shownText.chars === ' ') { - text.str += ' '; - } else { - text.str += shownText.chars; + if (textLayer) { + if (shownText.chars === ' ') { + text.str += ' '; + } else { + text.str += shownText.chars; + } + text.canvasWidth += shownText.width; + text.length += e.length; } - text.canvasWidth += shownText.width; - text.length += e.length; } else { malformed('TJ array element ' + e + ' is not string or num'); } diff --git a/src/core.js b/src/core.js index 7e7bb6ea8..4313959a8 100644 --- a/src/core.js +++ b/src/core.js @@ -7,7 +7,7 @@ var globalScope = (typeof window === 'undefined') ? this : window; var ERRORS = 0, WARNINGS = 1, TODOS = 5; var verbosity = WARNINGS; -var useWorker = false; +var useWorker = true; // The global PDFJS object exposes the API // In production, it will be declared outside a global wrapper @@ -157,7 +157,7 @@ var Page = (function pagePage() { IRQueue, fonts) { var self = this; this.IRQueue = IRQueue; - var gfx = new CanvasGraphics(this.ctx, this.objs, this.textLayer, this.textScale); + var gfx = new CanvasGraphics(this.ctx, this.objs, this.textLayer); var startTime = Date.now(); var displayContinuation = function pageDisplayContinuation() { @@ -306,11 +306,10 @@ var Page = (function pagePage() { } return links; }, - startRendering: function(ctx, callback, textLayer, textScale) { + startRendering: function(ctx, callback, textLayer) { this.ctx = ctx; this.callback = callback; this.textLayer = textLayer; - this.textScale = textScale; this.startRenderingTime = Date.now(); this.pdf.startRendering(this); diff --git a/web/viewer.js b/web/viewer.js index 523b7dc56..d8a59e651 100644 --- a/web/viewer.js +++ b/web/viewer.js @@ -491,7 +491,7 @@ var PageView = function pageView(container, content, id, pageWidth, pageHeight, ctx.translate(-this.x * scale, -this.y * scale); stats.begin = Date.now(); - this.content.startRendering(ctx, this.updateStats, textLayer, scale); + this.content.startRendering(ctx, this.updateStats, textLayer); setupLinks(this.content, this.scale); div.setAttribute('data-loaded', true); From c74d7b8777d9b963bbb7b56dac957db5b51647db Mon Sep 17 00:00:00 2001 From: Artur Adib Date: Mon, 31 Oct 2011 16:49:49 -0400 Subject: [PATCH 04/68] Workers off! --- src/core.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core.js b/src/core.js index 4313959a8..ab2509016 100644 --- a/src/core.js +++ b/src/core.js @@ -7,7 +7,7 @@ var globalScope = (typeof window === 'undefined') ? this : window; var ERRORS = 0, WARNINGS = 1, TODOS = 5; var verbosity = WARNINGS; -var useWorker = true; +var useWorker = false; // The global PDFJS object exposes the API // In production, it will be declared outside a global wrapper From 9ddc40c3d7b82f3059e3864c887f05c649b575ca Mon Sep 17 00:00:00 2001 From: Artur Adib Date: Wed, 2 Nov 2011 12:22:39 -0400 Subject: [PATCH 05/68] Nit --- src/canvas.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/canvas.js b/src/canvas.js index 1ed1ab76d..4edcb3096 100644 --- a/src/canvas.js +++ b/src/canvas.js @@ -106,7 +106,7 @@ var CanvasGraphics = (function canvasGraphics() { this.ctx.scale(cw / mediaBox.width, ch / mediaBox.height); this.textDivs = []; this.textLayerQueue = []; - // Prevent textLayerQueue to be rendered while rendering a new page + // Prevent textLayerQueue from being rendered while rendering a new page if (this.textLayerTimer) clearTimeout(this.textLayerTimer); }, @@ -166,7 +166,7 @@ var CanvasGraphics = (function canvasGraphics() { var self = this; this.ctx.restore(); - var textLayer = self.textLayer; + var textLayer = this.textLayer; if (textLayer) { var renderTextLayer = function canvasRenderTextLayer() { var textDivs = self.textDivs; @@ -557,10 +557,10 @@ var CanvasGraphics = (function canvasGraphics() { ctx.translate(current.x, -1 * current.y); ctx.transform.apply(ctx, font.fontMatrix || IDENTITY_MATRIX); ctx.scale(1 / textHScale, 1); - var inv = ctx.mozCurrentTransform; - if (inv) { - var bl = Util.applyTransform([0, 0], inv); - var tr = Util.applyTransform([1, 1], inv); + var ctxMatrix = ctx.mozCurrentTransform; + if (ctxMatrix) { + var bl = Util.applyTransform([0, 0], ctxMatrix); + var tr = Util.applyTransform([1, 1], ctxMatrix); text.geom.x = bl[0]; text.geom.y = bl[1]; text.geom.xFactor = tr[0] - bl[0]; @@ -601,7 +601,7 @@ var CanvasGraphics = (function canvasGraphics() { malformed('TJ array element ' + e + ' is not string or num'); } } - + if (textLayer) { var div = document.createElement('div'); var fontHeight = text.geom.yFactor * fontSize; From 9bb2b881b0bd0984b28cab66ef4fcdc084c633c3 Mon Sep 17 00:00:00 2001 From: Brendan Dahl Date: Tue, 8 Nov 2011 08:48:10 -0800 Subject: [PATCH 06/68] Adds cmyk jpg support. Treats the cmyk jpg as a regular stream. --- Makefile | 1 + examples/helloworld/index.html | 1 + src/core.js | 2 +- src/evaluator.js | 2 +- src/image.js | 12 +++++----- src/stream.js | 44 +++++++++++++++++++++++++++------- test/test_slave.html | 1 + web/viewer.html | 2 +- 8 files changed, 47 insertions(+), 18 deletions(-) diff --git a/Makefile b/Makefile index 3e385b175..2b566cbbf 100644 --- a/Makefile +++ b/Makefile @@ -33,6 +33,7 @@ PDF_JS_FILES = \ pattern.js \ stream.js \ worker.js \ + ../external/jpgjs/jpg.js \ $(NULL) # make server diff --git a/examples/helloworld/index.html b/examples/helloworld/index.html index a48e3705b..a2485d918 100644 --- a/examples/helloworld/index.html +++ b/examples/helloworld/index.html @@ -22,6 +22,7 @@ + + - + From 1869888838666b73c6956b046b60bfac7c9968ec Mon Sep 17 00:00:00 2001 From: Brendan Dahl Date: Tue, 8 Nov 2011 08:50:01 -0800 Subject: [PATCH 07/68] Comment on the new flag. --- src/stream.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/stream.js b/src/stream.js index de07e1387..d8a681a88 100644 --- a/src/stream.js +++ b/src/stream.js @@ -793,6 +793,8 @@ var JpegStream = (function jpegStream() { // TODO: per poppler, some images may have 'junk' before that // need to be removed this.dict = dict; + + // Flag indicating wether the image can be natively loaded. this.isNative = true; if (isAdobeImage(bytes)) { From 9ebec03ddc11e8de6e36c059b1bd71e34f24688c Mon Sep 17 00:00:00 2001 From: Artur Adib Date: Tue, 8 Nov 2011 15:27:03 -0500 Subject: [PATCH 08/68] Implemented selection for showText() --- src/canvas.js | 153 ++++++++++++++++++++++++++++++-------------------- src/fonts.js | 8 ++- 2 files changed, 98 insertions(+), 63 deletions(-) diff --git a/src/canvas.js b/src/canvas.js index 470bbef94..05f74f24e 100644 --- a/src/canvas.js +++ b/src/canvas.js @@ -453,7 +453,58 @@ var CanvasGraphics = (function canvasGraphics() { nextLine: function canvasGraphicsNextLine() { this.moveText(0, this.current.leading); }, - showText: function canvasGraphicsShowText(text) { + applyTextTransforms: function canvasApplyTransforms() { + var ctx = this.ctx; + var current = this.current; + var textHScale = current.textHScale; + var font = current.font; + + ctx.transform.apply(ctx, current.textMatrix); + ctx.scale(1, -1); + ctx.translate(current.x, -1 * current.y); + ctx.transform.apply(ctx, font.fontMatrix || IDENTITY_MATRIX); + ctx.scale(1 / textHScale, 1); + }, + getTextGeometry: function canvasGetTextGeometry() { + var geom = {}; + var ctx = this.ctx; + var font = this.current.font; + var ctxMatrix = ctx.mozCurrentTransform; + if (ctxMatrix) { + var bl = Util.applyTransform([0, 0], ctxMatrix); + var tr = Util.applyTransform([1, 1], ctxMatrix); + geom.x = bl[0]; + geom.y = bl[1]; + geom.hScale = tr[0] - bl[0]; + geom.vScale = tr[1] - bl[1]; + } + var spaceGlyph = font.charsToGlyphs(' ', true); + // Hack (sometimes space is not encoded) + if (spaceGlyph.length === 0 || spaceGlyph[0].width === 0) + spaceGlyph = font.charsToGlyphs('i', true); + // Fallback + if (spaceGlyph.length === 0 || spaceGlyph[0].width === 0) + spaceGlyph = [ {width:0} ]; + geom.spaceWidth = spaceGlyph[0].width; + return geom; + }, + pushTextDivs: function canvasGraphicsPushTextDivs(text) { + var div = document.createElement('div'); + var fontSize = this.current.fontSize; + var fontHeight = text.geom.vScale * fontSize; + + div.style.fontSize = fontHeight + 'px'; + // TODO: family should be '= font.loadedName', but some fonts don't + // have spacing info (cf. fonts.js > Font > fields > htmx) + div.style.fontFamily = 'serif'; + div.style.left = text.geom.x + 'px'; + div.style.top = (text.geom.y - fontHeight) + 'px'; + div.innerHTML = text.str; + div.dataset.canvasWidth = text.canvasWidth * text.geom.hScale; + div.dataset.textLength = text.length; + this.textDivs.push(div); + }, + showText: function canvasGraphicsShowText(str, skipTextSelection) { function unicodeToChar(unicode) { return (unicode >= 0x10000) ? String.fromCharCode(0xD800 | ((unicode - 0x10000) >> 10), @@ -463,14 +514,24 @@ var CanvasGraphics = (function canvasGraphics() { var ctx = this.ctx; var current = this.current; var font = current.font; - var glyphs = font.charsToGlyphs(text); + var glyphs = font.charsToGlyphs(str); var fontSize = current.fontSize; var charSpacing = current.charSpacing; var wordSpacing = current.wordSpacing; var textHScale = current.textHScale; var glyphsLength = glyphs.length; - var text = { chars:'', width:0 }; + var textLayer = this.textLayer; + var text = { str:'', length:0, canvasWidth:0, geom:{}}; + var textSelection = textLayer && !skipTextSelection ? true : false; + + if (textSelection) { + ctx.save(); + this.applyTextTransforms(); + text.geom = this.getTextGeometry(); + ctx.restore(); + } + // Type3 fonts - each glyph is a "mini-PDF" if (font.coded) { ctx.save(); ctx.transform.apply(ctx, current.textMatrix); @@ -498,17 +559,14 @@ var CanvasGraphics = (function canvasGraphics() { ctx.translate(charWidth, 0); current.x += charWidth; - text.chars += unicodeToChar(glyph.unicode); - text.width += charWidth; + text.str += unicodeToChar(glyph.unicode); + text.canvasWidth += charWidth; + text.length++; } ctx.restore(); } else { ctx.save(); - ctx.transform.apply(ctx, current.textMatrix); - ctx.scale(1, -1); - ctx.translate(current.x, -1 * current.y); - ctx.transform.apply(ctx, font.fontMatrix || IDENTITY_MATRIX); - ctx.scale(1 / textHScale, 1); + this.applyTextTransforms(); var width = 0; for (var i = 0; i < glyphsLength; ++i) { @@ -524,12 +582,18 @@ var CanvasGraphics = (function canvasGraphics() { ctx.fillText(char, width, 0); width += charWidth; - text.chars += char; - text.width += charWidth; + text.str += char; + text.canvasWidth += charWidth; + text.length++; } + current.x += width; ctx.restore(); } + + if (textSelection) + this.pushTextDivs(text); + return text; }, showSpacedText: function canvasGraphicsShowSpacedText(arr) { @@ -540,32 +604,13 @@ var CanvasGraphics = (function canvasGraphics() { var arrLength = arr.length; var textLayer = this.textLayer; var font = current.font; - var text = {str:'', length:0, canvasWidth:0, spaceWidth:0, geom:{}}; + var text = {str:'', length:0, canvasWidth:0, geom:{}}; + var textSelection = textLayer ? true : false; - if (textLayer) { - text.spaceWidth = this.current.font.charsToGlyphs(' ')[0].width; - if (!text.spaceWidth>0) { - // Hack (space is sometimes not encoded) - text.spaceWidth = this.current.font.charsToGlyphs('i')[0].width; - } - - // Compute text.geom - // TODO: refactor the series of transformations below, and share it with showText() + if (textSelection) { ctx.save(); - ctx.transform.apply(ctx, current.textMatrix); - ctx.scale(1, -1); - ctx.translate(current.x, -1 * current.y); - ctx.transform.apply(ctx, font.fontMatrix || IDENTITY_MATRIX); - ctx.scale(1 / textHScale, 1); - var ctxMatrix = ctx.mozCurrentTransform; - if (ctxMatrix) { - var bl = Util.applyTransform([0, 0], ctxMatrix); - var tr = Util.applyTransform([1, 1], ctxMatrix); - text.geom.x = bl[0]; - text.geom.y = bl[1]; - text.geom.xFactor = tr[0] - bl[0]; - text.geom.yFactor = tr[1] - bl[1]; - } + this.applyTextTransforms(); + text.geom = this.getTextGeometry(); ctx.restore(); } @@ -575,47 +620,35 @@ var CanvasGraphics = (function canvasGraphics() { var spacingLength = -e * 0.001 * fontSize * textHScale; current.x += spacingLength; - if (textLayer) { + if (textSelection) { // Emulate precise spacing via HTML spaces text.canvasWidth += spacingLength; - if (e<0 && text.spaceWidth>0) { // avoid div by zero - var numFakeSpaces = Math.round(-e / text.spaceWidth); + if (e<0 && text.geom.spaceWidth>0) { // avoid div by zero + var numFakeSpaces = Math.round(-e / text.geom.spaceWidth); for (var j = 0; j < numFakeSpaces; ++j) text.str += ' '; text.length += numFakeSpaces>0 ? 1 : 0; } } } else if (isString(e)) { - var shownText = this.showText(e); + var shownText = this.showText(e, true); - if (textLayer) { - if (shownText.chars === ' ') { - text.str += ' '; + if (textSelection) { + if (shownText.str === ' ') { + text.str += ' '; } else { - text.str += shownText.chars; + text.str += shownText.str; } - text.canvasWidth += shownText.width; + text.canvasWidth += shownText.canvasWidth; text.length += e.length; } } else { malformed('TJ array element ' + e + ' is not string or num'); } } - - if (textLayer) { - var div = document.createElement('div'); - var fontHeight = text.geom.yFactor * fontSize; - div.style.fontSize = fontHeight + 'px'; - // TODO: family should be '= font.loadedName', but some fonts don't - // have spacing info (cf. fonts.js > Font > fields > htmx) - div.style.fontFamily = 'serif'; - div.style.left = text.geom.x + 'px'; - div.style.top = (text.geom.y - fontHeight) + 'px'; - div.innerHTML = text.str; - div.dataset.canvasWidth = text.canvasWidth * text.geom.xFactor; - div.dataset.textLength = text.length; - this.textDivs.push(div); - } + + if (textSelection) + this.pushTextDivs(text); }, nextLineShowText: function canvasGraphicsNextLineShowText(text) { this.nextLine(); diff --git a/src/fonts.js b/src/fonts.js index ca02bb020..9462ac88e 100644 --- a/src/fonts.js +++ b/src/fonts.js @@ -1797,7 +1797,7 @@ var Font = (function Font() { return rule; }, - charsToGlyphs: function fonts_chars2Glyphs(chars) { + charsToGlyphs: function fonts_chars2Glyphs(chars, suppressWarnings) { var charsCache = this.charsCache; var glyphs; @@ -1830,7 +1830,8 @@ var Font = (function Font() { var charcode = int16([chars.charCodeAt(i++), chars.charCodeAt(i)]); var glyph = encoding[charcode]; if ('undefined' == typeof(glyph)) { - warn('Unencoded charcode ' + charcode); + if (!suppressWarnings) + warn('Unencoded charcode ' + charcode); glyph = { unicode: charcode, width: this.defaultWidth @@ -1847,7 +1848,8 @@ var Font = (function Font() { var charcode = chars.charCodeAt(i); var glyph = encoding[charcode]; if ('undefined' == typeof(glyph)) { - warn('Unencoded charcode ' + charcode); + if (!suppressWarnings) + warn('Unencoded charcode ' + charcode); glyph = { unicode: charcode, width: this.defaultWidth From 686f275830ba749d02f04e41c1954d0d0427bff5 Mon Sep 17 00:00:00 2001 From: Artur Adib Date: Tue, 8 Nov 2011 16:05:11 -0500 Subject: [PATCH 09/68] Fix font and spaces --- src/canvas.js | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/canvas.js b/src/canvas.js index 05f74f24e..83d9c34d1 100644 --- a/src/canvas.js +++ b/src/canvas.js @@ -494,9 +494,7 @@ var CanvasGraphics = (function canvasGraphics() { var fontHeight = text.geom.vScale * fontSize; div.style.fontSize = fontHeight + 'px'; - // TODO: family should be '= font.loadedName', but some fonts don't - // have spacing info (cf. fonts.js > Font > fields > htmx) - div.style.fontFamily = 'serif'; + div.style.fontFamily = this.current.font.loadedName || 'serif'; div.style.left = text.geom.x + 'px'; div.style.top = (text.geom.y - fontHeight) + 'px'; div.innerHTML = text.str; @@ -560,8 +558,8 @@ var CanvasGraphics = (function canvasGraphics() { current.x += charWidth; text.str += unicodeToChar(glyph.unicode); - text.canvasWidth += charWidth; text.length++; + text.canvasWidth += charWidth; } ctx.restore(); } else { @@ -582,9 +580,9 @@ var CanvasGraphics = (function canvasGraphics() { ctx.fillText(char, width, 0); width += charWidth; - text.str += char; - text.canvasWidth += charWidth; + text.str += char === ' ' ? ' ' : char; text.length++; + text.canvasWidth += charWidth; } current.x += width; From 6fec709011c6570b72ced48e003692fa989ef2dd Mon Sep 17 00:00:00 2001 From: Artur Adib Date: Tue, 8 Nov 2011 16:14:23 -0500 Subject: [PATCH 10/68] Adding 1040.pdf --- test/pdfs/.gitignore | 1 + test/pdfs/1040.pdf | Bin 0 -> 299340 bytes test/test_manifest.json | 7 +++++++ 3 files changed, 8 insertions(+) create mode 100644 test/pdfs/1040.pdf diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index 443cb155a..dce433acf 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -14,4 +14,5 @@ !sizes.pdf !close-path-bug.pdf !alphatrans.pdf +!1040.pdf diff --git a/test/pdfs/1040.pdf b/test/pdfs/1040.pdf new file mode 100644 index 0000000000000000000000000000000000000000..12b9a66429417553b31b1bc57ea254e44cfc3a9d GIT binary patch literal 299340 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

`1C*m-*)5T|AAmSKf1R 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 Date: Tue, 8 Nov 2011 13:53:56 -0800 Subject: [PATCH 11/68] Add another way to detect cmyk images. --- src/parser.js | 2 +- src/stream.js | 28 ++++++++++++++++++++++++---- src/worker_loader.js | 3 ++- 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/src/parser.js b/src/parser.js index a740615ed..93a3f21b5 100644 --- a/src/parser.js +++ b/src/parser.js @@ -236,7 +236,7 @@ var Parser = (function parserParser() { return new LZWStream(stream, earlyChange); } else if (name == 'DCTDecode' || name == 'DCT') { var bytes = stream.getBytes(length); - return new JpegStream(bytes, stream.dict); + return new JpegStream(bytes, stream.dict, this.xref); } else if (name == 'ASCII85Decode' || name == 'A85') { return new Ascii85Stream(stream); } else if (name == 'ASCIIHexDecode' || name == 'AHx') { diff --git a/src/stream.js b/src/stream.js index d8a681a88..7634e50bb 100644 --- a/src/stream.js +++ b/src/stream.js @@ -776,6 +776,25 @@ var JpegStream = (function jpegStream() { return false; } + function isCmykAdobe(bytes) { + var maxBytesScanned = Math.max(bytes.length - 16, 1024); + // Looking for APP14, 'Adobe' + for (var i = 0; i < maxBytesScanned; ++i) { + if (bytes[i] == 0xFF && bytes[i + 1] == 0xEE && + bytes[i + 2] == 0x00 && bytes[i + 3] == 0x0E && + bytes[i + 4] == 0x41 && bytes[i + 5] == 0x64 && + bytes[i + 6] == 0x6F && bytes[i + 7] == 0x62 && + bytes[i + 8] == 0x65 && bytes[i + 9] == 0 && + bytes[i + 15] == 2 ) { + return true; + } + // scanning until frame tag + if (bytes[i] == 0xFF && bytes[i + 1] == 0xC0) + break; + } + return false; + } + function fixAdobeImage(bytes) { // Inserting 'EMBED' marker after JPEG signature var embedMarker = new Uint8Array([0xFF, 0xEC, 0, 8, 0x45, 0x4D, 0x42, 0x45, @@ -789,19 +808,20 @@ var JpegStream = (function jpegStream() { return newBytes; } - function constructor(bytes, dict) { + function constructor(bytes, dict, xref) { // TODO: per poppler, some images may have 'junk' before that // need to be removed this.dict = dict; - + // Flag indicating wether the image can be natively loaded. this.isNative = true; if (isAdobeImage(bytes)) { // when bug 674619 land, let's check if browser can do // normal cmyk and then we won't have to the following - var cs = dict.get('ColorSpace'); + var cs = xref.fetchIfRef(dict.get('ColorSpace')); if (isName(cs) && cs.name === 'DeviceCMYK') { + //if (isCmykAdobe(bytes)) { this.isNative = false; this.bytes = bytes; } else { @@ -826,7 +846,7 @@ var JpegStream = (function jpegStream() { var height = jpegImage.height; var dataLength = width * height * 4; var data = new Uint8Array(dataLength); - jpegImage.getData(data, width, height); + jpegImage.getData(data, width, height, true); this.buffer = data; this.bufferLength = data.length; }; diff --git a/src/worker_loader.js b/src/worker_loader.js index cb0a91071..7141fa3e3 100644 --- a/src/worker_loader.js +++ b/src/worker_loader.js @@ -40,7 +40,8 @@ function onMessageLoader(evt) { 'parser.js', 'pattern.js', 'stream.js', - 'worker.js' + 'worker.js', + '../external/jpgjs/jpg.js' ]; // Load all the files. From 493805d9521ad064d099bbbb9ba5128611674c71 Mon Sep 17 00:00:00 2001 From: Brendan Dahl Date: Tue, 8 Nov 2011 14:00:39 -0800 Subject: [PATCH 12/68] Remove the alternative way to do CMYK check. Checking the colorspace seems sufficient. --- src/stream.js | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/src/stream.js b/src/stream.js index 7634e50bb..ce69e96aa 100644 --- a/src/stream.js +++ b/src/stream.js @@ -776,25 +776,6 @@ var JpegStream = (function jpegStream() { return false; } - function isCmykAdobe(bytes) { - var maxBytesScanned = Math.max(bytes.length - 16, 1024); - // Looking for APP14, 'Adobe' - for (var i = 0; i < maxBytesScanned; ++i) { - if (bytes[i] == 0xFF && bytes[i + 1] == 0xEE && - bytes[i + 2] == 0x00 && bytes[i + 3] == 0x0E && - bytes[i + 4] == 0x41 && bytes[i + 5] == 0x64 && - bytes[i + 6] == 0x6F && bytes[i + 7] == 0x62 && - bytes[i + 8] == 0x65 && bytes[i + 9] == 0 && - bytes[i + 15] == 2 ) { - return true; - } - // scanning until frame tag - if (bytes[i] == 0xFF && bytes[i + 1] == 0xC0) - break; - } - return false; - } - function fixAdobeImage(bytes) { // Inserting 'EMBED' marker after JPEG signature var embedMarker = new Uint8Array([0xFF, 0xEC, 0, 8, 0x45, 0x4D, 0x42, 0x45, @@ -821,7 +802,6 @@ var JpegStream = (function jpegStream() { // normal cmyk and then we won't have to the following var cs = xref.fetchIfRef(dict.get('ColorSpace')); if (isName(cs) && cs.name === 'DeviceCMYK') { - //if (isCmykAdobe(bytes)) { this.isNative = false; this.bytes = bytes; } else { From 8c182cb72428465b94e569e56f7029a37ca38200 Mon Sep 17 00:00:00 2001 From: Artur Adib Date: Tue, 8 Nov 2011 17:27:02 -0500 Subject: [PATCH 13/68] Default font fallback is same as setFont()'s --- src/canvas.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/canvas.js b/src/canvas.js index 83d9c34d1..590af469c 100644 --- a/src/canvas.js +++ b/src/canvas.js @@ -494,7 +494,7 @@ var CanvasGraphics = (function canvasGraphics() { var fontHeight = text.geom.vScale * fontSize; div.style.fontSize = fontHeight + 'px'; - div.style.fontFamily = this.current.font.loadedName || 'serif'; + div.style.fontFamily = this.current.font.loadedName || 'sans-serif'; div.style.left = text.geom.x + 'px'; div.style.top = (text.geom.y - fontHeight) + 'px'; div.innerHTML = text.str; From 073af783070e15863ab688954055d098e4cd8e9c Mon Sep 17 00:00:00 2001 From: Brendan Dahl Date: Wed, 9 Nov 2011 09:29:33 -0800 Subject: [PATCH 14/68] Handle device gray and pass in the color transform option. --- src/stream.js | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/stream.js b/src/stream.js index ce69e96aa..65e122ad0 100644 --- a/src/stream.js +++ b/src/stream.js @@ -797,16 +797,21 @@ var JpegStream = (function jpegStream() { // Flag indicating wether the image can be natively loaded. this.isNative = true; + this.colorTransform = -1; + if (isAdobeImage(bytes)) { // when bug 674619 land, let's check if browser can do // normal cmyk and then we won't have to the following var cs = xref.fetchIfRef(dict.get('ColorSpace')); - if (isName(cs) && cs.name === 'DeviceCMYK') { - this.isNative = false; - this.bytes = bytes; - } else { + + // DeviceRGB and DeviceGray are the only Adobe images that work natively + if (isName(cs) && (cs.name === 'DeviceRGB' || cs.name === 'DeviceGray')) { bytes = fixAdobeImage(bytes); this.src = bytesToString(bytes); + } else { + this.colorTransform = dict.get('ColorTransform'); + this.isNative = false; + this.bytes = bytes; } } else { this.src = bytesToString(bytes); @@ -820,7 +825,7 @@ var JpegStream = (function jpegStream() { constructor.prototype.ensureBuffer = function jpegStreamEnsureBuffer(req) { if (this.bufferLength) return; - var jpegImage = new JpegImage(); + var jpegImage = new JpegImage(this.colorTransform); jpegImage.parse(this.bytes); var width = jpegImage.width; var height = jpegImage.height; From 22e531b1f2c48dbdc4f78ab28df181c4d5e8e0e5 Mon Sep 17 00:00:00 2001 From: Brendan Dahl Date: Wed, 9 Nov 2011 09:36:57 -0800 Subject: [PATCH 15/68] Adding the jpgjs as submodule. --- .gitmodules | 3 +++ external/jpgjs | 1 + 2 files changed, 4 insertions(+) create mode 100644 .gitmodules create mode 160000 external/jpgjs diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 000000000..5a852cd3f --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "external/jpgjs"] + path = external/jpgjs + url = git@github.com:brendandahl/jpgjs.git diff --git a/external/jpgjs b/external/jpgjs new file mode 160000 index 000000000..592bec146 --- /dev/null +++ b/external/jpgjs @@ -0,0 +1 @@ +Subproject commit 592bec14658593fe90df1309926a38177889042e From 3d662cf08a559c8a074bbe8440fe3074d413f1a2 Mon Sep 17 00:00:00 2001 From: Brendan Dahl Date: Wed, 9 Nov 2011 09:39:55 -0800 Subject: [PATCH 16/68] Add the cmyk jpeg test file. --- test/pdfs/.gitignore | 2 +- test/pdfs/cmykjpeg.pdf | Bin 0 -> 141727 bytes test/test_manifest.json | 7 +++++++ 3 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 test/pdfs/cmykjpeg.pdf diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index 443cb155a..854612f83 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -14,4 +14,4 @@ !sizes.pdf !close-path-bug.pdf !alphatrans.pdf - +!cmykjpeg.pdf diff --git a/test/pdfs/cmykjpeg.pdf b/test/pdfs/cmykjpeg.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2f35ef763824b72d78054d53974eecabd87d5981 GIT binary patch literal 141727 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 D8?>TF{ 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 z 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%0Ds{6}h0| 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 Date: Wed, 9 Nov 2011 09:50:40 -0800 Subject: [PATCH 17/68] Data is now created by jpg.js since we don't know the size. --- external/jpgjs | 2 +- src/stream.js | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/external/jpgjs b/external/jpgjs index 592bec146..0d69fa811 160000 --- a/external/jpgjs +++ b/external/jpgjs @@ -1 +1 @@ -Subproject commit 592bec14658593fe90df1309926a38177889042e +Subproject commit 0d69fa8117fd72c58d85f8b0536d7eebd7b96c47 diff --git a/src/stream.js b/src/stream.js index 65e122ad0..69f792b58 100644 --- a/src/stream.js +++ b/src/stream.js @@ -829,9 +829,7 @@ var JpegStream = (function jpegStream() { jpegImage.parse(this.bytes); var width = jpegImage.width; var height = jpegImage.height; - var dataLength = width * height * 4; - var data = new Uint8Array(dataLength); - jpegImage.getData(data, width, height, true); + var data = jpegImage.getData(width, height); this.buffer = data; this.bufferLength = data.length; }; From baf395ab16dabca43d977162534b35694ab762fc Mon Sep 17 00:00:00 2001 From: Artur Adib Date: Wed, 9 Nov 2011 13:53:27 -0500 Subject: [PATCH 18/68] Removing 1040... (duplicate) --- test/pdfs/.gitignore | 1 - test/pdfs/1040.pdf | Bin 299340 -> 0 bytes test/test_manifest.json | 7 ------- 3 files changed, 8 deletions(-) delete mode 100644 test/pdfs/1040.pdf diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index dce433acf..443cb155a 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -14,5 +14,4 @@ !sizes.pdf !close-path-bug.pdf !alphatrans.pdf -!1040.pdf diff --git a/test/pdfs/1040.pdf b/test/pdfs/1040.pdf deleted file mode 100644 index 12b9a66429417553b31b1bc57ea254e44cfc3a9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 299340 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

`1C*m-*)5T|AAmSKf1R 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 Date: Wed, 9 Nov 2011 16:38:55 -0800 Subject: [PATCH 19/68] Update readme to init the submodule. --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index deb925601..be342060d 100644 --- a/README.md +++ b/README.md @@ -45,6 +45,8 @@ To get a local copy of the current code, clone it using git: $ git clone git://github.com/mozilla/pdf.js.git pdfjs $ cd pdfjs + $ git submodule init + $ git submodule update Next, you need to start a local web server as some browsers don't allow opening PDF files for a file:// url: From b1ae23772fb3369b52c8ace087d270ced87c88d8 Mon Sep 17 00:00:00 2001 From: Artur Adib Date: Mon, 14 Nov 2011 15:32:52 -0500 Subject: [PATCH 20/68] No suppressWarnings in Yury's encoding patch --- src/canvas.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/canvas.js b/src/canvas.js index bf3bad4c6..d80bc80b2 100644 --- a/src/canvas.js +++ b/src/canvas.js @@ -478,10 +478,10 @@ var CanvasGraphics = (function canvasGraphics() { geom.hScale = tr[0] - bl[0]; geom.vScale = tr[1] - bl[1]; } - var spaceGlyph = font.charsToGlyphs(' ', true); + var spaceGlyph = font.charsToGlyphs(' '); // Hack (sometimes space is not encoded) if (spaceGlyph.length === 0 || spaceGlyph[0].width === 0) - spaceGlyph = font.charsToGlyphs('i', true); + spaceGlyph = font.charsToGlyphs('i'); // Fallback if (spaceGlyph.length === 0 || spaceGlyph[0].width === 0) spaceGlyph = [ {width:0} ]; From 87d13cf803a1366f4838d7f6ae05d3713aefb806 Mon Sep 17 00:00:00 2001 From: Brendan Dahl Date: Tue, 15 Nov 2011 15:05:31 -0800 Subject: [PATCH 21/68] Remove submodule. --- .gitmodules | 3 --- external/jpgjs | 1 - 2 files changed, 4 deletions(-) delete mode 100644 .gitmodules delete mode 160000 external/jpgjs diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 5a852cd3f..000000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "external/jpgjs"] - path = external/jpgjs - url = git@github.com:brendandahl/jpgjs.git diff --git a/external/jpgjs b/external/jpgjs deleted file mode 160000 index 0d69fa811..000000000 --- a/external/jpgjs +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 0d69fa8117fd72c58d85f8b0536d7eebd7b96c47 From 9e8d0795793b9c4edd85f95eec2fd5ef27fdcb2a Mon Sep 17 00:00:00 2001 From: Brendan Dahl Date: Tue, 15 Nov 2011 15:08:13 -0800 Subject: [PATCH 22/68] Adding jpg.js back as a regular file. --- external/jpgjs/jpg.js | 722 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 722 insertions(+) create mode 100644 external/jpgjs/jpg.js diff --git a/external/jpgjs/jpg.js b/external/jpgjs/jpg.js new file mode 100644 index 000000000..6ae443c41 --- /dev/null +++ b/external/jpgjs/jpg.js @@ -0,0 +1,722 @@ +/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- / +/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ + +// - The JPEG specification can be found in the ITU CCITT Recommendation T.81 +// (www.w3.org/Graphics/JPEG/itu-t81.pdf) +// - The JFIF specification can be found in the JPEG File Interchange Format +// (www.w3.org/Graphics/JPEG/jfif3.pdf) +// - The Adobe Application-Specific JPEG markers in the Supporting the DCT Filters +// in PostScript Level 2, Technical Note #5116 +// (partners.adobe.com/public/developer/en/ps/sdk/5116.DCT_Filter.pdf) + +var JpegImage = (function jpegImage() { + "use strict"; + + function constructor(colorTransform) { + this.colorTransform = typeof colorTransform !== 'undefined' ? colorTransform : -1; + } + + var iDCTTables = (function initDCTTables() { + var cosTables = [], i, j; + for (i = 0; i < 8; i++) { + cosTables.push(new Float32Array(8)); + for (j = 0; j < 8; j++) + cosTables[i][j] = Math.cos((2 * i + 1) * j * Math.PI / 16) * + (j > 0 ? 1 : 1/Math.sqrt(2)); + } + + var zzTransform = new Int32Array([ + 0, 1, 5, 6, 14, 15, 27, 28, 2, 4, 7, 13, 16, 26, 29, 42, 3, 8, 12, + 17, 25, 30, 41, 43, 9, 11, 18, 24, 31, 40, 44, 53, 10, 19, 23, 32, + 39, 45, 52, 54, 20, 22, 33, 38, 46, 51, 55, 60, 21, 34, 37, 47, + 50, 56, 59, 61, 35, 36, 48, 49, 57, 58, 62, 63]); + + var x, y, u, v; + var tables = []; + for (y = 0; y < 8; y++) { + var cosTable_y = cosTables[y]; + for (x = 0; x < 8; x++) { + var cosTable_x = cosTables[x]; + var table = new Float32Array(64); + i = 0; + for (v = 0; v < 8; v++) { + for (u = 0; u < 8; u++) + table[zzTransform[i++]] = cosTable_x[u] * cosTable_y[v]; + } + tables.push(table); + } + } + return tables; + })(); + + function buildHuffmanTable(codeLengths, values) { + var k = 0, code = [], i, j, length = 16; + while (length > 0 && !codeLengths[length - 1]) + length--; + code.push({children: [], index: 0}); + var p = code[0], q; + for (i = 0; i < length; i++) { + for (j = 0; j < codeLengths[i]; j++) { + p = code.pop(); + p.children[p.index] = values[k]; + while (p.index > 0) { + p = code.pop(); + } + p.index++; + code.push(p); + while (code.length <= i) { + code.push(q = {children: [], index: 0}); + p.children[p.index] = q.children; + p = q; + } + k++; + } + if (i + 1 < length) { + // p here points to last code + code.push(q = {children: [], index: 0}); + p.children[p.index] = q.children; + p = q; + } + } + return code[0].children; + } + + function decodeScan(data, offset, + frame, components, resetInterval, + spectralStart, spectralEnd, + successivePrev, successive) { + var precision = frame.precision; + var samplesPerLine = frame.samplesPerLine; + var scanLines = frame.scanLines; + var mcusPerLine = frame.mcusPerLine; + var progressive = frame.progressive; + var maxH = frame.maxH, maxV = frame.maxV; + + var startOffset = offset, bitsData = 0, bitsCount = 0; + function readBit() { + if (bitsCount > 0) { + bitsCount--; + return (bitsData >> bitsCount) & 1; + } + bitsData = data[offset++]; + if (bitsData == 0xFF) { + var nextByte = data[offset++]; + if (nextByte) { + throw "unexpected marker: " + ((bitsData << 8) | nextByte).toString(16); + } + // unstuff 0 + } + bitsCount = 7; + return bitsData >>> 7; + } + function decodeHuffman(tree) { + var node = tree, bit; + while ((bit = readBit()) !== null) { + node = node[bit]; + if (typeof node === 'number') + return node; + if (typeof node !== 'object') + throw "invalid huffman sequence"; + } + return null; + } + function receive(length) { + var n = 0; + while (length > 0) { + var bit = readBit(); + if (bit === null) return; + n = (n << 1) | bit; + length--; + } + return n; + } + function receiveAndExtend(length) { + var n = receive(length); + if (n >= 1 << (length - 1)) + return n; + return n + (-1 << length) + 1; + } + function decodeBaseline(component, zz) { + var t = decodeHuffman(component.huffmanTableDC); + var diff = t === 0 ? 0 : receiveAndExtend(t); + zz[0]= (component.pred += diff); + var k = 1; + while (k < 64) { + var rs = decodeHuffman(component.huffmanTableAC); + var s = rs & 15, r = rs >> 4; + if (s === 0) { + if (r < 15) + break; + k += 16; + continue; + } + k += r; + zz[k] = receiveAndExtend(s); + k++; + } + } + function decodeDCFirst(component, zz) { + var t = decodeHuffman(component.huffmanTableDC); + var diff = t === 0 ? 0 : (receiveAndExtend(t) << successive); + zz[0] = (component.pred += diff); + } + function decodeDCSuccessive(component, zz) { + zz[0] |= readBit() << successive; + } + var eobrun = 0; + function decodeACFirst(component, zz) { + if (eobrun > 0) { + eobrun--; + return; + } + var k = spectralStart, e = spectralEnd; + while (k <= e) { + var rs = decodeHuffman(component.huffmanTableAC); + var s = rs & 15, r = rs >> 4; + if (s === 0) { + if (r < 15) { + eobrun = receive(r) + (1 << r) - 1; + break; + } + k += 16; + continue; + } + k += r; + zz[k] = receiveAndExtend(s) * (1 << successive); + k++; + } + } + var successiveACState = 0, successiveACNextValue; + function decodeACSuccessive(component, zz) { + var k = spectralStart, e = spectralEnd, r = 0; + while (k <= e) { + switch (successiveACState) { + case 0: // initial state + var rs = decodeHuffman(component.huffmanTableAC); + var s = rs & 15, r = rs >> 4; + if (s === 0) { + if (r < 15) { + eobrun = receive(r) + (1 << r); + successiveACState = 4; + } else { + r = 16; + successiveACState = 1; + } + } else { + if (s !== 1) + throw "invalid ACn encoding"; + successiveACNextValue = receiveAndExtend(s); + successiveACState = r ? 2 : 3; + } + continue; + case 1: // skipping r zero items + case 2: + if (zz[k]) + zz[k] += (readBit() << successive); + else { + r--; + if (r === 0) + successiveACState = successiveACState == 2 ? 3 : 0; + } + break; + case 3: // set value for a zero item + if (zz[k]) + zz[k] += (readBit() << successive); + else { + zz[k] = successiveACNextValue << successive; + successiveACState = 0; + } + break; + case 4: // eob + if (zz[k]) + zz[k] += (readBit() << successive); + break; + } + k++; + } + if (successiveACState === 4) { + eobrun--; + if (eobrun === 0) + successiveACState = 0; + } + } + function decodeMcu(component, decode, mcu, row, col) { + var mcuRow = (mcu / mcusPerLine) | 0; + var mcuCol = mcu % mcusPerLine; + var blockRow = mcuRow * component.v + row; + var blockCol = mcuCol * component.h + col; + decode(component, component.blocks[blockRow][blockCol]); + } + function decodeBlock(component, decode, mcu) { + var blockRow = (mcu / component.blocksPerLine) | 0; + var blockCol = mcu % component.blocksPerLine; + decode(component, component.blocks[blockRow][blockCol]); + } + + var componentsLength = components.length; + var component, i, j, k, n; + var decodeFn; + if (progressive) { + if (spectralStart === 0) + decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive; + else + decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive; + } else { + decodeFn = decodeBaseline; + } + + var mcu = 0, marker; + var mcuExpected; + if (componentsLength == 1) { + mcuExpected = components[0].blocksPerLine * components[0].blocksPerColumn; + } else { + mcuExpected = mcusPerLine * frame.mcusPerColumn; + } + if (!resetInterval) resetInterval = mcuExpected; + + var h, v; + while (mcu < mcuExpected) { + // reset interval stuff + for (i = 0; i < componentsLength; i++) + components[i].pred = 0; + eobrun = 0; + + if (componentsLength == 1) { + component = components[0]; + for (n = 0; n < resetInterval; n++) { + decodeBlock(component, decodeFn, mcu); + mcu++; + } + } else { + for (n = 0; n < resetInterval; n++) { + for (i = 0; i < componentsLength; i++) { + component = components[i]; + h = component.h; + v = component.v; + for (j = 0; j < v; j++) { + for (k = 0; k < h; k++) { + decodeMcu(component, decodeFn, mcu, j, k); + } + } + } + mcu++; + } + } + + // find marker + bitsCount = 0; + marker = (data[offset] << 8) | data[offset + 1]; + if (marker <= 0xFF00) { + throw "marker was not found"; + } + + if (marker >= 0xFFD0 && marker <= 0xFFD7) { // RSTx + offset += 2; + } + else + break; + } + + return offset - startOffset; + } + + function buildComponentData(frame, component) { + var lines = []; + var blocksPerLine = component.blocksPerLine; + var blocksPerColumn = component.blocksPerColumn; + var samplesPerLine = blocksPerLine << 3; + + function quantizeAndInverse(zz) { + var qt = component.quantizationTable; + var precisionShift = frame.precision - 8; + + var R = new Int32Array(64); + for (i = 0; i < 64; i++) + R[i] = zz[i] * qt[i]; + + var r = new Uint8Array(64), i, j; + for (i = 0; i < 64; i++) { + var sum = 0; + var table = iDCTTables[i]; + for (j = 0; j < 64; j++) + sum += table[j] * R[j]; + // TODO loosing precision? + var sample = 128 + ((sum / 4) >> precisionShift); + // clamping + r[i] = sample < 0 ? 0 : sample > 0xFF ? 0xFF : sample; + } + return r; + } + + var i, j; + for (var blockRow = 0; blockRow < blocksPerColumn; blockRow++) { + var scanLine = blockRow << 3; + for (i = 0; i < 8; i++) + lines.push(new Uint8Array(samplesPerLine)); + for (var blockCol = 0; blockCol < blocksPerLine; blockCol++) { + var r = quantizeAndInverse(component.blocks[blockRow][blockCol]); + + var offset = 0, sample = blockCol << 3; + for (j = 0; j < 8; j++) { + var line = lines[scanLine + j]; + for (i = 0; i < 8; i++) + line[sample + i] = r[offset++]; + } + } + } + return lines; + } + + constructor.prototype = { + load: function load(path) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", path, true); + xhr.responseType = "arraybuffer"; + xhr.onload = (function() { + // TODO catch parse error + var data = new Uint8Array(xhr.response || xhr.mozResponseArrayBuffer); + this.parse(data); + if (this.onload) + this.onload(); + }).bind(this); + xhr.send(null); + }, + parse: function parse(data) { + var offset = 0, length = data.length; + function readUint16() { + var value = (data[offset] << 8) | data[offset + 1]; + offset += 2; + return value; + } + function readDataBlock() { + var length = readUint16(); + var array = data.subarray(offset, offset + length - 2); + offset += array.length; + return array; + } + function prepareComponents(frame) { + var maxH = 0, maxV = 0; + var component, componentId; + for (componentId in frame.components) { + if (frame.components.hasOwnProperty(componentId)) { + component = frame.components[componentId]; + if (maxH < component.h) maxH = component.h; + if (maxV < component.v) maxV = component.v; + } + } + var mcusPerLine = Math.ceil(frame.samplesPerLine / 8 / maxH); + var mcusPerColumn = Math.ceil(frame.scanLines / 8 / maxV); + for (componentId in frame.components) { + if (frame.components.hasOwnProperty(componentId)) { + component = frame.components[componentId]; + var blocksPerLine = Math.ceil(Math.ceil(frame.samplesPerLine / 8) * component.h / maxH); + var blocksPerColumn = Math.ceil(Math.ceil(frame.scanLines / 8) * component.v / maxV); + var blocksPerLineForMcu = mcusPerLine * component.h; + var blocksPerColumnForMcu = mcusPerColumn * component.v; + var blocks = []; + for (var i = 0; i < blocksPerColumnForMcu; i++) { + var row = []; + for (var j = 0; j < blocksPerLineForMcu; j++) + row.push(new Int32Array(64)); + blocks.push(row); + } + component.blocksPerLine = blocksPerLine; + component.blocksPerColumn = blocksPerColumn; + component.blocks = blocks; + } + } + frame.maxH = maxH; + frame.maxV = maxV; + frame.mcusPerLine = mcusPerLine; + frame.mcusPerColumn = mcusPerColumn; + } + var jfif = null; + var adobe = null; + var pixels = null; + var frame, resetInterval; + var quantizationTables = [], frames = []; + var huffmanTablesAC = [], huffmanTablesDC = []; + var fileMarker = readUint16(); + if (fileMarker != 0xFFD8) { // SOI (Start of Image) + throw "SOI not found"; + } + + fileMarker = readUint16(); + while (fileMarker != 0xFFD9) { // EOI (End of image) + var i, j, l; + switch(fileMarker) { + case 0xFFE0: // APP0 (Application Specific) + case 0xFFE1: // APP1 + case 0xFFE2: // APP2 + case 0xFFE3: // APP3 + case 0xFFE4: // APP4 + case 0xFFE5: // APP5 + case 0xFFE6: // APP6 + case 0xFFE7: // APP7 + case 0xFFE8: // APP8 + case 0xFFE9: // APP9 + case 0xFFEA: // APP10 + case 0xFFEB: // APP11 + case 0xFFEC: // APP12 + case 0xFFED: // APP13 + case 0xFFEE: // APP14 + case 0xFFEF: // APP15 + case 0xFFFE: // COM (Comment) + var appData = readDataBlock(); + + if (fileMarker === 0xFFE0) { + if (appData[0] === 0x4A && appData[1] === 0x46 && appData[2] === 0x49 && + appData[3] === 0x46 && appData[4] === 0) { // 'JFIF\x00' + jfif = { + version: { major: appData[5], minor: appData[6] }, + densityUnits: appData[7], + xDensity: (appData[8] << 8) | appData[9], + yDensity: (appData[10] << 8) | appData[11], + thumbWidth: appData[12], + thumbHeight: appData[13], + thumbData: appData.subarray(14, 14 + 3 * appData[12] * appData[13]) + }; + } + } + // TODO APP1 - Exif + if (fileMarker === 0xFFEE) { + if (appData[0] === 0x41 && appData[1] === 0x64 && appData[2] === 0x6F && + appData[3] === 0x62 && appData[4] === 0x65 && appData[5] === 0) { // 'Adobe\x00' + adobe = { + version: appData[6], + flags0: (appData[7] << 8) | appData[8], + flags1: (appData[9] << 8) | appData[10], + transformCode: appData[11] + }; + } + } + break; + + case 0xFFDB: // DQT (Define Quantization Tables) + var quantizationTableCount = Math.floor((readUint16() - 2) / 65); + for (i = 0; i < quantizationTableCount; i++) { + var quantizationTableSpec = data[offset++]; + var tableData = new Int32Array(64); + if ((quantizationTableSpec >> 4) === 0) { // 8 bit values + for (j = 0; j < 64; j++) + tableData[j] = data[offset++]; + } else if ((quantizationTableSpec >> 4) === 1) { //16 bit + tableData[j] = readUint16(); + } else + throw "DQT: invalid table spec"; + quantizationTables[quantizationTableSpec & 15] = tableData; + } + break; + + case 0xFFC0: // SOF0 (Start of Frame, Baseline DCT) + case 0xFFC2: // SOF2 (Start of Frame, Progressive DCT) + readUint16(); // skip data length + frame = {}; + frame.progressive = (fileMarker === 0xFFC2); + frame.precision = data[offset++]; + frame.scanLines = readUint16(); + frame.samplesPerLine = readUint16(); + frame.components = []; + var componentsCount = data[offset++], componentId; + var maxH = 0, maxV = 0; + for (i = 0; i < componentsCount; i++) { + componentId = data[offset]; + var h = data[offset + 1] >> 4; + var v = data[offset + 1] & 15; + var qId = data[offset + 2]; + frame.components[componentId] = { + h: h, + v: v, + quantizationTable: quantizationTables[qId] + }; + offset += 3; + } + prepareComponents(frame); + frames.push(frame); + break; + + case 0xFFC4: // DHT (Define Huffman Tables) + var huffmanLength = readUint16(); + for (i = 2; i < huffmanLength;) { + var huffmanTableSpec = data[offset++]; + var codeLengths = new Uint8Array(16); + var codeLengthSum = 0; + for (j = 0; j < 16; j++, offset++) + codeLengthSum += (codeLengths[j] = data[offset]); + var huffmanValues = new Uint8Array(codeLengthSum); + for (j = 0; j < codeLengthSum; j++, offset++) + huffmanValues[j] = data[offset]; + i += 17 + codeLengthSum; + + ((huffmanTableSpec >> 4) === 0 ? + huffmanTablesDC : huffmanTablesAC)[huffmanTableSpec & 15] = + buildHuffmanTable(codeLengths, huffmanValues); + } + break; + + case 0xFFDD: // DRI (Define Restart Interval) + readUint16(); // skip data length + resetInterval = readUint16(); + break; + + case 0xFFDA: // SOS (Start of Scan) + var scanLength = readUint16(); + var selectorsCount = data[offset++]; + var components = [], component; + for (i = 0; i < selectorsCount; i++) { + component = frame.components[data[offset++]]; + var tableSpec = data[offset++]; + component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4]; + component.huffmanTableAC = huffmanTablesAC[tableSpec & 15]; + components.push(component); + } + var spectralStart = data[offset++]; + var spectralEnd = data[offset++]; + var successiveApproximation = data[offset++]; + var processed = decodeScan(data, offset, + frame, components, resetInterval, + spectralStart, spectralEnd, + successiveApproximation >> 4, successiveApproximation & 15); + offset += processed; + break; + default: + throw "unknown JPEG marker " + fileMarker.toString(16); + } + fileMarker = readUint16(); + } + if (frames.length != 1) + throw "only single frame JPEGs supported"; + + this.width = frame.samplesPerLine; + this.height = frame.scanLines; + this.jfif = jfif; + this.adobe = adobe; + this.components = []; + for (var id in frame.components) { + if (frame.components.hasOwnProperty(id)) { + this.components.push({ + lines: buildComponentData(frame, frame.components[id]), + scaleX: frame.components[id].h / frame.maxH, + scaleY: frame.components[id].v / frame.maxV + }); + } + } + }, + getData: function getData(width, height) { + function clampTo8bit(a) { + return a < 0 ? 0 : a > 255 ? 255 : a; + } + var scaleX = this.width / width, scaleY = this.height / height; + + var component1, component2, component3, component4; + var component1Line, component2Line, component3Line, component4Line; + var x, y; + var offset = 0; + var Y, Cb, Cr, K, C, M, Ye, R, G, B; + var colorTransform; + var dataLength = width * height * this.components.length; + var data = new Uint8Array(dataLength); + switch (this.components.length) { + case 1: + component1 = this.components[0]; + for (y = 0; y < height; y++) { + component1Line = component1.lines[0 | (y * component1.scaleY * scaleY)]; + for (x = 0; x < width; x++) { + Y = component1Line[0 | (x * component1.scaleX * scaleX)]; + + data[offset++] = Y; + } + } + break; + case 3: + // The default transform for three components is true + colorTransform = true; + // The adobe transform marker overrides any previous setting + if (this.adobe && this.adobe.transformCode) + colorTransform = true; + else if (typeof this.colorTransform != -1) + colorTransform = this.colorTransform == true; + + component1 = this.components[0]; + component2 = this.components[1]; + component3 = this.components[2]; + for (y = 0; y < height; y++) { + component1Line = component1.lines[0 | (y * component1.scaleY * scaleY)]; + component2Line = component2.lines[0 | (y * component2.scaleY * scaleY)]; + component3Line = component3.lines[0 | (y * component3.scaleY * scaleY)]; + for (x = 0; x < width; x++) { + if (!colorTransform) { + R = component1Line[0 | (x * component1.scaleX * scaleX)]; + G = component2Line[0 | (x * component2.scaleX * scaleX)]; + B = component3Line[0 | (x * component3.scaleX * scaleX)]; + } else { + Y = component1Line[0 | (x * component1.scaleX * scaleX)]; + Cb = component2Line[0 | (x * component2.scaleX * scaleX)]; + Cr = component3Line[0 | (x * component3.scaleX * scaleX)]; + + R = clampTo8bit(Y + 1.402 * (Cr - 128)); + G = clampTo8bit(Y - 0.3441363 * (Cb - 128) - 0.71413636 * (Cr - 128)); + B = clampTo8bit(Y + 1.772 * (Cb - 128)); + } + + data[offset++] = R; + data[offset++] = G; + data[offset++] = B; + } + } + break; + case 4: + if (!this.adobe) + throw 'Unsupported color mode (4 components)'; + // The default transform for four components is false + colorTransform = false; + // The adobe transform marker overrides any previous setting + if (this.adobe && this.adobe.transformCode) + colorTransform = true; + else if (typeof this.colorTransform != -1) + colorTransform = this.colorTransform == true; + + component1 = this.components[0]; + component2 = this.components[1]; + component3 = this.components[2]; + component4 = this.components[3]; + for (y = 0; y < height; y++) { + component1Line = component1.lines[0 | (y * component1.scaleY * scaleY)]; + component2Line = component2.lines[0 | (y * component2.scaleY * scaleY)]; + component3Line = component3.lines[0 | (y * component3.scaleY * scaleY)]; + component4Line = component4.lines[0 | (y * component4.scaleY * scaleY)]; + for (x = 0; x < width; x++) { + if (!colorTransform) { + C = component1Line[0 | (x * component1.scaleX * scaleX)]; + M = component2Line[0 | (x * component2.scaleX * scaleX)]; + Ye = component3Line[0 | (x * component3.scaleX * scaleX)]; + K = component4Line[0 | (x * component4.scaleX * scaleX)]; + } else { + Y = component1Line[0 | (x * component1.scaleX * scaleX)]; + Cb = component2Line[0 | (x * component2.scaleX * scaleX)]; + Cr = component3Line[0 | (x * component3.scaleX * scaleX)]; + K = component4Line[0 | (x * component4.scaleX * scaleX)]; + + C = 255 - clampTo8bit(Y + 1.402 * (Cr - 128)); + M = 255 - clampTo8bit(Y - 0.3441363 * (Cb - 128) - 0.71413636 * (Cr - 128)); + Ye = 255 - clampTo8bit(Y + 1.772 * (Cb - 128)); + } + data[offset++] = C; + data[offset++] = M; + data[offset++] = Ye; + data[offset++] = K; + } + } + break; + default: + throw 'Unsupported color mode'; + } + return data; + }, + copyToImageData: function copyToImageData(imageData) { + this.getData(imageData.data, imageData.width, imageData.height); + } + }; + + return constructor; +})(); \ No newline at end of file From edf6f51c27d9a721ed6640ef926ae8878fd95048 Mon Sep 17 00:00:00 2001 From: Brendan Dahl Date: Tue, 15 Nov 2011 15:51:32 -0800 Subject: [PATCH 23/68] Remove submodule documentation. --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index be342060d..deb925601 100644 --- a/README.md +++ b/README.md @@ -45,8 +45,6 @@ To get a local copy of the current code, clone it using git: $ git clone git://github.com/mozilla/pdf.js.git pdfjs $ cd pdfjs - $ git submodule init - $ git submodule update Next, you need to start a local web server as some browsers don't allow opening PDF files for a file:// url: From d2964f3e94b92629150cb97525753dc845d6eade Mon Sep 17 00:00:00 2001 From: Brendan Dahl Date: Wed, 16 Nov 2011 15:12:42 -0800 Subject: [PATCH 24/68] Update documentation. --- src/stream.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/stream.js b/src/stream.js index 69f792b58..c7b5c8121 100644 --- a/src/stream.js +++ b/src/stream.js @@ -756,8 +756,13 @@ var PredictorStream = (function predictorStream() { return constructor; })(); -// A JpegStream can't be read directly. We use the platform to render -// the underlying JPEG data for us. +/** + * Depending on the type of JPEG a JpegStream is handled in different ways. For + * JPEG's that are supported natively such as DeviceGray and DeviceRGB the image + * data is stored and then loaded by the browser. For unsupported JPEG's we use + * a library to decode these images and the stream behaves like all the other + * DecodeStreams. + */ var JpegStream = (function jpegStream() { function isAdobeImage(bytes) { var maxBytesScanned = Math.max(bytes.length - 16, 1024); From 564fe0d90783db6b34071270f54af36a8edd54d7 Mon Sep 17 00:00:00 2001 From: Brendan Dahl Date: Wed, 16 Nov 2011 15:16:04 -0800 Subject: [PATCH 25/68] Remove open web pdf until we can resolve the performance issues. --- test/test_manifest.json | 7 ------- 1 file changed, 7 deletions(-) diff --git a/test/test_manifest.json b/test/test_manifest.json index a6f2dc72a..583e1cbaa 100644 --- a/test/test_manifest.json +++ b/test/test_manifest.json @@ -44,13 +44,6 @@ "rounds": 1, "type": "eq" }, - { "id": "openweb-cover", - "file": "pdfs/openweb_tm-PRINT.pdf", - "md5": "53f611dfc19ddfb50554c21c4af465c0", - "link": true, - "rounds": 1, - "type": "eq" - }, { "id": "plusminus", "file": "pdfs/Test-plusminus.pdf", "md5": "1ec7ade5b95ac9aaba3a618af28d34c7", From b150f8be0dd163c542c35dbca1fdbaeaf223f392 Mon Sep 17 00:00:00 2001 From: Brendan Dahl Date: Wed, 16 Nov 2011 15:18:31 -0800 Subject: [PATCH 26/68] Remove the open web link file for now. --- test/pdfs/openweb_tm-PRINT.pdf.link | 1 - 1 file changed, 1 deletion(-) delete mode 100644 test/pdfs/openweb_tm-PRINT.pdf.link diff --git a/test/pdfs/openweb_tm-PRINT.pdf.link b/test/pdfs/openweb_tm-PRINT.pdf.link deleted file mode 100644 index 08c897140..000000000 --- a/test/pdfs/openweb_tm-PRINT.pdf.link +++ /dev/null @@ -1 +0,0 @@ -http://openweb.flossmanuals.net/materials/openweb_tm-PRINT.pdf \ No newline at end of file From 7a5556ca91ff2a5ebdb4038564d5f1cd96436f56 Mon Sep 17 00:00:00 2001 From: Brendan Dahl Date: Mon, 21 Nov 2011 09:35:36 -0800 Subject: [PATCH 27/68] Add license. --- external/jpgjs/LICENSE | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 external/jpgjs/LICENSE diff --git a/external/jpgjs/LICENSE b/external/jpgjs/LICENSE new file mode 100644 index 000000000..d1c08028c --- /dev/null +++ b/external/jpgjs/LICENSE @@ -0,0 +1,21 @@ + +Copyright (C) 2011 by notmasteryet + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. From b64b7d55b1e805fbcf0d41f843a06f162a801537 Mon Sep 17 00:00:00 2001 From: Brendan Dahl Date: Tue, 22 Nov 2011 09:32:20 -0800 Subject: [PATCH 28/68] Use the updated jpgjs with faster transform. --- external/jpgjs/LICENSE | 3 + external/jpgjs/jpg.js | 323 ++++++++++++++++++++++++++++++++--------- src/stream.js | 3 +- 3 files changed, 261 insertions(+), 68 deletions(-) diff --git a/external/jpgjs/LICENSE b/external/jpgjs/LICENSE index d1c08028c..f28619c6a 100644 --- a/external/jpgjs/LICENSE +++ b/external/jpgjs/LICENSE @@ -1,6 +1,9 @@ Copyright (C) 2011 by notmasteryet +Contributors: Yury Delendik + Brendan Dahl + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including diff --git a/external/jpgjs/jpg.js b/external/jpgjs/jpg.js index 6ae443c41..dc8956ac0 100644 --- a/external/jpgjs/jpg.js +++ b/external/jpgjs/jpg.js @@ -11,44 +11,36 @@ var JpegImage = (function jpegImage() { "use strict"; + var dctZigZag = new Int32Array([ + 0, + 1, 8, + 16, 9, 2, + 3, 10, 17, 24, + 32, 25, 18, 11, 4, + 5, 12, 19, 26, 33, 40, + 48, 41, 34, 27, 20, 13, 6, + 7, 14, 21, 28, 35, 42, 49, 56, + 57, 50, 43, 36, 29, 22, 15, + 23, 30, 37, 44, 51, 58, + 59, 52, 45, 38, 31, + 39, 46, 53, 60, + 61, 54, 47, + 55, 62, + 63 + ]); - function constructor(colorTransform) { - this.colorTransform = typeof colorTransform !== 'undefined' ? colorTransform : -1; + var dctCos1 = 4017 // cos(pi/16) + var dctSin1 = 799 // sin(pi/16) + var dctCos3 = 3406 // cos(3*pi/16) + var dctSin3 = 2276 // sin(3*pi/16) + var dctCos6 = 1567 // cos(6*pi/16) + var dctSin6 = 3784 // sin(6*pi/16) + var dctSqrt2 = 5793 // sqrt(2) + var dctSqrt1d2 = 2896 // sqrt(2) / 2 + + function constructor() { } - var iDCTTables = (function initDCTTables() { - var cosTables = [], i, j; - for (i = 0; i < 8; i++) { - cosTables.push(new Float32Array(8)); - for (j = 0; j < 8; j++) - cosTables[i][j] = Math.cos((2 * i + 1) * j * Math.PI / 16) * - (j > 0 ? 1 : 1/Math.sqrt(2)); - } - - var zzTransform = new Int32Array([ - 0, 1, 5, 6, 14, 15, 27, 28, 2, 4, 7, 13, 16, 26, 29, 42, 3, 8, 12, - 17, 25, 30, 41, 43, 9, 11, 18, 24, 31, 40, 44, 53, 10, 19, 23, 32, - 39, 45, 52, 54, 20, 22, 33, 38, 46, 51, 55, 60, 21, 34, 37, 47, - 50, 56, 59, 61, 35, 36, 48, 49, 57, 58, 62, 63]); - - var x, y, u, v; - var tables = []; - for (y = 0; y < 8; y++) { - var cosTable_y = cosTables[y]; - for (x = 0; x < 8; x++) { - var cosTable_x = cosTables[x]; - var table = new Float32Array(64); - i = 0; - for (v = 0; v < 8; v++) { - for (u = 0; u < 8; u++) - table[zzTransform[i++]] = cosTable_x[u] * cosTable_y[v]; - } - tables.push(table); - } - } - return tables; - })(); - function buildHuffmanTable(codeLengths, values) { var k = 0, code = [], i, j, length = 16; while (length > 0 && !codeLengths[length - 1]) @@ -151,7 +143,8 @@ var JpegImage = (function jpegImage() { continue; } k += r; - zz[k] = receiveAndExtend(s); + var z = dctZigZag[k]; + zz[z] = receiveAndExtend(s); k++; } } @@ -182,7 +175,8 @@ var JpegImage = (function jpegImage() { continue; } k += r; - zz[k] = receiveAndExtend(s) * (1 << successive); + var z = dctZigZag[k]; + zz[z] = receiveAndExtend(s) * (1 << successive); k++; } } @@ -190,6 +184,7 @@ var JpegImage = (function jpegImage() { function decodeACSuccessive(component, zz) { var k = spectralStart, e = spectralEnd, r = 0; while (k <= e) { + var z = dctZigZag[k]; switch (successiveACState) { case 0: // initial state var rs = decodeHuffman(component.huffmanTableAC); @@ -211,8 +206,8 @@ var JpegImage = (function jpegImage() { continue; case 1: // skipping r zero items case 2: - if (zz[k]) - zz[k] += (readBit() << successive); + if (zz[z]) + zz[z] += (readBit() << successive); else { r--; if (r === 0) @@ -220,16 +215,16 @@ var JpegImage = (function jpegImage() { } break; case 3: // set value for a zero item - if (zz[k]) - zz[k] += (readBit() << successive); + if (zz[z]) + zz[z] += (readBit() << successive); else { - zz[k] = successiveACNextValue << successive; + zz[z] = successiveACNextValue << successive; successiveACState = 0; } break; case 4: // eob - if (zz[k]) - zz[k] += (readBit() << successive); + if (zz[z]) + zz[z] += (readBit() << successive); break; } k++; @@ -325,27 +320,166 @@ var JpegImage = (function jpegImage() { var blocksPerLine = component.blocksPerLine; var blocksPerColumn = component.blocksPerColumn; var samplesPerLine = blocksPerLine << 3; + var R = new Int32Array(64), r = new Uint8Array(64); - function quantizeAndInverse(zz) { + // A port of poppler's IDCT method which in turn is taken from: + // Christoph Loeffler, Adriaan Ligtenberg, George S. Moschytz, + // "Practical Fast 1-D DCT Algorithms with 11 Multiplications", + // IEEE Intl. Conf. on Acoustics, Speech & Signal Processing, 1989, + // 988-991. + function quantizeAndInverse(zz, dataOut, dataIn) { var qt = component.quantizationTable; - var precisionShift = frame.precision - 8; + var v0, v1, v2, v3, v4, v5, v6, v7, t; + var p = dataIn; + var i; - var R = new Int32Array(64); + // dequant for (i = 0; i < 64; i++) - R[i] = zz[i] * qt[i]; + p[i] = zz[i] * qt[i]; - var r = new Uint8Array(64), i, j; - for (i = 0; i < 64; i++) { - var sum = 0; - var table = iDCTTables[i]; - for (j = 0; j < 64; j++) - sum += table[j] * R[j]; - // TODO loosing precision? - var sample = 128 + ((sum / 4) >> precisionShift); - // clamping - r[i] = sample < 0 ? 0 : sample > 0xFF ? 0xFF : sample; + // inverse DCT on rows + for (i = 0; i < 8; ++i) { + var row = 8 * i; + + // check for all-zero AC coefficients + if (p[1 + row] == 0 && p[2 + row] == 0 && p[3 + row] == 0 && + p[4 + row] == 0 && p[5 + row] == 0 && p[6 + row] == 0 && + p[7 + row] == 0) { + t = (dctSqrt2 * p[0 + row] + 512) >> 10; + p[0 + row] = t; + p[1 + row] = t; + p[2 + row] = t; + p[3 + row] = t; + p[4 + row] = t; + p[5 + row] = t; + p[6 + row] = t; + p[7 + row] = t; + continue; + } + + // stage 4 + v0 = (dctSqrt2 * p[0 + row] + 128) >> 8; + v1 = (dctSqrt2 * p[4 + row] + 128) >> 8; + v2 = p[2 + row]; + v3 = p[6 + row]; + v4 = (dctSqrt1d2 * (p[1 + row] - p[7 + row]) + 128) >> 8; + v7 = (dctSqrt1d2 * (p[1 + row] + p[7 + row]) + 128) >> 8; + v5 = p[3 + row] << 4; + v6 = p[5 + row] << 4; + + // stage 3 + t = (v0 - v1+ 1) >> 1; + v0 = (v0 + v1 + 1) >> 1; + v1 = t; + t = (v2 * dctSin6 + v3 * dctCos6 + 128) >> 8; + v2 = (v2 * dctCos6 - v3 * dctSin6 + 128) >> 8; + v3 = t; + t = (v4 - v6 + 1) >> 1; + v4 = (v4 + v6 + 1) >> 1; + v6 = t; + t = (v7 + v5 + 1) >> 1; + v5 = (v7 - v5 + 1) >> 1; + v7 = t; + + // stage 2 + t = (v0 - v3 + 1) >> 1; + v0 = (v0 + v3 + 1) >> 1; + v3 = t; + t = (v1 - v2 + 1) >> 1; + v1 = (v1 + v2 + 1) >> 1; + v2 = t; + t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12; + v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12; + v7 = t; + t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12; + v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12; + v6 = t; + + // stage 1 + p[0 + row] = v0 + v7; + p[7 + row] = v0 - v7; + p[1 + row] = v1 + v6; + p[6 + row] = v1 - v6; + p[2 + row] = v2 + v5; + p[5 + row] = v2 - v5; + p[3 + row] = v3 + v4; + p[4 + row] = v3 - v4; + } + + // inverse DCT on columns + for (i = 0; i < 8; ++i) { + var col = i; + + // check for all-zero AC coefficients + if (p[1*8 + col] == 0 && p[2*8 + col] == 0 && p[3*8 + col] == 0 && + p[4*8 + col] == 0 && p[5*8 + col] == 0 && p[6*8 + col] == 0 && + p[7*8 + col] == 0) { + t = (dctSqrt2 * dataIn[i+0] + 8192) >> 14; + p[0*8 + col] = t; + p[1*8 + col] = t; + p[2*8 + col] = t; + p[3*8 + col] = t; + p[4*8 + col] = t; + p[5*8 + col] = t; + p[6*8 + col] = t; + p[7*8 + col] = t; + continue; + } + + // stage 4 + v0 = (dctSqrt2 * p[0*8 + col] + 2048) >> 12; + v1 = (dctSqrt2 * p[4*8 + col] + 2048) >> 12; + v2 = p[2*8 + col]; + v3 = p[6*8 + col]; + v4 = (dctSqrt1d2 * (p[1*8 + col] - p[7*8 + col]) + 2048) >> 12; + v7 = (dctSqrt1d2 * (p[1*8 + col] + p[7*8 + col]) + 2048) >> 12; + v5 = p[3*8 + col]; + v6 = p[5*8 + col]; + + // stage 3 + t = (v0 - v1 + 1) >> 1; + v0 = (v0 + v1 + 1) >> 1; + v1 = t; + t = (v2 * dctSin6 + v3 * dctCos6 + 2048) >> 12; + v2 = (v2 * dctCos6 - v3 * dctSin6 + 2048) >> 12; + v3 = t; + t = (v4 - v6 + 1) >> 1; + v4 = (v4 + v6 + 1) >> 1; + v6 = t; + t = (v7 + v5 + 1) >> 1; + v5 = (v7 - v5 + 1) >> 1; + v7 = t; + + // stage 2 + t = (v0 - v3 + 1) >> 1; + v0 = (v0 + v3 + 1) >> 1; + v3 = t; + t = (v1 - v2 + 1) >> 1; + v1 = (v1 + v2 + 1) >> 1; + v2 = t; + t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12; + v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12; + v7 = t; + t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12; + v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12; + v6 = t; + + // stage 1 + p[0*8 + col] = v0 + v7; + p[7*8 + col] = v0 - v7; + p[1*8 + col] = v1 + v6; + p[6*8 + col] = v1 - v6; + p[2*8 + col] = v2 + v5; + p[5*8 + col] = v2 - v5; + p[3*8 + col] = v3 + v4; + p[4*8 + col] = v3 - v4; + } + + // convert to 8-bit integers + for (i = 0; i < 64; ++i) { + var sample = 128 + ((p[i] + 8) >> 4); + dataOut[i] = sample < 0 ? 0 : sample > 0xFF ? 0xFF : sample; } - return r; } var i, j; @@ -354,7 +488,7 @@ var JpegImage = (function jpegImage() { for (i = 0; i < 8; i++) lines.push(new Uint8Array(samplesPerLine)); for (var blockCol = 0; blockCol < blocksPerLine; blockCol++) { - var r = quantizeAndInverse(component.blocks[blockRow][blockCol]); + quantizeAndInverse(component.blocks[blockRow][blockCol], r, R); var offset = 0, sample = blockCol << 3; for (j = 0; j < 8; j++) { @@ -498,8 +632,10 @@ var JpegImage = (function jpegImage() { var quantizationTableSpec = data[offset++]; var tableData = new Int32Array(64); if ((quantizationTableSpec >> 4) === 0) { // 8 bit values - for (j = 0; j < 64; j++) - tableData[j] = data[offset++]; + for (j = 0; j < 64; j++) { + var z = dctZigZag[j]; + tableData[z] = data[offset++]; + } } else if ((quantizationTableSpec >> 4) === 1) { //16 bit tableData[j] = readUint16(); } else @@ -634,8 +770,8 @@ var JpegImage = (function jpegImage() { // The adobe transform marker overrides any previous setting if (this.adobe && this.adobe.transformCode) colorTransform = true; - else if (typeof this.colorTransform != -1) - colorTransform = this.colorTransform == true; + else if (typeof this.colorTransform !== 'undefined') + colorTransform = !!this.colorTransform; component1 = this.components[0]; component2 = this.components[1]; @@ -673,8 +809,8 @@ var JpegImage = (function jpegImage() { // The adobe transform marker overrides any previous setting if (this.adobe && this.adobe.transformCode) colorTransform = true; - else if (typeof this.colorTransform != -1) - colorTransform = this.colorTransform == true; + else if (typeof this.colorTransform !== 'undefined') + colorTransform = !!this.colorTransform; component1 = this.components[0]; component2 = this.components[1]; @@ -714,7 +850,60 @@ var JpegImage = (function jpegImage() { return data; }, copyToImageData: function copyToImageData(imageData) { - this.getData(imageData.data, imageData.width, imageData.height); + var width = imageData.width, height = imageData.height; + var imageDataArray = imageData.data; + var data = this.getData(width, height); + var i = 0, j = 0, x, y; + var Y, K, C, M, R, G, B; + switch (this.components.length) { + case 1: + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) { + Y = data[i++]; + + imageDataArray[j++] = Y; + imageDataArray[j++] = Y; + imageDataArray[j++] = Y; + imageDataArray[j++] = 255; + } + } + break; + case 3: + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) { + R = data[i++]; + G = data[i++]; + B = data[i++]; + + imageDataArray[j++] = R; + imageDataArray[j++] = G; + imageDataArray[j++] = B; + imageDataArray[j++] = 255; + } + } + break; + case 4: + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) { + C = data[i++]; + M = data[i++]; + Y = data[i++]; + K = data[i++]; + + R = 255 - clampTo8bit(C * (1 - K / 255) + K); + G = 255 - clampTo8bit(M * (1 - K / 255) + K); + B = 255 - clampTo8bit(Y * (1 - K / 255) + K); + + imageDataArray[j++] = R; + imageDataArray[j++] = G; + imageDataArray[j++] = B; + imageDataArray[j++] = 255; + } + } + break; + default: + throw 'Unsupported color mode'; + } } }; diff --git a/src/stream.js b/src/stream.js index c7b5c8121..559fb2ca2 100644 --- a/src/stream.js +++ b/src/stream.js @@ -830,7 +830,8 @@ var JpegStream = (function jpegStream() { constructor.prototype.ensureBuffer = function jpegStreamEnsureBuffer(req) { if (this.bufferLength) return; - var jpegImage = new JpegImage(this.colorTransform); + var jpegImage = new JpegImage(); + jpegImage.colorTransform = this.colorTransform; jpegImage.parse(this.bytes); var width = jpegImage.width; var height = jpegImage.height; From 709dc1a0c9f334d5079c03feb69323bec1c21372 Mon Sep 17 00:00:00 2001 From: notmasteryet Date: Thu, 24 Nov 2011 09:38:09 -0600 Subject: [PATCH 29/68] Initial ToUnicode modifications --- src/canvas.js | 8 +++----- src/evaluator.js | 16 +++++++++++++--- src/fonts.js | 41 +++++++++++++++++++++++++++++++++++++++-- 3 files changed, 55 insertions(+), 10 deletions(-) diff --git a/src/canvas.js b/src/canvas.js index 9b3ed0ba9..8d6fb046d 100644 --- a/src/canvas.js +++ b/src/canvas.js @@ -474,13 +474,11 @@ var CanvasGraphics = (function canvasGraphics() { continue; } - var unicode = glyph.unicode; - var char = (unicode >= 0x10000) ? - String.fromCharCode(0xD800 | ((unicode - 0x10000) >> 10), - 0xDC00 | (unicode & 0x3FF)) : String.fromCharCode(unicode); - + var char = glyph.fontChar; ctx.fillText(char, width, 0); width += glyph.width * fontSize * 0.001 + charSpacing; + + // TODO actual characters can be extracted from the glyph.unicode } current.x += width; diff --git a/src/evaluator.js b/src/evaluator.js index a863a531e..03fce2d9a 100644 --- a/src/evaluator.js +++ b/src/evaluator.js @@ -512,6 +512,7 @@ var PartialEvaluator = (function partialEvaluator() { error('Encoding is not a Name nor a Dict'); } } + properties.differences = differences; properties.baseEncoding = baseEncoding; properties.hasEncoding = hasEncoding; @@ -595,9 +596,18 @@ var PartialEvaluator = (function partialEvaluator() { } } else if (byte == 0x3E) { if (token.length) { - // parsing hex number - tokens.push(parseInt(token, 16)); - token = ''; + if (token.length <= 4) { + // parsing hex number + tokens.push(parseInt(token, 16)); + token = ''; + } else { + // parsing hex UTF-16BE numbers + var str = []; + for (var i = 0, ii = token.length; i < ii; i += 4) + str.push(parseInt(token.substr(i, 4), 16)); + tokens.push(String.fromCharCode.apply(String, str)); + token = ''; + } } } else { token += String.fromCharCode(byte); diff --git a/src/fonts.js b/src/fonts.js index 116bb4dfc..d028a9786 100644 --- a/src/fonts.js +++ b/src/fonts.js @@ -771,7 +771,6 @@ var Font = (function Font() { this.widths = properties.widths; this.defaultWidth = properties.defaultWidth; this.composite = properties.composite; - this.toUnicode = properties.toUnicode; this.hasEncoding = properties.hasEncoding; this.fontMatrix = properties.fontMatrix; @@ -781,6 +780,11 @@ var Font = (function Font() { // Trying to fix encoding using glyph CIDSystemInfo. this.loadCidToUnicode(properties); + if (properties.toUnicode) + this.toUnicode = properties.toUnicode; + else + this.rebuildToUnicode(properties); + if (!file) { // The file data is not specified. Trying to fix the font name // to be used with the canvas.font. @@ -1898,6 +1902,29 @@ var Font = (function Font() { return stringToArray(otf.file); }, + rebuildToUnicode: function font_rebuildToUnicode(properties) { + var map = []; + if (properties.composite) { + for (var i = properties.firstChar, ii = properties.lastChar; i <= ii; i++) { + // TODO missing map the character according font's CMap + var cid = i; + map[i] = this.cidToUnicode[cid]; + } + } else { + for (var i = properties.firstChar, ii = properties.lastChar; i <= ii; i++) { + var glyph = properties.differences[i]; + if (!glyph) + glyph = properties.baseEncoding[i]; + if (!!glyph && (glyph in GlyphsUnicode)) + map[i] = GlyphsUnicode[glyph] + } + } + this.toUnicode = map; + this.refreshToUnicode = function refreshToUnicode() { + this.font_rebuildToUnicode(properties); + }; + }, + loadCidToUnicode: function font_loadCidToUnicode(properties) { if (properties.cidToGidMap) { this.cidToUnicode = properties.cidToGidMap; @@ -2039,8 +2066,18 @@ var Font = (function Font() { warn('Unsupported font type: ' + this.type); break; } + + var unicodeChars = this.toUnicode ? this.toUnicode[charcode] : charcode; + if (typeof unicodeChars === 'number') { + unicodeChars = (unicodeChars >= 0x10000) ? + String.fromCharCode(0xD800 | ((unicodeChars - 0x10000) >> 10), + 0xDC00 | (unicodeChars & 0x3FF)) : String.fromCharCode(unicodeChars); + // TODO we probably don't need convert high/low surrogate... keeping for now + } + return { - unicode: unicode, + fontChar: String.fromCharCode(unicode), + unicode: unicodeChars, width: isNum(width) ? width : this.defaultWidth, codeIRQueue: codeIRQueue }; From 868591554285c4577372b4a1478cf987aed76d15 Mon Sep 17 00:00:00 2001 From: notmasteryet Date: Thu, 24 Nov 2011 12:53:11 -0600 Subject: [PATCH 30/68] Re-using the pages as thumbnails --- web/viewer.js | 58 ++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 50 insertions(+), 8 deletions(-) diff --git a/web/viewer.js b/web/viewer.js index bfb3a4303..c8b830431 100644 --- a/web/viewer.js +++ b/web/viewer.js @@ -193,6 +193,13 @@ var PDFView = { }, load: function pdfViewLoad(data, scale) { + function bindOnAfterDraw(pageView, thumbnailView) { + // when page is painted, using the image as thumbnail base + pageView.onAfterDraw = function pdfViewLoadOnAfterDraw() { + thumbnailView.setImage(pageView.canvas); + }; + } + var loadingIndicator = document.getElementById('loading'); loadingIndicator.setAttribute('hidden', 'true'); @@ -219,10 +226,14 @@ var PDFView = { var thumbnails = this.thumbnails = []; for (var i = 1; i <= pagesCount; i++) { var page = pdf.getPage(i); - pages.push(new PageView(container, page, i, page.width, page.height, - page.stats, this.navigateTo.bind(this))); - thumbnails.push(new ThumbnailView(sidebar, page, i, - page.width / page.height)); + var pageView = new PageView(container, page, i, page.width, page.height, + page.stats, this.navigateTo.bind(this)); + var thumbnailView = new ThumbnailView(sidebar, page, i, + page.width / page.height); + bindOnAfterDraw(pageView, thumbnailView); + + pages.push(pageView); + thumbnails.push(thumbnailView); var pageRef = page.ref; pagesRefMap[pageRef.num + ' ' + pageRef.gen + ' R'] = i; } @@ -360,6 +371,8 @@ var PageView = function pageView(container, content, id, pageWidth, pageHeight, while (div.hasChildNodes()) div.removeChild(div.lastChild); div.removeAttribute('data-loaded'); + + delete this.canvas; }; function setupLinks(content, scale) { @@ -474,6 +487,7 @@ var PageView = function pageView(container, content, id, pageWidth, pageHeight, canvas.id = 'page' + this.id; canvas.mozOpaque = true; div.appendChild(canvas); + this.canvas = canvas; var scale = this.scale; canvas.width = pageWidth * scale; @@ -487,7 +501,11 @@ var PageView = function pageView(container, content, id, pageWidth, pageHeight, ctx.translate(-this.x * scale, -this.y * scale); stats.begin = Date.now(); - this.content.startRendering(ctx, this.updateStats); + this.content.startRendering(ctx, (function pageViewDrawCallback() { + this.updateStats(); + if (this.onAfterDraw) + this.onAfterDraw(); + }).bind(this)); setupLinks(this.content, this.scale); div.setAttribute('data-loaded', true); @@ -518,10 +536,9 @@ var ThumbnailView = function thumbnailView(container, page, id, pageRatio) { anchor.appendChild(div); container.appendChild(anchor); - this.draw = function thumbnailViewDraw() { - if (div.hasChildNodes()) - return; + this.hasImage = false; + function getPageDrawContext() { var canvas = document.createElement('canvas'); canvas.id = 'thumbnail' + id; canvas.mozOpaque = true; @@ -549,7 +566,28 @@ var ThumbnailView = function thumbnailView(container, page, id, pageRatio) { div.style.height = (view.height * scaleY) + 'px'; div.style.lineHeight = (view.height * scaleY) + 'px'; + return ctx; + } + + this.draw = function thumbnailViewDraw() { + if (this.hasImage) + return; + + var ctx = getPageDrawContext(); page.startRendering(ctx, function thumbnailViewDrawStartRendering() {}); + + this.hasImage = true; + }; + + this.setImage = function thumbnailViewSetImage(img) { + if (this.hasImage) + return; + + var ctx = getPageDrawContext(); + ctx.drawImage(img, 0, 0, img.width, img.height, + 0, 0, ctx.canvas.width, ctx.canvas.height); + + this.hasImage = true; }; }; @@ -687,6 +725,10 @@ window.addEventListener('transitionend', function webViewerTransitionend(evt) { var container = document.getElementById('sidebarView'); container._interval = window.setInterval(function interval() { + // skipping the thumbnails with set images + while (pageIndex < pagesCount && PDFView.thumbnails[pageIndex].hasImage) + pageIndex++; + if (pageIndex >= pagesCount) { window.clearInterval(container._interval); return; From a30f0ff848beb8d205c9e4c061973f5955181f79 Mon Sep 17 00:00:00 2001 From: Julian Viereck Date: Tue, 22 Nov 2011 21:00:04 +0100 Subject: [PATCH 31/68] Implement ctx.mozCurrentTransform and ctx.mozCurrentTransformInverse shim --- src/canvas.js | 109 +++++++++++++++++++++++++++++++++++++++++++++++++ src/pattern.js | 2 + 2 files changed, 111 insertions(+) diff --git a/src/canvas.js b/src/canvas.js index 9b3ed0ba9..d9c60f416 100644 --- a/src/canvas.js +++ b/src/canvas.js @@ -59,6 +59,111 @@ function ScratchCanvas(width, height) { return canvas; } +function addCtxCurrentTransform(ctx) { + // If the context doesn't expose a `mozCurrentTransform`, add a JS based on. + if (!ctx.mozCurrentTransform) { + // Store the original context + ctx._originalSave = ctx.save; + ctx._originalRestore = ctx.restore; + ctx._originalRotate = ctx.rotate; + ctx._originalScale = ctx.scale; + ctx._originalTranslate = ctx.translate; + ctx._originalTransform = ctx.transform; + + ctx._transformMatrix = [1, 0, 0, 1, 0, 0]; + ctx._transformStack = []; + + ctx.__defineGetter__('mozCurrentTransform', function getCurrentTransform() { + return this._transformMatrix; + }); + + ctx.__defineGetter__('mozCurrentTransformInverse', + function getCurrentTransformInverse() { + // Calculation done using WolframAlpha: + // http://www.wolframalpha.com/input/? + // i=Inverse+{{a%2C+c%2C+e}%2C+{b%2C+d%2C+f}%2C+{0%2C+0%2C+1}} + + var m = this._transformMatrix; + var a = m[0], b = m[1], c = m[2], d = m[3], e = m[4], f = m[5]; + + return [ + d / (a * d - b * c), + b / (b * c - a * d), + c / (b * c - a * d), + a / (a * d - b * c), + (d * e - c * f) / (b * c - a * d), + (b * e - a * f) / (a * d - b * c) + ]; + } + ); + + ctx.save = function ctxSave() { + var old = this._transformMatrix; + this._transformStack.push(old); + this._transformMatrix = old.slice(0, 6); + + this._originalSave(); + }; + + ctx.restore = function ctxRestore() { + var prev = this._transformStack.pop(); + if (prev) { + this._transformMatrix = prev; + this._originalRestore(); + } + } + + ctx.translate = function ctxTranslate(x, y) { + var m = this._transformMatrix; + m[4] = m[0] * x + m[2] * y + m[4]; + m[5] = m[1] * x + m[3] * y + m[5]; + + this._originalTranslate(x, y); + } + + ctx.scale = function ctxScale(x, y) { + var m = this._transformMatrix; + m[0] = m[0] * x; + m[1] = m[1] * x; + m[2] = m[2] * y; + m[3] = m[3] * y; + + this._originalScale(x, y); + } + + ctx.transform = function ctxTransform(a, b, c, d, e, f) { + var m = this._transformMatrix; + this._transformMatrix = [ + m[0] * a + m[2] * b, + m[1] * a + m[3] * b, + m[0] * c + m[2] * d, + m[1] * c + m[3] * d, + m[0] * e + m[2] * f + m[4], + m[1] * e + m[3] * f + m[5] + ]; + + ctx._originalTransform(a, b, c, d, e, f); + } + + ctx.rotate = function ctxRotate(angle) { + var cosValue = Math.cos(angle); + var sinValue = Math.sin(angle); + + var m = this._transformMatrix; + this._transformMatrix = [ + m[0] * cosValue + m[2] * sinValue, + m[1] * cosValue + m[3] * sinValue, + m[0] * (-sinValue) + m[2] * cosValue, + m[1] * (-sinValue) + m[3] * cosValue, + m[4], + m[5] + ]; + + this._originalRotate(angle); + } + } +} + var CanvasGraphics = (function canvasGraphics() { // Defines the time the executeIRQueue is going to be executing // before it stops and shedules a continue of execution. @@ -77,6 +182,10 @@ var CanvasGraphics = (function canvasGraphics() { this.xobjs = null; this.ScratchCanvas = ScratchCanvas; this.objs = objs; + + if (canvasCtx) { + addCtxCurrentTransform(canvasCtx); + } } var LINE_CAP_STYLES = ['butt', 'round', 'square']; diff --git a/src/pattern.js b/src/pattern.js index 72d13d896..c565e8b7f 100644 --- a/src/pattern.js +++ b/src/pattern.js @@ -217,6 +217,8 @@ var TilingPattern = (function tilingPattern() { // set the new canvas element context as the graphics context var tmpCtx = tmpCanvas.getContext('2d'); + addCtxCurrentTransform(tmpCtx); + var graphics = new CanvasGraphics(tmpCtx, objs); switch (paintType) { From 36e618c373f718320faa0540536263a7c37068f9 Mon Sep 17 00:00:00 2001 From: Julian Viereck Date: Sun, 27 Nov 2011 09:22:08 +0100 Subject: [PATCH 32/68] Address Yury's review comments + remove call to addCtxCurrentTransform in pattern.js as the contet is added during the CanvasGraphics constructor already --- src/canvas.js | 41 +++++++++++++++++++++++------------------ src/pattern.js | 2 -- 2 files changed, 23 insertions(+), 20 deletions(-) diff --git a/src/canvas.js b/src/canvas.js index d9c60f416..035651b0f 100644 --- a/src/canvas.js +++ b/src/canvas.js @@ -59,7 +59,7 @@ function ScratchCanvas(width, height) { return canvas; } -function addCtxCurrentTransform(ctx) { +function addContextCurrentTransform(ctx) { // If the context doesn't expose a `mozCurrentTransform`, add a JS based on. if (!ctx.mozCurrentTransform) { // Store the original context @@ -73,12 +73,14 @@ function addCtxCurrentTransform(ctx) { ctx._transformMatrix = [1, 0, 0, 1, 0, 0]; ctx._transformStack = []; - ctx.__defineGetter__('mozCurrentTransform', function getCurrentTransform() { - return this._transformMatrix; + Object.defineProperty(ctx, 'mozCurrentTransform', { + get: function getCurrentTransform() { + return this._transformMatrix; + } }); - ctx.__defineGetter__('mozCurrentTransformInverse', - function getCurrentTransformInverse() { + Object.defineProperty(ctx, 'mozCurrentTransformInverse', { + get: function getCurrentTransformInverse() { // Calculation done using WolframAlpha: // http://www.wolframalpha.com/input/? // i=Inverse+{{a%2C+c%2C+e}%2C+{b%2C+d%2C+f}%2C+{0%2C+0%2C+1}} @@ -86,16 +88,19 @@ function addCtxCurrentTransform(ctx) { var m = this._transformMatrix; var a = m[0], b = m[1], c = m[2], d = m[3], e = m[4], f = m[5]; + var ad_bc = a * d - b * c; + var bc_ad = b * c - a * d; + return [ - d / (a * d - b * c), - b / (b * c - a * d), - c / (b * c - a * d), - a / (a * d - b * c), - (d * e - c * f) / (b * c - a * d), - (b * e - a * f) / (a * d - b * c) + d / ad_bc, + b / bc_ad, + c / bc_ad, + a / ad_bc, + (d * e - c * f) / bc_ad, + (b * e - a * f) / ad_bc ]; } - ); + }); ctx.save = function ctxSave() { var old = this._transformMatrix; @@ -111,7 +116,7 @@ function addCtxCurrentTransform(ctx) { this._transformMatrix = prev; this._originalRestore(); } - } + }; ctx.translate = function ctxTranslate(x, y) { var m = this._transformMatrix; @@ -119,7 +124,7 @@ function addCtxCurrentTransform(ctx) { m[5] = m[1] * x + m[3] * y + m[5]; this._originalTranslate(x, y); - } + }; ctx.scale = function ctxScale(x, y) { var m = this._transformMatrix; @@ -129,7 +134,7 @@ function addCtxCurrentTransform(ctx) { m[3] = m[3] * y; this._originalScale(x, y); - } + }; ctx.transform = function ctxTransform(a, b, c, d, e, f) { var m = this._transformMatrix; @@ -143,7 +148,7 @@ function addCtxCurrentTransform(ctx) { ]; ctx._originalTransform(a, b, c, d, e, f); - } + }; ctx.rotate = function ctxRotate(angle) { var cosValue = Math.cos(angle); @@ -160,7 +165,7 @@ function addCtxCurrentTransform(ctx) { ]; this._originalRotate(angle); - } + }; } } @@ -184,7 +189,7 @@ var CanvasGraphics = (function canvasGraphics() { this.objs = objs; if (canvasCtx) { - addCtxCurrentTransform(canvasCtx); + addContextCurrentTransform(canvasCtx); } } diff --git a/src/pattern.js b/src/pattern.js index c565e8b7f..72d13d896 100644 --- a/src/pattern.js +++ b/src/pattern.js @@ -217,8 +217,6 @@ var TilingPattern = (function tilingPattern() { // set the new canvas element context as the graphics context var tmpCtx = tmpCanvas.getContext('2d'); - addCtxCurrentTransform(tmpCtx); - var graphics = new CanvasGraphics(tmpCtx, objs); switch (paintType) { From 8991cfad83768f3d73152ccf8ad1c59c595afa53 Mon Sep 17 00:00:00 2001 From: Julian Viereck Date: Sun, 27 Nov 2011 20:54:25 +0100 Subject: [PATCH 33/68] Check after each executed command if execution took too long already --- src/canvas.js | 40 +++++++++++++++++++--------------------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/src/canvas.js b/src/canvas.js index 9b3ed0ba9..780a96c9b 100644 --- a/src/canvas.js +++ b/src/canvas.js @@ -64,10 +64,6 @@ var CanvasGraphics = (function canvasGraphics() { // before it stops and shedules a continue of execution. var kExecutionTime = 50; - // Number of IR commands to execute before checking - // if we execute longer then `kExecutionTime`. - var kExecutionTimeCheck = 500; - function constructor(canvasCtx, objs) { this.ctx = canvasCtx; this.current = new CanvasExtraState(); @@ -112,31 +108,33 @@ var CanvasGraphics = (function canvasGraphics() { var i = executionStartIdx || 0; var argsArrayLen = argsArray.length; + // Sometimes the IRQueue to execute is empty. + if (argsArrayLen == i) { + return i; + } + var executionEndIdx; var startTime = Date.now(); var objs = this.objs; - do { - executionEndIdx = Math.min(argsArrayLen, i + kExecutionTimeCheck); + while (true) { + if (fnArray[i] !== 'dependency') { + this[fnArray[i]].apply(this, argsArray[i]); + } else { + var deps = argsArray[i]; + for (var n = 0, nn = deps.length; n < nn; n++) { + var depObjId = deps[n]; - for (i; i < executionEndIdx; i++) { - if (fnArray[i] !== 'dependency') { - this[fnArray[i]].apply(this, argsArray[i]); - } else { - var deps = argsArray[i]; - for (var n = 0, nn = deps.length; n < nn; n++) { - var depObjId = deps[n]; - - // If the promise isn't resolved yet, add the continueCallback - // to the promise and bail out. - if (!objs.isResolved(depObjId)) { - objs.get(depObjId, continueCallback); - return i; - } + // If the promise isn't resolved yet, add the continueCallback + // to the promise and bail out. + if (!objs.isResolved(depObjId)) { + objs.get(depObjId, continueCallback); + return i; } } } + i++; // If the entire IRQueue was executed, stop as were done. if (i == argsArrayLen) { @@ -153,7 +151,7 @@ var CanvasGraphics = (function canvasGraphics() { // If the IRQueue isn't executed completly yet OR the execution time // was short enough, do another execution round. - } while (true); + } }, endDrawing: function canvasGraphicsEndDrawing() { From 08e3fd88ada78c094dfbe527854264b2c1c4dbb8 Mon Sep 17 00:00:00 2001 From: notmasteryet Date: Sun, 27 Nov 2011 20:43:23 -0600 Subject: [PATCH 34/68] Removing adaptUnicode; making cmap equal to ToUnicode tables --- src/evaluator.js | 18 ++- src/fonts.js | 277 +++++++++++++++++++++++++++-------------------- 2 files changed, 172 insertions(+), 123 deletions(-) diff --git a/src/evaluator.js b/src/evaluator.js index 03fce2d9a..3e687c72d 100644 --- a/src/evaluator.js +++ b/src/evaluator.js @@ -555,9 +555,21 @@ var PartialEvaluator = (function partialEvaluator() { var startRange = tokens[j]; var endRange = tokens[j + 1]; var code = tokens[j + 2]; - while (startRange <= endRange) { - charToUnicode[startRange] = code++; - ++startRange; + if (code == 0xFFFF) { + // CMap is broken, assuming code == startRange + code = startRange; + } + if (isArray(code)) { + var codeindex = 0; + while (startRange <= endRange) { + charToUnicode[startRange] = code[codeindex++]; + ++startRange; + } + } else { + while (startRange <= endRange) { + charToUnicode[startRange] = code++; + ++startRange; + } } } break; diff --git a/src/fonts.js b/src/fonts.js index d028a9786..fb9bb9f0c 100644 --- a/src/fonts.js +++ b/src/fonts.js @@ -719,20 +719,10 @@ function getUnicodeRangeFor(value) { return -1; } -function adaptUnicode(unicode) { - return (unicode <= 0x1F || (unicode >= 127 && unicode < kSizeOfGlyphArea)) ? - unicode + kCmapGlyphOffset : unicode; -} - -function isAdaptedUnicode(unicode) { - return unicode >= kCmapGlyphOffset && - unicode < kCmapGlyphOffset + kSizeOfGlyphArea; -} - function isSpecialUnicode(unicode) { return (unicode <= 0x1F || (unicode >= 127 && unicode < kSizeOfGlyphArea)) || - unicode >= kCmapGlyphOffset && - unicode < kCmapGlyphOffset + kSizeOfGlyphArea; + (unicode >= kCmapGlyphOffset && + unicode < kCmapGlyphOffset + kSizeOfGlyphArea); } /** @@ -965,15 +955,15 @@ var Font = (function Font() { var ranges = []; for (var n = 0; n < length; ) { var start = codes[n].unicode; - var startCode = codes[n].code; + var codeIndices = [codes[n].code]; ++n; var end = start; while (n < length && end + 1 == codes[n].unicode) { + codeIndices.push(codes[n].code); ++end; ++n; } - var endCode = codes[n - 1].code; - ranges.push([start, end, startCode, endCode]); + ranges.push([start, end, codeIndices]); } return ranges; @@ -1016,17 +1006,16 @@ var Font = (function Font() { idDeltas += string16(0); idRangeOffsets += string16(offset); - var startCode = range[2]; - var endCode = range[3]; - for (var j = startCode; j <= endCode; ++j) - glyphsIds += string16(deltas[j]); + var codes = range[2]; + for (var j = 0, jj = codes.length; j < jj; ++j) + glyphsIds += string16(deltas[codes[j]]); } } else { for (var i = 0; i < segCount - 1; i++) { var range = ranges[i]; var start = range[0]; var end = range[1]; - var startCode = range[2]; + var startCode = range[2][0]; startCount += string16(start); endCount += string16(end); @@ -1303,7 +1292,7 @@ var Font = (function Font() { properties.baseEncoding = encoding; } - function replaceCMapTable(cmap, font, properties) { + function readCMapTable(cmap, font) { var start = (font.start ? font.start : 0) + cmap.offset; font.pos = start; @@ -1320,7 +1309,7 @@ var Font = (function Font() { } // Check that table are sorted by platformID then encodingID, - records.sort(function fontReplaceCMapTableSort(a, b) { + records.sort(function fontReadCMapTableSort(a, b) { return ((a.platformID << 16) + a.encodingID) - ((b.platformID << 16) + b.encodingID); }); @@ -1375,16 +1364,15 @@ var Font = (function Font() { for (var j = 0; j < 256; j++) { var index = font.getByte(); if (index) { - var unicode = adaptUnicode(j); - glyphs.push({ unicode: unicode, code: j }); + glyphs.push({ unicode: j, code: j }); ids.push(index); } } - - properties.hasShortCmap = true; - - createGlyphNameMap(glyphs, ids, properties); - return cmap.data = createCMapTable(glyphs, ids); + return { + glyphs: glyphs, + ids: ids, + hasShortCmap: true + }; } else if (format == 4) { // re-creating the table in format 4 since the encoding // might be changed @@ -1436,17 +1424,18 @@ var Font = (function Font() { var glyphCode = offsetIndex < 0 ? j : offsets[offsetIndex + j - start]; glyphCode = (glyphCode + delta) & 0xFFFF; - if (glyphCode == 0 || isAdaptedUnicode(j)) + if (glyphCode == 0) continue; - var unicode = adaptUnicode(j); - glyphs.push({ unicode: unicode, code: j }); + glyphs.push({ unicode: j, code: j }); ids.push(glyphCode); } } - createGlyphNameMap(glyphs, ids, properties); - return cmap.data = createCMapTable(glyphs, ids); + return { + glyphs: glyphs, + ids: ids + }; } else if (format == 6) { // Format 6 is a 2-bytes dense mapping, which means the font data // lives glue together even if they are pretty far in the unicode @@ -1461,19 +1450,18 @@ var Font = (function Font() { for (var j = 0; j < entryCount; j++) { var glyphCode = int16(font.getBytes(2)); var code = firstCode + j; - if (isAdaptedUnicode(glyphCode)) - continue; - var unicode = adaptUnicode(code); - glyphs.push({ unicode: unicode, code: code }); + glyphs.push({ unicode: code, code: code }); ids.push(glyphCode); } - createGlyphNameMap(glyphs, ids, properties); - return cmap.data = createCMapTable(glyphs, ids); + return { + glyphs: glyphs, + ids: ids + }; } } - return cmap.data; + error('Unsupported cmap table format'); }; function sanitizeMetrics(font, header, metrics, numGlyphs) { @@ -1712,17 +1700,60 @@ var Font = (function Font() { tables.push(cmap); } - var glyphs = []; + var glyphs = [], ids = []; + var usedUnicodes = [], unusedUnicode = kCmapGlyphOffset; + var cidToGidMap = properties.cidToGidMap; for (i = 1; i < numGlyphs; i++) { - if (isAdaptedUnicode(i)) - continue; - - glyphs.push({ unicode: adaptUnicode(i) }); + var cid = cidToGidMap ? cidToGidMap.indexOf(i) : i; + var unicode = this.toUnicode[cid]; + if (!unicode || isSpecialUnicode(unicode) || + unicode in usedUnicodes) { + // overriding the special special symbols mapping + while (unusedUnicode in usedUnicodes) + unusedUnicode++; + this.toUnicode[cid] = unicode = unusedUnicode++; + if (unusedUnicode >= kCmapGlyphOffset + kSizeOfGlyphArea) { + // overflow of the user defined symblos range + // using symbols that a little bit lower than this range + unusedUnicode = kCmapGlyphOffset - numGlyphs; + } + } + usedUnicodes[unicode] = true; + glyphs.push({ unicode: unicode, code: cid }); + ids.push(i); } - cmap.data = createCMapTable(glyphs); + cmap.data = createCMapTable(glyphs, ids); } else { - replaceCMapTable(cmap, font, properties); + var cmapTable = readCMapTable(cmap, font); + var glyphs = cmapTable.glyphs; + var ids = cmapTable.ids; + var hasShortCmap = !!cmapTable.hasShortCmap; + var toUnicode = this.toUnicode; + + if (hasShortCmap && toUnicode) { + // checking if cmap is just identity map + var isIdentity = true; + for (var i = 0, ii = glyphs.length; i < ii; i++) { + if (glyphs[i].unicode != i + 1) { + isIdentity = false; + break; + } + } + // if it is, replacing with meaningful toUnicode values + if (isIdentity) { + for (var i = 0, ii = glyphs.length; i < ii; i++) { + var unicode = toUnicode[i + 1] || i + 1; + glyphs[i].unicode = unicode; + } + this.useToUnicode = true; + } + } + properties.hasShortCmap = hasShortCmap; + + createGlyphNameMap(glyphs, ids, properties); this.glyphNameMap = properties.glyphNameMap; + + cmap.data = createCMapTable(glyphs, ids); } // Rewrite the 'post' table if needed @@ -1812,6 +1843,14 @@ var Font = (function Font() { } properties.baseEncoding = encoding; } + if (properties.subtype == 'CIDFontType0C') { + var toUnicode = []; + for (var i = 0; i < charstrings.length; ++i) { + var charstring = charstrings[i]; + toUnicode[charstring.code] = charstring.unicode; + } + this.toUnicode = toUnicode; + } var fields = { // PostScript Font Program @@ -1872,8 +1911,11 @@ var Font = (function Font() { // Horizontal metrics 'hmtx': (function fontFieldsHmtx() { var hmtx = '\x00\x00\x00\x00'; // Fake .notdef - for (var i = 0, ii = charstrings.length; i < ii; i++) - hmtx += string16(charstrings[i].width) + string16(0); + for (var i = 0, ii = charstrings.length; i < ii; i++) { + var charstring = charstrings[i]; + var width = 'width' in charstring ? charstring.width : 0; + hmtx += string16(width) + string16(0); + } return stringToArray(hmtx); })(), @@ -1903,20 +1945,22 @@ var Font = (function Font() { }, rebuildToUnicode: function font_rebuildToUnicode(properties) { + var firstChar = properties.firstChar, lastChar = properties.lastChar; var map = []; if (properties.composite) { - for (var i = properties.firstChar, ii = properties.lastChar; i <= ii; i++) { + var isIdentityMap = this.cidToUnicode.length == 0; + for (var i = firstChar, ii = lastChar; i <= ii; i++) { // TODO missing map the character according font's CMap var cid = i; - map[i] = this.cidToUnicode[cid]; + map[i] = isIdentityMap ? cid : this.cidToUnicode[cid]; } } else { - for (var i = properties.firstChar, ii = properties.lastChar; i <= ii; i++) { + for (var i = firstChar, ii = lastChar; i <= ii; i++) { var glyph = properties.differences[i]; if (!glyph) glyph = properties.baseEncoding[i]; if (!!glyph && (glyph in GlyphsUnicode)) - map[i] = GlyphsUnicode[glyph] + map[i] = GlyphsUnicode[glyph]; } } this.toUnicode = map; @@ -1926,16 +1970,12 @@ var Font = (function Font() { }, loadCidToUnicode: function font_loadCidToUnicode(properties) { - if (properties.cidToGidMap) { - this.cidToUnicode = properties.cidToGidMap; - return; - } - if (!properties.cidSystemInfo) return; - var cidToUnicodeMap = []; + var cidToUnicodeMap = [], unicodeToCIDMap = []; this.cidToUnicode = cidToUnicodeMap; + this.unicodeToCID = unicodeToCIDMap; var cidSystemInfo = properties.cidSystemInfo; var cidToUnicode; @@ -1947,28 +1987,34 @@ var Font = (function Font() { if (!cidToUnicode) return; // identity encoding - var glyph = 1, i, j, k, ii; + var cid = 1, i, j, k, ii; for (i = 0, ii = cidToUnicode.length; i < ii; ++i) { var unicode = cidToUnicode[i]; if (isArray(unicode)) { var length = unicode.length; - for (j = 0; j < length; j++) - cidToUnicodeMap[unicode[j]] = glyph; - glyph++; + for (j = 0; j < length; j++) { + cidToUnicodeMap[cid] = unicode[j]; + unicodeToCIDMap[unicode[j]] = cid; + } + cid++; } else if (typeof unicode === 'object') { var fillLength = unicode.f; if (fillLength) { k = unicode.c; for (j = 0; j < fillLength; ++j) { - cidToUnicodeMap[k] = glyph++; + cidToUnicodeMap[cid] = k; + unicodeToCIDMap[k] = cid; + cid++; k++; } } else - glyph += unicode.s; + cid += unicode.s; } else if (unicode) { - cidToUnicodeMap[unicode] = glyph++; + cidToUnicodeMap[cid] = unicode; + unicodeToCIDMap[unicode] = cid; + cid++; } else - glyph++; + cid++; } }, @@ -2008,19 +2054,19 @@ var Font = (function Font() { switch (this.type) { case 'CIDFontType0': if (this.noUnicodeAdaptation) { - width = this.widths[this.cidToUnicode[charcode]]; + width = this.widths[this.unicodeToCID[charcode] || charcode]; unicode = charcode; break; } - unicode = adaptUnicode(this.cidToUnicode[charcode] || charcode); + unicode = this.toUnicode[charcode] || charcode; break; case 'CIDFontType2': if (this.noUnicodeAdaptation) { - width = this.widths[this.cidToUnicode[charcode]]; + width = this.widths[this.unicodeToCID[charcode] || charcode]; unicode = charcode; break; } - unicode = adaptUnicode(this.cidToUnicode[charcode] || charcode); + unicode = this.toUnicode[charcode] || charcode; break; case 'Type1': var glyphName = this.differences[charcode] || this.encoding[charcode]; @@ -2031,7 +2077,7 @@ var Font = (function Font() { break; } unicode = this.glyphNameMap[glyphName] || - adaptUnicode(GlyphsUnicode[glyphName] || charcode); + GlyphsUnicode[glyphName] || charcode; break; case 'Type3': var glyphName = this.differences[charcode] || this.encoding[charcode]; @@ -2049,16 +2095,16 @@ var Font = (function Font() { break; } if (!this.hasEncoding) { - unicode = adaptUnicode(charcode); + unicode = this.useToUnicode ? this.toUnicode[charcode] : charcode; break; } - if (this.hasShortCmap) { + if (this.hasShortCmap && false) { var j = Encodings.MacRomanEncoding.indexOf(glyphName); - unicode = j >= 0 && !isSpecialUnicode(j) ? j : + unicode = j >= 0 ? j : this.glyphNameMap[glyphName]; } else { unicode = glyphName in GlyphsUnicode ? - adaptUnicode(GlyphsUnicode[glyphName]) : + GlyphsUnicode[glyphName] : this.glyphNameMap[glyphName]; } break; @@ -2068,12 +2114,8 @@ var Font = (function Font() { } var unicodeChars = this.toUnicode ? this.toUnicode[charcode] : charcode; - if (typeof unicodeChars === 'number') { - unicodeChars = (unicodeChars >= 0x10000) ? - String.fromCharCode(0xD800 | ((unicodeChars - 0x10000) >> 10), - 0xDC00 | (unicodeChars & 0x3FF)) : String.fromCharCode(unicodeChars); - // TODO we probably don't need convert high/low surrogate... keeping for now - } + if (typeof unicodeChars === 'number') + unicodeChars = String.fromCharCode(unicodeChars); return { fontChar: String.fromCharCode(unicode), @@ -2790,22 +2832,13 @@ CFF.prototype = { getOrderedCharStrings: function cff_getOrderedCharStrings(glyphs, properties) { var charstrings = []; - var reverseMapping = {}; - var encoding = properties.baseEncoding; var i, length, glyphName; - for (i = 0, length = encoding.length; i < length; ++i) { - glyphName = encoding[i]; - if (!glyphName || isSpecialUnicode(i)) - continue; - reverseMapping[glyphName] = i; - } - reverseMapping['.notdef'] = 0; var unusedUnicode = kCmapGlyphOffset; for (i = 0, length = glyphs.length; i < length; i++) { var item = glyphs[i]; var glyphName = item.glyph; - var unicode = glyphName in reverseMapping ? - reverseMapping[glyphName] : unusedUnicode++; + var unicode = glyphName in GlyphsUnicode ? + GlyphsUnicode[glyphName] : unusedUnicode++; charstrings.push({ glyph: glyphName, unicode: unicode, @@ -3092,16 +3125,14 @@ var Type2CFF = (function type2CFF() { } var charStrings = this.parseIndex(topDict.CharStrings); - var charset = this.parseCharsets(topDict.charset, - charStrings.length, strings); - var encoding = this.parseEncoding(topDict.Encoding, properties, - strings, charset); var charset, encoding; var isCIDFont = properties.subtype == 'CIDFontType0C'; if (isCIDFont) { - charset = []; - charset.length = charStrings.length; + charset = ['.notdef']; + for (var i = 1, ii = charStrings.length; i < ii; ++i) + charset.push('glyph' + i); + encoding = this.parseCidMap(topDict.charset, charStrings.length); } else { @@ -3170,38 +3201,44 @@ var Type2CFF = (function type2CFF() { var charstrings = []; var unicodeUsed = []; var unassignedUnicodeItems = []; + var inverseEncoding = []; + for (var charcode in encoding) + inverseEncoding[encoding[charcode]] = charcode | 0; for (var i = 0, ii = charsets.length; i < ii; i++) { var glyph = charsets[i]; - var encodingFound = false; - for (var charcode in encoding) { - if (encoding[charcode] == i) { - var code = charcode | 0; - charstrings.push({ - unicode: adaptUnicode(code), - code: code, - gid: i, - glyph: glyph - }); - unicodeUsed[code] = true; - encodingFound = true; - break; - } + if (glyph == '.notdef') { + charstrings.push({ + unicode: 0, + code: 0, + gid: i, + glyph: glyph + }); + continue; } - if (!encodingFound) { + var code = inverseEncoding[i]; + if (!code || isSpecialUnicode(code)) { unassignedUnicodeItems.push(i); + continue; } + charstrings.push({ + unicode: code, + code: code, + gid: i, + glyph: glyph + }); + unicodeUsed[code] = true; } - var nextUnusedUnicode = 0x21; + var nextUnusedUnicode = kCmapGlyphOffset; for (var j = 0, jj = unassignedUnicodeItems.length; j < jj; ++j) { var i = unassignedUnicodeItems[j]; // giving unicode value anyway - while (unicodeUsed[nextUnusedUnicode]) + while (nextUnusedUnicode in unicodeUsed) nextUnusedUnicode++; - var code = nextUnusedUnicode++; + var unicode = nextUnusedUnicode++; charstrings.push({ - unicode: adaptUnicode(code), - code: code, + unicode: unicode, + code: inverseEncoding[i] || 0, gid: i, glyph: charsets[i] }); From a1853185b16a69ac7eb8d22b3b276d467236c0aa Mon Sep 17 00:00:00 2001 From: Artur Adib Date: Mon, 28 Nov 2011 09:25:25 -0500 Subject: [PATCH 35/68] Comments --- src/canvas.js | 9 +++++++-- src/metrics.js | 3 +++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/canvas.js b/src/canvas.js index 0107570d9..ab1422758 100644 --- a/src/canvas.js +++ b/src/canvas.js @@ -103,6 +103,7 @@ var CanvasGraphics = (function canvasGraphics() { this.ctx.transform(0, -1, -1, 0, cw, ch); break; } + // Scale so that canvas units are the same as PDF user space units this.ctx.scale(cw / mediaBox.width, ch / mediaBox.height); this.textDivs = []; this.textLayerQueue = []; @@ -491,14 +492,18 @@ var CanvasGraphics = (function canvasGraphics() { pushTextDivs: function canvasGraphicsPushTextDivs(text) { var div = document.createElement('div'); var fontSize = this.current.fontSize; - var fontHeight = text.geom.vScale * fontSize; + + // vScale and hScale already contain the scaling to pixel units + // as mozCurrentTransform reflects ctx.scale() changes + // (see beginDrawing()) + var fontHeight = fontSize * text.geom.vScale; + div.dataset.canvasWidth = text.canvasWidth * text.geom.hScale; div.style.fontSize = fontHeight + 'px'; div.style.fontFamily = this.current.font.loadedName || 'sans-serif'; div.style.left = text.geom.x + 'px'; div.style.top = (text.geom.y - fontHeight) + 'px'; div.innerHTML = text.str; - div.dataset.canvasWidth = text.canvasWidth * text.geom.hScale; div.dataset.textLength = text.length; this.textDivs.push(div); }, diff --git a/src/metrics.js b/src/metrics.js index c21b4aed1..e64961aa7 100644 --- a/src/metrics.js +++ b/src/metrics.js @@ -3,6 +3,9 @@ 'use strict'; +// The Metrics object contains glyph widths (in glyph space units). +// As per PDF spec, for most fonts (Type 3 being an exception) a glyph +// space unit corresponds to 1/1000th of text space unit. var Metrics = { 'Courier': 600, 'Courier-Bold': 600, From d6925b13ba3749afd29a1d50db7eb6c2509ae6eb Mon Sep 17 00:00:00 2001 From: Brendan Dahl Date: Mon, 28 Nov 2011 16:55:09 -0800 Subject: [PATCH 36/68] Adding new errorback and code to display error messages. --- src/core.js | 21 ++++++++++++++++++--- src/worker.js | 21 ++++++++++++++++----- test/driver.js | 8 +++++--- web/viewer.css | 31 +++++++++++++++++++++++++++++++ web/viewer.html | 18 ++++++++++++++++++ web/viewer.js | 35 +++++++++++++++++++++++++++++++---- 6 files changed, 119 insertions(+), 15 deletions(-) diff --git a/src/core.js b/src/core.js index 3549eb906..72601fdf7 100644 --- a/src/core.js +++ b/src/core.js @@ -63,6 +63,10 @@ var Page = (function pagePage() { }; this.xref = xref; this.ref = ref; + + this.ctx = null; + this.callback = null; + this.errorback = null; } constructor.prototype = { @@ -165,8 +169,10 @@ var Page = (function pagePage() { try { self.display(gfx, self.callback); } catch (e) { - if (self.callback) self.callback(e.toString()); - throw e; + if (self.errorback) + self.errorback(e); + else + throw e; } }); }; @@ -303,9 +309,10 @@ var Page = (function pagePage() { } return links; }, - startRendering: function pageStartRendering(ctx, callback) { + startRendering: function pageStartRendering(ctx, callback, errorback) { this.ctx = ctx; this.callback = callback; + this.errorback = errorback; this.startRenderingTime = Date.now(); this.pdf.startRendering(this); @@ -599,6 +606,14 @@ var PDFDoc = (function pdfDoc() { } }.bind(this)); + messageHandler.on('page_error', function pdfDocError(data) { + var page = this.pageCache[data.pageNum]; + if (page.errorback) + page.errorback(data.error) + else + throw data.error; + }, this); + setTimeout(function pdfDocFontReadySetTimeout() { messageHandler.send('doc', this.data); this.workerReadyPromise.resolve(true); diff --git a/src/worker.js b/src/worker.js index 67f1bf658..06b9c7a22 100644 --- a/src/worker.js +++ b/src/worker.js @@ -14,7 +14,6 @@ function MessageHandler(name, comObj) { ah['console_error'] = [function ahConsoleError(data) { console.error.apply(console, data); }]; - comObj.onmessage = function messageHandlerComObjOnMessage(event) { var data = event.data; if (data.action in ah) { @@ -67,7 +66,6 @@ var WorkerMessageHandler = { handler.on('page_request', function wphSetupPageRequest(pageNum) { pageNum = parseInt(pageNum); - var page = pdfDoc.getPage(pageNum); // The following code does quite the same as // Page.prototype.startRendering, but stops at one point and sends the @@ -77,9 +75,22 @@ var WorkerMessageHandler = { var start = Date.now(); var dependency = []; - - // Pre compile the pdf page and fetch the fonts/images. - var IRQueue = page.getIRQueue(handler, dependency); + try { + var page = pdfDoc.getPage(pageNum); + // Pre compile the pdf page and fetch the fonts/images. + var IRQueue = page.getIRQueue(handler, dependency); + } catch(e) { + // Turn the error into an obj that can be serialized + e = { + message: e.message, + stack: e.stack + }; + handler.send('page_error', { + pageNum: pageNum, + error: e + }); + return; + } console.log('page=%d - getIRQueue: time=%dms, len=%d', pageNum, Date.now() - start, IRQueue.fnArray.length); diff --git a/test/driver.js b/test/driver.js index c11cecf56..48ac77e65 100644 --- a/test/driver.js +++ b/test/driver.js @@ -162,9 +162,11 @@ function nextPage(task, loadError) { page.startRendering( ctx, - function nextPageStartRendering(e) { - snapshotCurrentPage(task, (!failure && e) ? - ('render : ' + e) : failure); + function nextPageStartRendering() { + snapshotCurrentPage(task, false); + }, + function errorNextPageStartRendering(e) { + snapshotCurrentPage(task, 'render : ' + e.message); } ); } catch (e) { diff --git a/web/viewer.css b/web/viewer.css index c379e91c4..81458b612 100644 --- a/web/viewer.css +++ b/web/viewer.css @@ -252,6 +252,37 @@ canvas { display: none; } +#errorWrapper { + background: none repeat scroll 0 0 #FF5555; + color: white; + left: 0; + position: fixed; + right: 0; + top: 30px; + z-index: 1000; + padding: 3px; +} + +#errorMessageLeft { + float: left; +} + +#errorMessageRight { + float: right; +} + +#errorMoreInfo { + background-color: #FFFFFF; + color: black; + padding: 3px; + margin: 3px; + white-space: pre; +} + +.clearBoth { + clear: both; +} + /* === Printed media overrides === */ @media print { #sidebar { diff --git a/web/viewer.html b/web/viewer.html index e441a9847..153b22e80 100644 --- a/web/viewer.html +++ b/web/viewer.html @@ -97,6 +97,24 @@ -- +