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