Kill current rendering task if the user zooms in/out while the page is being re-rendered
This commit is contained in:
@@ -138,12 +138,13 @@
|
|||||||
const ZOOM_MIN = 0.1;
|
const ZOOM_MIN = 0.1;
|
||||||
const ZOOM_MAX = 5.0;
|
const ZOOM_MAX = 5.0;
|
||||||
|
|
||||||
let pdfDoc = null;
|
let pdfDoc = null;
|
||||||
let scale = 1.0; // desired display scale
|
let scale = 1.0; // desired display scale
|
||||||
let renderScale = 1.0; // scale at which pagesWrapper canvases are rendered
|
let renderScale = 1.0; // scale at which pagesWrapper canvases are rendered
|
||||||
let renderGen = 0; // incremented on each render to cancel stale passes
|
let renderGen = 0; // incremented on each render to cancel stale passes
|
||||||
let renderTimer = null;
|
let renderTimer = null;
|
||||||
let pagesWrapper = null; // the current #pages-wrapper element
|
let pagesWrapper = null; // the current #pages-wrapper element
|
||||||
|
let pendingRenderTask = null; // the active page.render() RenderTask, if any
|
||||||
|
|
||||||
// ── Utilities ──────────────────────────────────────────────────────────
|
// ── Utilities ──────────────────────────────────────────────────────────
|
||||||
|
|
||||||
@@ -209,6 +210,8 @@
|
|||||||
|
|
||||||
async function renderAll() {
|
async function renderAll() {
|
||||||
if (!pdfDoc) return;
|
if (!pdfDoc) return;
|
||||||
|
pendingRenderTask?.cancel();
|
||||||
|
pendingRenderTask = null;
|
||||||
const gen = ++renderGen;
|
const gen = ++renderGen;
|
||||||
const targetScale = scale;
|
const targetScale = scale;
|
||||||
|
|
||||||
@@ -282,6 +285,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function renderPage(wrapper, pageNum, targetScale) {
|
async function renderPage(wrapper, pageNum, targetScale) {
|
||||||
|
let task = null;
|
||||||
try {
|
try {
|
||||||
const page = await pdfDoc.getPage(pageNum);
|
const page = await pdfDoc.getPage(pageNum);
|
||||||
const vp = page.getViewport({ scale: targetScale * DPR });
|
const vp = page.getViewport({ scale: targetScale * DPR });
|
||||||
@@ -293,9 +297,13 @@
|
|||||||
canvas.style.width = Math.round(vp.width / DPR) + "px";
|
canvas.style.width = Math.round(vp.width / DPR) + "px";
|
||||||
canvas.style.height = Math.round(vp.height / DPR) + "px";
|
canvas.style.height = Math.round(vp.height / DPR) + "px";
|
||||||
|
|
||||||
await page.render({ canvasContext: canvas.getContext("2d"), viewport: vp }).promise;
|
task = page.render({ canvasContext: canvas.getContext("2d"), viewport: vp });
|
||||||
|
pendingRenderTask = task;
|
||||||
|
await task.promise;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
if (e?.name !== "RenderingCancelledException") console.warn("render:", e);
|
if (e?.name !== "RenderingCancelledException") console.warn("render:", e);
|
||||||
|
} finally {
|
||||||
|
if (pendingRenderTask === task) pendingRenderTask = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user