what-the-bank/sources/org/jnbis/internal/InternalWsqDecoder.java

1239 lines
45 KiB
Java

package org.jnbis.internal;
import java.util.Arrays;
import org.bouncycastle.crypto.tls.CipherSuite;
import org.jnbis.Bitmap;
import org.jnbis.internal.WsqHelper;
/* loaded from: classes6.dex */
public class InternalWsqDecoder {
private int getCPpiWSQ() {
return -1;
}
private int intSign(int i) {
if (i == 0) {
return 1;
}
int i2 = -1;
for (int i3 = 1; i3 < i; i3++) {
i2 = -i2;
}
return i2;
}
public Bitmap decode(byte[] bArr) {
WsqHelper.Token token = new WsqHelper.Token(bArr);
token.initialize();
getCMarkerWSQ(token, 65440);
int cMarkerWSQ = getCMarkerWSQ(token, 2);
while (cMarkerWSQ != 65442) {
getCTableWSQ(token, cMarkerWSQ);
cMarkerWSQ = getCMarkerWSQ(token, 2);
}
WsqHelper.HeaderFrm cFrameHeaderWSQ = getCFrameHeaderWSQ(token);
int i = cFrameHeaderWSQ.width;
int i2 = cFrameHeaderWSQ.height;
int cPpiWSQ = getCPpiWSQ();
buildWSQTrees(token, i, i2);
float[] unquantize = unquantize(token, huffmanDecodeDataMem(token, i * i2), i, i2);
wsqReconstruct(token, unquantize, i, i2);
return new Bitmap(convertImage2Byte(unquantize, i, i2, cFrameHeaderWSQ.mShift, cFrameHeaderWSQ.rScale), i, i2, cPpiWSQ, 8, 1);
}
private int getCMarkerWSQ(WsqHelper.Token token, int i) {
if (token.pointer >= token.buffer.length) {
StringBuilder sb = new StringBuilder("Error, Invalid pointer : ");
sb.append(token.pointer);
throw new RuntimeException(sb.toString());
}
int readShort = token.readShort();
if (i == 2) {
if (readShort == 65444 || readShort == 65445 || readShort == 65446 || readShort == 65442 || readShort == 65448) {
return readShort;
}
throw new RuntimeException("ERROR : getc_marker_wsq : No SOF, Table, or comment markers : ".concat(String.valueOf(readShort)));
}
if (i == 4) {
if (readShort == 65444 || readShort == 65445 || readShort == 65446 || readShort == 65443 || readShort == 65448) {
return readShort;
}
throw new RuntimeException("ERROR : getc_marker_wsq : No SOB, Table, or comment markers : ".concat(String.valueOf(readShort)));
}
if (i == 65440) {
if (readShort == 65440) {
return readShort;
}
throw new RuntimeException("ERROR : getCMarkerWSQ : No SOI marker : ".concat(String.valueOf(readShort)));
}
if (i != 65535) {
throw new RuntimeException("ERROR : getc_marker_wsq : Invalid marker : ".concat(String.valueOf(readShort)));
}
if ((readShort & CipherSuite.DRAFT_TLS_DHE_RSA_WITH_AES_128_OCB) != 65280) {
throw new RuntimeException("ERROR : getc_marker_wsq : no marker found : ".concat(String.valueOf(readShort)));
}
if (readShort < 65440 || readShort > 65448) {
throw new RuntimeException("ERROR : getc_marker_wsq : not a valid marker : ".concat(String.valueOf(readShort)));
}
return readShort;
}
private void getCTableWSQ(WsqHelper.Token token, int i) {
switch (i) {
case 65444:
getCTransformTable(token);
return;
case 65445:
getCQuantizationTable(token);
return;
case 65446:
getCHuffmanTableWSQ(token);
return;
case 65447:
default:
throw new RuntimeException("ERROR: getCTableWSQ : Invalid table defined : ".concat(String.valueOf(i)));
case 65448:
getCComment(token);
return;
}
}
private String getCComment(WsqHelper.Token token) {
return Arrays.toString(token.readBytes(token.readShort() - 2));
}
private void getCTransformTable(WsqHelper.Token token) {
int i;
int i2;
token.readShort();
token.tableDTT.hisz = token.readByte();
token.tableDTT.losz = token.readByte();
token.tableDTT.hifilt = new float[token.tableDTT.hisz];
token.tableDTT.lofilt = new float[token.tableDTT.losz];
if (token.tableDTT.hisz % 2 != 0) {
i = (token.tableDTT.hisz + 1) / 2;
} else {
i = token.tableDTT.hisz / 2;
}
float[] fArr = new float[i];
int i3 = i - 1;
for (int i4 = 0; i4 <= i3; i4++) {
int readByte = token.readByte();
fArr[i4] = (float) token.readInt();
for (int readByte2 = token.readByte(); readByte2 > 0; readByte2--) {
fArr[i4] = (float) (fArr[i4] / 10.0d);
}
if (readByte != 0) {
fArr[i4] = (float) (-fArr[i4]);
}
if (token.tableDTT.hisz % 2 != 0) {
int i5 = i4 + i3;
token.tableDTT.hifilt[i5] = intSign(i4) * fArr[i4];
if (i4 > 0) {
token.tableDTT.hifilt[i3 - i4] = token.tableDTT.hifilt[i5];
}
} else {
int i6 = i4 + i3 + 1;
token.tableDTT.hifilt[i6] = intSign(i4) * fArr[i4];
token.tableDTT.hifilt[i3 - i4] = -token.tableDTT.hifilt[i6];
}
}
if (token.tableDTT.losz % 2 != 0) {
i2 = (token.tableDTT.losz + 1) / 2;
} else {
i2 = token.tableDTT.losz / 2;
}
float[] fArr2 = new float[i2];
int i7 = i2 - 1;
for (int i8 = 0; i8 <= i7; i8++) {
int readByte3 = token.readByte();
fArr2[i8] = (float) token.readInt();
for (int readByte4 = token.readByte(); readByte4 > 0; readByte4--) {
fArr2[i8] = (float) (fArr2[i8] / 10.0d);
}
if (readByte3 != 0) {
fArr2[i8] = (float) (-fArr2[i8]);
}
if (token.tableDTT.losz % 2 != 0) {
int i9 = i8 + i7;
token.tableDTT.lofilt[i9] = intSign(i8) * fArr2[i8];
if (i8 > 0) {
token.tableDTT.lofilt[i7 - i8] = token.tableDTT.lofilt[i9];
}
} else {
int i10 = i8 + i7 + 1;
token.tableDTT.lofilt[i10] = intSign(i8 + 1) * fArr2[i8];
token.tableDTT.lofilt[i7 - i8] = token.tableDTT.lofilt[i10];
}
}
token.tableDTT.lodef = 1;
token.tableDTT.hidef = 1;
}
public void getCQuantizationTable(WsqHelper.Token token) {
token.readShort();
token.tableDQT.binCenter = token.readShort();
for (int readByte = token.readByte(); readByte > 0; readByte--) {
token.tableDQT.binCenter = (float) (r3.binCenter / 10.0d);
}
for (int i = 0; i < 64; i++) {
token.tableDQT.qBin[i] = token.readShort();
for (int readByte2 = token.readByte(); readByte2 > 0; readByte2--) {
token.tableDQT.qBin[i] = (float) (r4[i] / 10.0d);
}
token.tableDQT.zBin[i] = token.readShort();
for (int readByte3 = token.readByte(); readByte3 > 0; readByte3--) {
token.tableDQT.zBin[i] = (float) (r4[i] / 10.0d);
}
}
token.tableDQT.dqtDef = (char) 1;
}
public void getCHuffmanTableWSQ(WsqHelper.Token token) {
WsqHelper.HuffmanTable cHuffmanTable = getCHuffmanTable(token, 256, 0, true);
int i = cHuffmanTable.tableId;
token.tableDHT[i].huffbits = (int[]) cHuffmanTable.huffbits.clone();
token.tableDHT[i].huffvalues = (int[]) cHuffmanTable.huffvalues.clone();
token.tableDHT[i].tabdef = (byte) 1;
int i2 = cHuffmanTable.bytesLeft;
while (i2 != 0) {
WsqHelper.HuffmanTable cHuffmanTable2 = getCHuffmanTable(token, 256, i2, false);
int i3 = cHuffmanTable2.tableId;
if (token.tableDHT[i3].tabdef != 0) {
throw new RuntimeException("ERROR : getCHuffmanTableWSQ : huffman table already defined.");
}
token.tableDHT[i3].huffbits = (int[]) cHuffmanTable2.huffbits.clone();
token.tableDHT[i3].huffvalues = (int[]) cHuffmanTable2.huffvalues.clone();
token.tableDHT[i3].tabdef = (byte) 1;
i2 = cHuffmanTable2.bytesLeft;
}
}
private WsqHelper.HuffmanTable getCHuffmanTable(WsqHelper.Token token, int i, int i2, boolean z) {
WsqHelper.HuffmanTable huffmanTable = new WsqHelper.HuffmanTable();
if (z) {
huffmanTable.tableLen = token.readShort();
huffmanTable.bytesLeft = huffmanTable.tableLen - 2;
i2 = huffmanTable.bytesLeft;
} else {
huffmanTable.bytesLeft = i2;
}
if (i2 <= 0) {
throw new RuntimeException("ERROR : getCHuffmanTable : no huffman table bytes remaining");
}
huffmanTable.tableId = token.readByte();
huffmanTable.bytesLeft--;
huffmanTable.huffbits = new int[16];
int i3 = 0;
for (int i4 = 0; i4 < 16; i4++) {
huffmanTable.huffbits[i4] = token.readByte();
i3 += huffmanTable.huffbits[i4];
}
huffmanTable.bytesLeft -= 16;
int i5 = i + 1;
if (i3 > i5) {
throw new RuntimeException("ERROR : getCHuffmanTable : numHufvals is larger than MAX_HUFFCOUNTS");
}
huffmanTable.huffvalues = new int[i5];
for (int i6 = 0; i6 < i3; i6++) {
huffmanTable.huffvalues[i6] = token.readByte();
}
huffmanTable.bytesLeft -= i3;
return huffmanTable;
}
private WsqHelper.HeaderFrm getCFrameHeaderWSQ(WsqHelper.Token token) {
WsqHelper.HeaderFrm headerFrm = new WsqHelper.HeaderFrm();
token.readShort();
headerFrm.black = token.readByte();
headerFrm.white = token.readByte();
headerFrm.height = token.readShort();
headerFrm.width = token.readShort();
headerFrm.mShift = token.readShort();
for (int readByte = token.readByte(); readByte > 0; readByte--) {
headerFrm.mShift = (float) (headerFrm.mShift / 10.0d);
}
headerFrm.rScale = token.readShort();
for (int readByte2 = token.readByte(); readByte2 > 0; readByte2--) {
headerFrm.rScale = (float) (headerFrm.rScale / 10.0d);
}
headerFrm.wsqEncoder = token.readByte();
headerFrm.software = token.readShort();
return headerFrm;
}
private void buildWSQTrees(WsqHelper.Token token, int i, int i2) {
buildWTree(token, 20, i, i2);
buildQTree(token, 64);
}
private void buildWTree(WsqHelper.Token token, int i, int i2, int i3) {
int i4;
int i5;
int i6;
int i7;
token.wtree = new WsqHelper.WavletTree[i];
for (int i8 = 0; i8 < i; i8++) {
token.wtree[i8] = new WsqHelper.WavletTree();
token.wtree[i8].invrw = 0;
token.wtree[i8].invcl = 0;
}
token.wtree[2].invrw = 1;
token.wtree[4].invrw = 1;
token.wtree[7].invrw = 1;
token.wtree[9].invrw = 1;
token.wtree[11].invrw = 1;
token.wtree[13].invrw = 1;
token.wtree[16].invrw = 1;
token.wtree[18].invrw = 1;
token.wtree[3].invcl = 1;
token.wtree[5].invcl = 1;
token.wtree[8].invcl = 1;
token.wtree[9].invcl = 1;
token.wtree[12].invcl = 1;
token.wtree[13].invcl = 1;
token.wtree[17].invcl = 1;
token.wtree[18].invcl = 1;
wtree4(token, 0, 1, i2, i3, 0, 0, 1);
if (token.wtree[1].lenx % 2 == 0) {
i5 = token.wtree[1].lenx / 2;
i4 = i5;
} else {
int i9 = (token.wtree[1].lenx + 1) / 2;
i4 = i9;
i5 = i9 - 1;
}
if (token.wtree[1].leny % 2 == 0) {
i6 = token.wtree[1].leny / 2;
i7 = i6;
} else {
int i10 = (token.wtree[1].leny + 1) / 2;
i6 = i10;
i7 = i10 - 1;
}
wtree4(token, 4, 6, i5, i6, i4, 0, 0);
int i11 = i4;
wtree4(token, 5, 10, i11, i7, 0, i6, 0);
wtree4(token, 14, 15, i11, i6, 0, 0, 0);
token.wtree[19].x = 0;
token.wtree[19].y = 0;
if (token.wtree[15].lenx % 2 == 0) {
token.wtree[19].lenx = token.wtree[15].lenx / 2;
} else {
token.wtree[19].lenx = (token.wtree[15].lenx + 1) / 2;
}
if (token.wtree[15].leny % 2 == 0) {
token.wtree[19].leny = token.wtree[15].leny / 2;
} else {
token.wtree[19].leny = (token.wtree[15].leny + 1) / 2;
}
}
private void wtree4(WsqHelper.Token token, int i, int i2, int i3, int i4, int i5, int i6, int i7) {
token.wtree[i].x = i5;
token.wtree[i].y = i6;
token.wtree[i].lenx = i3;
token.wtree[i].leny = i4;
token.wtree[i2].x = i5;
int i8 = i2 + 2;
token.wtree[i8].x = i5;
token.wtree[i2].y = i6;
int i9 = i2 + 1;
token.wtree[i9].y = i6;
if (i3 % 2 == 0) {
token.wtree[i2].lenx = i3 / 2;
token.wtree[i9].lenx = token.wtree[i2].lenx;
} else if (i == 4) {
token.wtree[i2].lenx = (i3 - 1) / 2;
token.wtree[i9].lenx = token.wtree[i2].lenx + 1;
} else {
token.wtree[i2].lenx = (i3 + 1) / 2;
token.wtree[i9].lenx = token.wtree[i2].lenx - 1;
}
token.wtree[i9].x = token.wtree[i2].lenx + i5;
if (i7 == 0) {
int i10 = i2 + 3;
token.wtree[i10].lenx = token.wtree[i9].lenx;
token.wtree[i10].x = token.wtree[i9].x;
}
token.wtree[i8].lenx = token.wtree[i2].lenx;
if (i4 % 2 == 0) {
token.wtree[i2].leny = i4 / 2;
token.wtree[i8].leny = token.wtree[i2].leny;
} else if (i == 5) {
token.wtree[i2].leny = (i4 - 1) / 2;
token.wtree[i8].leny = token.wtree[i2].leny + 1;
} else {
token.wtree[i2].leny = (i4 + 1) / 2;
token.wtree[i8].leny = token.wtree[i2].leny - 1;
}
token.wtree[i8].y = token.wtree[i2].leny + i6;
if (i7 == 0) {
int i11 = i2 + 3;
token.wtree[i11].leny = token.wtree[i8].leny;
token.wtree[i11].y = token.wtree[i8].y;
}
token.wtree[i9].leny = token.wtree[i2].leny;
}
private void buildQTree(WsqHelper.Token token, int i) {
token.qtree = new WsqHelper.QuantTree[i];
for (int i2 = 0; i2 < token.qtree.length; i2++) {
token.qtree[i2] = new WsqHelper.QuantTree();
}
qtree16(token, 3, token.wtree[14].lenx, token.wtree[14].leny, token.wtree[14].x, token.wtree[14].y, 0, 0);
qtree16(token, 19, token.wtree[4].lenx, token.wtree[4].leny, token.wtree[4].x, token.wtree[4].y, 0, 1);
qtree16(token, 48, token.wtree[0].lenx, token.wtree[0].leny, token.wtree[0].x, token.wtree[0].y, 0, 0);
qtree16(token, 35, token.wtree[5].lenx, token.wtree[5].leny, token.wtree[5].x, token.wtree[5].y, 1, 0);
qtree4(token, 0, token.wtree[19].lenx, token.wtree[19].leny, token.wtree[19].x, token.wtree[19].y);
}
private void qtree16(WsqHelper.Token token, int i, int i2, int i3, int i4, int i5, int i6, int i7) {
int i8;
int i9;
int i10;
int i11;
if (i2 % 2 == 0) {
i8 = i2 / 2;
i9 = i8;
} else if (i7 != 0) {
int i12 = (i2 + 1) / 2;
i9 = i12;
i8 = i12 - 1;
} else {
i8 = (i2 + 1) / 2;
i9 = i8 - 1;
}
if (i3 % 2 == 0) {
i10 = i3 / 2;
i11 = i10;
} else if (i6 != 0) {
int i13 = (i3 + 1) / 2;
i11 = i13;
i10 = i13 - 1;
} else {
i10 = (i3 + 1) / 2;
i11 = i10 - 1;
}
token.qtree[i].x = i4;
int i14 = i + 2;
token.qtree[i14].x = i4;
token.qtree[i].y = i5;
int i15 = i + 1;
token.qtree[i15].y = i5;
if (i8 % 2 == 0) {
token.qtree[i].lenx = i8 / 2;
token.qtree[i15].lenx = token.qtree[i].lenx;
token.qtree[i14].lenx = token.qtree[i].lenx;
token.qtree[i + 3].lenx = token.qtree[i].lenx;
} else {
token.qtree[i].lenx = (i8 + 1) / 2;
token.qtree[i15].lenx = token.qtree[i].lenx - 1;
token.qtree[i14].lenx = token.qtree[i].lenx;
token.qtree[i + 3].lenx = token.qtree[i15].lenx;
}
token.qtree[i15].x = token.qtree[i].lenx + i4;
int i16 = i + 3;
token.qtree[i16].x = token.qtree[i15].x;
if (i10 % 2 == 0) {
token.qtree[i].leny = i10 / 2;
token.qtree[i15].leny = token.qtree[i].leny;
token.qtree[i14].leny = token.qtree[i].leny;
token.qtree[i16].leny = token.qtree[i].leny;
} else {
token.qtree[i].leny = (i10 + 1) / 2;
token.qtree[i15].leny = token.qtree[i].leny;
token.qtree[i14].leny = token.qtree[i].leny - 1;
token.qtree[i16].leny = token.qtree[i14].leny;
}
token.qtree[i14].y = token.qtree[i].leny + i5;
token.qtree[i16].y = token.qtree[i14].y;
int i17 = i + 4;
token.qtree[i17].x = i8 + i4;
int i18 = i + 6;
token.qtree[i18].x = token.qtree[i17].x;
token.qtree[i17].y = i5;
int i19 = i + 5;
token.qtree[i19].y = i5;
token.qtree[i18].y = token.qtree[i14].y;
int i20 = i + 7;
token.qtree[i20].y = token.qtree[i14].y;
token.qtree[i17].leny = token.qtree[i].leny;
token.qtree[i19].leny = token.qtree[i].leny;
token.qtree[i18].leny = token.qtree[i14].leny;
token.qtree[i20].leny = token.qtree[i14].leny;
if (i9 % 2 == 0) {
token.qtree[i17].lenx = i9 / 2;
token.qtree[i19].lenx = token.qtree[i17].lenx;
token.qtree[i18].lenx = token.qtree[i17].lenx;
token.qtree[i20].lenx = token.qtree[i17].lenx;
} else {
token.qtree[i19].lenx = (i9 + 1) / 2;
token.qtree[i17].lenx = token.qtree[i19].lenx - 1;
token.qtree[i18].lenx = token.qtree[i17].lenx;
token.qtree[i20].lenx = token.qtree[i19].lenx;
}
token.qtree[i19].x = token.qtree[i17].x + token.qtree[i17].lenx;
token.qtree[i20].x = token.qtree[i19].x;
int i21 = i + 8;
token.qtree[i21].x = i4;
int i22 = i + 9;
token.qtree[i22].x = token.qtree[i15].x;
int i23 = i + 10;
token.qtree[i23].x = i4;
int i24 = i + 11;
token.qtree[i24].x = token.qtree[i15].x;
token.qtree[i21].y = i5 + i10;
token.qtree[i22].y = token.qtree[i21].y;
token.qtree[i21].lenx = token.qtree[i].lenx;
token.qtree[i22].lenx = token.qtree[i15].lenx;
token.qtree[i23].lenx = token.qtree[i].lenx;
token.qtree[i24].lenx = token.qtree[i15].lenx;
if (i11 % 2 == 0) {
token.qtree[i21].leny = i11 / 2;
token.qtree[i22].leny = token.qtree[i21].leny;
token.qtree[i23].leny = token.qtree[i21].leny;
token.qtree[i24].leny = token.qtree[i21].leny;
} else {
token.qtree[i23].leny = (i11 + 1) / 2;
token.qtree[i24].leny = token.qtree[i23].leny;
token.qtree[i21].leny = token.qtree[i23].leny - 1;
token.qtree[i22].leny = token.qtree[i21].leny;
}
token.qtree[i23].y = token.qtree[i21].y + token.qtree[i21].leny;
token.qtree[i24].y = token.qtree[i23].y;
int i25 = i + 12;
token.qtree[i25].x = token.qtree[i17].x;
int i26 = i + 13;
token.qtree[i26].x = token.qtree[i19].x;
int i27 = i + 14;
token.qtree[i27].x = token.qtree[i17].x;
int i28 = i + 15;
token.qtree[i28].x = token.qtree[i19].x;
token.qtree[i25].y = token.qtree[i21].y;
token.qtree[i26].y = token.qtree[i21].y;
token.qtree[i27].y = token.qtree[i23].y;
token.qtree[i28].y = token.qtree[i23].y;
token.qtree[i25].lenx = token.qtree[i17].lenx;
token.qtree[i26].lenx = token.qtree[i19].lenx;
token.qtree[i27].lenx = token.qtree[i17].lenx;
token.qtree[i28].lenx = token.qtree[i19].lenx;
token.qtree[i25].leny = token.qtree[i21].leny;
token.qtree[i26].leny = token.qtree[i21].leny;
token.qtree[i27].leny = token.qtree[i23].leny;
token.qtree[i28].leny = token.qtree[i23].leny;
}
private void qtree4(WsqHelper.Token token, int i, int i2, int i3, int i4, int i5) {
token.qtree[i].x = i4;
int i6 = i + 2;
token.qtree[i6].x = i4;
token.qtree[i].y = i5;
int i7 = i + 1;
token.qtree[i7].y = i5;
if (i2 % 2 == 0) {
token.qtree[i].lenx = i2 / 2;
token.qtree[i7].lenx = token.qtree[i].lenx;
token.qtree[i6].lenx = token.qtree[i].lenx;
token.qtree[i + 3].lenx = token.qtree[i].lenx;
} else {
token.qtree[i].lenx = (i2 + 1) / 2;
token.qtree[i7].lenx = token.qtree[i].lenx - 1;
token.qtree[i6].lenx = token.qtree[i].lenx;
token.qtree[i + 3].lenx = token.qtree[i7].lenx;
}
token.qtree[i7].x = i4 + token.qtree[i].lenx;
int i8 = i + 3;
token.qtree[i8].x = token.qtree[i7].x;
if (i3 % 2 == 0) {
token.qtree[i].leny = i3 / 2;
token.qtree[i7].leny = token.qtree[i].leny;
token.qtree[i6].leny = token.qtree[i].leny;
token.qtree[i8].leny = token.qtree[i].leny;
} else {
token.qtree[i].leny = (i3 + 1) / 2;
token.qtree[i7].leny = token.qtree[i].leny;
token.qtree[i6].leny = token.qtree[i].leny - 1;
token.qtree[i8].leny = token.qtree[i6].leny;
}
token.qtree[i6].y = i5 + token.qtree[i].leny;
token.qtree[i8].y = token.qtree[i6].y;
}
private int[] huffmanDecodeDataMem(WsqHelper.Token token, int i) {
WsqHelper.IntRef intRef;
int i2;
int i3;
int[] iArr = new int[i];
int[] iArr2 = new int[17];
int[] iArr3 = new int[17];
int[] iArr4 = new int[17];
int i4 = 4;
WsqHelper.IntRef intRef2 = new WsqHelper.IntRef(getCMarkerWSQ(token, 4));
int i5 = 0;
WsqHelper.IntRef intRef3 = new WsqHelper.IntRef(0);
WsqHelper.IntRef intRef4 = new WsqHelper.IntRef(0);
int i6 = 0;
int i7 = 0;
while (intRef2.value != 65441) {
if (intRef2.value != 0) {
while (intRef2.value != 65443) {
getCTableWSQ(token, intRef2.value);
intRef2.value = getCMarkerWSQ(token, i4);
}
i2 = getCBlockHeader(token);
if (token.tableDHT[i2].tabdef != 1) {
throw new RuntimeException("ERROR : huffmanDecodeDataMem : huffman table undefined.");
}
WsqHelper.HuffCode[] buildHuffsizes = buildHuffsizes(token.tableDHT[i2].huffbits, 256);
buildHuffcodes(buildHuffsizes);
intRef = intRef4;
genDecodeTable(buildHuffsizes, iArr2, iArr3, iArr4, token.tableDHT[i2].huffbits);
intRef3.value = i5;
intRef2.value = i5;
} else {
intRef = intRef4;
i2 = i6;
}
int i8 = i5;
WsqHelper.IntRef intRef5 = intRef3;
int i9 = i4;
int decodeDataMem = decodeDataMem(token, iArr3, iArr2, iArr4, token.tableDHT[i2].huffvalues, intRef3, intRef2, intRef);
if (decodeDataMem != -1) {
if (decodeDataMem > 0 && decodeDataMem <= 100) {
int i10 = i8;
while (i10 < decodeDataMem) {
iArr[i7] = i8;
i10++;
i7++;
}
} else if (decodeDataMem <= 106 || decodeDataMem >= 255) {
if (decodeDataMem == 101) {
i3 = i7 + 1;
intRef4 = intRef;
iArr[i7] = getCNextbitsWSQ(token, intRef2, intRef5, 8, intRef4);
} else if (decodeDataMem == 102) {
i3 = i7 + 1;
intRef4 = intRef;
iArr[i7] = -getCNextbitsWSQ(token, intRef2, intRef5, 8, intRef4);
} else if (decodeDataMem == 103) {
i3 = i7 + 1;
intRef4 = intRef;
iArr[i7] = getCNextbitsWSQ(token, intRef2, intRef5, 16, intRef4);
} else if (decodeDataMem == 104) {
i3 = i7 + 1;
intRef4 = intRef;
iArr[i7] = -getCNextbitsWSQ(token, intRef2, intRef5, 16, intRef4);
} else if (decodeDataMem == 105) {
for (int cNextbitsWSQ = getCNextbitsWSQ(token, intRef2, intRef5, 8, intRef); cNextbitsWSQ > 0; cNextbitsWSQ--) {
iArr[i7] = i8;
i7++;
}
} else if (decodeDataMem == 106) {
for (int cNextbitsWSQ2 = getCNextbitsWSQ(token, intRef2, intRef5, 16, intRef); cNextbitsWSQ2 > 0; cNextbitsWSQ2--) {
iArr[i7] = i8;
i7++;
}
} else {
StringBuilder sb = new StringBuilder("ERROR: huffman_decode_data_mem : Invalid code (");
sb.append(decodeDataMem);
sb.append(")");
throw new RuntimeException(sb.toString());
}
i7 = i3;
i6 = i2;
i5 = i8;
intRef3 = intRef5;
i4 = i9;
} else {
iArr[i7] = decodeDataMem - 180;
i7++;
}
}
i6 = i2;
i5 = i8;
intRef4 = intRef;
intRef3 = intRef5;
i4 = i9;
}
return iArr;
}
private int getCBlockHeader(WsqHelper.Token token) {
token.readShort();
return token.readByte();
}
private WsqHelper.HuffCode[] buildHuffsizes(int[] iArr, int i) {
WsqHelper.HuffCode[] huffCodeArr = new WsqHelper.HuffCode[i + 1];
int i2 = 0;
for (int i3 = 1; i3 <= 16; i3++) {
for (int i4 = 1; i4 <= iArr[i3 - 1]; i4++) {
WsqHelper.HuffCode huffCode = new WsqHelper.HuffCode();
huffCodeArr[i2] = huffCode;
huffCode.size = i3;
i2++;
}
}
WsqHelper.HuffCode huffCode2 = new WsqHelper.HuffCode();
huffCodeArr[i2] = huffCode2;
huffCode2.size = 0;
return huffCodeArr;
}
private void buildHuffcodes(WsqHelper.HuffCode[] huffCodeArr) {
int i = 0;
int i2 = huffCodeArr[0].size;
if (huffCodeArr[0].size == 0) {
return;
}
int i3 = i2;
short s = 0;
while (true) {
huffCodeArr[i].code = s;
s = (short) (s + 1);
i++;
if (huffCodeArr[i].size != i3) {
if (huffCodeArr[i].size == 0) {
return;
}
do {
s = (short) (s << 1);
i3++;
} while (huffCodeArr[i].size != i3);
if (huffCodeArr[i].size != i3) {
return;
}
}
}
}
private void genDecodeTable(WsqHelper.HuffCode[] huffCodeArr, int[] iArr, int[] iArr2, int[] iArr3, int[] iArr4) {
int i = 0;
for (int i2 = 0; i2 <= 16; i2++) {
iArr[i2] = 0;
iArr2[i2] = 0;
iArr3[i2] = 0;
}
for (int i3 = 1; i3 <= 16; i3++) {
int i4 = i3 - 1;
if (iArr4[i4] == 0) {
iArr[i3] = -1;
} else {
iArr3[i3] = i;
iArr2[i3] = huffCodeArr[i].code;
i += iArr4[i4];
iArr[i3] = huffCodeArr[i - 1].code;
}
}
}
private int decodeDataMem(WsqHelper.Token token, int[] iArr, int[] iArr2, int[] iArr3, int[] iArr4, WsqHelper.IntRef intRef, WsqHelper.IntRef intRef2, WsqHelper.IntRef intRef3) {
short cNextbitsWSQ = (short) getCNextbitsWSQ(token, intRef2, intRef, 1, intRef3);
if (intRef2.value != 0) {
return -1;
}
int i = 1;
while (cNextbitsWSQ > iArr2[i]) {
cNextbitsWSQ = (short) ((cNextbitsWSQ << 1) + getCNextbitsWSQ(token, intRef2, intRef, 1, intRef3));
if (intRef2.value != 0) {
return -1;
}
i++;
}
return iArr4[(iArr3[i] + cNextbitsWSQ) - iArr[i]];
}
private int getCNextbitsWSQ(WsqHelper.Token token, WsqHelper.IntRef intRef, WsqHelper.IntRef intRef2, int i, WsqHelper.IntRef intRef3) {
if (intRef2.value == 0) {
intRef3.value = token.readByte();
intRef2.value = 8;
if (intRef3.value == 255) {
int readByte = token.readByte();
if (readByte != 0 && i == 1) {
intRef.value = (intRef3.value << 8) | readByte;
return 1;
}
if (readByte != 0) {
throw new RuntimeException("ERROR: getCNextbitsWSQ : No stuffed zeros.");
}
}
}
if (i <= intRef2.value) {
int i2 = (intRef3.value >> (intRef2.value - i)) & WsqHelper.BITMASK[i];
intRef2.value -= i;
intRef3.value &= WsqHelper.BITMASK[intRef2.value];
return i2;
}
int i3 = i - intRef2.value;
int i4 = intRef3.value;
intRef2.value = 0;
return getCNextbitsWSQ(token, intRef, intRef2, i3, intRef3) | (i4 << i3);
}
private float[] unquantize(WsqHelper.Token token, int[] iArr, int i, int i2) {
float[] fArr = new float[i2 * i];
if (token.tableDQT.dqtDef != 1) {
throw new RuntimeException("ERROR: unquantize : quantization table parameters not defined!");
}
float f = token.tableDQT.binCenter;
int i3 = 0;
for (int i4 = 0; i4 < 60; i4++) {
if (token.tableDQT.qBin[i4] != 0.0d) {
int i5 = (token.qtree[i4].y * i) + token.qtree[i4].x;
int i6 = 0;
while (i6 < token.qtree[i4].leny) {
for (int i7 = 0; i7 < token.qtree[i4].lenx; i7++) {
int i8 = iArr[i3];
if (i8 == 0) {
fArr[i5] = 0.0f;
} else if (i8 > 0) {
fArr[i5] = (token.tableDQT.qBin[i4] * (iArr[i3] - f)) + (token.tableDQT.zBin[i4] / 2.0f);
} else if (i8 < 0) {
fArr[i5] = (token.tableDQT.qBin[i4] * (iArr[i3] + f)) - (token.tableDQT.zBin[i4] / 2.0f);
} else {
throw new RuntimeException("ERROR : unquantize : invalid quantization pixel value");
}
i5++;
i3++;
}
i6++;
i5 += i - token.qtree[i4].lenx;
}
}
}
return fArr;
}
private void wsqReconstruct(WsqHelper.Token token, float[] fArr, int i, int i2) {
if (token.tableDTT.lodef != 1) {
throw new RuntimeException("ERROR: wsq_reconstruct : Lopass filter coefficients not defined");
}
if (token.tableDTT.hidef != 1) {
throw new RuntimeException("ERROR: wsq_reconstruct : Hipass filter coefficients not defined");
}
float[] fArr2 = new float[i * i2];
for (int i3 = 19; i3 >= 0; i3--) {
int i4 = (token.wtree[i3].y * i) + token.wtree[i3].x;
joinLets(fArr2, fArr, 0, i4, token.wtree[i3].lenx, token.wtree[i3].leny, 1, i, token.tableDTT.hifilt, token.tableDTT.hisz, token.tableDTT.lofilt, token.tableDTT.losz, token.wtree[i3].invcl);
joinLets(fArr, fArr2, i4, 0, token.wtree[i3].leny, token.wtree[i3].lenx, i, 1, token.tableDTT.hifilt, token.tableDTT.hisz, token.tableDTT.lofilt, token.tableDTT.losz, token.wtree[i3].invrw);
}
}
private void joinLets(float[] fArr, float[] fArr2, int i, int i2, int i3, int i4, int i5, int i6, float[] fArr3, int i7, float[] fArr4, int i8, int i9) {
int i10;
int i11;
boolean z;
boolean z2;
int i12;
int i13;
int i14;
boolean z3;
float f;
int i15;
int i16;
boolean z4;
int i17;
int i18;
int i19;
int i20;
int i21;
int i22;
int i23;
float f2;
int i24;
boolean z5;
int i25;
float f3;
boolean z6;
int i26 = i8;
int i27 = i4 % 2;
int i28 = i26 % 2;
int i29 = -i6;
boolean z7 = true;
if (i27 != 0) {
i10 = (i4 + 1) / 2;
i11 = i10 - 1;
} else {
i10 = i4 / 2;
i11 = i10;
}
if (i28 != 0) {
int i30 = i26 - 1;
i16 = i30 / 4;
int i31 = i7 + 1;
i15 = (i31 / 4) - 1;
i12 = (i30 / 2) % 2;
i14 = (i31 / 2) % 2;
if (i27 != 0) {
z6 = true;
z = false;
} else {
z = true;
z6 = false;
}
z3 = z6;
f = 1.0f;
i13 = 0;
z2 = false;
z4 = false;
} else {
int i32 = (i26 / 4) - 1;
int i33 = (i7 / 4) - 1;
int i34 = i26 / 2;
int i35 = (i7 / 2) % 2;
z = i27 == 0;
if (i32 == -1) {
i32 = 0;
z2 = false;
} else {
z2 = true;
}
if (i33 == -1) {
z7 = false;
i33 = 0;
} else {
z7 = true;
}
int i36 = 0;
while (i36 < i7) {
fArr3[i36] = (float) (-fArr3[i36]);
i36++;
i32 = i32;
}
int i37 = i32;
i12 = i34 % 2;
i13 = 2;
i14 = i35;
z3 = true;
f = -1.0f;
i15 = i33;
i16 = i37;
z4 = true;
}
int i38 = i3;
int i39 = 0;
int i40 = 0;
while (i39 < i38) {
int i41 = i39 * i5;
int i42 = i + i41;
fArr[i42] = 0.0f;
fArr[i42 + i6] = 0.0f;
if (i9 != 0) {
i18 = i2 + i41;
i17 = i18 + (i6 * i11);
} else {
i17 = i2 + i41;
i18 = i17 + (i6 * i10);
}
int i43 = i18;
boolean z8 = z7;
int i44 = i17;
int i45 = i10;
int i46 = i44 + ((i10 - 1) * i6);
boolean z9 = z3;
int i47 = i43 + ((i11 - 1) * i6);
int i48 = i44 + (i16 * i6);
float f4 = f;
int i49 = i13;
int i50 = i12;
int i51 = i16;
int i52 = i14;
boolean z10 = z2;
int i53 = i29;
int i54 = i53;
boolean z11 = z8;
int i55 = i43 + (i15 * i6);
int i56 = 0;
int i57 = i48;
int i58 = i42;
while (i56 < i11) {
while (i50 >= 0) {
fArr[i42] = fArr2[i57] * fArr4[i50];
int i59 = i28;
int i60 = i11;
int i61 = i57;
boolean z12 = z;
int i62 = i53;
boolean z13 = z10;
for (int i63 = i50 + 2; i63 < i26; i63 += 2) {
if (i61 == i44) {
if (z13) {
z13 = false;
i62 = 0;
} else {
i62 = i6;
}
}
if (i61 == i46) {
if (z12) {
z12 = false;
i62 = 0;
} else {
i62 = i29;
}
}
i61 += i62;
fArr[i42] = fArr[i42] + (fArr2[i61] * fArr4[i63]);
}
i42 += i6;
i50--;
i11 = i60;
i28 = i59;
}
int i64 = i28;
int i65 = i11;
if (i57 == i44) {
if (z10) {
i53 = 0;
z10 = false;
} else {
i53 = i6;
}
}
int i66 = i57 + i53;
while (i52 >= 0) {
int i67 = i66;
int i68 = i55;
boolean z14 = z9;
i40 = i49;
float f5 = f4;
boolean z15 = z11;
int i69 = i54;
int i70 = i52;
while (i70 < i7) {
if (i68 == i43) {
if (z15) {
z15 = false;
i69 = 0;
} else {
i69 = i6;
f5 = 1.0f;
}
}
if (i68 != i47) {
i24 = i39;
z5 = z15;
i25 = i47;
} else if (z14) {
if (!z4 || i27 == 0) {
i24 = i39;
z5 = z15;
i25 = i47;
} else {
z5 = z15;
int i71 = i40 - 1;
i24 = i39;
f3 = i71;
i40 = i71;
i25 = i47;
if (f3 != 0.0d) {
z14 = true;
f5 = f3;
i69 = 0;
} else {
f5 = f3;
}
}
f3 = f5;
z14 = false;
f5 = f3;
i69 = 0;
} else {
i24 = i39;
z5 = z15;
i25 = i47;
i69 = i29;
if (z4) {
f5 = -1.0f;
}
}
fArr[i58] = fArr[i58] + (fArr2[i68] * fArr3[i70] * f5);
i68 += i69;
i70 += 2;
z15 = z5;
i39 = i24;
i47 = i25;
}
i58 += i6;
i52--;
i66 = i67;
}
int i72 = i39;
int i73 = i47;
int i74 = i66;
if (i55 == i43) {
if (z11) {
z11 = false;
i54 = 0;
} else {
i54 = i6;
f4 = 1.0f;
}
}
i55 += i54;
i56++;
i11 = i65;
i28 = i64;
i57 = i74;
i39 = i72;
i47 = i73;
i50 = 1;
i52 = 1;
}
int i75 = i28;
int i76 = i39;
int i77 = i11;
int i78 = i47;
if (i27 != 0) {
if (i12 == 0) {
i19 = 0;
}
i19 = 1;
} else {
if (i12 != 0) {
i19 = 2;
}
i19 = 1;
}
for (int i79 = 1; i79 >= i19; i79--) {
fArr[i42] = fArr2[i57] * fArr4[i79];
int i80 = i57;
boolean z16 = z;
int i81 = i53;
boolean z17 = z10;
for (int i82 = i79 + 2; i82 < i26; i82 += 2) {
if (i80 == i44) {
if (z17) {
z17 = false;
i81 = 0;
} else {
i81 = i6;
}
}
if (i80 == i46) {
if (z16) {
z16 = false;
i81 = 0;
} else {
i81 = i29;
}
}
i80 += i81;
fArr[i42] = fArr[i42] + (fArr2[i80] * fArr4[i82]);
}
i42 += i6;
}
if (i27 != 0) {
i21 = i14 != 0 ? 1 : 0;
i20 = 2;
if (i7 == 2) {
i55 -= i54;
i40 = 1;
}
} else {
i20 = 2;
i21 = i14 != 0 ? 2 : 1;
}
int i83 = 1;
while (i83 >= i21) {
if (i7 != i20) {
i40 = i49;
}
int i84 = i83;
int i85 = i55;
boolean z18 = z9;
float f6 = f4;
boolean z19 = z11;
int i86 = i54;
while (i84 < i7) {
if (i85 != i43) {
i22 = i78;
} else if (z19) {
i22 = i78;
z19 = false;
i86 = 0;
} else {
i86 = i6;
i22 = i78;
f6 = 1.0f;
}
if (i85 != i22) {
i23 = i27;
} else if (z18) {
if (!z4 || i27 == 0) {
i23 = i27;
} else {
int i87 = i40 - 1;
f2 = i87;
i23 = i27;
i40 = i87;
if (f2 != 0.0d) {
z18 = true;
f6 = f2;
i86 = 0;
} else {
f6 = f2;
}
}
f2 = f6;
z18 = false;
f6 = f2;
i86 = 0;
} else {
i23 = i27;
i86 = i29;
if (z4) {
f6 = -1.0f;
}
}
fArr[i58] = fArr[i58] + (fArr2[i85] * fArr3[i84] * f6);
i85 += i86;
i84 += 2;
i78 = i22;
i27 = i23;
}
i58 += i6;
i83--;
i20 = 2;
}
i39 = i76 + 1;
i38 = i3;
i26 = i8;
z7 = z8;
i10 = i45;
z3 = z9;
f = f4;
i13 = i49;
i16 = i51;
i11 = i77;
i28 = i75;
}
if (i28 == 0) {
for (int i88 = 0; i88 < i7; i88++) {
fArr3[i88] = (float) (-fArr3[i88]);
}
}
}
private byte[] convertImage2Byte(float[] fArr, int i, int i2, float f, float f2) {
byte[] bArr = new byte[i * i2];
int i3 = 0;
for (int i4 = 0; i4 < i2; i4++) {
for (int i5 = 0; i5 < i; i5++) {
float f3 = (float) ((fArr[i3] * f2) + f + 0.5d);
double d = f3;
if (d < 0.0d) {
bArr[i3] = 0;
} else if (d > 255.0d) {
bArr[i3] = -1;
} else {
bArr[i3] = (byte) f3;
}
i3++;
}
}
return bArr;
}
}