fix(dees-pdf-viewer): account for devicePixelRatio when setting canvas dimensions and scale 2D context to render crisp PDF pages and thumbnails on high-DPI displays

This commit is contained in:
2026-01-28 16:17:05 +00:00
parent 25f46162c5
commit 5ddeb8fe7c
3 changed files with 23 additions and 7 deletions

View File

@@ -1,5 +1,13 @@
# Changelog # Changelog
## 2026-01-28 - 3.41.2 - fix(dees-pdf-viewer)
account for devicePixelRatio when setting canvas dimensions and scale 2D context to render crisp PDF pages and thumbnails on high-DPI displays
- Multiply canvas.width and canvas.height by window.devicePixelRatio (dpr) and use Math.floor to set the actual pixel buffer size
- Call ctx.scale(dpr, dpr) so drawing is rendered at device pixels while keeping CSS display size unchanged
- Apply the same high-DPI adjustments to both main page rendering and thumbnail generation
- Keep canvas.style.width and canvas.style.height set to viewport dimensions to preserve layout
## 2026-01-27 - 3.41.1 - fix(dataview-codebox) ## 2026-01-27 - 3.41.1 - fix(dataview-codebox)
fix dees-dataview codebox layout to ensure full-height, proper flex behavior and scrolling; bump internal dependencies fix dees-dataview codebox layout to ensure full-height, proper flex behavior and scrolling; bump internal dependencies

View File

@@ -3,6 +3,6 @@
*/ */
export const commitinfo = { export const commitinfo = {
name: '@design.estate/dees-catalog', name: '@design.estate/dees-catalog',
version: '3.41.1', version: '3.41.2',
description: 'A comprehensive library that provides dynamic web components for building sophisticated and modern web applications using JavaScript and TypeScript.' description: 'A comprehensive library that provides dynamic web components for building sophisticated and modern web applications using JavaScript and TypeScript.'
} }

View File

@@ -444,9 +444,10 @@ export class DeesPdfViewer extends DeesElement {
const page = await this.pdfDocument.getPage(pageNum); const page = await this.pdfDocument.getPage(pageNum);
const viewport = this.computeViewport(page); const viewport = this.computeViewport(page);
// Set canvas dimensions // Set canvas dimensions with device pixel ratio for sharp rendering
canvas.height = viewport.height; const dpr = window.devicePixelRatio || 1;
canvas.width = viewport.width; canvas.width = Math.floor(viewport.width * dpr);
canvas.height = Math.floor(viewport.height * dpr);
canvas.style.width = `${viewport.width}px`; canvas.style.width = `${viewport.width}px`;
canvas.style.height = `${viewport.height}px`; canvas.style.height = `${viewport.height}px`;
@@ -457,6 +458,9 @@ export class DeesPdfViewer extends DeesElement {
return; return;
} }
// Scale context for high-DPI displays
ctx.scale(dpr, dpr);
const renderContext = { const renderContext = {
canvasContext: ctx, canvasContext: ctx,
viewport: viewport, viewport: viewport,
@@ -652,9 +656,10 @@ export class DeesPdfViewer extends DeesElement {
const scale = maxThumbnailWidth / initialViewport.width; const scale = maxThumbnailWidth / initialViewport.width;
const viewport = page.getViewport({ scale }); const viewport = page.getViewport({ scale });
// Set canvas dimensions to actual render size // Set canvas dimensions with device pixel ratio for sharp thumbnails
canvas.width = viewport.width; const dpr = window.devicePixelRatio || 1;
canvas.height = viewport.height; canvas.width = Math.floor(viewport.width * dpr);
canvas.height = Math.floor(viewport.height * dpr);
// Set the display size via style to ensure proper display // Set the display size via style to ensure proper display
canvas.style.width = `${viewport.width}px`; canvas.style.width = `${viewport.width}px`;
@@ -670,6 +675,9 @@ export class DeesPdfViewer extends DeesElement {
continue; continue;
} }
// Scale context for high-DPI displays
context.scale(dpr, dpr);
const renderContext = { const renderContext = {
canvasContext: context, canvasContext: context,
viewport: viewport, viewport: viewport,