1 package SevenZip.Compression.RangeCoder;
2 import java.io.IOException;
3 
4 public class BitTreeEncoder
5 {
6 	short[] Models;
7 	int NumBitLevels;
8 
BitTreeEncoder(int numBitLevels)9 	public BitTreeEncoder(int numBitLevels)
10 	{
11 		NumBitLevels = numBitLevels;
12 		Models = new short[1 << numBitLevels];
13 	}
14 
Init()15 	public void Init()
16 	{
17 		Decoder.InitBitModels(Models);
18 	}
19 
Encode(Encoder rangeEncoder, int symbol)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 
ReverseEncode(Encoder rangeEncoder, int symbol)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 
GetPrice(int symbol)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 
ReverseGetPrice(int symbol)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 
ReverseGetPrice(short[] Models, int startIndex, int NumBitLevels, int symbol)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 
ReverseEncode(short[] Models, int startIndex, Encoder rangeEncoder, int NumBitLevels, int symbol)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