Avoid triggering rendering multiple times when zooming using the mouse wheel

This commit is contained in:
Jonas 2013-08-26 21:00:35 +02:00
parent 427dd3948b
commit 8630e29054
2 changed files with 39 additions and 14 deletions

View File

@ -1119,12 +1119,14 @@ canvas {
background-color: white; background-color: white;
} }
.page > a { .page > a,
.annotationLayer > a {
display: block; display: block;
position: absolute; position: absolute;
} }
.page > a:hover { .page > a:hover,
.annotationLayer > a:hover {
opacity: 0.2; opacity: 0.2;
background: #ff0; background: #ff0;
box-shadow: 0px 2px 10px #ff0; box-shadow: 0px 2px 10px #ff0;

View File

@ -311,17 +311,23 @@ var PDFView = {
selectScaleOption(value); selectScaleOption(value);
}, },
zoomIn: function pdfViewZoomIn() { zoomIn: function pdfViewZoomIn(ticks) {
var newScale = (this.currentScale * DEFAULT_SCALE_DELTA).toFixed(2); var newScale = this.currentScale;
newScale = Math.ceil(newScale * 10) / 10; do {
newScale = Math.min(MAX_SCALE, newScale); newScale = (newScale * DEFAULT_SCALE_DELTA).toFixed(2);
newScale = Math.ceil(newScale * 10) / 10;
newScale = Math.min(MAX_SCALE, newScale);
} while (--ticks && newScale < MAX_SCALE);
this.parseScale(newScale, true); this.parseScale(newScale, true);
}, },
zoomOut: function pdfViewZoomOut() { zoomOut: function pdfViewZoomOut(ticks) {
var newScale = (this.currentScale / DEFAULT_SCALE_DELTA).toFixed(2); var newScale = this.currentScale;
newScale = Math.floor(newScale * 10) / 10; do {
newScale = Math.max(MIN_SCALE, newScale); newScale = (newScale / DEFAULT_SCALE_DELTA).toFixed(2);
newScale = Math.floor(newScale * 10) / 10;
newScale = Math.max(MIN_SCALE, newScale);
} while (--ticks && newScale > MIN_SCALE);
this.parseScale(newScale, true); this.parseScale(newScale, true);
}, },
@ -1554,6 +1560,8 @@ var PageView = function pageView(container, id, scale,
this.textContent = null; this.textContent = null;
this.textLayer = null; this.textLayer = null;
this.annotationLayer = null;
var anchor = document.createElement('a'); var anchor = document.createElement('a');
anchor.name = '' + this.id; anchor.name = '' + this.id;
@ -1607,6 +1615,8 @@ var PageView = function pageView(container, id, scale,
div.removeChild(div.lastChild); div.removeChild(div.lastChild);
div.removeAttribute('data-loaded'); div.removeAttribute('data-loaded');
this.annotationLayer = null;
delete this.canvas; delete this.canvas;
this.loadingIconDiv = document.createElement('div'); this.loadingIconDiv = document.createElement('div');
@ -1628,7 +1638,9 @@ var PageView = function pageView(container, id, scale,
enumerable: true enumerable: true
}); });
function setupAnnotations(annotationsDiv, pdfPage, viewport) { var self = this;
function setupAnnotations(pageDiv, pdfPage, viewport) {
function bindLink(link, dest) { function bindLink(link, dest) {
link.href = PDFView.getDestinationHash(dest); link.href = PDFView.getDestinationHash(dest);
@ -1687,6 +1699,12 @@ var PageView = function pageView(container, id, scale,
} }
pdfPage.getAnnotations().then(function(annotationsData) { pdfPage.getAnnotations().then(function(annotationsData) {
if (self.annotationLayer) {
// If an annotationLayer already exists, delete it to avoid creating
// duplicate annotations when rapidly re-zooming the document.
pageDiv.removeChild(self.annotationLayer);
self.annotationLayer = null;
}
viewport = viewport.clone({ dontFlip: true }); viewport = viewport.clone({ dontFlip: true });
for (var i = 0; i < annotationsData.length; i++) { for (var i = 0; i < annotationsData.length; i++) {
var data = annotationsData[i]; var data = annotationsData[i];
@ -1725,7 +1743,13 @@ var PageView = function pageView(container, id, scale,
} }
} }
annotationsDiv.appendChild(element); if (!self.annotationLayer) {
var annotationLayerDiv = document.createElement('div');
annotationLayerDiv.className = 'annotationLayer';
pageDiv.appendChild(annotationLayerDiv);
self.annotationLayer = annotationLayerDiv;
}
self.annotationLayer.appendChild(element);
} }
}); });
} }
@ -2554,8 +2578,7 @@ window.addEventListener('DOMMouseScroll', function(evt) {
var ticks = evt.detail; var ticks = evt.detail;
var direction = (ticks > 0) ? 'zoomOut' : 'zoomIn'; var direction = (ticks > 0) ? 'zoomOut' : 'zoomIn';
for (var i = 0, length = Math.abs(ticks); i < length; i++) PDFView[direction](Math.abs(ticks));
PDFView[direction]();
} else if (PDFView.isPresentationMode) { } else if (PDFView.isPresentationMode) {
var FIREFOX_DELTA_FACTOR = -40; var FIREFOX_DELTA_FACTOR = -40;
PDFView.mouseScroll(evt.detail * FIREFOX_DELTA_FACTOR); PDFView.mouseScroll(evt.detail * FIREFOX_DELTA_FACTOR);