pull/603/head
parent
b42d728628
commit
b0f7170595
60
zinflate.cpp
60
zinflate.cpp
|
|
@ -612,41 +612,51 @@ void Inflator::FlushOutput()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct NewFixedLiteralDecoder
|
void Inflator::CreateFixedLiteralDecoder()
|
||||||
{
|
{
|
||||||
HuffmanDecoder * operator()() const
|
unsigned int codeLengths[288];
|
||||||
{
|
std::fill(codeLengths + 0, codeLengths + 144, 8);
|
||||||
unsigned int codeLengths[288];
|
std::fill(codeLengths + 144, codeLengths + 256, 9);
|
||||||
std::fill(codeLengths + 0, codeLengths + 144, 8);
|
std::fill(codeLengths + 256, codeLengths + 280, 7);
|
||||||
std::fill(codeLengths + 144, codeLengths + 256, 9);
|
std::fill(codeLengths + 280, codeLengths + 288, 8);
|
||||||
std::fill(codeLengths + 256, codeLengths + 280, 7);
|
m_fixedLiteralDecoder.reset(new HuffmanDecoder);
|
||||||
std::fill(codeLengths + 280, codeLengths + 288, 8);
|
m_fixedLiteralDecoder->Initialize(codeLengths, 288);
|
||||||
member_ptr<HuffmanDecoder> pDecoder(new HuffmanDecoder);
|
|
||||||
pDecoder->Initialize(codeLengths, 288);
|
|
||||||
return pDecoder.release();
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct NewFixedDistanceDecoder
|
void Inflator::CreateFixedDistanceDecoder()
|
||||||
{
|
{
|
||||||
HuffmanDecoder * operator()() const
|
unsigned int codeLengths[32];
|
||||||
{
|
std::fill(codeLengths + 0, codeLengths + 32, 5);
|
||||||
unsigned int codeLengths[32];
|
m_fixedDistanceDecoder.reset(new HuffmanDecoder);
|
||||||
std::fill(codeLengths + 0, codeLengths + 32, 5);
|
m_fixedDistanceDecoder->Initialize(codeLengths, 32);
|
||||||
member_ptr<HuffmanDecoder> pDecoder(new HuffmanDecoder);
|
|
||||||
pDecoder->Initialize(codeLengths, 32);
|
|
||||||
return pDecoder.release();
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const HuffmanDecoder& Inflator::GetLiteralDecoder() const
|
const HuffmanDecoder& Inflator::GetLiteralDecoder()
|
||||||
{
|
{
|
||||||
return m_blockType == 1 ? Singleton<HuffmanDecoder, NewFixedLiteralDecoder>().Ref() : m_dynamicLiteralDecoder;
|
if (m_blockType == 1)
|
||||||
|
{
|
||||||
|
if (m_fixedLiteralDecoder.get() == NULLPTR)
|
||||||
|
CreateFixedLiteralDecoder();
|
||||||
|
return *m_fixedLiteralDecoder;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return m_dynamicLiteralDecoder;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const HuffmanDecoder& Inflator::GetDistanceDecoder() const
|
const HuffmanDecoder& Inflator::GetDistanceDecoder()
|
||||||
{
|
{
|
||||||
return m_blockType == 1 ? Singleton<HuffmanDecoder, NewFixedDistanceDecoder>().Ref() : m_dynamicDistanceDecoder;
|
if (m_blockType == 1)
|
||||||
|
{
|
||||||
|
if (m_fixedDistanceDecoder.get() == NULLPTR)
|
||||||
|
CreateFixedDistanceDecoder();
|
||||||
|
return *m_fixedDistanceDecoder;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return m_dynamicDistanceDecoder;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
NAMESPACE_END
|
NAMESPACE_END
|
||||||
|
|
|
||||||
|
|
@ -133,11 +133,11 @@ private:
|
||||||
void OutputString(const byte *string, size_t length);
|
void OutputString(const byte *string, size_t length);
|
||||||
void OutputPast(unsigned int length, unsigned int distance);
|
void OutputPast(unsigned int length, unsigned int distance);
|
||||||
|
|
||||||
static const HuffmanDecoder *FixedLiteralDecoder();
|
void CreateFixedDistanceDecoder();
|
||||||
static const HuffmanDecoder *FixedDistanceDecoder();
|
void CreateFixedLiteralDecoder();
|
||||||
|
|
||||||
const HuffmanDecoder& GetLiteralDecoder() const;
|
const HuffmanDecoder& GetLiteralDecoder();
|
||||||
const HuffmanDecoder& GetDistanceDecoder() const;
|
const HuffmanDecoder& GetDistanceDecoder();
|
||||||
|
|
||||||
enum State {PRE_STREAM, WAIT_HEADER, DECODING_BODY, POST_STREAM, AFTER_END};
|
enum State {PRE_STREAM, WAIT_HEADER, DECODING_BODY, POST_STREAM, AFTER_END};
|
||||||
State m_state;
|
State m_state;
|
||||||
|
|
@ -148,6 +148,7 @@ private:
|
||||||
NextDecode m_nextDecode;
|
NextDecode m_nextDecode;
|
||||||
unsigned int m_literal, m_distance; // for LENGTH_BITS or DISTANCE_BITS
|
unsigned int m_literal, m_distance; // for LENGTH_BITS or DISTANCE_BITS
|
||||||
HuffmanDecoder m_dynamicLiteralDecoder, m_dynamicDistanceDecoder;
|
HuffmanDecoder m_dynamicLiteralDecoder, m_dynamicDistanceDecoder;
|
||||||
|
member_ptr<HuffmanDecoder> m_fixedLiteralDecoder, m_fixedDistanceDecoder;
|
||||||
LowFirstBitReader m_reader;
|
LowFirstBitReader m_reader;
|
||||||
SecByteBlock m_window;
|
SecByteBlock m_window;
|
||||||
size_t m_current, m_lastFlush;
|
size_t m_current, m_lastFlush;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue