diff --git a/web/pdf_thumbnail_view.js b/web/pdf_thumbnail_view.js index 6d4aca892..de9e885d1 100644 --- a/web/pdf_thumbnail_view.js +++ b/web/pdf_thumbnail_view.js @@ -32,35 +32,52 @@ var THUMBNAIL_CANVAS_BORDER_WIDTH = 1; // px * but increases the overall memory usage. The default value is false. */ +const TempImageFactory = (function TempImageFactoryClosure() { + let tempCanvasCache = null; + + return { + getCanvas(width, height) { + let tempCanvas = tempCanvasCache; + if (!tempCanvas) { + tempCanvas = document.createElement('canvas'); + tempCanvasCache = tempCanvas; + } + tempCanvas.width = width; + tempCanvas.height = height; + + // Since this is a temporary canvas, we need to fill it with a white + // background ourselves. `_getPageDrawContext` uses CSS rules for this. + if (typeof PDFJSDev === 'undefined' || + PDFJSDev.test('MOZCENTRAL || FIREFOX || GENERIC')) { + tempCanvas.mozOpaque = true; + } + + let ctx = tempCanvas.getContext('2d', { alpha: false, }); + ctx.save(); + ctx.fillStyle = 'rgb(255, 255, 255)'; + ctx.fillRect(0, 0, width, height); + ctx.restore(); + return tempCanvas; + }, + + destroyCanvas() { + let tempCanvas = tempCanvasCache; + if (tempCanvas) { + // Zeroing the width and height causes Firefox to release graphics + // resources immediately, which can greatly reduce memory consumption. + tempCanvas.width = 0; + tempCanvas.height = 0; + } + tempCanvasCache = null; + }, + }; +})(); + /** * @class * @implements {IRenderableView} */ var PDFThumbnailView = (function PDFThumbnailViewClosure() { - function getTempCanvas(width, height) { - var tempCanvas = PDFThumbnailView.tempImageCache; - if (!tempCanvas) { - tempCanvas = document.createElement('canvas'); - PDFThumbnailView.tempImageCache = tempCanvas; - } - tempCanvas.width = width; - tempCanvas.height = height; - - // Since this is a temporary canvas, we need to fill the canvas with a white - // background ourselves. `_getPageDrawContext` uses CSS rules for this. - if (typeof PDFJSDev === 'undefined' || - PDFJSDev.test('MOZCENTRAL || FIREFOX || GENERIC')) { - tempCanvas.mozOpaque = true; - } - - var ctx = tempCanvas.getContext('2d', {alpha: false}); - ctx.save(); - ctx.fillStyle = 'rgb(255, 255, 255)'; - ctx.fillRect(0, 0, width, height); - ctx.restore(); - return tempCanvas; - } - /** * @constructs PDFThumbnailView * @param {PDFThumbnailViewOptions} options @@ -358,7 +375,8 @@ var PDFThumbnailView = (function PDFThumbnailViewClosure() { var MAX_NUM_SCALING_STEPS = 3; var reducedWidth = canvas.width << MAX_NUM_SCALING_STEPS; var reducedHeight = canvas.height << MAX_NUM_SCALING_STEPS; - var reducedImage = getTempCanvas(reducedWidth, reducedHeight); + var reducedImage = TempImageFactory.getCanvas(reducedWidth, + reducedHeight); var reducedImageCtx = reducedImage.getContext('2d'); while (reducedWidth > img.width || reducedHeight > img.height) { @@ -405,11 +423,13 @@ var PDFThumbnailView = (function PDFThumbnailViewClosure() { }, }; + PDFThumbnailView.cleanup = function() { + TempImageFactory.destroyCanvas(); + }; + return PDFThumbnailView; })(); -PDFThumbnailView.tempImageCache = null; - export { PDFThumbnailView, }; diff --git a/web/pdf_thumbnail_viewer.js b/web/pdf_thumbnail_viewer.js index d1c1d81a4..fbc7f80e4 100644 --- a/web/pdf_thumbnail_viewer.js +++ b/web/pdf_thumbnail_viewer.js @@ -104,14 +104,7 @@ var PDFThumbnailViewer = (function PDFThumbnailViewerClosure() { }, cleanup: function PDFThumbnailViewer_cleanup() { - var tempCanvas = PDFThumbnailView.tempImageCache; - if (tempCanvas) { - // Zeroing the width and height causes Firefox to release graphics - // resources immediately, which can greatly reduce memory consumption. - tempCanvas.width = 0; - tempCanvas.height = 0; - } - PDFThumbnailView.tempImageCache = null; + PDFThumbnailView.cleanup(); }, /**