Update comic reader js

This commit is contained in:
Ozzieisaacs
2019-06-17 19:48:17 +02:00
parent e67d707867
commit cd546eb6d4
9 changed files with 311 additions and 292 deletions
+68 -65
View File
@@ -10,13 +10,14 @@
*
* http://kthoom.googlecode.com/hg/docs/unrar.html
*/
/* global bitjs, importScripts */
/* global bitjs, importScripts, RarVM, Uint8Array, UnpackFilter */
/* global VM_FIXEDGLOBALSIZE, VM_GLOBALMEMSIZE, MAXWINMASK, VM_GLOBALMEMADDR, MAXWINSIZE */
// This file expects to be invoked as a Worker (see onmessage below).
importScripts('../io/bitstream.js');
importScripts('../io/bytebuffer.js');
importScripts('archive.js');
importScripts('rarvm.js');
importScripts("../io/bitstream.js");
importScripts("../io/bytebuffer.js");
importScripts("archive.js");
importScripts("rarvm.js");
// Progress variables.
var currentFilename = "";
@@ -296,6 +297,12 @@ var rBuffer;
*/
var wBuffer;
var lowDistRepCount = 0;
var prevLowDist = 0;
var rOldDist = [0, 0, 0, 0];
var lastDist;
var lastLength;
/**
* In unpack.cpp, UnpPtr keeps track of what bytes have been unpacked
@@ -401,15 +408,15 @@ function rarDecodeNumber(bstream, dec) {
((bitField < DecodeLen[1]) ? 1 : 2) :
((bitField < DecodeLen[3]) ? 3 : 4)) :
(bitField < DecodeLen[6]) ?
((bitField < DecodeLen[5]) ? 5 : 6) :
((bitField < DecodeLen[7]) ? 7 : 8)) :
((bitField < DecodeLen[5]) ? 5 : 6) :
((bitField < DecodeLen[7]) ? 7 : 8)) :
((bitField < DecodeLen[12]) ?
((bitField < DecodeLen[10]) ?
((bitField < DecodeLen[9]) ? 9 : 10) :
((bitField < DecodeLen[11]) ? 11 : 12)) :
(bitField < DecodeLen[14]) ?
((bitField < DecodeLen[13]) ? 13 : 14) :
15));
((bitField < DecodeLen[13]) ? 13 : 14) :
15));
bstream.readBits(bits);
var N = DecodePos[bits] + ((bitField - DecodeLen[bits - 1]) >>> (16 - bits));
@@ -449,7 +456,7 @@ function rarMakeDecodeTables(BitLength, offset, dec, size) {
TmpPos[I] = DecodePos[I];
}
for (I = 0; I < size; ++I) {
if (BitLength[I + offset] != 0) {
if (BitLength[I + offset] !== 0) {
DecodeNum[TmpPos[BitLength[offset + I] & 0xF]++] = I;
}
}
@@ -524,7 +531,7 @@ function unpack20(bstream) { //, Solid) {
if (Distance >= 0x101) {
Length++;
if (Distance >= 0x2000) {
Length++
Length++;
if (Distance >= 0x40000) {
Length++;
}
@@ -611,13 +618,6 @@ function rarReadTables20(bstream) {
}
}
var lowDistRepCount = 0;
var prevLowDist = 0;
var rOldDist = [0, 0, 0, 0];
var lastDist;
var lastLength;
// ============================================================================================== //
// Unpack code specific to RarVM
@@ -644,7 +644,7 @@ var OldFilterLengths = [];
var LastFilter = 0;
function InitFilters() {
function initFilters() {
OldFilterLengths = [];
LastFilter = 0;
Filters = [];
@@ -658,13 +658,14 @@ function InitFilters() {
*/
function rarAddVMCode(firstByte, vmCode) {
VM.init();
var i;
var bstream = new bitjs.io.BitStream(vmCode.buffer, true /* rtl */ );
var filtPos;
if (firstByte & 0x80) {
filtPos = RarVM.readData(bstream);
if (filtPos == 0) {
InitFilters();
if (filtPos === 0) {
initFilters();
} else {
filtPos--;
}
@@ -677,7 +678,7 @@ function rarAddVMCode(firstByte, vmCode) {
}
LastFilter = filtPos;
var newFilter = (filtPos == Filters.length);
var newFilter = (filtPos === Filters.length);
// new filter for PrgStack
var stackFilter = new UnpackFilter();
@@ -701,10 +702,10 @@ function rarAddVMCode(firstByte, vmCode) {
}
var emptyCount = 0;
for (var i = 0; i < PrgStack.length; ++i) {
for (i = 0; i < PrgStack.length; ++i) {
PrgStack[i - emptyCount] = PrgStack[i];
if (PrgStack[i] == null) {
if (PrgStack[i] === null) {
emptyCount++;
}
if (emptyCount > 0) {
@@ -712,7 +713,7 @@ function rarAddVMCode(firstByte, vmCode) {
}
}
if (emptyCount == 0) {
if (emptyCount === 0) {
PrgStack.push(null); //PrgStack.Add(1);
emptyCount = 1;
}
@@ -734,12 +735,12 @@ function rarAddVMCode(firstByte, vmCode) {
OldFilterLengths[filtPos] :
0;
}
stackFilter.NextWindow = (wBuffer.ptr != rBuffer.ptr) &&
stackFilter.NextWindow = (wBuffer.ptr !== rBuffer.ptr) &&
(((wBuffer.ptr - rBuffer.ptr) & MAXWINMASK) <= blockStart);
OldFilterLengths[filtPos] = stackFilter.BlockLength;
for (var i = 0; i < 7; ++i) {
for (i = 0; i < 7; ++i) {
stackFilter.Prg.InitR[i] = 0;
}
stackFilter.Prg.InitR[3] = VM_GLOBALMEMADDR;
@@ -749,7 +750,7 @@ function rarAddVMCode(firstByte, vmCode) {
// set registers to optional parameters if any
if (firstByte & 0x10) {
var initMask = bstream.readBits(7);
for (var i = 0; i < 7; ++i) {
for (i = 0; i < 7; ++i) {
if (initMask & (1 << i)) {
stackFilter.Prg.InitR[i] = RarVM.readData(bstream);
}
@@ -758,11 +759,11 @@ function rarAddVMCode(firstByte, vmCode) {
if (newFilter) {
var vmCodeSize = RarVM.readData(bstream);
if (vmCodeSize >= 0x10000 || vmCodeSize == 0) {
if (vmCodeSize >= 0x10000 || vmCodeSize === 0) {
return false;
}
var vmCode = new Uint8Array(vmCodeSize);
for (var i = 0; i < vmCodeSize; ++i) {
vmCode = new Uint8Array(vmCodeSize);
for (i = 0; i < vmCodeSize; ++i) {
//if (Inp.Overflow(3))
// return(false);
vmCode[i] = bstream.readBits(8);
@@ -775,7 +776,7 @@ function rarAddVMCode(firstByte, vmCode) {
var staticDataSize = filter.Prg.StaticData.length;
if (staticDataSize > 0 && staticDataSize < VM_GLOBALMEMSIZE) {
// read statically defined data contained in DB commands
for (var i = 0; i < staticDataSize; ++i) {
for (i = 0; i < staticDataSize; ++i) {
stackFilter.Prg.StaticData[i] = filter.Prg.StaticData[i];
}
}
@@ -785,14 +786,14 @@ function rarAddVMCode(firstByte, vmCode) {
}
var globalData = stackFilter.Prg.GlobalData;
for (var i = 0; i < 7; ++i) {
for (i = 0; i < 7; ++i) {
VM.setLowEndianValue(globalData, stackFilter.Prg.InitR[i], i * 4);
}
VM.setLowEndianValue(globalData, stackFilter.BlockLength, 0x1c);
VM.setLowEndianValue(globalData, 0, 0x20);
VM.setLowEndianValue(globalData, stackFilter.ExecCount, 0x2c);
for (var i = 0; i < 16; ++i) {
for (i = 0; i < 16; ++i) {
globalData[0x30 + i] = 0;
}
@@ -816,7 +817,7 @@ function rarAddVMCode(firstByte, vmCode) {
globalData = newGlobalData;
}
//byte *GlobalData=&StackFilter->Prg.GlobalData[VM_FIXEDGLOBALSIZE];
for (var i = 0; i < dataSize; ++i) {
for (i = 0; i < dataSize; ++i) {
//if (Inp.Overflow(3))
// return(false);
globalData[VM_FIXEDGLOBALSIZE + i] = bstream.readBits(8);
@@ -833,9 +834,9 @@ function rarAddVMCode(firstByte, vmCode) {
function rarReadVMCode(bstream) {
var firstByte = bstream.readBits(8);
var length = (firstByte & 7) + 1;
if (length == 7) {
if (length === 7) {
length = bstream.readBits(8) + 7;
} else if (length == 8) {
} else if (length === 8) {
length = bstream.readBits(16);
}
@@ -845,7 +846,7 @@ function rarReadVMCode(bstream) {
// Do something here with checking readbuf.
vmCode[i] = bstream.readBits(8);
}
return RarAddVMCode(firstByte, vmCode);
return rarAddVMCode(firstByte, vmCode);
}
/**
@@ -946,7 +947,7 @@ function unpack29(bstream) {
continue;
}
if (num === 258) {
if (lastLength != 0) {
if (lastLength !== 0) {
rarCopyString(lastLength, lastDist);
}
continue;
@@ -955,8 +956,8 @@ function unpack29(bstream) {
var DistNum = num - 259;
Distance = rOldDist[DistNum];
for (var I = DistNum; I > 0; I--) {
rOldDist[I] = rOldDist[I - 1];
for (var I2 = DistNum; I2 > 0; I2--) {
rOldDist[I2] = rOldDist[I2 - 1];
}
rOldDist[0] = Distance;
@@ -990,10 +991,11 @@ function unpack29(bstream) {
*/
function rarWriteBuf() {
var writeSize = (rBuffer.ptr & MAXWINMASK);
var j;
var flt;
for (var i = 0; i < PrgStack.length; ++i) {
var flt = PrgStack[i];
if (flt == null) {
flt = PrgStack[i];
if (flt === null) {
continue;
}
@@ -1004,17 +1006,18 @@ function rarWriteBuf() {
var blockStart = flt.BlockStart;
var blockLength = flt.BlockLength;
var parentPrg;
// WrittenBorder = wBuffer.ptr
if (((blockStart - wBuffer.ptr) & MAXWINMASK) < writeSize) {
if (wBuffer.ptr != blockStart) {
if (wBuffer.ptr !== blockStart) {
// Copy blockStart bytes from rBuffer into wBuffer.
rarWriteArea(wBuffer.ptr, blockStart);
writeSize = (rBuffer.ptr - wBuffer.ptr) & MAXWINMASK;
}
if (blockLength <= writeSize) {
var blockEnd = (blockStart + blockLength) & MAXWINMASK;
if (blockStart < blockEnd || blockEnd == 0) {
if (blockStart < blockEnd || blockEnd === 0) {
VM.setMemory(0, rBuffer.data.subarray(blockStart, blockStart + blockLength), blockLength);
} else {
var firstPartLength = MAXWINSIZE - blockStart;
@@ -1022,7 +1025,7 @@ function rarWriteBuf() {
VM.setMemory(firstPartLength, rBuffer.data, blockEnd);
}
var parentPrg = Filters[flt.ParentFilter].Prg;
parentPrg = Filters[flt.ParentFilter].Prg;
var prg = flt.Prg;
if (parentPrg.GlobalData.length > VM_FIXEDGLOBALSIZE) {
@@ -1031,10 +1034,11 @@ function rarWriteBuf() {
}
rarExecuteCode(prg);
var globalDataLen;
if (prg.GlobalData.length > VM_FIXEDGLOBALSIZE) {
// Save global data for next script execution.
var globalDataLen = prg.GlobalData.length;
globalDataLen = prg.GlobalData.length;
if (parentPrg.GlobalData.length < globalDataLen) {
parentPrg.GlobalData = new Uint8Array(globalDataLen);
}
@@ -1050,8 +1054,8 @@ function rarWriteBuf() {
PrgStack[i] = null;
while (i + 1 < PrgStack.length) {
var nextFilter = PrgStack[i + 1];
if (nextFilter == null || nextFilter.BlockStart != blockStart ||
nextFilter.BlockLength != filteredData.length || nextFilter.NextWindow) {
if (nextFilter === null || nextFilter.BlockStart !== blockStart ||
nextFilter.BlockLength !== filteredData.length || nextFilter.NextWindow) {
break;
}
@@ -1059,10 +1063,10 @@ function rarWriteBuf() {
VM.setMemory(0, filteredData, filteredData.length);
var parentPrg = Filters[nextFilter.ParentFilter].Prg;
parentPrg = Filters[nextFilter.ParentFilter].Prg;
var nextPrg = nextFilter.Prg;
var globalDataLen = parentPrg.GlobalData.length;
globalDataLen = parentPrg.GlobalData.length;
if (globalDataLen > VM_FIXEDGLOBALSIZE) {
// Copy global data from previous script execution if any.
nextPrg.GlobalData = new Uint8Array(globalDataLen);
@@ -1073,7 +1077,7 @@ function rarWriteBuf() {
if (nextPrg.GlobalData.length > VM_GLOBALMEMSIZE) {
// Save global data for next script execution.
var globalDataLen = nextPrg.GlobalData.length;
globalDataLen = nextPrg.GlobalData.length;
if (parentPrg.GlobalData.length < globalDataLen) {
parentPrg.GlobalData = new Uint8Array(globalDataLen);
}
@@ -1089,15 +1093,14 @@ function rarWriteBuf() {
PrgStack[i] = null;
} // while (i + 1 < PrgStack.length)
for (var j = 0; j < filteredData.length; ++j) {
for (j = 0; j < filteredData.length; ++j) {
wBuffer.insertByte(filteredData[j]);
}
writeSize = (rBuffer.ptr - wBuffer.ptr) & MAXWINMASK;
} // if (blockLength <= writeSize)
else {
for (var j = i; j < PrgStack.length; ++j) {
var flt = PrgStack[j];
if (flt != null && flt.NextWindow) {
} else { // if (blockLength <= writeSize)
for (j = i; j < PrgStack.length; ++j) {
flt = PrgStack[j];
if (flt !== null && flt.NextWindow) {
flt.NextWindow = false;
}
}
@@ -1121,7 +1124,7 @@ function rarWriteBuf() {
*/
function rarWriteArea(startPtr, endPtr) {
if (endPtr < startPtr) {
console.error('endPtr < startPtr, endPtr=' + endPtr + ', startPtr=' + startPtr);
console.error("endPtr < startPtr, endPtr=" + endPtr + ", startPtr=" + startPtr);
// rarWriteData(startPtr, -(int)StartPtr & MAXWINMASK);
// RarWriteData(0, endPtr);
return;
@@ -1173,7 +1176,7 @@ function rarReadEndOfBlock(bstream) {
NewTable = !!bstream.readBits(1);
}
//tablesRead = !NewTable;
return !(NewFile || NewTable && !rarReadTables(bstream));
return !(NewFile || (NewTable && !rarReadTables(bstream)));
}
function rarInsertLastMatch(length, distance) {
@@ -1220,8 +1223,8 @@ function rarCopyString(length, distance) {
function unpack(v) {
// TODO: implement what happens when unpVer is < 15
var Ver = v.header.unpVer <= 15 ? 15 : v.header.unpVer;
var Solid = v.header.LHD_SOLID;
var bstream = new bitjs.io.BitStream(v.fileData.buffer, true /* rtl */ , v.fileData.byteOffset, v.fileData.byteLength);
// var Solid = v.header.LHD_SOLID;
var bstream = new bitjs.io.BitStream(v.fileData.buffer, true /* rtl */, v.fileData.byteOffset, v.fileData.byteLength);
rBuffer = new bitjs.io.ByteBuffer(v.header.unpackedSize);
@@ -1252,7 +1255,7 @@ var RarLocalFile = function(bstream) {
this.header = new RarVolumeHeader(bstream);
this.filename = this.header.filename;
if (this.header.headType != FILE_HEAD && this.header.headType != ENDARC_HEAD) {
if (this.header.headType !== FILE_HEAD && this.header.headType !== ENDARC_HEAD) {
this.isValid = false;
info("Error! RAR Volume did not include a FILE_HEAD header ");
} else {
@@ -1306,7 +1309,7 @@ var unrar = function(arrayBuffer) {
info("Found RAR signature");
var mhead = new RarVolumeHeader(bstream);
if (mhead.headType != MAIN_HEAD) {
if (mhead.headType !== MAIN_HEAD) {
info("Error! RAR did not include a MAIN_HEAD header");
} else {
var localFiles = [];