mirror of
https://github.com/Xevion/easy7zip.git
synced 2025-12-14 14:11:40 -06:00
3.13
This commit is contained in:
69
7zip/Compress/LZMA/LZMALiteral.cpp
Executable file
69
7zip/Compress/LZMA/LZMALiteral.cpp
Executable file
@@ -0,0 +1,69 @@
|
||||
// LZMALiteral.cpp
|
||||
|
||||
#include "StdAfx.h"
|
||||
|
||||
#include "LZMALiteral.h"
|
||||
|
||||
namespace NCompress {
|
||||
namespace NLZMA {
|
||||
namespace NLiteral {
|
||||
|
||||
void CEncoder2::Init()
|
||||
{
|
||||
for (int i = 0; i < 3; i++)
|
||||
for (int j = 1; j < (1 << 8); j++)
|
||||
_encoders[i][j].Init();
|
||||
}
|
||||
|
||||
void CEncoder2::Encode(NRangeCoder::CEncoder *rangeEncoder,
|
||||
bool matchMode, BYTE matchByte, BYTE symbol)
|
||||
{
|
||||
UINT32 context = 1;
|
||||
bool same = true;
|
||||
for (int i = 7; i >= 0; i--)
|
||||
{
|
||||
UINT32 bit = (symbol >> i) & 1;
|
||||
UINT state;
|
||||
if (matchMode && same)
|
||||
{
|
||||
UINT32 matchBit = (matchByte >> i) & 1;
|
||||
state = 1 + matchBit;
|
||||
same = (matchBit == bit);
|
||||
}
|
||||
else
|
||||
state = 0;
|
||||
_encoders[state][context].Encode(rangeEncoder, bit);
|
||||
context = (context << 1) | bit;
|
||||
}
|
||||
}
|
||||
|
||||
UINT32 CEncoder2::GetPrice(bool matchMode, BYTE matchByte, BYTE symbol) const
|
||||
{
|
||||
UINT32 price = 0;
|
||||
UINT32 context = 1;
|
||||
int i = 7;
|
||||
if (matchMode)
|
||||
{
|
||||
for (; i >= 0; i--)
|
||||
{
|
||||
UINT32 matchBit = (matchByte >> i) & 1;
|
||||
UINT32 bit = (symbol >> i) & 1;
|
||||
price += _encoders[1 + matchBit][context].GetPrice(bit);
|
||||
context = (context << 1) | bit;
|
||||
if (matchBit != bit)
|
||||
{
|
||||
i--;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
for (; i >= 0; i--)
|
||||
{
|
||||
UINT32 bit = (symbol >> i) & 1;
|
||||
price += _encoders[0][context].GetPrice(bit);
|
||||
context = (context << 1) | bit;
|
||||
}
|
||||
return price;
|
||||
};
|
||||
|
||||
}}}
|
||||
Reference in New Issue
Block a user