shaved 148 bytes, 236 more to go
git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@3207 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
parent
06c87de7e0
commit
c062ecca53
7 changed files with 59 additions and 90 deletions
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
#include "LZMADecoder.h"
|
#include "LZMADecoder.h"
|
||||||
|
|
||||||
UINT32 CLZMADecoder::Create(BYTE *memoryPointer,
|
void CLZMADecoder::Create(BYTE *memoryPointer,
|
||||||
int numLiteralContextBits,
|
int numLiteralContextBits,
|
||||||
int numLiteralPosStateBits,
|
int numLiteralPosStateBits,
|
||||||
int numPosStateBits)
|
int numPosStateBits)
|
||||||
|
@ -10,7 +10,7 @@ UINT32 CLZMADecoder::Create(BYTE *memoryPointer,
|
||||||
|
|
||||||
int numPosStates = 1 << numPosStateBits;
|
int numPosStates = 1 << numPosStateBits;
|
||||||
m_PosStateMask = numPosStates - 1;
|
m_PosStateMask = numPosStates - 1;
|
||||||
return m_LiteralDecoder.Create(memoryPointer, numLiteralPosStateBits, numLiteralContextBits);
|
m_LiteralDecoder.Create(memoryPointer, numLiteralPosStateBits, numLiteralContextBits);
|
||||||
}
|
}
|
||||||
|
|
||||||
UINT32 CLZMADecoder::Code(CLZMAStateP lzmaState)
|
UINT32 CLZMADecoder::Code(CLZMAStateP lzmaState)
|
||||||
|
@ -19,17 +19,9 @@ UINT32 CLZMADecoder::Code(CLZMAStateP lzmaState)
|
||||||
m_OutWindowStream.Init(lzmaState);
|
m_OutWindowStream.Init(lzmaState);
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
for(i = 0; i < kNumStates; i++)
|
for (i = 0; i < sizeof(m_Decoders) / sizeof(CBitDecoder); i++)
|
||||||
{
|
{
|
||||||
for (int j = 0; j <= m_PosStateMask; j++)
|
((CBitDecoder *) &m_Decoders)[i].Init();
|
||||||
{
|
|
||||||
m_MainChoiceDecoders[i][j].Init();
|
|
||||||
m_MatchRepShortChoiceDecoders[i][j].Init();
|
|
||||||
}
|
|
||||||
m_MatchChoiceDecoders[i].Init();
|
|
||||||
m_MatchRepChoiceDecoders[i].Init();
|
|
||||||
m_MatchRep1ChoiceDecoders[i].Init();
|
|
||||||
m_MatchRep2ChoiceDecoders[i].Init();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
m_LiteralDecoder.Init();
|
m_LiteralDecoder.Init();
|
||||||
|
@ -62,16 +54,12 @@ UINT32 CLZMADecoder::Code(CLZMAStateP lzmaState)
|
||||||
while(nowPos < 0xFFFFFFFF)
|
while(nowPos < 0xFFFFFFFF)
|
||||||
{
|
{
|
||||||
int posState = nowPos & m_PosStateMask;
|
int posState = nowPos & m_PosStateMask;
|
||||||
if (m_MainChoiceDecoders[state.Index][posState].Decode(&m_RangeDecoder) == 0)
|
if (!m_Decoders.MainChoiceDecoders[state.Index][posState].Decode(&m_RangeDecoder))
|
||||||
{
|
{
|
||||||
state.UpdateChar();
|
state.UpdateChar();
|
||||||
if(peviousIsMatch)
|
if(peviousIsMatch)
|
||||||
{
|
{
|
||||||
#ifdef __STREAM_VERSION
|
|
||||||
BYTE matchByte = m_OutWindowStream.GetOneByte(0 - repDistances[0]);
|
BYTE matchByte = m_OutWindowStream.GetOneByte(0 - repDistances[0]);
|
||||||
#else
|
|
||||||
BYTE matchByte = *(outStream - repDistances[0]);
|
|
||||||
#endif
|
|
||||||
previousByte = m_LiteralDecoder.DecodeWithMatchByte(&m_RangeDecoder,
|
previousByte = m_LiteralDecoder.DecodeWithMatchByte(&m_RangeDecoder,
|
||||||
nowPos, previousByte, matchByte);
|
nowPos, previousByte, matchByte);
|
||||||
peviousIsMatch = false;
|
peviousIsMatch = false;
|
||||||
|
@ -80,11 +68,7 @@ UINT32 CLZMADecoder::Code(CLZMAStateP lzmaState)
|
||||||
previousByte = m_LiteralDecoder.DecodeNormal(&m_RangeDecoder,
|
previousByte = m_LiteralDecoder.DecodeNormal(&m_RangeDecoder,
|
||||||
nowPos, previousByte);
|
nowPos, previousByte);
|
||||||
|
|
||||||
#ifdef __STREAM_VERSION
|
|
||||||
m_OutWindowStream.PutOneByte(previousByte);
|
m_OutWindowStream.PutOneByte(previousByte);
|
||||||
#else
|
|
||||||
*outStream++ = previousByte;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
nowPos++;
|
nowPos++;
|
||||||
}
|
}
|
||||||
|
@ -93,21 +77,16 @@ UINT32 CLZMADecoder::Code(CLZMAStateP lzmaState)
|
||||||
peviousIsMatch = true;
|
peviousIsMatch = true;
|
||||||
UINT32 distance;
|
UINT32 distance;
|
||||||
int len;
|
int len;
|
||||||
if(m_MatchChoiceDecoders[state.Index].Decode(&m_RangeDecoder) == 1)
|
if(m_Decoders.MatchChoiceDecoders[state.Index].Decode(&m_RangeDecoder))
|
||||||
{
|
{
|
||||||
if(m_MatchRepChoiceDecoders[state.Index].Decode(&m_RangeDecoder) == 0)
|
if(!m_Decoders.MatchRepChoiceDecoders[state.Index].Decode(&m_RangeDecoder))
|
||||||
{
|
{
|
||||||
if(m_MatchRepShortChoiceDecoders[state.Index][posState].Decode(&m_RangeDecoder) == 0)
|
if(!m_Decoders.MatchRepShortChoiceDecoders[state.Index][posState].Decode(&m_RangeDecoder))
|
||||||
{
|
{
|
||||||
state.UpdateShortRep();
|
state.UpdateShortRep();
|
||||||
|
|
||||||
#ifdef __STREAM_VERSION
|
|
||||||
previousByte = m_OutWindowStream.GetOneByte(0 - repDistances[0]);
|
previousByte = m_OutWindowStream.GetOneByte(0 - repDistances[0]);
|
||||||
m_OutWindowStream.PutOneByte(previousByte);
|
m_OutWindowStream.PutOneByte(previousByte);
|
||||||
#else
|
|
||||||
previousByte = *(outStream - repDistances[0]);
|
|
||||||
*outStream++ = previousByte;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
nowPos++;
|
nowPos++;
|
||||||
continue;
|
continue;
|
||||||
|
@ -116,11 +95,11 @@ UINT32 CLZMADecoder::Code(CLZMAStateP lzmaState)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if(m_MatchRep1ChoiceDecoders[state.Index].Decode(&m_RangeDecoder) == 0)
|
if(!m_Decoders.MatchRep1ChoiceDecoders[state.Index].Decode(&m_RangeDecoder))
|
||||||
distance = repDistances[1];
|
distance = repDistances[1];
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (m_MatchRep2ChoiceDecoders[state.Index].Decode(&m_RangeDecoder) == 0)
|
if (!m_Decoders.MatchRep2ChoiceDecoders[state.Index].Decode(&m_RangeDecoder))
|
||||||
distance = repDistances[2];
|
distance = repDistances[2];
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -171,10 +150,21 @@ UINT32 CLZMADecoder::Code(CLZMAStateP lzmaState)
|
||||||
}
|
}
|
||||||
|
|
||||||
len += kMatchMinLen;
|
len += kMatchMinLen;
|
||||||
m_OutWindowStream.CopyBackBlock(m_OutWindowStream._pos - distance, len);
|
|
||||||
previousByte = m_OutWindowStream.GetOneByte((UINT32)(-1));
|
|
||||||
|
|
||||||
nowPos += len;
|
nowPos += len;
|
||||||
|
// CopyBackBlock
|
||||||
|
{
|
||||||
|
UINT32 fromPos = m_OutWindowStream._pos - distance;
|
||||||
|
if (fromPos >= m_OutWindowStream._windowSize)
|
||||||
|
fromPos += m_OutWindowStream._windowSize;
|
||||||
|
while (len--)
|
||||||
|
{
|
||||||
|
m_OutWindowStream._buffer[m_OutWindowStream._pos++] = m_OutWindowStream._buffer[fromPos++];
|
||||||
|
if (fromPos >= m_OutWindowStream._windowSize)
|
||||||
|
fromPos = 0;
|
||||||
|
m_OutWindowStream.Flush();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
previousByte = m_OutWindowStream.GetOneByte((UINT32)(-1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
m_OutWindowStream._windowSize = 0;
|
m_OutWindowStream._windowSize = 0;
|
||||||
|
|
|
@ -53,12 +53,15 @@ class CLZMADecoder
|
||||||
CLZOutWindow m_OutWindowStream;
|
CLZOutWindow m_OutWindowStream;
|
||||||
CRangeDecoder m_RangeDecoder;
|
CRangeDecoder m_RangeDecoder;
|
||||||
|
|
||||||
CBitDecoder m_MainChoiceDecoders[kNumStates][kLenNumPosStatesMax];
|
struct
|
||||||
CBitDecoder m_MatchRepShortChoiceDecoders[kNumStates][kLenNumPosStatesMax];
|
{
|
||||||
CBitDecoder m_MatchChoiceDecoders[kNumStates];
|
CBitDecoder MainChoiceDecoders[kNumStates][kLenNumPosStatesMax];
|
||||||
CBitDecoder m_MatchRepChoiceDecoders[kNumStates];
|
CBitDecoder MatchRepShortChoiceDecoders[kNumStates][kLenNumPosStatesMax];
|
||||||
CBitDecoder m_MatchRep1ChoiceDecoders[kNumStates];
|
CBitDecoder MatchChoiceDecoders[kNumStates];
|
||||||
CBitDecoder m_MatchRep2ChoiceDecoders[kNumStates];
|
CBitDecoder MatchRepChoiceDecoders[kNumStates];
|
||||||
|
CBitDecoder MatchRep1ChoiceDecoders[kNumStates];
|
||||||
|
CBitDecoder MatchRep2ChoiceDecoders[kNumStates];
|
||||||
|
} m_Decoders;
|
||||||
|
|
||||||
CLZMALiteralDecoder m_LiteralDecoder;
|
CLZMALiteralDecoder m_LiteralDecoder;
|
||||||
|
|
||||||
|
@ -72,7 +75,7 @@ class CLZMADecoder
|
||||||
int m_PosStateMask;
|
int m_PosStateMask;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
UINT32 Create(BYTE *memoryPointer,
|
void Create(BYTE *memoryPointer,
|
||||||
int numLiteralContextBits,
|
int numLiteralContextBits,
|
||||||
int numLiteralPosStateBits,
|
int numLiteralPosStateBits,
|
||||||
int numPosStateBits);
|
int numPosStateBits);
|
||||||
|
|
|
@ -19,12 +19,14 @@ const int kLenNumMidSymbols = 1 << kLenNumMidBits;
|
||||||
const int kLenNumHighBits = 8;
|
const int kLenNumHighBits = 8;
|
||||||
const int kLenNumSymbolsTotal = kLenNumLowSymbols + kLenNumMidSymbols + (1 << kLenNumHighBits);
|
const int kLenNumSymbolsTotal = kLenNumLowSymbols + kLenNumMidSymbols + (1 << kLenNumHighBits);
|
||||||
|
|
||||||
|
#define LOW 0
|
||||||
|
#define HIGH 1
|
||||||
|
|
||||||
class CLZMALenDecoder
|
class CLZMALenDecoder
|
||||||
{
|
{
|
||||||
CBitDecoder m_Choice;
|
CBitDecoder m_Choice;
|
||||||
CBitDecoder m_Choice2;
|
CBitDecoder m_Choice2;
|
||||||
CBitTreeDecoder3 m_LowCoder[kLenNumPosStatesMax];
|
CBitTreeDecoder3 m_Coder[2][kLenNumPosStatesMax];
|
||||||
CBitTreeDecoder3 m_MidCoder[kLenNumPosStatesMax];
|
|
||||||
CBitTreeDecoder8 m_HighCoder;
|
CBitTreeDecoder8 m_HighCoder;
|
||||||
public:
|
public:
|
||||||
// void Init(int numPosStates)
|
// void Init(int numPosStates)
|
||||||
|
@ -32,20 +34,18 @@ public:
|
||||||
{
|
{
|
||||||
m_Choice.Init();
|
m_Choice.Init();
|
||||||
m_Choice2.Init();
|
m_Choice2.Init();
|
||||||
// for (int posState = 0; posState < numPosStates; posState++)
|
for (int posState = 0; posState < kLenNumPosStatesMax * 2; posState++)
|
||||||
for (int posState = 0; posState < kLenNumPosStatesMax; posState++)
|
|
||||||
{
|
{
|
||||||
m_LowCoder[posState].Init();
|
((CBitTreeDecoder3 *) m_Coder)[posState].Init();
|
||||||
m_MidCoder[posState].Init();
|
|
||||||
}
|
}
|
||||||
m_HighCoder.Init();
|
m_HighCoder.Init();
|
||||||
}
|
}
|
||||||
int Decode(CRangeDecoder *rangeDecoder, int posState)
|
int Decode(CRangeDecoder *rangeDecoder, int posState)
|
||||||
{
|
{
|
||||||
if(m_Choice.Decode(rangeDecoder) == 0)
|
if(m_Choice.Decode(rangeDecoder) == 0)
|
||||||
return m_LowCoder[posState].Decode(rangeDecoder);
|
return m_Coder[LOW][posState].Decode(rangeDecoder);
|
||||||
if(m_Choice2.Decode(rangeDecoder) == 0)
|
if(m_Choice2.Decode(rangeDecoder) == 0)
|
||||||
return kLenNumLowSymbols + m_MidCoder[posState].Decode(rangeDecoder);
|
return kLenNumLowSymbols + m_Coder[HIGH][posState].Decode(rangeDecoder);
|
||||||
return kLenNumLowSymbols + kLenNumMidSymbols + m_HighCoder.Decode(rangeDecoder);
|
return kLenNumLowSymbols + kLenNumMidSymbols + m_HighCoder.Decode(rangeDecoder);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -12,9 +12,8 @@ class CLZMALiteralDecoder2
|
||||||
public:
|
public:
|
||||||
void Init()
|
void Init()
|
||||||
{
|
{
|
||||||
for (int i = 0; i < 3; i++)
|
for (int i = 0; i < sizeof(m_Decoders) / sizeof(CBitDecoder); i++)
|
||||||
for (int j = 0; j < (1 << 8); j++)
|
((CBitDecoder *) m_Decoders)[i].Init();
|
||||||
m_Decoders[i][j].Init();
|
|
||||||
}
|
}
|
||||||
BYTE DecodeNormal(CRangeDecoder *rangeDecoder)
|
BYTE DecodeNormal(CRangeDecoder *rangeDecoder)
|
||||||
{
|
{
|
||||||
|
@ -78,17 +77,15 @@ public:
|
||||||
class CLZMALiteralDecoder
|
class CLZMALiteralDecoder
|
||||||
{
|
{
|
||||||
CLZMALiteralDecoder2 *m_Coders;
|
CLZMALiteralDecoder2 *m_Coders;
|
||||||
int m_NumPrevBits;
|
int m_NumPrevBits;
|
||||||
int m_PosMask;
|
int m_PosMask;
|
||||||
public:
|
public:
|
||||||
CLZMALiteralDecoder(): m_Coders(0) {}
|
CLZMALiteralDecoder(): m_Coders(0) {}
|
||||||
UINT32 Create(BYTE *memory, int numPosBits, int numPrevBits)
|
void Create(BYTE *memory, int numPosBits, int numPrevBits)
|
||||||
{
|
{
|
||||||
m_PosMask = (1 << numPosBits) - 1;
|
m_PosMask = (1 << numPosBits) - 1;
|
||||||
m_NumPrevBits = numPrevBits;
|
m_NumPrevBits = numPrevBits;
|
||||||
int numStates = 1 << (numPrevBits + numPosBits);
|
m_Coders = (CLZMALiteralDecoder2 *) memory;
|
||||||
m_Coders = (CLZMALiteralDecoder2 *)memory;
|
|
||||||
return sizeof(CLZMALiteralDecoder2) * numStates;
|
|
||||||
}
|
}
|
||||||
void Init()
|
void Init()
|
||||||
{
|
{
|
||||||
|
|
|
@ -23,18 +23,6 @@ public:
|
||||||
_streamPos = 0;
|
_streamPos = 0;
|
||||||
_pos = 0;
|
_pos = 0;
|
||||||
}
|
}
|
||||||
void CopyBackBlock(UINT32 fromPos, int len)
|
|
||||||
{
|
|
||||||
if (fromPos >= _windowSize)
|
|
||||||
fromPos += _windowSize;
|
|
||||||
while (len--)
|
|
||||||
{
|
|
||||||
_buffer[_pos++] = _buffer[fromPos++];
|
|
||||||
if (fromPos >= _windowSize)
|
|
||||||
fromPos = 0;
|
|
||||||
Flush();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
void PutOneByte(BYTE b)
|
void PutOneByte(BYTE b)
|
||||||
{
|
{
|
||||||
_buffer[_pos++] = b;
|
_buffer[_pos++] = b;
|
||||||
|
|
|
@ -35,29 +35,27 @@ struct CBitDecoder: public CBitModel
|
||||||
int Decode(CRangeDecoder *rangeDecoder)
|
int Decode(CRangeDecoder *rangeDecoder)
|
||||||
{
|
{
|
||||||
UINT32 newBound = (rangeDecoder->Range >> kNumBitModelTotalBits) * Probability;
|
UINT32 newBound = (rangeDecoder->Range >> kNumBitModelTotalBits) * Probability;
|
||||||
|
int ret = 0;
|
||||||
if (rangeDecoder->Code < newBound)
|
if (rangeDecoder->Code < newBound)
|
||||||
{
|
{
|
||||||
rangeDecoder->Range = newBound;
|
rangeDecoder->Range = newBound;
|
||||||
Probability += (kBitModelTotal - Probability) >> kNumMoveBits;
|
Probability += (kBitModelTotal - Probability) >> kNumMoveBits;
|
||||||
if (rangeDecoder->Range < kTopValue)
|
|
||||||
{
|
|
||||||
rangeDecoder->Code = (rangeDecoder->Code << 8) | rangeDecoder->Stream.ReadByte();
|
|
||||||
rangeDecoder->Range <<= 8;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
rangeDecoder->Range -= newBound;
|
rangeDecoder->Range -= newBound;
|
||||||
rangeDecoder->Code -= newBound;
|
rangeDecoder->Code -= newBound;
|
||||||
Probability -= (Probability) >> kNumMoveBits;
|
Probability -= (Probability) >> kNumMoveBits;
|
||||||
if (rangeDecoder->Range < kTopValue)
|
ret = 1;
|
||||||
{
|
|
||||||
rangeDecoder->Code = (rangeDecoder->Code << 8) | rangeDecoder->Stream.ReadByte();
|
|
||||||
rangeDecoder->Range <<= 8;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (rangeDecoder->Range < kTopValue)
|
||||||
|
{
|
||||||
|
rangeDecoder->Code = (rangeDecoder->Code << 8) | rangeDecoder->Stream.ReadByte();
|
||||||
|
rangeDecoder->Range <<= 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -82,9 +82,7 @@ DWORD WINAPI lzmaDecompressThread(LPVOID lpParameter)
|
||||||
firstByte %= 9;
|
firstByte %= 9;
|
||||||
int numLiteralContextBits = firstByte;
|
int numLiteralContextBits = firstByte;
|
||||||
|
|
||||||
int memSize =
|
int memSize = (1 << (numLiteralContextBits + numLiteralPosStateBits)) * sizeof(CLZMALiteralDecoder2);
|
||||||
((1 << (numLiteralContextBits + numLiteralPosStateBits))*
|
|
||||||
256 * 3) * sizeof(CBitDecoder);
|
|
||||||
|
|
||||||
if (lzmaState->DynamicData == 0 || firstByte != lzmaState->FirstProp)
|
if (lzmaState->DynamicData == 0 || firstByte != lzmaState->FirstProp)
|
||||||
{
|
{
|
||||||
|
@ -94,13 +92,8 @@ DWORD WINAPI lzmaDecompressThread(LPVOID lpParameter)
|
||||||
lzmaState->FirstProp = firstByte;
|
lzmaState->FirstProp = firstByte;
|
||||||
}
|
}
|
||||||
|
|
||||||
int memSizeReal = lzmaDecodeder->Create((BYTE *) lzmaState->DynamicData,
|
lzmaDecodeder->Create((LPBYTE) lzmaState->DynamicData,
|
||||||
numLiteralContextBits, numLiteralPosStateBits, numPosStateBits);
|
numLiteralContextBits, numLiteralPosStateBits, numPosStateBits);
|
||||||
|
|
||||||
if (memSizeReal != memSize)
|
|
||||||
{
|
|
||||||
goto finished;
|
|
||||||
}
|
|
||||||
|
|
||||||
UINT32 dictionarySize = 0;
|
UINT32 dictionarySize = 0;
|
||||||
for (int i = 0; i < 4; i++)
|
for (int i = 0; i < 4; i++)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue