From 4377eed920762c42a3cf7af8feea291d29b9ce90 Mon Sep 17 00:00:00 2001 From: Brendan Dahl Date: Sat, 6 Aug 2011 14:41:18 -0700 Subject: [PATCH] Adding support for page rotation --- pdf.js | 50 ++++++++++++++++++++++++++++++++++++---- test/driver.js | 4 ++-- test/pdfs/rotation.pdf | Bin 0 -> 6605 bytes test/test_manifest.json | 5 ++++ web/viewer.js | 5 +--- 5 files changed, 53 insertions(+), 11 deletions(-) create mode 100644 test/pdfs/rotation.pdf diff --git a/pdf.js b/pdf.js index 9d915b8ec..50594f2ad 100644 --- a/pdf.js +++ b/pdf.js @@ -2995,7 +2995,7 @@ var Page = (function() { inheritPageProp: function(key) { var dict = this.pageDict; var obj = dict.get(key); - while (!obj) { + while (typeof obj == 'undefined') { dict = this.xref.fetchIfRef(dict.get('Parent')); if (!dict) break; @@ -3014,6 +3014,32 @@ var Page = (function() { return shadow(this, 'mediaBox', ((IsArray(obj) && obj.length == 4) ? obj : null)); }, + get width() { + var mediaBox = this.mediaBox; + var rotate = this.rotate; + var width; + if (rotate == 0 || rotate == 180) { + width = (mediaBox[2] - mediaBox[0]); + } else { + width = (mediaBox[3] - mediaBox[1]); + } + return shadow(this, 'width', width); + }, + get height() { + var mediaBox = this.mediaBox; + var rotate = this.rotate; + var height; + if (rotate == 0 || rotate == 180) { + height = (mediaBox[3] - mediaBox[1]); + } else { + height = (mediaBox[2] - mediaBox[0]); + } + return shadow(this, 'height', height); + }, + get rotate() { + var rotate = this.inheritPageProp("Rotate") || 0; + return shadow(this, 'rotate', rotate); + }, startRendering: function(canvasCtx, continuation, onerror) { var self = this; var stats = self.stats; @@ -3085,8 +3111,9 @@ var Page = (function() { var mediaBox = xref.fetchIfRef(this.mediaBox); assertWellFormed(IsDict(resources), 'invalid page resources'); gfx.beginDrawing({ x: mediaBox[0], y: mediaBox[1], - width: mediaBox[2] - mediaBox[0], - height: mediaBox[3] - mediaBox[1] }); + width: this.width, + height: this.height, + rotate: this.rotate }); gfx.execute(this.code, xref, resources); gfx.endDrawing(); } @@ -3994,8 +4021,21 @@ var CanvasGraphics = (function() { beginDrawing: function(mediaBox) { var cw = this.ctx.canvas.width, ch = this.ctx.canvas.height; this.ctx.save(); - this.ctx.scale(cw / mediaBox.width, -ch / mediaBox.height); - this.ctx.translate(0, -mediaBox.height); + switch (mediaBox.rotate) { + case 0: + this.ctx.transform(1, 0, 0, -1, 0, ch); + break; + case 90: + this.ctx.transform(0, 1, 1, 0, 0, 0); + break; + case 180: + this.ctx.transform(-1, 0, 0, 1, cw, 0); + break; + case 270: + this.ctx.transform(0, -1, -1, 0, cw, ch); + break; + } + this.ctx.scale(cw / mediaBox.width, ch / mediaBox.height); }, compile: function(stream, xref, resources, fonts) { diff --git a/test/driver.js b/test/driver.js index 642c5273c..8d962eac8 100644 --- a/test/driver.js +++ b/test/driver.js @@ -105,8 +105,8 @@ function nextPage(task, loadError) { var pdfToCssUnitsCoef = 96.0 / 72.0; // using mediaBox for the canvas size - var pageWidth = (page.mediaBox[2] - page.mediaBox[0]); - var pageHeight = (page.mediaBox[3] - page.mediaBox[1]); + var pageWidth = page.width; + var pageHeight = page.height; canvas.width = pageWidth * pdfToCssUnitsCoef; canvas.height = pageHeight * pdfToCssUnitsCoef; clear(ctx); diff --git a/test/pdfs/rotation.pdf b/test/pdfs/rotation.pdf new file mode 100644 index 0000000000000000000000000000000000000000..807dafe5f8b5b1e9b932104d84e1cc13276c6dbf GIT binary patch literal 6605 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