[PDFThumbnailView] Re-factor the canvas
to image
conversion such that we always render to a canvas
, and then replace it with an image
once rendering is done
*This is a follow-up to PRs 6299 and 6441.* The patch also adds an option to `PDFThumbnailView`, that disables the canvas-to-image conversion entirely, which might be useful in the context of issue 7026.
This commit is contained in:
parent
0c19d84911
commit
b5582e14a9
@ -26,6 +26,9 @@ var THUMBNAIL_CANVAS_BORDER_WIDTH = 1; // px
|
|||||||
* @property {PageViewport} defaultViewport - The page viewport.
|
* @property {PageViewport} defaultViewport - The page viewport.
|
||||||
* @property {IPDFLinkService} linkService - The navigation/linking service.
|
* @property {IPDFLinkService} linkService - The navigation/linking service.
|
||||||
* @property {PDFRenderingQueue} renderingQueue - The rendering queue object.
|
* @property {PDFRenderingQueue} renderingQueue - The rendering queue object.
|
||||||
|
* @property {boolean} disableCanvasToImageConversion - (optional) Don't convert
|
||||||
|
* the canvas thumbnails to images. This prevents `toDataURL` calls,
|
||||||
|
* but increases the overall memory usage. The default value is false.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -43,7 +46,7 @@ var PDFThumbnailView = (function PDFThumbnailViewClosure() {
|
|||||||
tempCanvas.height = height;
|
tempCanvas.height = height;
|
||||||
|
|
||||||
// Since this is a temporary canvas, we need to fill the canvas with a white
|
// Since this is a temporary canvas, we need to fill the canvas with a white
|
||||||
// background ourselves. |_getPageDrawContext| uses CSS rules for this.
|
// background ourselves. `_getPageDrawContext` uses CSS rules for this.
|
||||||
//#if MOZCENTRAL || FIREFOX || GENERIC
|
//#if MOZCENTRAL || FIREFOX || GENERIC
|
||||||
tempCanvas.mozOpaque = true;
|
tempCanvas.mozOpaque = true;
|
||||||
//#endif
|
//#endif
|
||||||
@ -65,6 +68,8 @@ var PDFThumbnailView = (function PDFThumbnailViewClosure() {
|
|||||||
var defaultViewport = options.defaultViewport;
|
var defaultViewport = options.defaultViewport;
|
||||||
var linkService = options.linkService;
|
var linkService = options.linkService;
|
||||||
var renderingQueue = options.renderingQueue;
|
var renderingQueue = options.renderingQueue;
|
||||||
|
var disableCanvasToImageConversion =
|
||||||
|
options.disableCanvasToImageConversion || false;
|
||||||
|
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.renderingId = 'thumbnail' + id;
|
this.renderingId = 'thumbnail' + id;
|
||||||
@ -79,6 +84,7 @@ var PDFThumbnailView = (function PDFThumbnailViewClosure() {
|
|||||||
|
|
||||||
this.resume = null;
|
this.resume = null;
|
||||||
this.renderingState = RenderingStates.INITIAL;
|
this.renderingState = RenderingStates.INITIAL;
|
||||||
|
this.disableCanvasToImageConversion = disableCanvasToImageConversion;
|
||||||
|
|
||||||
this.pageWidth = this.viewport.width;
|
this.pageWidth = this.viewport.width;
|
||||||
this.pageHeight = this.viewport.height;
|
this.pageHeight = this.viewport.height;
|
||||||
@ -183,6 +189,8 @@ var PDFThumbnailView = (function PDFThumbnailViewClosure() {
|
|||||||
_getPageDrawContext:
|
_getPageDrawContext:
|
||||||
function PDFThumbnailView_getPageDrawContext(noCtxScale) {
|
function PDFThumbnailView_getPageDrawContext(noCtxScale) {
|
||||||
var canvas = document.createElement('canvas');
|
var canvas = document.createElement('canvas');
|
||||||
|
// Keep the no-thumbnail outline visible, i.e. `data-loaded === false`,
|
||||||
|
// until rendering/image conversion is complete, to avoid display issues.
|
||||||
this.canvas = canvas;
|
this.canvas = canvas;
|
||||||
|
|
||||||
//#if MOZCENTRAL || FIREFOX || GENERIC
|
//#if MOZCENTRAL || FIREFOX || GENERIC
|
||||||
@ -199,18 +207,6 @@ var PDFThumbnailView = (function PDFThumbnailViewClosure() {
|
|||||||
if (!noCtxScale && outputScale.scaled) {
|
if (!noCtxScale && outputScale.scaled) {
|
||||||
ctx.scale(outputScale.sx, outputScale.sy);
|
ctx.scale(outputScale.sx, outputScale.sy);
|
||||||
}
|
}
|
||||||
|
|
||||||
var image = document.createElement('img');
|
|
||||||
this.image = image;
|
|
||||||
|
|
||||||
image.id = this.renderingId;
|
|
||||||
image.className = 'thumbnailImage';
|
|
||||||
image.setAttribute('aria-label', mozL10n.get('thumb_page_canvas',
|
|
||||||
{ page: this.id }, 'Thumbnail of Page {{page}}'));
|
|
||||||
|
|
||||||
image.style.width = canvas.style.width;
|
|
||||||
image.style.height = canvas.style.height;
|
|
||||||
|
|
||||||
return ctx;
|
return ctx;
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -221,10 +217,36 @@ var PDFThumbnailView = (function PDFThumbnailViewClosure() {
|
|||||||
if (!this.canvas) {
|
if (!this.canvas) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this.image.src = this.canvas.toDataURL();
|
if (this.renderingState !== RenderingStates.FINISHED) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var id = this.renderingId;
|
||||||
|
var className = 'thumbnailImage';
|
||||||
|
var ariaLabel = mozL10n.get('thumb_page_canvas', { page: this.id },
|
||||||
|
'Thumbnail of Page {{page}}');
|
||||||
|
|
||||||
|
if (this.disableCanvasToImageConversion) {
|
||||||
|
this.canvas.id = id;
|
||||||
|
this.canvas.className = className;
|
||||||
|
this.canvas.setAttribute('aria-label', ariaLabel);
|
||||||
|
|
||||||
|
this.div.setAttribute('data-loaded', true);
|
||||||
|
this.ring.appendChild(this.canvas);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var image = document.createElement('img');
|
||||||
|
image.id = id;
|
||||||
|
image.className = className;
|
||||||
|
image.setAttribute('aria-label', ariaLabel);
|
||||||
|
|
||||||
|
image.style.width = this.canvasWidth + 'px';
|
||||||
|
image.style.height = this.canvasHeight + 'px';
|
||||||
|
|
||||||
|
image.src = this.canvas.toDataURL();
|
||||||
|
this.image = image;
|
||||||
|
|
||||||
this.div.setAttribute('data-loaded', true);
|
this.div.setAttribute('data-loaded', true);
|
||||||
this.ring.appendChild(this.image);
|
this.ring.appendChild(image);
|
||||||
|
|
||||||
// Zeroing the width and height causes Firefox to release graphics
|
// Zeroing the width and height causes Firefox to release graphics
|
||||||
// resources immediately, which can greatly reduce memory consumption.
|
// resources immediately, which can greatly reduce memory consumption.
|
||||||
|
@ -147,7 +147,8 @@ var PDFThumbnailViewer = (function PDFThumbnailViewerClosure() {
|
|||||||
id: pageNum,
|
id: pageNum,
|
||||||
defaultViewport: viewport.clone(),
|
defaultViewport: viewport.clone(),
|
||||||
linkService: this.linkService,
|
linkService: this.linkService,
|
||||||
renderingQueue: this.renderingQueue
|
renderingQueue: this.renderingQueue,
|
||||||
|
disableCanvasToImageConversion: false,
|
||||||
});
|
});
|
||||||
this.thumbnails.push(thumbnail);
|
this.thumbnails.push(thumbnail);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user