Home | History | Annotate | Download | only in RangeCoder
      1 package SevenZip.Compression.RangeCoder;
      2 import java.io.IOException;
      3 
      4 public class BitTreeEncoder
      5 {
      6 	short[] Models;
      7 	int NumBitLevels;
      8 
      9 	public BitTreeEncoder(int numBitLevels)
     10 	{
     11 		NumBitLevels = numBitLevels;
     12 		Models = new short[1 << numBitLevels];
     13 	}
     14 
     15 	public void Init()
     16 	{
     17 		Decoder.InitBitModels(Models);
     18 	}
     19 
     20 	public void Encode(Encoder rangeEncoder, int symbol) throws IOException
     21 	{
     22 		int m = 1;
     23 		for (int bitIndex = NumBitLevels; bitIndex != 0; )
     24 		{
     25 			bitIndex--;
     26 			int bit = (symbol >>> bitIndex) & 1;
     27 			rangeEncoder.Encode(Models, m, bit);
     28 			m = (m << 1) | bit;
     29 		}
     30 	}
     31 
     32 	public void ReverseEncode(Encoder rangeEncoder, int symbol) throws IOException
     33 	{
     34 		int m = 1;
     35 		for (int  i = 0; i < NumBitLevels; i++)
     36 		{
     37 			int bit = symbol & 1;
     38 			rangeEncoder.Encode(Models, m, bit);
     39 			m = (m << 1) | bit;
     40 			symbol >>= 1;
     41 		}
     42 	}
     43 
     44 	public int GetPrice(int symbol)
     45 	{
     46 		int price = 0;
     47 		int m = 1;
     48 		for (int bitIndex = NumBitLevels; bitIndex != 0; )
     49 		{
     50 			bitIndex--;
     51 			int bit = (symbol >>> bitIndex) & 1;
     52 			price += Encoder.GetPrice(Models[m], bit);
     53 			m = (m << 1) + bit;
     54 		}
     55 		return price;
     56 	}
     57 
     58 	public int ReverseGetPrice(int symbol)
     59 	{
     60 		int price = 0;
     61 		int m = 1;
     62 		for (int i = NumBitLevels; i != 0; i--)
     63 		{
     64 			int bit = symbol & 1;
     65 			symbol >>>= 1;
     66 			price += Encoder.GetPrice(Models[m], bit);
     67 			m = (m << 1) | bit;
     68 		}
     69 		return price;
     70 	}
     71 
     72 	public static int ReverseGetPrice(short[] Models, int startIndex,
     73 			int NumBitLevels, int symbol)
     74 	{
     75 		int price = 0;
     76 		int m = 1;
     77 		for (int i = NumBitLevels; i != 0; i--)
     78 		{
     79 			int bit = symbol & 1;
     80 			symbol >>>= 1;
     81 			price += Encoder.GetPrice(Models[startIndex + m], bit);
     82 			m = (m << 1) | bit;
     83 		}
     84 		return price;
     85 	}
     86 
     87 	public static void ReverseEncode(short[] Models, int startIndex,
     88 			Encoder rangeEncoder, int NumBitLevels, int symbol) throws IOException
     89 	{
     90 		int m = 1;
     91 		for (int i = 0; i < NumBitLevels; i++)
     92 		{
     93 			int bit = symbol & 1;
     94 			rangeEncoder.Encode(Models, startIndex + m, bit);
     95 			m = (m << 1) | bit;
     96 			symbol >>= 1;
     97 		}
     98 	}
     99 }
    100