|
|
@ -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"); |
|
|
|
} |
|
|
|
} |
|
|
|