1
0
Fork 0
mirror of https://github.com/mozilla/pdf.js.git synced 2025-04-19 14:48:08 +02:00

Merge pull request #19661 from Snuffleupagus/thumbnails-inline-finishRenderTask

Inline the `PDFThumbnailView.prototype.#finishRenderTask`  helper method
This commit is contained in:
Tim van der Meij 2025-03-15 18:46:26 +01:00 committed by GitHub
commit 23972e1946
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -31,6 +31,13 @@ const DRAW_UPSCALE_FACTOR = 2; // See comment in `PDFThumbnailView.draw` below.
const MAX_NUM_SCALING_STEPS = 3;
const THUMBNAIL_WIDTH = 98; // px
function zeroCanvas(c) {
// Zeroing the width and height causes Firefox to release graphics
// resources immediately, which can greatly reduce memory consumption.
c.width = 0;
c.height = 0;
}
/**
* @typedef {Object} PDFThumbnailViewOptions
* @property {HTMLDivElement} container - The viewer element.
@ -74,12 +81,8 @@ class TempImageFactory {
}
static destroyCanvas() {
const tempCanvas = this.#tempCanvas;
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;
if (this.#tempCanvas) {
zeroCanvas(this.#tempCanvas);
}
this.#tempCanvas = null;
}
@ -255,37 +258,15 @@ class PDFThumbnailView {
this.div.setAttribute("data-loaded", true);
this._placeholderImg.replaceWith(image);
// Zeroing the width and height causes Firefox to release graphics
// resources immediately, which can greatly reduce memory consumption.
reducedCanvas.width = 0;
reducedCanvas.height = 0;
}
async #finishRenderTask(renderTask, canvas, error = null) {
// The renderTask may have been replaced by a new one, so only remove
// the reference to the renderTask if it matches the one that is
// triggering this callback.
if (renderTask === this.renderTask) {
this.renderTask = null;
}
if (error instanceof RenderingCancelledException) {
return;
}
this.renderingState = RenderingStates.FINISHED;
this.#convertCanvasToImage(canvas);
if (error) {
throw error;
}
zeroCanvas(reducedCanvas);
}
async draw() {
if (this.renderingState !== RenderingStates.INITIAL) {
console.error("Must be in new state before drawing");
return undefined;
return;
}
const { pdfPage } = this;
const { pageColors, pdfPage } = this;
if (!pdfPage) {
this.renderingState = RenderingStates.FINISHED;
@ -321,29 +302,42 @@ class PDFThumbnailView {
transform,
viewport: drawViewport,
optionalContentConfigPromise: this._optionalContentConfigPromise,
pageColors: this.pageColors,
pageColors,
};
const renderTask = (this.renderTask = pdfPage.render(renderContext));
renderTask.onContinue = renderContinueCallback;
const resultPromise = renderTask.promise.then(
() => this.#finishRenderTask(renderTask, canvas),
error => this.#finishRenderTask(renderTask, canvas, error)
);
resultPromise.finally(() => {
// Zeroing the width and height causes Firefox to release graphics
// resources immediately, which can greatly reduce memory consumption.
canvas.width = 0;
canvas.height = 0;
let error = null;
try {
await renderTask.promise;
} catch (e) {
if (e instanceof RenderingCancelledException) {
zeroCanvas(canvas);
return;
}
error = e;
} finally {
// The renderTask may have been replaced by a new one, so only remove
// the reference to the renderTask if it matches the one that is
// triggering this callback.
if (renderTask === this.renderTask) {
this.renderTask = null;
}
}
this.renderingState = RenderingStates.FINISHED;
this.eventBus.dispatch("thumbnailrendered", {
source: this,
pageNumber: this.id,
pdfPage: this.pdfPage,
});
this.#convertCanvasToImage(canvas);
zeroCanvas(canvas);
this.eventBus.dispatch("thumbnailrendered", {
source: this,
pageNumber: this.id,
pdfPage,
});
return resultPromise;
if (error) {
throw error;
}
}
setImage(pageView) {
@ -366,8 +360,8 @@ class PDFThumbnailView {
}
#getReducedImageDims(canvas) {
let reducedWidth = canvas.width << MAX_NUM_SCALING_STEPS,
reducedHeight = canvas.height << MAX_NUM_SCALING_STEPS;
const width = canvas.width << MAX_NUM_SCALING_STEPS,
height = canvas.height << MAX_NUM_SCALING_STEPS;
const outputScale = new OutputScale();
// Here we're not actually "rendering" to the canvas and the `OutputScale`
@ -375,15 +369,12 @@ class PDFThumbnailView {
outputScale.sx = outputScale.sy = 1;
outputScale.limitCanvas(
reducedWidth,
reducedHeight,
width,
height,
this.maxCanvasPixels,
this.maxCanvasDim
);
reducedWidth = (reducedWidth * outputScale.sx) | 0;
reducedHeight = (reducedHeight * outputScale.sy) | 0;
return [reducedWidth, reducedHeight];
return [(width * outputScale.sx) | 0, (height * outputScale.sy) | 0];
}
#reduceImage(img) {