Limit the size of canvases to 5MP (iOS restriction)

This commit is contained in:
Samuel Chantaraud 2014-05-23 21:43:43 -04:00
parent 06cdca4576
commit 952545e20f
4 changed files with 51 additions and 5 deletions

View File

@ -140,6 +140,14 @@ PDFJS.useOnlyCssZoom = (PDFJS.useOnlyCssZoom === undefined ?
PDFJS.verbosity = (PDFJS.verbosity === undefined ? PDFJS.verbosity = (PDFJS.verbosity === undefined ?
PDFJS.VERBOSITY_LEVELS.warnings : PDFJS.verbosity); PDFJS.VERBOSITY_LEVELS.warnings : PDFJS.verbosity);
/**
* The maximum supported canvas size in total pixels e.g. width * height.
* The default value is 4096 * 4096. Use -1 for no limit.
* @var {number}
*/
PDFJS.maxCanvasPixels = (PDFJS.maxCanvasPixels === undefined ?
16777216 : PDFJS.maxCanvasPixels);
/** /**
* Document initialization / loading parameters object. * Document initialization / loading parameters object.
* *

View File

@ -507,3 +507,12 @@ if (typeof PDFJS === 'undefined') {
window.setTimeout(callback, 20); window.setTimeout(callback, 20);
}); });
})(); })();
(function checkCanvasSizeLimitation() {
var isIOS = /(iPad|iPhone|iPod)/g.test(navigator.userAgent);
var isAndroid = /Android/g.test(navigator.userAgent);
if (isIOS || isAndroid) {
// 5MP
PDFJS.maxCanvasPixels = 5242880;
}
})();

View File

@ -29,6 +29,7 @@ var PageView = function pageView(container, id, scale,
this.scale = scale || 1.0; this.scale = scale || 1.0;
this.viewport = defaultViewport; this.viewport = defaultViewport;
this.pdfPageRotate = defaultViewport.rotation; this.pdfPageRotate = defaultViewport.rotation;
this.hasRestrictedScaling = false;
this.renderingState = RenderingStates.INITIAL; this.renderingState = RenderingStates.INITIAL;
this.resume = null; this.resume = null;
@ -125,8 +126,23 @@ var PageView = function pageView(container, id, scale,
rotation: totalRotation rotation: totalRotation
}); });
if (PDFJS.useOnlyCssZoom && this.canvas) { var isScalingRestricted = false;
this.cssTransform(this.canvas); if (this.canvas && PDFJS.maxCanvasPixels > 0) {
var ctx = this.canvas.getContext('2d');
var outputScale = getOutputScale(ctx);
var pixelsInViewport = this.viewport.width * this.viewport.height;
var maxScale = Math.sqrt(PDFJS.maxCanvasPixels / pixelsInViewport);
if (((Math.floor(this.viewport.width) * outputScale.sx) | 0) *
((Math.floor(this.viewport.height) * outputScale.sy) | 0) >
PDFJS.maxCanvasPixels) {
isScalingRestricted = true;
}
}
if (this.canvas &&
(PDFJS.useOnlyCssZoom ||
(this.hasRestrictedScaling && isScalingRestricted))) {
this.cssTransform(this.canvas, true);
return; return;
} else if (this.canvas && !this.zoomLayer) { } else if (this.canvas && !this.zoomLayer) {
this.zoomLayer = this.canvas.parentNode; this.zoomLayer = this.canvas.parentNode;
@ -138,7 +154,7 @@ var PageView = function pageView(container, id, scale,
this.reset(true); this.reset(true);
}; };
this.cssTransform = function pageCssTransform(canvas) { this.cssTransform = function pageCssTransform(canvas, redrawAnnotations) {
// Scale canvas, canvas wrapper, and page container. // Scale canvas, canvas wrapper, and page container.
var width = this.viewport.width; var width = this.viewport.width;
var height = this.viewport.height; var height = this.viewport.height;
@ -201,7 +217,7 @@ var PageView = function pageView(container, id, scale,
CustomStyle.setProp('transformOrigin', textLayerDiv, '0% 0%'); CustomStyle.setProp('transformOrigin', textLayerDiv, '0% 0%');
} }
if (PDFJS.useOnlyCssZoom && this.annotationLayer) { if (redrawAnnotations && this.annotationLayer) {
setupAnnotations(div, this.pdfPage, this.viewport); setupAnnotations(div, this.pdfPage, this.viewport);
} }
}; };
@ -507,6 +523,19 @@ var PageView = function pageView(container, id, scale,
outputScale.scaled = true; outputScale.scaled = true;
} }
if (PDFJS.maxCanvasPixels > 0) {
var pixelsInViewport = viewport.width * viewport.height;
var maxScale = Math.sqrt(PDFJS.maxCanvasPixels / pixelsInViewport);
if (outputScale.sx > maxScale || outputScale.sy > maxScale) {
outputScale.sx = maxScale;
outputScale.sy = maxScale;
outputScale.scaled = true;
this.hasRestrictedScaling = true;
} else {
this.hasRestrictedScaling = false;
}
}
canvas.width = (Math.floor(viewport.width) * outputScale.sx) | 0; canvas.width = (Math.floor(viewport.width) * outputScale.sx) | 0;
canvas.height = (Math.floor(viewport.height) * outputScale.sy) | 0; canvas.height = (Math.floor(viewport.height) * outputScale.sy) | 0;
canvas.style.width = Math.floor(viewport.width) + 'px'; canvas.style.width = Math.floor(viewport.width) + 'px';

View File

@ -34,7 +34,7 @@ var SCROLLBAR_PADDING = 40;
var VERTICAL_PADDING = 5; var VERTICAL_PADDING = 5;
var MAX_AUTO_SCALE = 1.25; var MAX_AUTO_SCALE = 1.25;
var MIN_SCALE = 0.25; var MIN_SCALE = 0.25;
var MAX_SCALE = 4.0; var MAX_SCALE = 10.0;
var VIEW_HISTORY_MEMORY = 20; var VIEW_HISTORY_MEMORY = 20;
var SCALE_SELECT_CONTAINER_PADDING = 8; var SCALE_SELECT_CONTAINER_PADDING = 8;
var SCALE_SELECT_PADDING = 22; var SCALE_SELECT_PADDING = 22;