From 5c5d09c89844b3bc21827183a0a8c902d3ad5bf7 Mon Sep 17 00:00:00 2001 From: Andreas Gal Date: Mon, 6 Jun 2011 21:34:21 -0700 Subject: [PATCH 1/4] use dict.get2 to lookup with a key that has an abbreviation (i.e. BitsPerComponent/BPC) --- pdf.js | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/pdf.js b/pdf.js index 64e9432e9..9931758d7 100644 --- a/pdf.js +++ b/pdf.js @@ -510,6 +510,9 @@ var Dict = (function() { get: function(key) { return this.map[key]; }, + get2: function(key1, key2) { + return this.get(key1) || this.get(key2); + }, has: function(key) { return key in this.map; }, @@ -1027,8 +1030,8 @@ var Parser = (function() { return this.filter(stream, dict); }, filter: function(stream, dict) { - var filter = dict.get("Filter") || dict.get("F"); - var params = dict.get("DecodeParms") || dict.get("DP"); + var filter = dict.get2("Filter", "F"); + var params = dict.get2("DecodeParms", "DP"); if (IsName(filter)) return this.makeFilter(stream, filter.name, params); if (IsArray(filter)) { @@ -1890,16 +1893,16 @@ var CanvasGraphics = (function() { // TODO cache rendered images? var dict = image.dict; - var w = dict.get("Width") || dict.get("W"); - var h = dict.get("Height") || dict.get("H"); + var w = dict.get2("Width", "W"); + var h = dict.get2("Height", "H"); if (w < 1 || h < 1) error("Invalid image width or height"); - var interpolate = dict.get("Interpolate") || dict.get("I"); + var interpolate = dict.get2("Interpolate", "I"); if (!IsBool(interpolate)) interpolate = false; - var imageMask = dict.get("ImageMask") || dict.get("IM"); + var imageMask = dict.get2("ImageMask", "IM"); if (!IsBool(imageMask)) imageMask = false; @@ -1909,7 +1912,7 @@ var CanvasGraphics = (function() { var csMode = image.csMode; if (!bitsPerComponent) { - bitsPerComponent = dict.get("BitsPerComponent") || dict.get("BPC"); + bitsPerComponent = dict.get("BitsPerComponent", "BPC"); if (!bitsPerComponent) { if (imageMask) bitsPerComponent = 1; @@ -1938,7 +1941,7 @@ var CanvasGraphics = (function() { var smaskDict = smask.dict; if (!smaskDict) error("No dictionary for smask"); - var smaskBitsPerComponent = smaskDict.get("BitsPerComponent") || smaskDict.get("BPC"); + var smaskBitsPerComponent = smaskDict.get2("BitsPerComponent", "BPC"); if (!smaskBitsPerComponent) error("Bad BPC for smask"); var max = (1 << bitsPerComponent) - 1; From ee5d8763e8daeb5beca681403c2c01902fb4aae2 Mon Sep 17 00:00:00 2001 From: Andreas Gal Date: Wed, 8 Jun 2011 07:50:35 -0700 Subject: [PATCH 2/4] read in image data en-block instead of sucking it through the stream interface --- pdf.js | 49 ++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 38 insertions(+), 11 deletions(-) diff --git a/pdf.js b/pdf.js index 9931758d7..c771999d2 100644 --- a/pdf.js +++ b/pdf.js @@ -78,6 +78,15 @@ var Stream = (function() { this.pos++; return ch; }, + snarf: function(dest) { + var bytes = this.bytes; + var pos = this.pos; + var end = this.end; + var n = 0; + while (pos < end) + dest[n++] = bytes[pos++]; + this.pos = this.end; + }, skip: function(n) { if (!n) n = 1; @@ -308,6 +317,20 @@ var FlateStream = (function() { this.bufferPos++; return ch; }, + snarf: function(dest) { + // copy the leftover data in the buffer into dest + var bufferLength = this.bufferLength; + var bufferPos = this.bufferPos; + var n = 0; + while (bufferPos < bufferLength) + dest[n++] = this.buffer[bufferPos++]; + // now use dest as our buffer and fill it + this.buffer = dest; + while (!this.eof) + this.readBlock(); + // update stream position + this.pos = n; + }, skip: function(n) { if (!n) n = 1; @@ -1928,6 +1951,9 @@ var CanvasGraphics = (function() { var imgData = tmpCtx.getImageData(0, 0, w, h); var pixels = imgData.data; + // Read in image data + image.snarf(pixels); + var alpha = 25; if (image.dict.has("SMask")) { var smask = image.dict.get("SMask"); @@ -1951,18 +1977,19 @@ var CanvasGraphics = (function() { TODO(matte); } - for (var i = 0; i < 4 * w * h; ++i) { - pixels[i] = image.getChar() * smask.getChar() / max; - } + // read in mask data + var mask = new Uint8Array(4 * w * h); + smask.snarf(mask); + + // and blend images with it + var stop = 4 * w * h; + for (var i = 0; i < stop; ++i) + pixels[i] = pixels[i] * mask[i] / max; } else { - for (var i = 0; i < 4 * w * h; ++i) { - // TODO blend if SMask is a mask image - if (3 === i % 4) { - pixels[i] = alpha; - } else { - pixels[i] = image.getChar(); - } - } + // TODO blend if SMask is a mask image + var stop = 4 * w * h; + for (var i = 3; i < stop; i += 4) + pixels[i] = alpha; } tmpCtx.putImageData(imgData, 0, 0); From bab03e6add870cac3fc723c793aed40d44ca6b3a Mon Sep 17 00:00:00 2001 From: Andreas Gal Date: Wed, 8 Jun 2011 13:40:10 -0700 Subject: [PATCH 3/4] remove left-over shell code --- pdf.js | 22 +--------------------- 1 file changed, 1 insertion(+), 21 deletions(-) diff --git a/pdf.js b/pdf.js index c771999d2..8f0b09e35 100644 --- a/pdf.js +++ b/pdf.js @@ -1537,7 +1537,7 @@ var PDFDoc = (function() { return constructor; })(); -var IDENTITY_MATRIX = [ 1, 0, 0, 1, 0, 0 ]; +const IDENTITY_MATRIX = [ 1, 0, 0, 1, 0, 0 ]; // contexts store most of the state we need natively. // However, PDF needs a bit more state, which we store here. @@ -2033,23 +2033,3 @@ var CanvasGraphics = (function() { return constructor; })(); - -function runParseTests() { - var data = snarf("paper.pdf", "binary"); - var pdf = new PDFDoc(new Stream(data)); - var page = pdf.getPage(1); - page.display({ - beginDrawing: function() {} - }); -} - -if ("arguments" in this) { - const cmds = { - "-p": runParseTests - } - for (n in arguments) { - var fn = cmds[arguments[n]]; - if (fn) - fn(); - } -} From fa4c34ad06050249dfb4e6c77bfa08062a1252f7 Mon Sep 17 00:00:00 2001 From: Chris Jones Date: Wed, 8 Jun 2011 17:55:09 -0700 Subject: [PATCH 4/4] support test.html?page=[num], display total number of pages --- test.html | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/test.html b/test.html index 8513529fe..09ccf62d2 100644 --- a/test.html +++ b/test.html @@ -34,12 +34,24 @@ span#info {