blob: cb3890046e2529255dbf41fc1b95fb201b93af5f [file] [log] [blame]
part of archive;
/**
* Build huffman table from length list.
*/
class HuffmanTable {
Uint32List table;
int maxCodeLength = 0;
int minCodeLength = 0x7fffffff;
HuffmanTable(List<int> lengths) {
int listSize = lengths.length;
for (int i = 0; i < listSize; ++i) {
if (lengths[i] > maxCodeLength) {
maxCodeLength = lengths[i];
}
if (lengths[i] < minCodeLength) {
minCodeLength = lengths[i];
}
}
int size = 1 << maxCodeLength;
table = new Uint32List(size);
for (int bitLength = 1, code = 0, skip = 2; bitLength <= maxCodeLength;) {
for (int i = 0; i < listSize; ++i) {
if (lengths[i] == bitLength) {
int reversed = 0;
int rtemp = code;
for (int j = 0; j < bitLength; ++j) {
reversed = (reversed << 1) | (rtemp & 1);
rtemp >>= 1;
}
for (int j = reversed; j < size; j += skip) {
table[j] = (bitLength << 16) | i;
}
++code;
}
}
++bitLength;
code <<= 1;
skip <<= 1;
}
}
}