From baab676b00c4999440864738742bc27dfff12d64 Mon Sep 17 00:00:00 2001 From: notmasteryet Date: Thu, 29 Dec 2011 22:53:25 -0600 Subject: [PATCH 01/17] Fix stitching function --- src/function.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/function.js b/src/function.js index 6b0063218..33bdf8642 100644 --- a/src/function.js +++ b/src/function.js @@ -270,7 +270,6 @@ var PDFFunction = (function PDFFunctionClosure() { constructStiched: function pdfFunctionConstructStiched(fn, dict, xref) { var domain = dict.get('Domain'); - var range = dict.get('Range'); if (!domain) error('No domain'); @@ -279,13 +278,13 @@ var PDFFunction = (function PDFFunctionClosure() { if (inputSize != 1) error('Bad domain for stiched function'); - var fnRefs = dict.get('Functions'); + var fnRefs = xref.fetchIfRef(dict.get('Functions')); var fns = []; for (var i = 0, ii = fnRefs.length; i < ii; ++i) fns.push(PDFFunction.getIR(xref, xref.fetchIfRef(fnRefs[i]))); - var bounds = dict.get('Bounds'); - var encode = dict.get('Encode'); + var bounds = xref.fetchIfRef(dict.get('Bounds')); + var encode = xref.fetchIfRef(dict.get('Encode')); return [CONSTRUCT_STICHED, domain, bounds, encode, fns]; }, From e6b0d768fefe4bae7cb858dd598a63072eeff7b9 Mon Sep 17 00:00:00 2001 From: notmasteryet Date: Fri, 30 Dec 2011 15:32:53 -0600 Subject: [PATCH 02/17] Improving typed arrays compatibility support --- web/compatibility.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/web/compatibility.js b/web/compatibility.js index e4e2f2440..66e46b51b 100644 --- a/web/compatibility.js +++ b/web/compatibility.js @@ -5,8 +5,13 @@ // Checking if the typed arrays are supported (function checkTypedArrayCompatibility() { - if (typeof Uint8Array !== 'undefined') + if (typeof Uint8Array !== 'undefined') { + // some mobile version might not support Float64Array + if (typeof Float64Array === 'undefined') + window.Float64Array = Float32Array; + return; + } function subarray(start, end) { return this.slice(start, end); @@ -46,6 +51,8 @@ window.Uint32Array = TypedArray; window.Int32Array = TypedArray; window.Uint16Array = TypedArray; + window.Float32Array = TypedArray; + window.Float64Array = TypedArray; })(); // Object.create() ? From 3f286803d0cad3eacf4f44beed2f13b55995ec90 Mon Sep 17 00:00:00 2001 From: notmasteryet Date: Fri, 30 Dec 2011 16:45:33 -0600 Subject: [PATCH 03/17] Move the media left-top corner to the (0,0) canvas position --- src/canvas.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/canvas.js b/src/canvas.js index 00858c937..7221b72cb 100644 --- a/src/canvas.js +++ b/src/canvas.js @@ -255,6 +255,8 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { } // Scale so that canvas units are the same as PDF user space units this.ctx.scale(cw / mediaBox.width, ch / mediaBox.height); + // Move the media left-top corner to the (0,0) canvas position + this.ctx.translate(-mediaBox.x, -mediaBox.y); this.textDivs = []; this.textLayerQueue = []; }, From 47ab238c4ccdeeda94e52fec7dd6d1f4a0f518f2 Mon Sep 17 00:00:00 2001 From: notmasteryet Date: Fri, 30 Dec 2011 16:55:30 -0600 Subject: [PATCH 04/17] Add external ref test --- test/pdfs/issue1001.pdf.link | 1 + test/test_manifest.json | 7 +++++++ 2 files changed, 8 insertions(+) create mode 100644 test/pdfs/issue1001.pdf.link diff --git a/test/pdfs/issue1001.pdf.link b/test/pdfs/issue1001.pdf.link new file mode 100644 index 000000000..24e1bebc2 --- /dev/null +++ b/test/pdfs/issue1001.pdf.link @@ -0,0 +1 @@ +http://www.myhillsapartment.com/island_club/floorplans/images/links/Island_IC_brochure.pdf diff --git a/test/test_manifest.json b/test/test_manifest.json index 5a1efd75d..8bc000b3d 100644 --- a/test/test_manifest.json +++ b/test/test_manifest.json @@ -356,6 +356,13 @@ "rounds": 1, "type": "eq" }, + { "id": "issue1001", + "file": "pdfs/issue1001.pdf", + "md5": "0f1496e80a82a923e91d9e74c55ad94e", + "rounds": 1, + "link": true, + "type": "eq" + }, { "id": "aboutstacks", "file": "pdfs/aboutstacks.pdf", "md5": "6e7c8416a293ba2d83bc8dd20c6ccf51", From 6672420f8de06585bb7d41b0982079b16043c22c Mon Sep 17 00:00:00 2001 From: notmasteryet Date: Fri, 30 Dec 2011 18:52:15 -0600 Subject: [PATCH 05/17] Fixing CropBox --- src/core.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/core.js b/src/core.js index 26e376327..30da747a4 100644 --- a/src/core.js +++ b/src/core.js @@ -110,9 +110,11 @@ var Page = (function PageClosure() { width: this.width, height: this.height }; + var mediaBox = this.mediaBox; + var offsetX = mediaBox[0], offsetY = mediaBox[1]; if (isArray(obj) && obj.length == 4) { - var tl = this.rotatePoint(obj[0], obj[1]); - var br = this.rotatePoint(obj[2], obj[3]); + var tl = this.rotatePoint(obj[0] - offsetX, obj[1] - offsetY); + var br = this.rotatePoint(obj[2] - offsetX, obj[3] - offsetY); view.x = Math.min(tl.x, br.x); view.y = Math.min(tl.y, br.y); view.width = Math.abs(tl.x - br.x); From 997e094bdcb553838cd8874f75257828b41d0536 Mon Sep 17 00:00:00 2001 From: Julian Viereck Date: Thu, 22 Dec 2011 18:24:13 +0100 Subject: [PATCH 06/17] Add new 'Auto' option for the viewer. --- web/viewer.html | 3 ++- web/viewer.js | 10 ++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/web/viewer.html b/web/viewer.html index 53ca2a247..869bf0f2e 100644 --- a/web/viewer.html +++ b/web/viewer.html @@ -67,10 +67,11 @@ - + +
diff --git a/web/viewer.js b/web/viewer.js index b596de213..12158c4b8 100644 --- a/web/viewer.js +++ b/web/viewer.js @@ -4,7 +4,7 @@ 'use strict'; var kDefaultURL = 'compressed.tracemonkey-pldi-09.pdf'; -var kDefaultScale = 1.5; +var kDefaultScale = 'auto'; var kDefaultScaleDelta = 1.1; var kCacheSize = 20; var kCssUnits = 96.0 / 72.0; @@ -187,6 +187,11 @@ var PDFView = { this.setScale( Math.min(pageWidthScale, pageHeightScale), resetAutoSettings); } + if ('auto' == value) { + this.setScale(Math.min(1.0, pageWidthScale), resetAutoSettings); + } + + selectScaleOption(value); }, zoomIn: function pdfViewZoomIn() { @@ -1000,7 +1005,8 @@ window.addEventListener('webkitTransitionEnd', updateThumbViewArea, true); window.addEventListener('resize', function webViewerResize(evt) { if (document.getElementById('pageWidthOption').selected || - document.getElementById('pageFitOption').selected) + document.getElementById('pageFitOption').selected || + document.getElementById('pageAutoOption').selected) PDFView.parseScale(document.getElementById('scaleSelect').value); updateViewarea(); }); From db627c40825173ae5b9564e6f266c6e2888daef2 Mon Sep 17 00:00:00 2001 From: Julian Viereck Date: Thu, 22 Dec 2011 19:02:52 +0100 Subject: [PATCH 07/17] Ignore new scale value if it's the same as before --- web/viewer.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/web/viewer.js b/web/viewer.js index 12158c4b8..441a36a92 100644 --- a/web/viewer.js +++ b/web/viewer.js @@ -149,6 +149,9 @@ var PDFView = { initialBookmark: document.location.hash.substring(1), setScale: function pdfViewSetScale(val, resetAutoSettings) { + if (val == this.currentScale) + return; + var pages = this.pages; for (var i = 0; i < pages.length; i++) pages[i].update(val * kCssUnits); From 0c22e5d653369631504b35af8322a83a05683054 Mon Sep 17 00:00:00 2001 From: Julian Viereck Date: Thu, 22 Dec 2011 19:02:10 +0100 Subject: [PATCH 08/17] Make sure resolving the promise sets some data --- src/util.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/util.js b/src/util.js index 57dbca4bb..4d8918e48 100644 --- a/src/util.js +++ b/src/util.js @@ -284,7 +284,7 @@ var Promise = (function PromiseClosure() { } this.isResolved = true; - this.data = data; + this.data = data || null; var callbacks = this.callbacks; for (var i = 0, ii = callbacks.length; i < ii; i++) { From 52aba8648ebd2f6f9de99e15343b1513160622fe Mon Sep 17 00:00:00 2001 From: Julian Viereck Date: Thu, 22 Dec 2011 19:04:53 +0100 Subject: [PATCH 09/17] Add displayReadyPromise to the Page object to not request the IRQueue all the time and simplify some stuff --- src/core.js | 38 ++++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/src/core.js b/src/core.js index 6a0c82aa6..8b5fbea75 100644 --- a/src/core.js +++ b/src/core.js @@ -70,8 +70,7 @@ var Page = (function PageClosure() { this.xref = xref; this.ref = ref; - this.ctx = null; - this.callback = null; + this.displayReadyPromise = null; } Page.prototype = { @@ -167,20 +166,12 @@ var Page = (function PageClosure() { IRQueue, fonts) { var self = this; this.IRQueue = IRQueue; - var gfx = new CanvasGraphics(this.ctx, this.objs, this.textLayer); var displayContinuation = function pageDisplayContinuation() { // Always defer call to display() to work around bug in // Firefox error reporting from XHR callbacks. setTimeout(function pageSetTimeout() { - try { - self.display(gfx, self.callback); - } catch (e) { - if (self.callback) - self.callback(e); - else - throw e; - } + self.displayReadyPromise.resolve(); }); }; @@ -397,12 +388,27 @@ var Page = (function PageClosure() { return items; }, startRendering: function pageStartRendering(ctx, callback, textLayer) { - this.ctx = ctx; - this.callback = callback; - this.textLayer = textLayer; - this.startRenderingTime = Date.now(); - this.pdf.startRendering(this); + + // If there is no displayReadyPromise yet, then the IRQueue was never + // requested before. Make the request and create the promise. + if (!this.displayReadyPromise) { + this.pdf.startRendering(this); + this.displayReadyPromise = new Promise(); + } + + // Once the IRQueue and fonts are loaded, perform the actual rendering. + this.displayReadyPromise.then(function pageDisplayReadyPromise() { + var gfx = new CanvasGraphics(ctx, this.objs, textLayer); + try { + this.display(gfx, callback); + } catch (e) { + if (self.callback) + self.callback(e); + else + throw e; + } + }.bind(this)); } }; From c82b2faa0e064add7d04f21d8325bb127504ba1e Mon Sep 17 00:00:00 2001 From: Julian Viereck Date: Thu, 22 Dec 2011 19:41:17 +0100 Subject: [PATCH 10/17] Remove brakets --- web/viewer.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/web/viewer.js b/web/viewer.js index 441a36a92..648556dcb 100644 --- a/web/viewer.js +++ b/web/viewer.js @@ -190,9 +190,8 @@ var PDFView = { this.setScale( Math.min(pageWidthScale, pageHeightScale), resetAutoSettings); } - if ('auto' == value) { + if ('auto' == value) this.setScale(Math.min(1.0, pageWidthScale), resetAutoSettings); - } selectScaleOption(value); }, From b4a42930d684f6f431feb6c2434a2de5e300d0ca Mon Sep 17 00:00:00 2001 From: Julian Viereck Date: Mon, 2 Jan 2012 20:09:38 +0100 Subject: [PATCH 11/17] Add selectScaleOption function back, that seems to got lost during rebaseing --- web/viewer.js | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/web/viewer.js b/web/viewer.js index 648556dcb..68cd62e29 100644 --- a/web/viewer.js +++ b/web/viewer.js @@ -1045,6 +1045,21 @@ window.addEventListener('change', function webViewerChange(evt) { document.getElementById('download').setAttribute('hidden', 'true'); }, true); +function selectScaleOption(value) { + var options = document.getElementById('scaleSelect').options; + var predefinedValueFound = false; + for (var i = 0; i < options.length; i++) { + var option = options[i]; + if (option.value != value) { + option.selected = false; + continue; + } + option.selected = true; + predefinedValueFound = true; + } + return predefinedValueFound; +} + window.addEventListener('scalechange', function scalechange(evt) { var customScaleOption = document.getElementById('customScaleOption'); customScaleOption.selected = false; @@ -1056,19 +1071,7 @@ window.addEventListener('scalechange', function scalechange(evt) { return; } - var options = document.getElementById('scaleSelect').options; - var predefinedValueFound = false; - var value = '' + evt.scale; - for (var i = 0; i < options.length; i++) { - var option = options[i]; - if (option.value != value) { - option.selected = false; - continue; - } - option.selected = true; - predefinedValueFound = true; - } - + var predefinedValueFound = selectScaleOption('' + evt.scale); if (!predefinedValueFound) { customScaleOption.textContent = Math.round(evt.scale * 10000) / 100 + '%'; customScaleOption.selected = true; From 2f563dbd2b111e216d9ac5eac6bd2a508a12ea21 Mon Sep 17 00:00:00 2001 From: Julian Viereck Date: Mon, 2 Jan 2012 20:15:45 +0100 Subject: [PATCH 12/17] Treat `zoom` such that it can be a string value as well. --- web/viewer.js | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/web/viewer.js b/web/viewer.js index 68cd62e29..ab24cc46f 100644 --- a/web/viewer.js +++ b/web/viewer.js @@ -146,6 +146,7 @@ var PDFView = { pages: [], thumbnails: [], currentScale: 0, + currentScaleValue: null, initialBookmark: document.location.hash.substring(1), setScale: function pdfViewSetScale(val, resetAutoSettings) { @@ -172,6 +173,7 @@ var PDFView = { return; var scale = parseFloat(value); + this.currentScaleValue = value; if (scale) { this.setScale(scale, true); return; @@ -470,8 +472,16 @@ var PDFView = { if ('zoom' in params) { var zoomArgs = params.zoom.split(','); // scale,left,top // building destination array + + // If the zoom value, it has to get divided by 100. If it is a string, + // it should stay as it is. + var zoomArg = zoomArgs[0]; + var zoomArgNumber = parseFloat(zoomArg); + if (zoomArgNumber) + zoomArg = zoomArgNumber / 100; + var dest = [null, {name: 'XYZ'}, (zoomArgs[1] | 0), - (zoomArgs[2] | 0), (zoomArgs[0] | 0) / 100]; + (zoomArgs[2] | 0), zoomArg]; var currentPage = this.pages[pageNumber - 1]; currentPage.scrollIntoView(dest); } else @@ -959,10 +969,15 @@ function updateViewarea() { PDFView.page = firstPage.id; updateViewarea.inProgress = false; + var currentScale = PDFView.currentScale; + var currentScaleValue = PDFView.currentScaleValue; + var normalizedScaleValue = currentScaleValue == currentScale ? + currentScale * 100 : currentScaleValue; + var kViewerTopMargin = 52; var pageNumber = firstPage.id; var pdfOpenParams = '#page=' + pageNumber; - pdfOpenParams += '&zoom=' + Math.round(PDFView.currentScale * 100); + pdfOpenParams += '&zoom=' + normalizedScaleValue; var currentPage = PDFView.pages[pageNumber - 1]; var topLeft = currentPage.getPagePoint(window.pageXOffset, window.pageYOffset - firstPage.y - kViewerTopMargin); @@ -971,7 +986,7 @@ function updateViewarea() { var store = PDFView.store; store.set('exists', true); store.set('page', pageNumber); - store.set('zoom', Math.round(PDFView.currentScale * 100)); + store.set('zoom', normalizedScaleValue); store.set('scrollLeft', Math.round(topLeft.x)); store.set('scrollTop', Math.round(topLeft.y)); From 03e39363b61492e47cb9621616e6756f200f357d Mon Sep 17 00:00:00 2001 From: Christian Legnitto Date: Mon, 2 Jan 2012 21:40:43 -0800 Subject: [PATCH 13/17] Add the style element to the head rather than first element in the document, as the first element could be a comment and this would line would then throw --- src/fonts.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fonts.js b/src/fonts.js index 83ce4abaa..1b959d6c2 100644 --- a/src/fonts.js +++ b/src/fonts.js @@ -2092,7 +2092,7 @@ var Font = (function FontClosure() { window.btoa(data) + ');'); var rule = "@font-face { font-family:'" + fontName + "';src:" + url + '}'; - document.documentElement.firstChild.appendChild( + document.documentElement.getElementsByTagName('head')[0].appendChild( document.createElement('style')); var styleSheet = document.styleSheets[document.styleSheets.length - 1]; From 86387272fc1eceb4de5c4d30aebf105a91ef0678 Mon Sep 17 00:00:00 2001 From: Artur Adib Date: Tue, 3 Jan 2012 14:51:35 -0500 Subject: [PATCH 14/17] webkit dash support --- src/canvas.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/canvas.js b/src/canvas.js index 7221b72cb..4797bab46 100644 --- a/src/canvas.js +++ b/src/canvas.js @@ -361,6 +361,8 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { setDash: function canvasGraphicsSetDash(dashArray, dashPhase) { this.ctx.mozDash = dashArray; this.ctx.mozDashOffset = dashPhase; + this.ctx.webkitLineDash = dashArray; + this.ctx.webkitLineDashOffset = dashPhase; }, setRenderingIntent: function canvasGraphicsSetRenderingIntent(intent) { TODO('set rendering intent: ' + intent); From 9157597175822fba5ebc0b09827abbd31062a8a9 Mon Sep 17 00:00:00 2001 From: Julian Viereck Date: Tue, 3 Jan 2012 22:48:32 +0100 Subject: [PATCH 15/17] Fix lint error --- web/viewer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/viewer.js b/web/viewer.js index ab24cc46f..53eea005c 100644 --- a/web/viewer.js +++ b/web/viewer.js @@ -1086,7 +1086,7 @@ window.addEventListener('scalechange', function scalechange(evt) { return; } - var predefinedValueFound = selectScaleOption('' + evt.scale); + var predefinedValueFound = selectScaleOption('' + evt.scale); if (!predefinedValueFound) { customScaleOption.textContent = Math.round(evt.scale * 10000) / 100 + '%'; customScaleOption.selected = true; From 219a60175cd134b0f3615fa8b18e4843b78b68c1 Mon Sep 17 00:00:00 2001 From: notmasteryet Date: Tue, 3 Jan 2012 19:11:25 -0600 Subject: [PATCH 16/17] Fix blank unopened document regression --- web/viewer.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/web/viewer.js b/web/viewer.js index 53eea005c..1c3d9c79c 100644 --- a/web/viewer.js +++ b/web/viewer.js @@ -444,7 +444,7 @@ var PDFView = { else if (storedHash) this.setHash(storedHash); else { - this.setScale(scale || kDefaultScale, true); + this.parseScale(scale || kDefaultScale, true); this.page = 1; } }, @@ -934,7 +934,7 @@ window.addEventListener('load', function webViewerLoad(evt) { params[unescape(param[0])] = unescape(param[1]); } - var scale = ('scale' in params) ? params.scale : kDefaultScale; + var scale = ('scale' in params) ? params.scale : 0; PDFView.open(params.file || kDefaultURL, parseFloat(scale)); if (!window.File || !window.FileReader || !window.FileList || !window.Blob) @@ -1081,7 +1081,8 @@ window.addEventListener('scalechange', function scalechange(evt) { if (!evt.resetAutoSettings && (document.getElementById('pageWidthOption').selected || - document.getElementById('pageFitOption').selected)) { + document.getElementById('pageFitOption').selected || + document.getElementById('pageAutoOption').selected)) { updateViewarea(); return; } From 496e598813b1ab1e567d47d299d672a4963d2ee5 Mon Sep 17 00:00:00 2001 From: Julian Viereck Date: Wed, 4 Jan 2012 09:24:09 +0100 Subject: [PATCH 17/17] Reset scale value on opening new file --- web/viewer.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/web/viewer.js b/web/viewer.js index 1c3d9c79c..f561ed12e 100644 --- a/web/viewer.js +++ b/web/viewer.js @@ -437,6 +437,10 @@ var PDFView = { this.switchSidebarView('outline'); } + // Reset the current scale, as otherwise the page's scale might not get + // updated if the zoom level stayed the same. + this.currentScale = 0; + this.currentScaleValue = null; if (this.initialBookmark) { this.setHash(this.initialBookmark); this.initialBookmark = null;