fixes for the huffman decoder

This commit is contained in:
Andreas Gal 2011-05-11 16:30:30 -07:00
parent 9543128796
commit 2326832f49

47
pdf.js
View File

@ -117,6 +117,39 @@ var FlateStream = (function() {
[0, 258] [0, 258]
]; ];
const distDecode = [
[0, 1],
[0, 2],
[0, 3],
[0, 4],
[1, 5],
[1, 7],
[2, 9],
[2, 13],
[3, 17],
[3, 25],
[4, 33],
[4, 49],
[5, 65],
[5, 97],
[6, 129],
[6, 193],
[7, 257],
[7, 385],
[8, 513],
[8, 769],
[9, 1025],
[9, 1537],
[10, 2049],
[10, 3073],
[11, 4097],
[11, 6145],
[12, 8193],
[12, 12289],
[13, 16385],
[13, 24577]
];
const fixedLitCodeTab = [[ const fixedLitCodeTab = [[
[7, 0x0100], [7, 0x0100],
[8, 0x0050], [8, 0x0050],
@ -778,7 +811,7 @@ var FlateStream = (function() {
var size = 1 << maxLen; var size = 1 << maxLen;
var codes = new Array(size); var codes = new Array(size);
for (var len = 1, code = 0, skip = 2; for (var len = 1, code = 0, skip = 2;
len < maxLen; len <= maxLen;
++len, code <<= 1, skip <<= 1) { ++len, code <<= 1, skip <<= 1) {
for (var val = 0; val < n; ++val) { for (var val = 0; val < n; ++val) {
if (lengths[val] == len) { if (lengths[val] == len) {
@ -854,8 +887,6 @@ var FlateStream = (function() {
var i = 0; var i = 0;
while (i < numCodeLenCodes) while (i < numCodeLenCodes)
codeLenCodeLengths[codeLenCodeMap[i++]] = this.getBits(3); codeLenCodeLengths[codeLenCodeMap[i++]] = this.getBits(3);
while (i < codeLenCodeMap.length)
codeLenCodeLengths[i++] = 0;
var codeLenCodeTab = this.generateHuffmanTable(codeLenCodeLengths); var codeLenCodeTab = this.generateHuffmanTable(codeLenCodeLengths);
// built the literal and distance code tables // built the literal and distance code tables
@ -864,18 +895,18 @@ var FlateStream = (function() {
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(array, i, len, offset, what) { function repeat(stream, array, i, len, offset, what) {
var repeat = this.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(codeLengths, i, 2, 3, len); repeat(this, codeLengths, i, 2, 3, len);
} else if (code == 17) { } else if (code == 17) {
repeat(codeLengths, i, 3, 3, len = 0); repeat(this, codeLengths, i, 3, 3, len = 0);
} else if (code == 18) { } else if (code == 18) {
repeat(codeLengths, i, 7, 11, len = 0); repeat(this, codeLengths, i, 7, 11, len = 0);
} else { } else {
codeLengths[i++] = len = code; codeLengths[i++] = len = code;
} }