From 1ae9ba1d6464870e1431fb998a946266c60c01a7 Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Wed, 23 Sep 2015 12:34:24 +0200 Subject: [PATCH 1/2] Don't clear the `canvas` until re-rendering is finished when the `scale` or `rotation` is changed (issue 6467) *This regressed in PR 4920.* The main motivation for PR 4920 was to quickly get rid of old canvases when pages are evicted from the `PDFPageViewBuffer` cache. However it inadvertently broke the use-case where the `canvas` is used as a preview, on scale or rotation changes, until the re-rendering is finished. Fixes 6467. --- web/pdf_page_view.js | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/web/pdf_page_view.js b/web/pdf_page_view.js index fc68ee04d..f408fafd1 100644 --- a/web/pdf_page_view.js +++ b/web/pdf_page_view.js @@ -105,7 +105,7 @@ var PDFPageView = (function PDFPageViewClosure() { } }, - reset: function PDFPageView_reset(keepAnnotations) { + reset: function PDFPageView_reset(keepZoomLayer, keepAnnotations) { if (this.renderTask) { this.renderTask.cancel(); } @@ -117,12 +117,12 @@ var PDFPageView = (function PDFPageViewClosure() { div.style.height = Math.floor(this.viewport.height) + 'px'; var childNodes = div.childNodes; - var currentZoomLayer = this.zoomLayer || null; + var currentZoomLayerNode = (keepZoomLayer && this.zoomLayer) || null; var currentAnnotationNode = (keepAnnotations && this.annotationLayer && this.annotationLayer.div) || null; for (var i = childNodes.length - 1; i >= 0; i--) { var node = childNodes[i]; - if (currentZoomLayer === node || currentAnnotationNode === node) { + if (currentZoomLayerNode === node || currentAnnotationNode === node) { continue; } div.removeChild(node); @@ -139,7 +139,7 @@ var PDFPageView = (function PDFPageViewClosure() { this.annotationLayer = null; } - if (this.canvas) { + if (this.canvas && !currentZoomLayerNode) { // Zeroing the width and height causes Firefox to release graphics // resources immediately, which can greatly reduce memory consumption. this.canvas.width = 0; @@ -190,7 +190,7 @@ var PDFPageView = (function PDFPageViewClosure() { if (this.zoomLayer) { this.cssTransform(this.zoomLayer.firstChild); } - this.reset(true); + this.reset(/* keepZoomLayer = */ true, true); }, /** @@ -401,6 +401,12 @@ var PDFPageView = (function PDFPageViewClosure() { } if (self.zoomLayer) { + // Zeroing the width and height causes Firefox to release graphics + // resources immediately, which can greatly reduce memory consumption. + var zoomLayerCanvas = self.zoomLayer.firstChild; + zoomLayerCanvas.width = 0; + zoomLayerCanvas.height = 0; + div.removeChild(self.zoomLayer); self.zoomLayer = null; } From 5e7ce9d62d716ce30ca84bf5aa154d323a17d030 Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Wed, 23 Sep 2015 12:52:55 +0200 Subject: [PATCH 2/2] Fix incorrect indentation, and remove `else` after `return`, in `PDFPageView_update` --- web/pdf_page_view.js | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/web/pdf_page_view.js b/web/pdf_page_view.js index f408fafd1..725acbdfb 100644 --- a/web/pdf_page_view.js +++ b/web/pdf_page_view.js @@ -178,19 +178,21 @@ var PDFPageView = (function PDFPageViewClosure() { } } - if (this.canvas && - (PDFJS.useOnlyCssZoom || - (this.hasRestrictedScaling && isScalingRestricted))) { - this.cssTransform(this.canvas, true); - return; - } else if (this.canvas && !this.zoomLayer) { - this.zoomLayer = this.canvas.parentNode; - this.zoomLayer.style.position = 'absolute'; + if (this.canvas) { + if (PDFJS.useOnlyCssZoom || + (this.hasRestrictedScaling && isScalingRestricted)) { + this.cssTransform(this.canvas, true); + return; + } + if (!this.zoomLayer) { + this.zoomLayer = this.canvas.parentNode; + this.zoomLayer.style.position = 'absolute'; + } } if (this.zoomLayer) { this.cssTransform(this.zoomLayer.firstChild); } - this.reset(/* keepZoomLayer = */ true, true); + this.reset(/* keepZoomLayer = */ true, /* keepAnnotations = */ true); }, /**