From 997e094bdcb553838cd8874f75257828b41d0536 Mon Sep 17 00:00:00 2001 From: Julian Viereck Date: Thu, 22 Dec 2011 18:24:13 +0100 Subject: [PATCH 1/8] 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 2/8] 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 3/8] 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 4/8] 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 5/8] 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 6/8] 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 7/8] 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 9157597175822fba5ebc0b09827abbd31062a8a9 Mon Sep 17 00:00:00 2001 From: Julian Viereck Date: Tue, 3 Jan 2012 22:48:32 +0100 Subject: [PATCH 8/8] 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;