mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
100 lines
2.1 KiB
Java
100 lines
2.1 KiB
Java
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;
|
|
}
|
|
}
|
|
}
|