From 17ddf9071e3e88bc0baeb9240e8d07f166fa76a1 Mon Sep 17 00:00:00 2001 From: Andreas Tsouchlos Date: Wed, 25 Mar 2026 11:05:28 +0100 Subject: [PATCH] Kill current rendering task if the user zooms in/out while the page is being re-rendered --- src-tauri/src/pdf_viewer.html | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src-tauri/src/pdf_viewer.html b/src-tauri/src/pdf_viewer.html index a6c1fc8..af8c84f 100644 --- a/src-tauri/src/pdf_viewer.html +++ b/src-tauri/src/pdf_viewer.html @@ -138,12 +138,13 @@ const ZOOM_MIN = 0.1; const ZOOM_MAX = 5.0; - let pdfDoc = null; - let scale = 1.0; // desired display scale - let renderScale = 1.0; // scale at which pagesWrapper canvases are rendered - let renderGen = 0; // incremented on each render to cancel stale passes - let renderTimer = null; - let pagesWrapper = null; // the current #pages-wrapper element + let pdfDoc = null; + let scale = 1.0; // desired display scale + let renderScale = 1.0; // scale at which pagesWrapper canvases are rendered + let renderGen = 0; // incremented on each render to cancel stale passes + let renderTimer = null; + let pagesWrapper = null; // the current #pages-wrapper element + let pendingRenderTask = null; // the active page.render() RenderTask, if any // ── Utilities ────────────────────────────────────────────────────────── @@ -209,6 +210,8 @@ async function renderAll() { if (!pdfDoc) return; + pendingRenderTask?.cancel(); + pendingRenderTask = null; const gen = ++renderGen; const targetScale = scale; @@ -282,6 +285,7 @@ } async function renderPage(wrapper, pageNum, targetScale) { + let task = null; try { const page = await pdfDoc.getPage(pageNum); const vp = page.getViewport({ scale: targetScale * DPR }); @@ -293,9 +297,13 @@ canvas.style.width = Math.round(vp.width / 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) { if (e?.name !== "RenderingCancelledException") console.warn("render:", e); + } finally { + if (pendingRenderTask === task) pendingRenderTask = null; } }