Upload 2.0.2
[physicsfs] / lzma / Java / SevenZip / Compression / RangeCoder / BitTreeEncoder.java
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 }