| package SevenZip.Compression.RangeCoder; | |
| import java.io.IOException; | |
| public class BitTreeEncoder | |
| { | |
| short[] Models; | |
| int NumBitLevels; | |
| public BitTreeEncoder(int numBitLevels) | |
| { | |
| NumBitLevels = numBitLevels; | |
| Models = new short[1 << numBitLevels]; | |
| } | |
| public void Init() | |
| { | |
| Decoder.InitBitModels(Models); | |
| } | |
| public void Encode(Encoder rangeEncoder, int symbol) throws IOException | |
| { | |
| int m = 1; | |
| for (int bitIndex = NumBitLevels; bitIndex != 0; ) | |
| { | |
| bitIndex--; | |
| int bit = (symbol >>> bitIndex) & 1; | |
| rangeEncoder.Encode(Models, m, bit); | |
| m = (m << 1) | bit; | |
| } | |
| } | |
| public void ReverseEncode(Encoder rangeEncoder, int symbol) throws IOException | |
| { | |
| int m = 1; | |
| for (int i = 0; i < NumBitLevels; i++) | |
| { | |
| int bit = symbol & 1; | |
| rangeEncoder.Encode(Models, m, bit); | |
| m = (m << 1) | bit; | |
| symbol >>= 1; | |
| } | |
| } | |
| public int GetPrice(int symbol) | |
| { | |
| int price = 0; | |
| int m = 1; | |
| for (int bitIndex = NumBitLevels; bitIndex != 0; ) | |
| { | |
| bitIndex--; | |
| int bit = (symbol >>> bitIndex) & 1; | |
| price += Encoder.GetPrice(Models[m], bit); | |
| m = (m << 1) + bit; | |
| } | |
| return price; | |
| } | |
| public int ReverseGetPrice(int symbol) | |
| { | |
| int price = 0; | |
| int m = 1; | |
| for (int i = NumBitLevels; i != 0; i--) | |
| { | |
| int bit = symbol & 1; | |
| symbol >>>= 1; | |
| price += Encoder.GetPrice(Models[m], bit); | |
| m = (m << 1) | bit; | |
| } | |
| return price; | |
| } | |
| public static int ReverseGetPrice(short[] Models, int startIndex, | |
| int NumBitLevels, int symbol) | |
| { | |
| int price = 0; | |
| int m = 1; | |
| for (int i = NumBitLevels; i != 0; i--) | |
| { | |
| int bit = symbol & 1; | |
| symbol >>>= 1; | |
| price += Encoder.GetPrice(Models[startIndex + m], bit); | |
| m = (m << 1) | bit; | |
| } | |
| return price; | |
| } | |
| public static void ReverseEncode(short[] Models, int startIndex, | |
| Encoder rangeEncoder, int NumBitLevels, int symbol) throws IOException | |
| { | |
| int m = 1; | |
| for (int i = 0; i < NumBitLevels; i++) | |
| { | |
| int bit = symbol & 1; | |
| rangeEncoder.Encode(Models, startIndex + m, bit); | |
| m = (m << 1) | bit; | |
| symbol >>= 1; | |
| } | |
| } | |
| } |