From 81681e7914523ec393a947a60415a1779a8110a8 Mon Sep 17 00:00:00 2001 From: Yury Delendik Date: Sun, 27 May 2012 13:50:46 -0500 Subject: [PATCH 1/5] Pre-scale image in the paintImageMaskXObject --- src/canvas.js | 46 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/src/canvas.js b/src/canvas.js index 9d470fbec..b9d8e9e17 100644 --- a/src/canvas.js +++ b/src/canvas.js @@ -1094,6 +1094,40 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { } } } + function rescaleImage(pixels, widthScale, heightScale) { + var scaledWidth = Math.ceil(width / widthScale); + var scaledHeight = Math.ceil(height / heightScale); + + var itemsSum = new Uint32Array(scaledWidth * scaledHeight * 4); + var itemsCount = new Uint32Array(scaledWidth * scaledHeight); + for (var i = 0, position = 0; i < height; i++) { + var lineOffset = (0 | (i / heightScale)) * scaledWidth; + for (var j = 0; j < width; j++) { + var countOffset = lineOffset + (0 | (j / widthScale)); + var sumOffset = countOffset << 2; + itemsSum[sumOffset] += pixels[position]; + itemsSum[sumOffset + 1] += pixels[position + 1]; + itemsSum[sumOffset + 2] += pixels[position + 2]; + itemsSum[sumOffset + 3] += pixels[position + 3]; + itemsCount[countOffset]++; + position += 4; + } + } + var tmpCanvas = createScratchCanvas(scaledWidth, scaledHeight); + var tmpCtx = tmpCanvas.getContext('2d'); + var imgData = tmpCtx.getImageData(0, 0, scaledWidth, scaledHeight); + pixels = imgData.data; + for (var i = 0, j = 0, ii = scaledWidth * scaledHeight; i < ii; i++) { + var count = itemsCount[i]; + pixels[j] = itemsSum[j] / count; + pixels[j + 1] = itemsSum[j + 1] / count; + pixels[j + 2] = itemsSum[j + 2] / count; + pixels[j + 3] = itemsSum[j + 3] / count; + j += 4; + } + tmpCtx.putImageData(imgData, 0, 0); + return tmpCanvas; + } this.save(); @@ -1117,7 +1151,17 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { applyStencilMask(pixels, inverseDecode); tmpCtx.putImageData(imgData, 0, 0); - ctx.drawImage(tmpCanvas, 0, -h); + var currentTransform = ctx.mozCurrentTransformInverse; + var widthScale = Math.max(Math.abs(currentTransform[0]), 1); + var heightScale = Math.max(Math.abs(currentTransform[3]), 1); + if (widthScale >= 2 || heightScale >= 2) { + // canvas does not resize large images to small -- using simple + // algorithm to perform pre-scaling + tmpCanvas = rescaleImage(imgData.data, widthScale, heightScale); + ctx.scale(widthScale, heightScale); + ctx.drawImage(tmpCanvas, 0, -h / heightScale); + } else + ctx.drawImage(tmpCanvas, 0, -h); this.restore(); }, From 50b86ff480ffbad345ca9ca39974143006afc9da Mon Sep 17 00:00:00 2001 From: Yury Delendik Date: Mon, 28 May 2012 15:10:44 -0500 Subject: [PATCH 2/5] Move putImageData --- src/canvas.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/canvas.js b/src/canvas.js index b9d8e9e17..0be8cdb59 100644 --- a/src/canvas.js +++ b/src/canvas.js @@ -1150,17 +1150,17 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { applyStencilMask(pixels, inverseDecode); - tmpCtx.putImageData(imgData, 0, 0); var currentTransform = ctx.mozCurrentTransformInverse; var widthScale = Math.max(Math.abs(currentTransform[0]), 1); var heightScale = Math.max(Math.abs(currentTransform[3]), 1); if (widthScale >= 2 || heightScale >= 2) { - // canvas does not resize large images to small -- using simple + // canvas does not resize well large images to small -- using simple // algorithm to perform pre-scaling tmpCanvas = rescaleImage(imgData.data, widthScale, heightScale); ctx.scale(widthScale, heightScale); ctx.drawImage(tmpCanvas, 0, -h / heightScale); } else + tmpCtx.putImageData(imgData, 0, 0); ctx.drawImage(tmpCanvas, 0, -h); this.restore(); }, From d5da15e0017ae45b944642fd3d3c7185bb2e67c5 Mon Sep 17 00:00:00 2001 From: Yury Delendik Date: Tue, 5 Jun 2012 17:56:18 -0500 Subject: [PATCH 3/5] Fixes brackets --- src/canvas.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/canvas.js b/src/canvas.js index 0be8cdb59..06b02c2eb 100644 --- a/src/canvas.js +++ b/src/canvas.js @@ -1159,9 +1159,10 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { tmpCanvas = rescaleImage(imgData.data, widthScale, heightScale); ctx.scale(widthScale, heightScale); ctx.drawImage(tmpCanvas, 0, -h / heightScale); - } else + } else { tmpCtx.putImageData(imgData, 0, 0); ctx.drawImage(tmpCanvas, 0, -h); + } this.restore(); }, From 2dacbb7a03f591218b0b0fdd83765ebe18405aea Mon Sep 17 00:00:00 2001 From: Saebekassebil Date: Thu, 7 Jun 2012 21:27:26 +0200 Subject: [PATCH 4/5] Dismiss native browser zoom, and use PDF.JS zoom instead --- web/viewer.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/web/viewer.js b/web/viewer.js index 751f2deff..7d07b991e 100644 --- a/web/viewer.js +++ b/web/viewer.js @@ -1844,6 +1844,18 @@ window.addEventListener('pagechange', function pagechange(evt) { document.getElementById('next').disabled = (page >= PDFView.pages.length); }, true); +// Firefox specific event, so that we can prevent browser from zooming +window.addEventListener('DOMMouseScroll', function(evt) { + if(evt.ctrlKey) { + evt.preventDefault(); + + var ticks = evt.detail; + var direction = (ticks > 0) ? 'zoomOut' : 'zoomIn'; + for(var i = 0, length = Math.abs(ticks); i < length; i++) + PDFView[direction](); + } +}, false); + window.addEventListener('keydown', function keydown(evt) { var handled = false; var cmd = (evt.ctrlKey ? 1 : 0) | From 67703364fc0c05ed9613dd9bb2d4b7fc650e4a41 Mon Sep 17 00:00:00 2001 From: Saebekassebil Date: Thu, 7 Jun 2012 21:39:18 +0200 Subject: [PATCH 5/5] lint errors --- web/viewer.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/viewer.js b/web/viewer.js index 7d07b991e..29b57a948 100644 --- a/web/viewer.js +++ b/web/viewer.js @@ -1846,12 +1846,12 @@ window.addEventListener('pagechange', function pagechange(evt) { // Firefox specific event, so that we can prevent browser from zooming window.addEventListener('DOMMouseScroll', function(evt) { - if(evt.ctrlKey) { + if (evt.ctrlKey) { evt.preventDefault(); var ticks = evt.detail; var direction = (ticks > 0) ? 'zoomOut' : 'zoomIn'; - for(var i = 0, length = Math.abs(ticks); i < length; i++) + for (var i = 0, length = Math.abs(ticks); i < length; i++) PDFView[direction](); } }, false);