From 55df4f40cb9ec09855fc610db02bc63f53c4d33d Mon Sep 17 00:00:00 2001 From: Andreas Gal Date: Wed, 22 Jun 2011 01:12:27 -0400 Subject: [PATCH] avoid frequent calls to ensureBuffer during decompression --- pdf.js | 48 ++++++++++++++++++++++++++++-------------------- 1 file changed, 28 insertions(+), 20 deletions(-) diff --git a/pdf.js b/pdf.js index 38a2e0dd4..abdd91075 100644 --- a/pdf.js +++ b/pdf.js @@ -61,7 +61,7 @@ var Stream = (function() { this.bytes = Uint8Array(arrayBuffer); this.start = start || 0; this.pos = this.start; - this.end = (start + length) || this.bytes.byteLength; + this.end = (start + length) || this.bytes.length; this.dict = dict; } @@ -516,33 +516,41 @@ var FlateStream = (function() { error("Unknown block type in flate stream"); } + var buffer = this.buffer; + var limit = buffer ? buffer.length : 0; var pos = this.bufferLength; while (true) { var code1 = this.getCode(litCodeTable); + if (code1 < 256) { + if (pos + 1 >= limit) { + buffer = this.ensureBuffer(pos + 1); + limit = buffer.length; + } + buffer[pos++] = code1; + continue; + } if (code1 == 256) { this.bufferLength = pos; return; } - if (code1 < 256) { - var buffer = this.ensureBuffer(pos + 1); - buffer[pos++] = code1; - } else { - code1 -= 257; - code1 = lengthDecode[code1]; - var code2 = code1 >> 16; - if (code2 > 0) - code2 = this.getBits(code2); - var len = (code1 & 0xffff) + code2; - code1 = this.getCode(distCodeTable); - code1 = distDecode[code1]; - code2 = code1 >> 16; - if (code2 > 0) - code2 = this.getBits(code2); - var dist = (code1 & 0xffff) + code2; - var buffer = this.ensureBuffer(pos + len); - for (var k = 0; k < len; ++k, ++pos) - buffer[pos] = buffer[pos - dist]; + code1 -= 257; + code1 = lengthDecode[code1]; + var code2 = code1 >> 16; + if (code2 > 0) + code2 = this.getBits(code2); + var len = (code1 & 0xffff) + code2; + code1 = this.getCode(distCodeTable); + code1 = distDecode[code1]; + code2 = code1 >> 16; + if (code2 > 0) + code2 = this.getBits(code2); + var dist = (code1 & 0xffff) + code2; + if (pos + len >= limit) { + buffer = this.ensureBuffer(pos + len); + limit = buffer.length; } + for (var k = 0; k < len; ++k, ++pos) + buffer[pos] = buffer[pos - dist]; } };