From 3c2a0f11b1f63595d08458f31e4c21738cd4ca5d Mon Sep 17 00:00:00 2001 From: Brendan Dahl Date: Tue, 3 Jan 2012 14:26:19 -0800 Subject: [PATCH 1/7] Decode more jpegs using the browser if possible. --- src/evaluator.js | 3 ++- src/image.js | 2 +- src/stream.js | 53 ++++++++++++++++++++++++++++++------------------ 3 files changed, 36 insertions(+), 22 deletions(-) diff --git a/src/evaluator.js b/src/evaluator.js index 2905565da..3daf97da9 100644 --- a/src/evaluator.js +++ b/src/evaluator.js @@ -211,7 +211,8 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { args = [objId, w, h]; var softMask = dict.get('SMask', 'IM') || false; - if (!softMask && image instanceof JpegStream && image.isNative) { + if (!softMask && image instanceof JpegStream && + image.isNativelySupported(xref, resources)) { // These JPEGs don't need any more processing so we can just send it. fn = 'paintJpegXObject'; handler.send('obj', [objId, 'JpegStream', image.getIR()]); diff --git a/src/image.js b/src/image.js index 29bad4d8a..6e7ab2020 100644 --- a/src/image.js +++ b/src/image.js @@ -9,7 +9,7 @@ var PDFImage = (function PDFImageClosure() { * when the image data is ready. */ function handleImageData(handler, xref, res, image, promise) { - if (image instanceof JpegStream && image.isNative) { + if (image instanceof JpegStream && image.isNativelyDecodable(xref, res)) { // For natively supported jpegs send them to the main thread for decoding. var dict = image.dict; var colorSpace = dict.get('ColorSpace', 'CS'); diff --git a/src/stream.js b/src/stream.js index d996f5c91..3367636b4 100644 --- a/src/stream.js +++ b/src/stream.js @@ -803,35 +803,23 @@ var JpegStream = (function JpegStreamClosure() { // need to be removed this.dict = dict; - // Flag indicating wether the image can be natively loaded. - this.isNative = true; - - this.colorTransform = -1; + this.colorTransform = dict.get('ColorTransform') || -1; + this.isAdobeImage = false; 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')); - - // 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); + this.isAdobeImage = true; + bytes = fixAdobeImage(bytes); } + this.bytes = bytes; + DecodeStream.call(this); } JpegStream.prototype = Object.create(DecodeStream.prototype); JpegStream.prototype.ensureBuffer = function jpegStreamEnsureBuffer(req) { + // todo make sure this isn't called on natively supported jpegs if (this.bufferLength) return; var jpegImage = new JpegImage(); @@ -844,11 +832,36 @@ var JpegStream = (function JpegStreamClosure() { this.bufferLength = data.length; }; JpegStream.prototype.getIR = function jpegStreamGetIR() { - return this.src; + return bytesToString(this.bytes); }; JpegStream.prototype.getChar = function jpegStreamGetChar() { error('internal error: getChar is not valid on JpegStream'); }; + /** + * Checks if the image can be decoded and displayed by the browser without any + * further processing such as color space conversions. + */ + JpegStream.prototype.isNativelySupported = function isNativelySupported(xref, + res) { + var cs = ColorSpace.parse(this.dict.get('ColorSpace'), xref, res); + if (cs.name === 'DeviceGray' || cs.name === 'DeviceRGB') + return true; + if (cs.name === 'DeviceCMYK' && !this.isAdobeImage && + this.colorTransform < 1) + return true; + return false; + }; + /** + * Checks if the image can be decoded by the browser. + */ + JpegStream.prototype.isNativelyDecodable = function isNativelyDecodable(xref, + res) { + var cs = ColorSpace.parse(this.dict.get('ColorSpace'), xref, res); + if (cs.numComps == 1 || cs.numComps == 3) + return true; + + return false; + }; return JpegStream; })(); From c8192698fc57fad55b3878982558e78dccc79144 Mon Sep 17 00:00:00 2001 From: Artur Adib Date: Wed, 4 Jan 2012 11:20:19 -0500 Subject: [PATCH 2/7] disableTextLayer option --- web/viewer.js | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/web/viewer.js b/web/viewer.js index f561ed12e..d1e207a63 100644 --- a/web/viewer.js +++ b/web/viewer.js @@ -772,9 +772,12 @@ var PageView = function pageView(container, content, id, pageWidth, pageHeight, div.appendChild(canvas); this.canvas = canvas; - var textLayer = document.createElement('div'); - textLayer.className = 'textLayer'; - div.appendChild(textLayer); + var textLayer = null; + if (!PDFJS.disableTextLayer) { + textLayer = document.createElement('div'); + textLayer.className = 'textLayer'; + div.appendChild(textLayer); + } var scale = this.scale; canvas.width = pageWidth * scale; @@ -949,6 +952,10 @@ window.addEventListener('load', function webViewerLoad(evt) { if ('disableWorker' in params) PDFJS.disableWorker = params['disableWorker'] === 'true' ? true : false; + if ('disableTextLayer' in params) + PDFJS.disableTextLayer = params['disableTextLayer'] === 'true' ? + true : false; + var sidebarScrollView = document.getElementById('sidebarScrollView'); sidebarScrollView.addEventListener('scroll', updateThumbViewArea, true); }, true); From 9538da2b588963ac4c9148de0ec551e32969334c Mon Sep 17 00:00:00 2001 From: Brendan Dahl Date: Wed, 4 Jan 2012 11:56:53 -0800 Subject: [PATCH 3/7] Move comments. --- src/stream.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/stream.js b/src/stream.js index 3367636b4..2c45d32a1 100644 --- a/src/stream.js +++ b/src/stream.js @@ -819,7 +819,6 @@ var JpegStream = (function JpegStreamClosure() { JpegStream.prototype = Object.create(DecodeStream.prototype); JpegStream.prototype.ensureBuffer = function jpegStreamEnsureBuffer(req) { - // todo make sure this isn't called on natively supported jpegs if (this.bufferLength) return; var jpegImage = new JpegImage(); @@ -844,6 +843,8 @@ var JpegStream = (function JpegStreamClosure() { JpegStream.prototype.isNativelySupported = function isNativelySupported(xref, res) { var cs = ColorSpace.parse(this.dict.get('ColorSpace'), xref, res); + // when bug 674619 lands, let's check if browser can do + // normal cmyk and then we won't need to decode in JS if (cs.name === 'DeviceGray' || cs.name === 'DeviceRGB') return true; if (cs.name === 'DeviceCMYK' && !this.isAdobeImage && From ef137dd6a7a93fb4843d7c949eec60189338fbe7 Mon Sep 17 00:00:00 2001 From: Artur Adib Date: Thu, 5 Jan 2012 10:42:05 -0500 Subject: [PATCH 4/7] Support for textLayerBuilder --- web/viewer.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/web/viewer.js b/web/viewer.js index c62ee5b4c..99c08525c 100644 --- a/web/viewer.js +++ b/web/viewer.js @@ -781,12 +781,13 @@ var PageView = function pageView(container, content, id, pageWidth, pageHeight, div.appendChild(canvas); this.canvas = canvas; - var textLayer = null; + var textLayerDiv = null; if (!PDFJS.disableTextLayer) { - textLayer = document.createElement('div'); - textLayer.className = 'textLayer'; - div.appendChild(textLayer); + textLayerDiv = document.createElement('div'); + textLayerDiv.className = 'textLayer'; + div.appendChild(textLayerDiv); } + var textLayer = textLayerDiv ? new TextLayerBuilder(textLayerDiv) : null; var scale = this.scale; canvas.width = pageWidth * scale; @@ -810,7 +811,7 @@ var PageView = function pageView(container, content, id, pageWidth, pageHeight, cache.push(this); callback(); - }).bind(this), new TextLayerBuilder(textLayer) + }).bind(this), textLayer ); setupAnnotations(this.content, this.scale); From 7bf5daa273f57f91daa88ca30c4b96a6e51ef834 Mon Sep 17 00:00:00 2001 From: Brendan Dahl Date: Thu, 5 Jan 2012 11:06:17 -0800 Subject: [PATCH 5/7] Only set transform when its a non default. --- src/stream.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/stream.js b/src/stream.js index 2c45d32a1..adefc99d5 100644 --- a/src/stream.js +++ b/src/stream.js @@ -803,8 +803,8 @@ var JpegStream = (function JpegStreamClosure() { // need to be removed this.dict = dict; - this.colorTransform = dict.get('ColorTransform') || -1; this.isAdobeImage = false; + this.colorTransform = dict.get('ColorTransform') || -1; if (isAdobeImage(bytes)) { this.isAdobeImage = true; @@ -822,7 +822,8 @@ var JpegStream = (function JpegStreamClosure() { if (this.bufferLength) return; var jpegImage = new JpegImage(); - jpegImage.colorTransform = this.colorTransform; + if (this.colorTransform != -1) + jpegImage.colorTransform = this.colorTransform; jpegImage.parse(this.bytes); var width = jpegImage.width; var height = jpegImage.height; @@ -858,7 +859,8 @@ var JpegStream = (function JpegStreamClosure() { JpegStream.prototype.isNativelyDecodable = function isNativelyDecodable(xref, res) { var cs = ColorSpace.parse(this.dict.get('ColorSpace'), xref, res); - if (cs.numComps == 1 || cs.numComps == 3) + var numComps = cs.numComps; + if (numComps == 1 || numComps == 3) return true; return false; From 80a1919cfcab9c73a507b03c5d0b6936d0a891b9 Mon Sep 17 00:00:00 2001 From: notmasteryet Date: Thu, 5 Jan 2012 18:39:48 -0600 Subject: [PATCH 6/7] Fix thumbnail's drawingRequired --- web/viewer.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/web/viewer.js b/web/viewer.js index d9ef9b646..c0dcbfb08 100644 --- a/web/viewer.js +++ b/web/viewer.js @@ -878,6 +878,10 @@ var ThumbnailView = function thumbnailView(container, page, id, pageRatio) { return ctx; } + this.drawingRequired = function thumbnailViewDrawingRequired() { + return !this.hasImage; + }; + this.draw = function thumbnailViewDraw(callback) { if (this.hasImage) { callback(); From a4f257f9405de2ba3092fd1f2e42a1344429eb92 Mon Sep 17 00:00:00 2001 From: Artur Adib Date: Fri, 6 Jan 2012 08:27:23 -0500 Subject: [PATCH 7/7] nit --- web/viewer.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/web/viewer.js b/web/viewer.js index 99c08525c..6db4959cb 100644 --- a/web/viewer.js +++ b/web/viewer.js @@ -1007,11 +1007,10 @@ window.addEventListener('load', function webViewerLoad(evt) { document.getElementById('fileInput').value = null; if ('disableWorker' in params) - PDFJS.disableWorker = params['disableWorker'] === 'true' ? true : false; + PDFJS.disableWorker = (params['disableWorker'] === 'true'); if ('disableTextLayer' in params) - PDFJS.disableTextLayer = params['disableTextLayer'] === 'true' ? - true : false; + PDFJS.disableTextLayer = (params['disableTextLayer'] === 'true'); var sidebarScrollView = document.getElementById('sidebarScrollView'); sidebarScrollView.addEventListener('scroll', updateThumbViewArea, true);