public static HTreeGroup[] New(int num_htree_groups, int table_size) { var tables = new HuffmanCode[num_htree_groups * table_size]; var htree_groups = new HTreeGroup[num_htree_groups]; for (int i = 0; i < num_htree_groups; ++i) { htree_groups[i] = new HTreeGroup(); htree_groups[i].tables = tables; } return(htree_groups); }
void BuildPackedTable(HTreeGroup htree_group) { var huff = htree_group.packed_table; for (int code = 0; code < Huffman.PackedTableSize; ++code) { uint bits = (uint)code; var hcode = htree_group.GetCode (HuffIndex.Green, code); if (hcode.value >= Huffman.NumLiteralCodes) { huff[code].bits = hcode.bits + BitsSpecialMarker; huff[code].value = hcode.value; } else { huff[code].bits = 0; huff[code].value = 0; bits >>= AccumulateHCode (hcode, 8, ref huff[code]); bits >>= AccumulateHCode (htree_group.GetCode (HuffIndex.Red, (int)bits), 16, ref huff[code]); bits >>= AccumulateHCode (htree_group.GetCode (HuffIndex.Blue, (int)bits), 0, ref huff[code]); bits >>= AccumulateHCode (htree_group.GetCode (HuffIndex.Alpha, (int)bits), 24, ref huff[code]); } } }
int ReadPackedSymbols(HTreeGroup group, uint[] data, int dst) { uint val = br_.PrefetchBits() & (Huffman.PackedTableSize - 1); var code = group.packed_table[val]; if (code.bits < BitsSpecialMarker) { br_.SkipBits (code.bits); data[dst] = code.value; return PackedNonLiteralCode; } else { br_.SkipBits (code.bits - BitsSpecialMarker); return (int)code.value; } }