// Run length encoding plus LZ compression plus Huffman encoding private void cpt_rle_lzh() { uint bptr; int Huffchar, LZlength, LZoffs; get_bit = cpt_getbit; cpt_LZbuff[CIRCSIZE - 3] = 0; cpt_LZbuff[CIRCSIZE - 2] = 0; cpt_LZbuff[CIRCSIZE - 1] = 0; cpt_LZptr = 0; while (cpt_outlength != 0) { cpt_readHuff(256, cpt_Hufftree); cpt_readHuff(64, cpt_LZlength); cpt_readHuff(128, cpt_LZoffs); int block_count = 0; cpt_newbits = (uint)(cpt_data[cpt_char++] << 8); cpt_newbits = cpt_newbits | cpt_data[cpt_char++]; cpt_newbits = cpt_newbits << 16; cpt_bitsavail = 16; while (block_count < cpt_blocksize && cpt_outlength != 0) { if (cpt_getbit() != 0) { Huffchar = gethuffbyte(cpt_Hufftree[0]); cpt_outch((byte)Huffchar); block_count += 2; } else { LZlength = gethuffbyte(cpt_LZlength[0]); LZoffs = gethuffbyte(cpt_LZoffs[0]); LZoffs = (LZoffs << 6) | cpt_get6bits(); bptr = (uint)(cpt_LZptr - LZoffs); while (LZlength-- > 0) { cpt_outch(cpt_LZbuff[bptr++ & (CIRCSIZE - 1)]); } block_count += 3; } } } }