[Pkg-javascript-commits] [pdf.js] 03/116: Simple restructuring PageView into PDFPageView
David Prévot
taffit at moszumanska.debian.org
Fri Mar 6 16:19:54 UTC 2015
This is an automated email from the git hooks/post-receive script.
taffit pushed a commit to branch master
in repository pdf.js.
commit f68678086dbbc0214eed883905a830f6fc14c1ff
Author: Yury Delendik <ydelendik at mozilla.com>
Date: Sat Sep 27 13:03:28 2014 -0500
Simple restructuring PageView into PDFPageView
---
web/pdf_find_controller.js | 3 +-
web/pdf_page_view.js | 1053 +++++++++++++++++++++++---------------------
web/pdf_viewer.js | 24 +-
web/viewer.js | 3 +-
4 files changed, 556 insertions(+), 527 deletions(-)
diff --git a/web/pdf_find_controller.js b/web/pdf_find_controller.js
index 1aa9121..c54fc8a 100644
--- a/web/pdf_find_controller.js
+++ b/web/pdf_find_controller.js
@@ -197,8 +197,6 @@ var PDFFindController = (function PDFFindControllerClosure() {
},
updatePage: function PDFFindController_updatePage(index) {
- var page = this.pdfViewer.getPageView(index);
-
if (this.selected.pageIdx === index) {
// If the page is selected, scroll the page into view, which triggers
// rendering the page, which adds the textLayer. Once the textLayer is
@@ -206,6 +204,7 @@ var PDFFindController = (function PDFFindControllerClosure() {
this.pdfViewer.scrollPageIntoView(index + 1);
}
+ var page = this.pdfViewer.getPageView(index);
if (page.textLayer) {
page.textLayer.updateMatches();
}
diff --git a/web/pdf_page_view.js b/web/pdf_page_view.js
index 92ed39b..7e6aa17 100644
--- a/web/pdf_page_view.js
+++ b/web/pdf_page_view.js
@@ -20,591 +20,616 @@
'use strict';
/**
- * @constructor
- * @param {HTMLDivElement} container - The viewer element.
- * @param {number} id - The page unique ID (normally its number).
- * @param {number} scale - The page scale display.
- * @param {PageViewport} defaultViewport - The page viewport.
- * @param {IPDFLinkService} linkService - The navigation/linking service.
- * @param {PDFRenderingQueue} renderingQueue - The rendering queue object.
- * @param {Cache} cache - The page cache.
- * @param {PDFPageSource} pageSource
- * @param {PDFViewer} viewer
- *
+ * @typedef {Object} PDFPageViewOptions
+ * @property {HTMLDivElement} container - The viewer element.
+ * @property {number} id - The page unique ID (normally its number).
+ * @property {number} scale - The page scale display.
+ * @property {PageViewport} defaultViewport - The page viewport.
+ * @property {IPDFLinkService} linkService - The navigation/linking service.
+ * @property {PDFRenderingQueue} renderingQueue - The rendering queue object.
+ * @property {Cache} cache - The page cache.
+ * @property {PDFPageSource} pageSource
+ * @property {PDFViewer} viewer
+ */
+
+/**
+ * @class
* @implements {IRenderableView}
*/
-var PageView = function pageView(container, id, scale, defaultViewport,
- linkService, renderingQueue, cache,
- pageSource, viewer) {
- this.id = id;
- this.renderingId = 'page' + id;
-
- this.rotation = 0;
- this.scale = scale || 1.0;
- this.viewport = defaultViewport;
- this.pdfPageRotate = defaultViewport.rotation;
- this.hasRestrictedScaling = false;
-
- this.linkService = linkService;
- this.renderingQueue = renderingQueue;
- this.cache = cache;
- this.pageSource = pageSource;
- this.viewer = viewer;
-
- this.renderingState = RenderingStates.INITIAL;
- this.resume = null;
-
- this.textLayer = null;
-
- this.zoomLayer = null;
-
- this.annotationLayer = null;
-
- var anchor = document.createElement('a');
- anchor.name = '' + this.id;
-
- var div = this.el = document.createElement('div');
- div.id = 'pageContainer' + this.id;
- div.className = 'page';
- div.style.width = Math.floor(this.viewport.width) + 'px';
- div.style.height = Math.floor(this.viewport.height) + 'px';
-
- container.appendChild(anchor);
- container.appendChild(div);
-
- this.setPdfPage = function pageViewSetPdfPage(pdfPage) {
- this.pdfPage = pdfPage;
- this.pdfPageRotate = pdfPage.rotate;
- var totalRotation = (this.rotation + this.pdfPageRotate) % 360;
- this.viewport = pdfPage.getViewport(this.scale * CSS_UNITS, totalRotation);
- this.stats = pdfPage.stats;
- this.reset();
- };
+var PDFPageView = (function PDFPageViewClosure() {
+ /**
+ * @constructs PDFPageView
+ * @param {PDFPageViewOptions} options
+ */
+ function PDFPageView(options) {
+ var container = options.container;
+ var id = options.id;
+ var scale = options.scale;
+ var defaultViewport = options.defaultViewport;
+ var linkService = options.linkService;
+ var renderingQueue = options.renderingQueue;
+ var cache = options.cache;
+ var pageSource = options.pageSource;
+ var viewer = options.viewer;
+
+ this.id = id;
+ this.renderingId = 'page' + id;
+
+ this.rotation = 0;
+ this.scale = scale || 1.0;
+ this.viewport = defaultViewport;
+ this.pdfPageRotate = defaultViewport.rotation;
+ this.hasRestrictedScaling = false;
+
+ this.linkService = linkService;
+ this.renderingQueue = renderingQueue;
+ this.cache = cache;
+ this.pageSource = pageSource;
+ this.viewer = viewer;
+
+ this.renderingState = RenderingStates.INITIAL;
+ this.resume = null;
+
+ this.textLayer = null;
- this.destroy = function pageViewDestroy() {
this.zoomLayer = null;
- this.reset();
- if (this.pdfPage) {
- this.pdfPage.destroy();
- }
- };
- this.reset = function pageViewReset(keepAnnotations) {
- if (this.renderTask) {
- this.renderTask.cancel();
- }
- this.resume = null;
- this.renderingState = RenderingStates.INITIAL;
+ this.annotationLayer = null;
+ var anchor = document.createElement('a');
+ anchor.name = '' + this.id;
+
+ var div = document.createElement('div');
+ div.id = 'pageContainer' + this.id;
+ div.className = 'page';
div.style.width = Math.floor(this.viewport.width) + 'px';
div.style.height = Math.floor(this.viewport.height) + 'px';
+ this.el = div; // TODO replace 'el' property usage
+ this.div = div;
+
+ container.appendChild(anchor);
+ container.appendChild(div);
+ }
+
+ PDFPageView.prototype = {
+ setPdfPage: function PDFPageView_setPdfPage(pdfPage) {
+ this.pdfPage = pdfPage;
+ this.pdfPageRotate = pdfPage.rotate;
+ var totalRotation = (this.rotation + this.pdfPageRotate) % 360;
+ this.viewport = pdfPage.getViewport(this.scale * CSS_UNITS,
+ totalRotation);
+ this.stats = pdfPage.stats;
+ this.reset();
+ },
- var childNodes = div.childNodes;
- for (var i = div.childNodes.length - 1; i >= 0; i--) {
- var node = childNodes[i];
- if ((this.zoomLayer && this.zoomLayer === node) ||
- (keepAnnotations && this.annotationLayer === node)) {
- continue;
+ destroy: function PDFPageView_destroy() {
+ this.zoomLayer = null;
+ this.reset();
+ if (this.pdfPage) {
+ this.pdfPage.destroy();
}
- div.removeChild(node);
- }
- div.removeAttribute('data-loaded');
+ },
- if (keepAnnotations) {
- if (this.annotationLayer) {
- // Hide annotationLayer until all elements are resized
- // so they are not displayed on the already-resized page
- this.annotationLayer.setAttribute('hidden', 'true');
+ reset: function PDFPageView_reset(keepAnnotations) {
+ if (this.renderTask) {
+ this.renderTask.cancel();
+ }
+ this.resume = null;
+ this.renderingState = RenderingStates.INITIAL;
+
+ var div = this.div;
+ div.style.width = Math.floor(this.viewport.width) + 'px';
+ div.style.height = Math.floor(this.viewport.height) + 'px';
+
+ var childNodes = div.childNodes;
+ for (var i = div.childNodes.length - 1; i >= 0; i--) {
+ var node = childNodes[i];
+ if ((this.zoomLayer && this.zoomLayer === node) ||
+ (keepAnnotations && this.annotationLayer === node)) {
+ continue;
+ }
+ div.removeChild(node);
+ }
+ div.removeAttribute('data-loaded');
+
+ if (keepAnnotations) {
+ if (this.annotationLayer) {
+ // Hide annotationLayer until all elements are resized
+ // so they are not displayed on the already-resized page
+ this.annotationLayer.setAttribute('hidden', 'true');
+ }
+ } else {
+ this.annotationLayer = null;
}
- } else {
- this.annotationLayer = null;
- }
-
- if (this.canvas) {
- // Zeroing the width and height causes Firefox to release graphics
- // resources immediately, which can greatly reduce memory consumption.
- this.canvas.width = 0;
- this.canvas.height = 0;
- delete this.canvas;
- }
-
- this.loadingIconDiv = document.createElement('div');
- this.loadingIconDiv.className = 'loadingIcon';
- div.appendChild(this.loadingIconDiv);
- };
- this.update = function pageViewUpdate(scale, rotation) {
- this.scale = scale || this.scale;
+ if (this.canvas) {
+ // Zeroing the width and height causes Firefox to release graphics
+ // resources immediately, which can greatly reduce memory consumption.
+ this.canvas.width = 0;
+ this.canvas.height = 0;
+ delete this.canvas;
+ }
- if (typeof rotation !== 'undefined') {
- this.rotation = rotation;
- }
+ this.loadingIconDiv = document.createElement('div');
+ this.loadingIconDiv.className = 'loadingIcon';
+ div.appendChild(this.loadingIconDiv);
+ },
- var totalRotation = (this.rotation + this.pdfPageRotate) % 360;
- this.viewport = this.viewport.clone({
- scale: this.scale * CSS_UNITS,
- rotation: totalRotation
- });
+ update: function PDFPageView_update(scale, rotation) {
+ this.scale = scale || this.scale;
- var isScalingRestricted = false;
- 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 (typeof rotation !== 'undefined') {
+ this.rotation = rotation;
}
- }
-
- if (this.canvas &&
- (PDFJS.useOnlyCssZoom ||
- (this.hasRestrictedScaling && isScalingRestricted))) {
- this.cssTransform(this.canvas, true);
- return;
- } else if (this.canvas && !this.zoomLayer) {
- this.zoomLayer = this.canvas.parentNode;
- this.zoomLayer.style.position = 'absolute';
- }
- if (this.zoomLayer) {
- this.cssTransform(this.zoomLayer.firstChild);
- }
- this.reset(true);
- };
- this.cssTransform = function pageCssTransform(canvas, redrawAnnotations) {
- // Scale canvas, canvas wrapper, and page container.
- var width = this.viewport.width;
- var height = this.viewport.height;
- canvas.style.width = canvas.parentNode.style.width = div.style.width =
+ var totalRotation = (this.rotation + this.pdfPageRotate) % 360;
+ this.viewport = this.viewport.clone({
+ scale: this.scale * CSS_UNITS,
+ rotation: totalRotation
+ });
+
+ var isScalingRestricted = false;
+ 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;
+ } else if (this.canvas && !this.zoomLayer) {
+ this.zoomLayer = this.canvas.parentNode;
+ this.zoomLayer.style.position = 'absolute';
+ }
+ if (this.zoomLayer) {
+ this.cssTransform(this.zoomLayer.firstChild);
+ }
+ this.reset(true);
+ },
+
+ cssTransform: function PDFPageView_transform(canvas, redrawAnnotations) {
+ // Scale canvas, canvas wrapper, and page container.
+ var width = this.viewport.width;
+ var height = this.viewport.height;
+ var div = this.div;
+ canvas.style.width = canvas.parentNode.style.width = div.style.width =
Math.floor(width) + 'px';
- canvas.style.height = canvas.parentNode.style.height = div.style.height =
+ canvas.style.height = canvas.parentNode.style.height = div.style.height =
Math.floor(height) + 'px';
- // The canvas may have been originally rotated, so rotate relative to that.
- var relativeRotation = this.viewport.rotation - canvas._viewport.rotation;
- var absRotation = Math.abs(relativeRotation);
- var scaleX = 1, scaleY = 1;
- if (absRotation === 90 || absRotation === 270) {
- // Scale x and y because of the rotation.
- scaleX = height / width;
- scaleY = width / height;
- }
- var cssTransform = 'rotate(' + relativeRotation + 'deg) ' +
- 'scale(' + scaleX + ',' + scaleY + ')';
- CustomStyle.setProp('transform', canvas, cssTransform);
-
- if (this.textLayer) {
- // Rotating the text layer is more complicated since the divs inside the
- // the text layer are rotated.
- // TODO: This could probably be simplified by drawing the text layer in
- // one orientation then rotating overall.
- var textLayerViewport = this.textLayer.viewport;
- var textRelativeRotation = this.viewport.rotation -
- textLayerViewport.rotation;
- var textAbsRotation = Math.abs(textRelativeRotation);
- var scale = width / textLayerViewport.width;
- if (textAbsRotation === 90 || textAbsRotation === 270) {
- scale = width / textLayerViewport.height;
+ // The canvas may have been originally rotated, rotate relative to that.
+ var relativeRotation = this.viewport.rotation - canvas._viewport.rotation;
+ var absRotation = Math.abs(relativeRotation);
+ var scaleX = 1, scaleY = 1;
+ if (absRotation === 90 || absRotation === 270) {
+ // Scale x and y because of the rotation.
+ scaleX = height / width;
+ scaleY = width / height;
}
- var textLayerDiv = this.textLayer.textLayerDiv;
- var transX, transY;
- switch (textAbsRotation) {
- case 0:
- transX = transY = 0;
- break;
- case 90:
- transX = 0;
- transY = '-' + textLayerDiv.style.height;
- break;
- case 180:
- transX = '-' + textLayerDiv.style.width;
- transY = '-' + textLayerDiv.style.height;
- break;
- case 270:
- transX = '-' + textLayerDiv.style.width;
- transY = 0;
- break;
- default:
- console.error('Bad rotation value.');
- break;
+ var cssTransform = 'rotate(' + relativeRotation + 'deg) ' +
+ 'scale(' + scaleX + ',' + scaleY + ')';
+ CustomStyle.setProp('transform', canvas, cssTransform);
+
+ if (this.textLayer) {
+ // Rotating the text layer is more complicated since the divs inside the
+ // the text layer are rotated.
+ // TODO: This could probably be simplified by drawing the text layer in
+ // one orientation then rotating overall.
+ var textLayerViewport = this.textLayer.viewport;
+ var textRelativeRotation = this.viewport.rotation -
+ textLayerViewport.rotation;
+ var textAbsRotation = Math.abs(textRelativeRotation);
+ var scale = width / textLayerViewport.width;
+ if (textAbsRotation === 90 || textAbsRotation === 270) {
+ scale = width / textLayerViewport.height;
+ }
+ var textLayerDiv = this.textLayer.textLayerDiv;
+ var transX, transY;
+ switch (textAbsRotation) {
+ case 0:
+ transX = transY = 0;
+ break;
+ case 90:
+ transX = 0;
+ transY = '-' + textLayerDiv.style.height;
+ break;
+ case 180:
+ transX = '-' + textLayerDiv.style.width;
+ transY = '-' + textLayerDiv.style.height;
+ break;
+ case 270:
+ transX = '-' + textLayerDiv.style.width;
+ transY = 0;
+ break;
+ default:
+ console.error('Bad rotation value.');
+ break;
+ }
+ CustomStyle.setProp('transform', textLayerDiv,
+ 'rotate(' + textAbsRotation + 'deg) ' +
+ 'scale(' + scale + ', ' + scale + ') ' +
+ 'translate(' + transX + ', ' + transY + ')');
+ CustomStyle.setProp('transformOrigin', textLayerDiv, '0% 0%');
}
- CustomStyle.setProp('transform', textLayerDiv,
- 'rotate(' + textAbsRotation + 'deg) ' +
- 'scale(' + scale + ', ' + scale + ') ' +
- 'translate(' + transX + ', ' + transY + ')');
- CustomStyle.setProp('transformOrigin', textLayerDiv, '0% 0%');
- }
-
- if (redrawAnnotations && this.annotationLayer) {
- setupAnnotations(div, this.pdfPage, this.viewport);
- }
- };
- Object.defineProperty(this, 'width', {
- get: function PageView_getWidth() {
+ if (redrawAnnotations && this.annotationLayer) {
+ this.setupAnnotations();
+ }
+ },
+
+ get width() {
return this.viewport.width;
},
- enumerable: true
- });
- Object.defineProperty(this, 'height', {
- get: function PageView_getHeight() {
+ get height() {
return this.viewport.height;
},
- enumerable: true
- });
-
- var self = this;
-
- function setupAnnotations(pageDiv, pdfPage, viewport) {
- function bindLink(link, dest) {
- link.href = linkService.getDestinationHash(dest);
- link.onclick = function pageViewSetupLinksOnclick() {
+ setupAnnotations: function PDFPageView_setupAnnotations() {
+ function bindLink(link, dest) {
+ link.href = linkService.getDestinationHash(dest);
+ link.onclick = function pageViewSetupLinksOnclick() {
+ if (dest) {
+ linkService.navigateTo(dest);
+ }
+ return false;
+ };
if (dest) {
- linkService.navigateTo(dest);
+ link.className = 'internalLink';
}
- return false;
- };
- if (dest) {
+ }
+
+ function bindNamedAction(link, action) {
+ link.href = linkService.getAnchorUrl('');
+ link.onclick = function pageViewSetupNamedActionOnClick() {
+ linkService.executeNamedAction(action);
+ return false;
+ };
link.className = 'internalLink';
}
- }
- function bindNamedAction(link, action) {
- link.href = linkService.getAnchorUrl('');
- link.onclick = function pageViewSetupNamedActionOnClick() {
- linkService.executeNamedAction(action);
- return false;
- };
- link.className = 'internalLink';
- }
-
- pdfPage.getAnnotations().then(function(annotationsData) {
- viewport = viewport.clone({ dontFlip: true });
- var transform = viewport.transform;
- var transformStr = 'matrix(' + transform.join(',') + ')';
- var data, element, i, ii;
-
- if (self.annotationLayer) {
- // If an annotationLayer already exists, refresh its children's
- // transformation matrices
- for (i = 0, ii = annotationsData.length; i < ii; i++) {
- data = annotationsData[i];
- element = self.annotationLayer.querySelector(
- '[data-annotation-id="' + data.id + '"]');
- if (element) {
- CustomStyle.setProp('transform', element, transformStr);
- }
- }
- // See this.reset()
- self.annotationLayer.removeAttribute('hidden');
- } else {
- for (i = 0, ii = annotationsData.length; i < ii; i++) {
- data = annotationsData[i];
- if (!data || !data.hasHtml) {
- continue;
+ var linkService = this.linkService;
+ var pageDiv = this.div;
+ var pdfPage = this.pdfPage;
+ var viewport = this.viewport;
+ var self = this;
+
+ pdfPage.getAnnotations().then(function(annotationsData) {
+ viewport = viewport.clone({ dontFlip: true });
+ var transform = viewport.transform;
+ var transformStr = 'matrix(' + transform.join(',') + ')';
+ var data, element, i, ii;
+
+ if (self.annotationLayer) {
+ // If an annotationLayer already exists, refresh its children's
+ // transformation matrices
+ for (i = 0, ii = annotationsData.length; i < ii; i++) {
+ data = annotationsData[i];
+ element = self.annotationLayer.querySelector(
+ '[data-annotation-id="' + data.id + '"]');
+ if (element) {
+ CustomStyle.setProp('transform', element, transformStr);
+ }
}
+ // See this.reset()
+ self.annotationLayer.removeAttribute('hidden');
+ } else {
+ for (i = 0, ii = annotationsData.length; i < ii; i++) {
+ data = annotationsData[i];
+ if (!data || !data.hasHtml) {
+ continue;
+ }
- element = PDFJS.AnnotationUtils.getHtmlElement(data,
- pdfPage.commonObjs);
- element.setAttribute('data-annotation-id', data.id);
- mozL10n.translate(element);
-
- var rect = data.rect;
- var view = pdfPage.view;
- rect = PDFJS.Util.normalizeRect([
- rect[0],
- view[3] - rect[1] + view[1],
- rect[2],
- view[3] - rect[3] + view[1]
- ]);
- element.style.left = rect[0] + 'px';
- element.style.top = rect[1] + 'px';
- element.style.position = 'absolute';
-
- CustomStyle.setProp('transform', element, transformStr);
- var transformOriginStr = -rect[0] + 'px ' + -rect[1] + 'px';
- CustomStyle.setProp('transformOrigin', element, transformOriginStr);
-
- if (data.subtype === 'Link' && !data.url) {
- var link = element.getElementsByTagName('a')[0];
- if (link) {
- if (data.action) {
- bindNamedAction(link, data.action);
- } else {
- bindLink(link, ('dest' in data) ? data.dest : null);
+ element = PDFJS.AnnotationUtils.getHtmlElement(data,
+ pdfPage.commonObjs);
+ element.setAttribute('data-annotation-id', data.id);
+ mozL10n.translate(element);
+
+ var rect = data.rect;
+ var view = pdfPage.view;
+ rect = PDFJS.Util.normalizeRect([
+ rect[0],
+ view[3] - rect[1] + view[1],
+ rect[2],
+ view[3] - rect[3] + view[1]
+ ]);
+ element.style.left = rect[0] + 'px';
+ element.style.top = rect[1] + 'px';
+ element.style.position = 'absolute';
+
+ CustomStyle.setProp('transform', element, transformStr);
+ var transformOriginStr = -rect[0] + 'px ' + -rect[1] + 'px';
+ CustomStyle.setProp('transformOrigin', element, transformOriginStr);
+
+ if (data.subtype === 'Link' && !data.url) {
+ var link = element.getElementsByTagName('a')[0];
+ if (link) {
+ if (data.action) {
+ bindNamedAction(link, data.action);
+ } else {
+ bindLink(link, ('dest' in data) ? data.dest : null);
+ }
}
}
- }
- if (!self.annotationLayer) {
- var annotationLayerDiv = document.createElement('div');
- annotationLayerDiv.className = 'annotationLayer';
- pageDiv.appendChild(annotationLayerDiv);
- self.annotationLayer = annotationLayerDiv;
- }
+ if (!self.annotationLayer) {
+ var annotationLayerDiv = document.createElement('div');
+ annotationLayerDiv.className = 'annotationLayer';
+ pageDiv.appendChild(annotationLayerDiv);
+ self.annotationLayer = annotationLayerDiv;
+ }
- self.annotationLayer.appendChild(element);
+ self.annotationLayer.appendChild(element);
+ }
}
- }
- });
- }
+ });
+ },
- this.getPagePoint = function pageViewGetPagePoint(x, y) {
- return this.viewport.convertToPdfPoint(x, y);
- };
+ getPagePoint: function PDFPageView_getPagePoint(x, y) {
+ return this.viewport.convertToPdfPoint(x, y);
+ },
- this.draw = function pageviewDraw(callback) {
- var pdfPage = this.pdfPage;
-
- if (this.pagePdfPromise) {
- return;
- }
- if (!pdfPage) {
- var promise = this.pageSource.getPage();
- promise.then(function(pdfPage) {
- delete this.pagePdfPromise;
- this.setPdfPage(pdfPage);
- this.draw(callback);
- }.bind(this));
- this.pagePdfPromise = promise;
- return;
- }
-
- if (this.renderingState !== RenderingStates.INITIAL) {
- console.error('Must be in new state before drawing');
- }
-
- this.renderingState = RenderingStates.RUNNING;
-
- var viewport = this.viewport;
- // Wrap the canvas so if it has a css transform for highdpi the overflow
- // will be hidden in FF.
- var canvasWrapper = document.createElement('div');
- canvasWrapper.style.width = div.style.width;
- canvasWrapper.style.height = div.style.height;
- canvasWrapper.classList.add('canvasWrapper');
-
- var canvas = document.createElement('canvas');
- canvas.id = 'page' + this.id;
- canvasWrapper.appendChild(canvas);
- if (this.annotationLayer) {
- // annotationLayer needs to stay on top
- div.insertBefore(canvasWrapper, this.annotationLayer);
- } else {
- div.appendChild(canvasWrapper);
- }
- this.canvas = canvas;
-
- var ctx = canvas.getContext('2d');
- var outputScale = getOutputScale(ctx);
-
- if (PDFJS.useOnlyCssZoom) {
- var actualSizeViewport = viewport.clone({ scale: CSS_UNITS });
- // Use a scale that will make the canvas be the original intended size
- // of the page.
- outputScale.sx *= actualSizeViewport.width / viewport.width;
- outputScale.sy *= actualSizeViewport.height / viewport.height;
- 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;
+ draw: function PDFPageView_draw(callback) {
+ var pdfPage = this.pdfPage;
+
+ if (this.pagePdfPromise) {
+ return;
+ }
+ if (!pdfPage) {
+ var promise = this.pageSource.getPage();
+ promise.then(function(pdfPage) {
+ delete this.pagePdfPromise;
+ this.setPdfPage(pdfPage);
+ this.draw(callback);
+ }.bind(this));
+ this.pagePdfPromise = promise;
+ return;
}
- }
-
- canvas.width = (Math.floor(viewport.width) * outputScale.sx) | 0;
- canvas.height = (Math.floor(viewport.height) * outputScale.sy) | 0;
- canvas.style.width = Math.floor(viewport.width) + 'px';
- canvas.style.height = Math.floor(viewport.height) + 'px';
- // Add the viewport so it's known what it was originally drawn with.
- canvas._viewport = viewport;
-
- var textLayerDiv = null;
- var textLayer = null;
- if (!PDFJS.disableTextLayer) {
- textLayerDiv = document.createElement('div');
- textLayerDiv.className = 'textLayer';
- textLayerDiv.style.width = canvas.style.width;
- textLayerDiv.style.height = canvas.style.height;
+
+ if (this.renderingState !== RenderingStates.INITIAL) {
+ console.error('Must be in new state before drawing');
+ }
+
+ this.renderingState = RenderingStates.RUNNING;
+
+ var viewport = this.viewport;
+ var div = this.div;
+ // Wrap the canvas so if it has a css transform for highdpi the overflow
+ // will be hidden in FF.
+ var canvasWrapper = document.createElement('div');
+ canvasWrapper.style.width = div.style.width;
+ canvasWrapper.style.height = div.style.height;
+ canvasWrapper.classList.add('canvasWrapper');
+
+ var canvas = document.createElement('canvas');
+ canvas.id = 'page' + this.id;
+ canvasWrapper.appendChild(canvas);
if (this.annotationLayer) {
// annotationLayer needs to stay on top
- div.insertBefore(textLayerDiv, this.annotationLayer);
+ div.insertBefore(canvasWrapper, this.annotationLayer);
} else {
- div.appendChild(textLayerDiv);
+ div.appendChild(canvasWrapper);
}
+ this.canvas = canvas;
- textLayer = this.viewer.createTextLayerBuilder(textLayerDiv, this.id - 1,
- this.viewport);
- }
- this.textLayer = textLayer;
-
- // TODO(mack): use data attributes to store these
- ctx._scaleX = outputScale.sx;
- ctx._scaleY = outputScale.sy;
- if (outputScale.scaled) {
- ctx.scale(outputScale.sx, outputScale.sy);
- }
-
- // Rendering area
-
- var self = this;
- function pageViewDrawCallback(error) {
- // The renderTask may have been replaced by a new one, so only remove the
- // reference to the renderTask if it matches the one that is triggering
- // this callback.
- if (renderTask === self.renderTask) {
- self.renderTask = null;
+ var ctx = canvas.getContext('2d');
+ var outputScale = getOutputScale(ctx);
+
+ if (PDFJS.useOnlyCssZoom) {
+ var actualSizeViewport = viewport.clone({ scale: CSS_UNITS });
+ // Use a scale that will make the canvas be the original intended size
+ // of the page.
+ outputScale.sx *= actualSizeViewport.width / viewport.width;
+ outputScale.sy *= actualSizeViewport.height / viewport.height;
+ outputScale.scaled = true;
}
- if (error === 'cancelled') {
- return;
+ 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;
+ }
}
- self.renderingState = RenderingStates.FINISHED;
+ canvas.width = (Math.floor(viewport.width) * outputScale.sx) | 0;
+ canvas.height = (Math.floor(viewport.height) * outputScale.sy) | 0;
+ canvas.style.width = Math.floor(viewport.width) + 'px';
+ canvas.style.height = Math.floor(viewport.height) + 'px';
+ // Add the viewport so it's known what it was originally drawn with.
+ canvas._viewport = viewport;
+
+ var textLayerDiv = null;
+ var textLayer = null;
+ if (!PDFJS.disableTextLayer) {
+ textLayerDiv = document.createElement('div');
+ textLayerDiv.className = 'textLayer';
+ textLayerDiv.style.width = canvas.style.width;
+ textLayerDiv.style.height = canvas.style.height;
+ if (this.annotationLayer) {
+ // annotationLayer needs to stay on top
+ div.insertBefore(textLayerDiv, this.annotationLayer);
+ } else {
+ div.appendChild(textLayerDiv);
+ }
- if (self.loadingIconDiv) {
- div.removeChild(self.loadingIconDiv);
- delete self.loadingIconDiv;
+ textLayer = this.viewer.createTextLayerBuilder(textLayerDiv,
+ this.id - 1,
+ this.viewport);
}
+ this.textLayer = textLayer;
- if (self.zoomLayer) {
- div.removeChild(self.zoomLayer);
- self.zoomLayer = null;
+ // TODO(mack): use data attributes to store these
+ ctx._scaleX = outputScale.sx;
+ ctx._scaleY = outputScale.sy;
+ if (outputScale.scaled) {
+ ctx.scale(outputScale.sx, outputScale.sy);
}
- self.error = error;
- self.stats = pdfPage.stats;
- self.updateStats();
- if (self.onAfterDraw) {
- self.onAfterDraw();
- }
+ // Rendering area
- var event = document.createEvent('CustomEvent');
- event.initCustomEvent('pagerender', true, true, {
- pageNumber: pdfPage.pageNumber
- });
- div.dispatchEvent(event);
-
- callback();
- }
-
- var renderContext = {
- canvasContext: ctx,
- viewport: this.viewport,
- // intent: 'default', // === 'display'
- continueCallback: function pdfViewcContinueCallback(cont) {
- if (!self.renderingQueue.isHighestPriority(self)) {
- self.renderingState = RenderingStates.PAUSED;
- self.resume = function resumeCallback() {
- self.renderingState = RenderingStates.RUNNING;
- cont();
- };
+ var self = this;
+ function pageViewDrawCallback(error) {
+ // The renderTask may have been replaced by a new one, so only remove
+ // the reference to the renderTask if it matches the one that is
+ // triggering this callback.
+ if (renderTask === self.renderTask) {
+ self.renderTask = null;
+ }
+
+ if (error === 'cancelled') {
return;
}
- cont();
- }
- };
- var renderTask = this.renderTask = this.pdfPage.render(renderContext);
-
- this.renderTask.promise.then(
- function pdfPageRenderCallback() {
- pageViewDrawCallback(null);
- if (textLayer) {
- self.pdfPage.getTextContent().then(
- function textContentResolved(textContent) {
- textLayer.setTextContent(textContent);
- }
- );
+
+ self.renderingState = RenderingStates.FINISHED;
+
+ if (self.loadingIconDiv) {
+ div.removeChild(self.loadingIconDiv);
+ delete self.loadingIconDiv;
}
- },
- function pdfPageRenderError(error) {
- pageViewDrawCallback(error);
- }
- );
- setupAnnotations(div, pdfPage, this.viewport);
- div.setAttribute('data-loaded', true);
+ if (self.zoomLayer) {
+ div.removeChild(self.zoomLayer);
+ self.zoomLayer = null;
+ }
- // Add the page to the cache at the start of drawing. That way it can be
- // evicted from the cache and destroyed even if we pause its rendering.
- cache.push(this);
- };
+ self.error = error;
+ self.stats = pdfPage.stats;
+ self.updateStats();
+ if (self.onAfterDraw) {
+ self.onAfterDraw();
+ }
+
+ var event = document.createEvent('CustomEvent');
+ event.initCustomEvent('pagerender', true, true, {
+ pageNumber: pdfPage.pageNumber
+ });
+ div.dispatchEvent(event);
- this.beforePrint = function pageViewBeforePrint() {
- var pdfPage = this.pdfPage;
-
- var viewport = pdfPage.getViewport(1);
- // Use the same hack we use for high dpi displays for printing to get better
- // output until bug 811002 is fixed in FF.
- var PRINT_OUTPUT_SCALE = 2;
- var canvas = document.createElement('canvas');
- canvas.width = Math.floor(viewport.width) * PRINT_OUTPUT_SCALE;
- canvas.height = Math.floor(viewport.height) * PRINT_OUTPUT_SCALE;
- canvas.style.width = (PRINT_OUTPUT_SCALE * viewport.width) + 'pt';
- canvas.style.height = (PRINT_OUTPUT_SCALE * viewport.height) + 'pt';
- var cssScale = 'scale(' + (1 / PRINT_OUTPUT_SCALE) + ', ' +
- (1 / PRINT_OUTPUT_SCALE) + ')';
- CustomStyle.setProp('transform' , canvas, cssScale);
- CustomStyle.setProp('transformOrigin' , canvas, '0% 0%');
-
- var printContainer = document.getElementById('printContainer');
- var canvasWrapper = document.createElement('div');
- canvasWrapper.style.width = viewport.width + 'pt';
- canvasWrapper.style.height = viewport.height + 'pt';
- canvasWrapper.appendChild(canvas);
- printContainer.appendChild(canvasWrapper);
-
- canvas.mozPrintCallback = function(obj) {
- var ctx = obj.context;
-
- ctx.save();
- ctx.fillStyle = 'rgb(255, 255, 255)';
- ctx.fillRect(0, 0, canvas.width, canvas.height);
- ctx.restore();
- ctx.scale(PRINT_OUTPUT_SCALE, PRINT_OUTPUT_SCALE);
+ callback();
+ }
var renderContext = {
canvasContext: ctx,
- viewport: viewport,
- intent: 'print'
+ viewport: this.viewport,
+ // intent: 'default', // === 'display'
+ continueCallback: function pdfViewcContinueCallback(cont) {
+ if (!self.renderingQueue.isHighestPriority(self)) {
+ self.renderingState = RenderingStates.PAUSED;
+ self.resume = function resumeCallback() {
+ self.renderingState = RenderingStates.RUNNING;
+ cont();
+ };
+ return;
+ }
+ cont();
+ }
};
+ var renderTask = this.renderTask = this.pdfPage.render(renderContext);
+
+ this.renderTask.promise.then(
+ function pdfPageRenderCallback() {
+ pageViewDrawCallback(null);
+ if (textLayer) {
+ self.pdfPage.getTextContent().then(
+ function textContentResolved(textContent) {
+ textLayer.setTextContent(textContent);
+ }
+ );
+ }
+ },
+ function pdfPageRenderError(error) {
+ pageViewDrawCallback(error);
+ }
+ );
- pdfPage.render(renderContext).promise.then(function() {
- // Tell the printEngine that rendering this canvas/page has finished.
- obj.done();
- }, function(error) {
- console.error(error);
- // Tell the printEngine that rendering this canvas/page has failed.
- // This will make the print proces stop.
- if ('abort' in obj) {
- obj.abort();
- } else {
+ this.setupAnnotations();
+ div.setAttribute('data-loaded', true);
+
+ // Add the page to the cache at the start of drawing. That way it can be
+ // evicted from the cache and destroyed even if we pause its rendering.
+ this.cache.push(this);
+ },
+
+ beforePrint: function PDFPageView_beforePrint() {
+ var pdfPage = this.pdfPage;
+
+ var viewport = pdfPage.getViewport(1);
+ // Use the same hack we use for high dpi displays for printing to get
+ // better output until bug 811002 is fixed in FF.
+ var PRINT_OUTPUT_SCALE = 2;
+ var canvas = document.createElement('canvas');
+ canvas.width = Math.floor(viewport.width) * PRINT_OUTPUT_SCALE;
+ canvas.height = Math.floor(viewport.height) * PRINT_OUTPUT_SCALE;
+ canvas.style.width = (PRINT_OUTPUT_SCALE * viewport.width) + 'pt';
+ canvas.style.height = (PRINT_OUTPUT_SCALE * viewport.height) + 'pt';
+ var cssScale = 'scale(' + (1 / PRINT_OUTPUT_SCALE) + ', ' +
+ (1 / PRINT_OUTPUT_SCALE) + ')';
+ CustomStyle.setProp('transform' , canvas, cssScale);
+ CustomStyle.setProp('transformOrigin' , canvas, '0% 0%');
+
+ var printContainer = document.getElementById('printContainer');
+ var canvasWrapper = document.createElement('div');
+ canvasWrapper.style.width = viewport.width + 'pt';
+ canvasWrapper.style.height = viewport.height + 'pt';
+ canvasWrapper.appendChild(canvas);
+ printContainer.appendChild(canvasWrapper);
+
+ canvas.mozPrintCallback = function(obj) {
+ var ctx = obj.context;
+
+ ctx.save();
+ ctx.fillStyle = 'rgb(255, 255, 255)';
+ ctx.fillRect(0, 0, canvas.width, canvas.height);
+ ctx.restore();
+ ctx.scale(PRINT_OUTPUT_SCALE, PRINT_OUTPUT_SCALE);
+
+ var renderContext = {
+ canvasContext: ctx,
+ viewport: viewport,
+ intent: 'print'
+ };
+
+ pdfPage.render(renderContext).promise.then(function() {
+ // Tell the printEngine that rendering this canvas/page has finished.
obj.done();
- }
- });
- };
- };
+ }, function(error) {
+ console.error(error);
+ // Tell the printEngine that rendering this canvas/page has failed.
+ // This will make the print proces stop.
+ if ('abort' in obj) {
+ obj.abort();
+ } else {
+ obj.done();
+ }
+ });
+ };
+ },
- this.updateStats = function pageViewUpdateStats() {
- if (!this.stats) {
- return;
- }
+ updateStats: function PDFPageView_updateStats() {
+ if (!this.stats) {
+ return;
+ }
- if (PDFJS.pdfBug && Stats.enabled) {
- var stats = this.stats;
- Stats.add(this.id, stats);
- }
+ if (PDFJS.pdfBug && Stats.enabled) {
+ var stats = this.stats;
+ Stats.add(this.id, stats);
+ }
+ },
};
-};
+
+ return PDFPageView;
+})();
diff --git a/web/pdf_viewer.js b/web/pdf_viewer.js
index 190c37e..bd87a94 100644
--- a/web/pdf_viewer.js
+++ b/web/pdf_viewer.js
@@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
- /*globals watchScroll, Cache, DEFAULT_CACHE_SIZE, PageView, UNKNOWN_SCALE,
+ /*globals watchScroll, Cache, DEFAULT_CACHE_SIZE, PDFPageView, UNKNOWN_SCALE,
SCROLLBAR_PADDING, VERTICAL_PADDING, MAX_AUTO_SCALE, CSS_UNITS,
DEFAULT_SCALE, scrollIntoView, getVisibleElements, RenderingStates,
PDFJS, Promise, TextLayerBuilder, PDFRenderingQueue */
@@ -236,10 +236,17 @@ var PDFViewer = (function pdfViewer() {
var viewport = pdfPage.getViewport(scale * CSS_UNITS);
for (var pageNum = 1; pageNum <= pagesCount; ++pageNum) {
var pageSource = new PDFPageSource(pdfDocument, pageNum);
- var pageView = new PageView(this.viewer, pageNum, scale,
- viewport.clone(), this.linkService,
- this.renderingQueue, this.cache,
- pageSource, this);
+ var pageView = new PDFPageView({
+ container: this.viewer,
+ id: pageNum,
+ scale: scale,
+ defaultViewport: viewport.clone(),
+ linkService: this.linkService,
+ renderingQueue: this.renderingQueue,
+ cache: this.cache,
+ pageSource: pageSource,
+ viewer: this
+ });
bindOnAfterDraw(pageView);
this.pages.push(pageView);
}
@@ -398,7 +405,6 @@ var PDFViewer = (function pdfViewer() {
scrollPageIntoView: function PDFViewer_scrollPageIntoView(pageNumber,
dest) {
var pageView = this.pages[pageNumber - 1];
- var pageViewDiv = pageView.el;
if (this.presentationModeState ===
PresentationModeState.FULLSCREEN) {
@@ -412,7 +418,7 @@ var PDFViewer = (function pdfViewer() {
this._setScale(this.currentScaleValue, true);
}
if (!dest) {
- scrollIntoView(pageViewDiv);
+ scrollIntoView(pageView.div);
return;
}
@@ -475,7 +481,7 @@ var PDFViewer = (function pdfViewer() {
}
if (scale === 'page-fit' && !dest[4]) {
- scrollIntoView(pageViewDiv);
+ scrollIntoView(pageView.div);
return;
}
@@ -486,7 +492,7 @@ var PDFViewer = (function pdfViewer() {
var left = Math.min(boundingRect[0][0], boundingRect[1][0]);
var top = Math.min(boundingRect[0][1], boundingRect[1][1]);
- scrollIntoView(pageViewDiv, { left: left, top: top });
+ scrollIntoView(pageView.div, { left: left, top: top });
},
_updateLocation: function (firstPage) {
diff --git a/web/viewer.js b/web/viewer.js
index 439fb01..5528dd3 100644
--- a/web/viewer.js
+++ b/web/viewer.js
@@ -16,7 +16,7 @@
*/
/* globals PDFJS, PDFBug, FirefoxCom, Stats, Cache, ProgressBar,
DownloadManager, getFileName, scrollIntoView, getPDFFileNameFromURL,
- PDFHistory, Preferences, SidebarView, ViewHistory, PageView,
+ PDFHistory, Preferences, SidebarView, ViewHistory,
PDFThumbnailViewer, URL, noContextMenuHandler, SecondaryToolbar,
PasswordPrompt, PresentationMode, HandTool, Promise,
DocumentProperties, DocumentOutlineView, DocumentAttachmentsView,
@@ -1353,7 +1353,6 @@ var PDFViewerApplication = {
rotatePages: function pdfViewRotatePages(delta) {
var pageNumber = this.page;
-
this.pageRotation = (this.pageRotation + 360 + delta) % 360;
this.pdfViewer.pagesRotation = this.pageRotation;
this.pdfThumbnailViewer.pagesRotation = this.pageRotation;
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-javascript/pdf.js.git
More information about the Pkg-javascript-commits
mailing list