Example #1
0
        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);
        }
Example #2
0
 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]);
         }
     }
 }
Example #3
0
 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;
     }
 }