110 lines
2.9 KiB
C++
110 lines
2.9 KiB
C++
#ifndef __DECODER_H__
|
|
#define __DECODER_H__
|
|
//
|
|
// This file is part of sffview, a program to view structured fax files (sff)
|
|
//
|
|
// Copyright (C) 1998-2012 Peter Schaefer-Hutter and contributors ("THE AUTHORS")
|
|
//
|
|
// Permission to use, copy, modify, distribute, and sell this software and
|
|
// its documentation for any purpose is hereby granted without fee.
|
|
//
|
|
// THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
|
// EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
|
// WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
|
//
|
|
// IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL,
|
|
// INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY
|
|
// DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
|
// WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY
|
|
// THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE
|
|
// OR PERFORMANCE OF THIS SOFTWARE.
|
|
//
|
|
// Contributor(s):
|
|
// None
|
|
//
|
|
// You can contact the original author by email at peter.schaefer@gmx.de.
|
|
//
|
|
// I'm always pleased to hear that somebody is actually using my software.
|
|
// If you can manage it, e-mail me a quick notice. Thanks!
|
|
//
|
|
/*-RCS-Info----------------------------------------------------
|
|
|
|
$Id: decoder.h,v 1.2 2008/03/21 13:47:01 pschaefer Exp $
|
|
|
|
---RCS-Info--------------------------------------------------*/
|
|
|
|
class CBitSource
|
|
{
|
|
private:
|
|
sff_byte *m_pBuffer;
|
|
sff_word m_wBitsAvail;
|
|
sff_dword m_dwAccu;
|
|
sff_dword m_dwByteCount;
|
|
|
|
public:
|
|
void NeedBits(int nCount);
|
|
void ClrBits(int nCount);
|
|
sff_word GetBits(int nCount);
|
|
bool NoMoreBits();
|
|
|
|
CBitSource(void *pBuffer, sff_dword nByteCount);
|
|
};
|
|
|
|
//-----------------------------------------------------------------
|
|
|
|
class IBitSink
|
|
{
|
|
public:
|
|
virtual void SetBits(int nCount) = 0;
|
|
virtual void ClearBits(int nCount) = 0;
|
|
};
|
|
|
|
//-----------------------------------------------------------------
|
|
|
|
class CBitSink : public IBitSink
|
|
{
|
|
protected:
|
|
sff_byte *m_pBuffer;
|
|
|
|
sff_dword m_dwBitPos;
|
|
sff_dword m_dwByteCount;
|
|
sff_dword m_dwBitCount;
|
|
|
|
public:
|
|
void Reset();
|
|
|
|
virtual void SetBits(int nCount);
|
|
virtual void ClearBits(int nCount);
|
|
|
|
CBitSink(void *pBuffer, sff_dword nByteCount);
|
|
};
|
|
|
|
//-----------------------------------------------------------------
|
|
|
|
// writes ones
|
|
class CByteSink : public CBitSink
|
|
{
|
|
public:
|
|
CByteSink(void *pBuffer, sff_dword nByteCount) :
|
|
CBitSink(pBuffer, nByteCount) { /* sonst nix */ };
|
|
|
|
void SetBits(int nCount);
|
|
};
|
|
|
|
//-----------------------------------------------------------------
|
|
|
|
class CHuffDecoder : public CBitSource
|
|
{
|
|
protected:
|
|
sff_dword m_dwRunlength;
|
|
|
|
public:
|
|
CHuffDecoder(sff_byte *pBuffer, sff_dword nByteCount) :
|
|
CBitSource(pBuffer, nByteCount) { /* sonst nix */ };
|
|
|
|
int FindToken(LPTABENTRY pTable);
|
|
int DecodeLine(IBitSink& aBitSink);
|
|
};
|
|
|
|
#endif // __DECODER_H__
|