Browse Source

Automatically scale presentation to visible area.

pull/70/head
Joachim Bauch 12 years ago
parent
commit
5c987c7053
  1. 5
      src/styles/components/_presentation.scss
  2. 84
      static/js/directives/pdfcanvas.js
  3. 3
      static/js/directives/presentation.js

5
src/styles/components/_presentation.scss

@ -48,6 +48,11 @@
} }
.presentationpane { .presentationpane {
.canvasContainer {
width: 100%;
height: 100%;
overflow: hidden;
}
canvas { canvas {
position: relative; position: relative;
} }

84
static/js/directives/pdfcanvas.js

@ -26,12 +26,13 @@ define(['require', 'underscore', 'jquery', 'pdf'], function(require, _, $, pdf)
var controller = ['$scope', '$element', '$attrs', function($scope, $element, $attrs) { var controller = ['$scope', '$element', '$attrs', function($scope, $element, $attrs) {
var PDFCanvas = function(scope, scale, canvases) { var container = $($element);
var PDFCanvas = function(scope, canvases) {
this.scope = scope; this.scope = scope;
this.canvases = canvases; this.canvases = canvases;
this.doc = null; this.doc = null;
this.rendering = false; this.rendering = false;
this.scale = scale;
this.currentPage = null; this.currentPage = null;
this.pendingPageNumber = null; this.pendingPageNumber = null;
}; };
@ -109,34 +110,54 @@ define(['require', 'underscore', 'jquery', 'pdf'], function(require, _, $, pdf)
console.log("Got page", pageObject); console.log("Got page", pageObject);
this.scope.$emit("pdfPageLoaded", page, pageObject); this.scope.$emit("pdfPageLoaded", page, pageObject);
this.currentPage = pageObject; this.currentPage = pageObject;
var viewport = pageObject.getViewport(this.scale); this.drawPage(pageObject);
// use double-buffering to avoid flickering while }, this));
// the new page is rendered... };
var canvas = this.canvases[1 - this.scope.canvasIndex];
canvas.width = viewport.width; PDFCanvas.prototype.drawPage = function(pageObject) {
canvas.height = viewport.height; var pdfView = pageObject.view;
var renderContext = { var pdfWidth = pdfView[2] - pdfView[0];
canvasContext: canvas.getContext("2d"), var pdfHeight = pdfView[3] - pdfView[1];
viewport: viewport var w = container.width();
}; var h = container.height();
var scale = w / pdfWidth;
console.log("Rendering page", pageObject); if (pdfHeight * scale > h) {
this.scope.$emit("pdfPageRendering", page); scale = container.height() / pdfHeight;
// TODO(fancycode): also render images in different resolutions for subscribed peers and send to them when ready }
var renderTask = pageObject.render(renderContext);
renderTask.promise.then(_.bind(function() { // use double-buffering to avoid flickering while
this.scope.$apply(_.bind(function(scope) { // the new page is rendered...
console.log("Rendered page", page); var canvas = this.canvases[1 - this.scope.canvasIndex];
this.scope.$emit("pdfPageRendered", page, scope.maxPageNumber); var viewport = pageObject.getViewport(scale);
this.rendering = false; canvas.width = Math.round(viewport.width);
// ...and flip the buffers... canvas.height = Math.round(viewport.height);
scope.canvasIndex = 1 - scope.canvasIndex; var renderContext = {
this.showQueuedPage(); canvasContext: canvas.getContext("2d"),
}, this)); viewport: viewport
};
console.log("Rendering page", pageObject);
this.scope.$emit("pdfPageRendering", pageObject.pageNumber);
// TODO(fancycode): also render images in different resolutions for subscribed peers and send to them when ready
var renderTask = pageObject.render(renderContext);
renderTask.promise.then(_.bind(function() {
this.scope.$apply(_.bind(function(scope) {
console.log("Rendered page", pageObject.pageNumber);
this.scope.$emit("pdfPageRendered", pageObject.pageNumber, scope.maxPageNumber);
this.rendering = false;
// ...and flip the buffers...
scope.canvasIndex = 1 - scope.canvasIndex;
this.showQueuedPage();
}, this)); }, this));
}, this)); }, this));
}; };
PDFCanvas.prototype.redrawPage = function() {
if (this.currentPage !== null) {
this.drawPage(this.currentPage);
}
};
PDFCanvas.prototype.showPage = function(page) { PDFCanvas.prototype.showPage = function(page) {
if (page >= 1 && page <= this.scope.maxPageNumber) { if (page >= 1 && page <= this.scope.maxPageNumber) {
if (!this.doc || this.rendering) { if (!this.doc || this.rendering) {
@ -166,9 +187,8 @@ define(['require', 'underscore', 'jquery', 'pdf'], function(require, _, $, pdf)
$scope.maxPageNumber = -1; $scope.maxPageNumber = -1;
$scope.canvasIndex = 0; $scope.canvasIndex = 0;
var canvases = $element.find("canvas"); var canvases = container.find("canvas");
var scale = 0.8; var pdfCanvas = new PDFCanvas($scope, canvases);
var pdfCanvas = new PDFCanvas($scope, scale, canvases);
$scope.$on("openPdf", function(event, source) { $scope.$on("openPdf", function(event, source) {
pdfCanvas.open(source); pdfCanvas.open(source);
@ -191,6 +211,10 @@ define(['require', 'underscore', 'jquery', 'pdf'], function(require, _, $, pdf)
pdfCanvas.showQueuedPage(); pdfCanvas.showQueuedPage();
}); });
$scope.$on("redrawPdf", function() {
pdfCanvas.redrawPage();
});
$scope.prevPage = function() { $scope.prevPage = function() {
pdfCanvas.prevPage(); pdfCanvas.prevPage();
}; };
@ -204,7 +228,7 @@ define(['require', 'underscore', 'jquery', 'pdf'], function(require, _, $, pdf)
return { return {
restrict: 'E', restrict: 'E',
replace: true, replace: true,
template: '<span><canvas ng-hide="canvasIndex"></canvas><canvas ng-show="canvasIndex"></canvas></span>', template: '<div class="canvasContainer"><canvas ng-hide="canvasIndex"></canvas><canvas ng-show="canvasIndex"></canvas></div>',
controller: controller controller: controller
}; };

3
static/js/directives/presentation.js

@ -369,6 +369,9 @@ define(['jquery', 'underscore', 'text!partials/presentation.html'], function($,
} }
}); });
$($window).on("resize", function() {
$scope.$emit("redrawPdf");
});
}]; }];
return { return {

Loading…
Cancel
Save