fix deflate code

This commit is contained in:
Andreas Gal 2011-06-03 14:22:38 -07:00
parent 267f312f13
commit b6b5c2ac49
2 changed files with 14 additions and 15 deletions

23
pdf.js
View File

@ -788,22 +788,20 @@ var FlateStream = (function() {
if (codeSize == 0|| codeSize < codeLen || codeLen == 0) if (codeSize == 0|| codeSize < codeLen || codeLen == 0)
error("Bad encoding in flate stream"); error("Bad encoding in flate stream");
this.codeBuf = (codeBuf >> codeLen); this.codeBuf = (codeBuf >> codeLen);
this.codeLen = (codeLen - codeLen); this.codeSize = (codeSize - codeLen);
return codeVal; return codeVal;
}, },
ensureBuffer: function(requested, copy) { ensureBuffer: function(requested) {
var buffer = this.buffer; var buffer = this.buffer;
var current = buffer ? buffer.byteLength : 0; var current = buffer ? buffer.byteLength : 0;
if (current < requested) if (requested < current)
return buffer; return buffer;
var size = 512; var size = 512;
while (size < requested) while (size < requested)
size <<= 1; size <<= 1;
var buffer2 = new Uint8Array(size); var buffer2 = new Uint8Array(size);
if (copy) {
for (var i = 0; i < current; ++i) for (var i = 0; i < current; ++i)
buffer2[i] = buffer[i]; buffer2[i] = buffer[i];
}
return this.buffer = buffer2; return this.buffer = buffer2;
}, },
lookChar: function() { lookChar: function() {
@ -813,8 +811,9 @@ var FlateStream = (function() {
if (this.eof) if (this.eof)
return; return;
this.readBlock(); this.readBlock();
bufferPos = this.bufferPos;
} }
return String.fromChar(this.buffer[bufferPos]); return String.fromCharCode(this.buffer[bufferPos]);
}, },
getChar: function() { getChar: function() {
var ch = this.lookChar(); var ch = this.lookChar();
@ -922,31 +921,31 @@ var FlateStream = (function() {
codeLenCodeLengths[codeLenCodeMap[i++]] = this.getBits(3); codeLenCodeLengths[codeLenCodeMap[i++]] = this.getBits(3);
var codeLenCodeTab = this.generateHuffmanTable(codeLenCodeLengths); var codeLenCodeTab = this.generateHuffmanTable(codeLenCodeLengths);
// built the literal and distance code tables // build the literal and distance code tables
var len = 0; var len = 0;
var i = 0; var i = 0;
var codes = numLitCodes + numDistCodes; var codes = numLitCodes + numDistCodes;
var codeLengths = new Array(codes); var codeLengths = new Array(codes);
while (i < codes) { while (i < codes) {
function repeat(stream, array, i, len, offset, what) { function repeat(stream, array, len, offset, what) {
var repeat = stream.getBits(len) + offset; var repeat = stream.getBits(len) + offset;
while (repeat-- > 0) while (repeat-- > 0)
array[i++] = what; array[i++] = what;
} }
var code = this.getCode(codeLenCodeTab); var code = this.getCode(codeLenCodeTab);
if (code == 16) { if (code == 16) {
repeat(this, codeLengths, i, 2, 3, len); repeat(this, codeLengths, 2, 3, len);
} else if (code == 17) { } else if (code == 17) {
repeat(this, codeLengths, i, 3, 3, len = 0); repeat(this, codeLengths, 3, 3, len = 0);
} else if (code == 18) { } else if (code == 18) {
repeat(this, codeLengths, i, 7, 11, len = 0); repeat(this, codeLengths, 7, 11, len = 0);
} else { } else {
codeLengths[i++] = len = code; codeLengths[i++] = len = code;
} }
} }
litCodeTable = this.generateHuffmanTable(codeLengths.slice(0, numLitCodes)); litCodeTable = this.generateHuffmanTable(codeLengths.slice(0, numLitCodes));
distCodeTable = this.generateHuffmanTable(codeLengths.slice(numDistCodes, codes)); distCodeTable = this.generateHuffmanTable(codeLengths.slice(numLitCodes, codes));
} else { } else {
error("Unknown block type in flate stream"); error("Unknown block type in flate stream");
} }

View File

@ -40,7 +40,7 @@ function load() {
canvas.mozOpaque = true; canvas.mozOpaque = true;
pageDisplay = document.getElementById("pageNumber"); pageDisplay = document.getElementById("pageNumber");
infoDisplay = document.getElementById("info"); infoDisplay = document.getElementById("info");
open("uncompressed.tracemonkey-pldi-09.pdf"); open("compressed.tracemonkey-pldi-09.pdf");
} }
function open(url) { function open(url) {