From 2326832f496df53a89e9b18b9cbfbc8f4922533e Mon Sep 17 00:00:00 2001 From: Andreas Gal Date: Wed, 11 May 2011 16:30:30 -0700 Subject: [PATCH] fixes for the huffman decoder --- pdf.js | 47 +++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 39 insertions(+), 8 deletions(-) diff --git a/pdf.js b/pdf.js index 88e2e33ef..fc9f7ba11 100644 --- a/pdf.js +++ b/pdf.js @@ -117,6 +117,39 @@ var FlateStream = (function() { [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 = [[ [7, 0x0100], [8, 0x0050], @@ -778,7 +811,7 @@ var FlateStream = (function() { var size = 1 << maxLen; var codes = new Array(size); for (var len = 1, code = 0, skip = 2; - len < maxLen; + len <= maxLen; ++len, code <<= 1, skip <<= 1) { for (var val = 0; val < n; ++val) { if (lengths[val] == len) { @@ -854,8 +887,6 @@ var FlateStream = (function() { var i = 0; while (i < numCodeLenCodes) codeLenCodeLengths[codeLenCodeMap[i++]] = this.getBits(3); - while (i < codeLenCodeMap.length) - codeLenCodeLengths[i++] = 0; var codeLenCodeTab = this.generateHuffmanTable(codeLenCodeLengths); // built the literal and distance code tables @@ -864,18 +895,18 @@ var FlateStream = (function() { var codes = numLitCodes + numDistCodes; var codeLengths = new Array(codes); while (i < codes) { - function repeat(array, i, len, offset, what) { - var repeat = this.getBits(len) + offset; + function repeat(stream, array, i, len, offset, what) { + var repeat = stream.getBits(len) + offset; while (repeat-- > 0) array[i++] = what; } var code = this.getCode(codeLenCodeTab); if (code == 16) { - repeat(codeLengths, i, 2, 3, len); + repeat(this, codeLengths, i, 2, 3, len); } else if (code == 17) { - repeat(codeLengths, i, 3, 3, len = 0); + repeat(this, codeLengths, i, 3, 3, len = 0); } else if (code == 18) { - repeat(codeLengths, i, 7, 11, len = 0); + repeat(this, codeLengths, i, 7, 11, len = 0); } else { codeLengths[i++] = len = code; }