This commit is contained in:
Timothy Jaeryang Baek
2026-03-01 14:44:12 -06:00
parent 5645d5bccc
commit ff9f761d65
@@ -15,6 +15,8 @@
let pdfDoc: any = null; let pdfDoc: any = null;
let pzInstance: PanZoom | null = null; let pzInstance: PanZoom | null = null;
let zoomLevel = 1; let zoomLevel = 1;
let rerenderTimer: ReturnType<typeof setTimeout> | null = null;
let lastRenderedZoom = 1;
const initPanzoom = () => { const initPanzoom = () => {
if (pzInstance) { if (pzInstance) {
@@ -43,6 +45,13 @@
}); });
pzInstance.on('zoom', () => { pzInstance.on('zoom', () => {
zoomLevel = pzInstance?.getTransform()?.scale ?? 1; zoomLevel = pzInstance?.getTransform()?.scale ?? 1;
// Debounced re-render at new resolution so text stays crisp
if (rerenderTimer) clearTimeout(rerenderTimer);
rerenderTimer = setTimeout(() => {
if (Math.abs(zoomLevel - lastRenderedZoom) > 0.05) {
rerenderPages(zoomLevel);
}
}, 300);
}); });
} }
}; };
@@ -68,9 +77,37 @@
pzInstance.moveTo(0, 0); pzInstance.moveTo(0, 0);
pzInstance.zoomAbs(0, 0, 1); pzInstance.zoomAbs(0, 0, 1);
zoomLevel = 1; zoomLevel = 1;
rerenderPages(1);
} }
}; };
// Re-render existing canvases at a new zoom level (preserves panzoom transform)
const rerenderPages = async (forZoom: number) => {
if (!pdfDoc || !sceneElement) return;
const dpr = window.devicePixelRatio || 1;
const containerWidth = outerContainer?.clientWidth || 800;
const canvases = sceneElement.querySelectorAll('canvas');
for (let i = 0; i < canvases.length; i++) {
const page = await pdfDoc.getPage(i + 1);
const viewport = page.getViewport({ scale: 1 });
const cssScale = containerWidth / viewport.width;
const renderScale = cssScale * forZoom * dpr;
const scaledViewport = page.getViewport({ scale: renderScale });
const canvas = canvases[i];
canvas.width = scaledViewport.width;
canvas.height = scaledViewport.height;
const ctx = canvas.getContext('2d');
if (ctx) {
await page.render({ canvasContext: ctx, viewport: scaledViewport }).promise;
}
}
lastRenderedZoom = forZoom;
};
const renderAllPages = async () => { const renderAllPages = async () => {
if (!pdfDoc || !sceneElement) return; if (!pdfDoc || !sceneElement) return;
@@ -110,6 +147,7 @@
}).promise; }).promise;
} }
lastRenderedZoom = 1;
initPanzoom(); initPanzoom();
}; };
@@ -147,6 +185,7 @@
}); });
onDestroy(() => { onDestroy(() => {
if (rerenderTimer) clearTimeout(rerenderTimer);
pzInstance?.dispose(); pzInstance?.dispose();
if (pdfDoc) { if (pdfDoc) {
pdfDoc.destroy(); pdfDoc.destroy();