]> git.parisson.com Git - pdf.js.git/commitdiff
avoid frequent calls to ensureBuffer during decompression
authorAndreas Gal <andreas.gal@gmail.com>
Wed, 22 Jun 2011 05:12:27 +0000 (01:12 -0400)
committerAndreas Gal <andreas.gal@gmail.com>
Wed, 22 Jun 2011 05:12:27 +0000 (01:12 -0400)
pdf.js

diff --git a/pdf.js b/pdf.js
index 38a2e0dd435a929be1f29fcd34fe37efe43465b6..abdd910750a8d8c48b8c0b114cdab85c4cd067d5 100644 (file)
--- 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];
         }
     };