123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163 |
- #ifndef __PCL_COMPRESS__2000_09_06__H__
- #define __PCL_COMPRESS__2000_09_06__H__
- #include "../FColor.h"
- class FCCompress
- {
- public:
-
- static int RLE_PCX_Encode (const BYTE* pInBuffer, int nInSize, BYTE* pOutBuffer) ;
-
- static int RLE_PCX_Decode (const BYTE* pInBuffer, int nInSize, BYTE* pOutBuffer) ;
-
- static BYTE* RLE_TGA_EncodeLine (const BYTE* pInBuffer, int iColorBit, int iNumPixel, BYTE* pOutBuffer) ;
-
- static BYTE* RLE_TGA_DecodeLine (const BYTE* pInBuffer, int iColorBit, int iNumPixel, BYTE* pOutBuffer) ;
- };
- inline int FCCompress::RLE_PCX_Encode (const BYTE* pInBuffer, int nInSize, BYTE* pOutBuffer)
- {
- const BYTE * pOutStart = pOutBuffer ;
- while (nInSize-- > 0)
- {
- const BYTE byData = *pInBuffer++ ;
- BYTE cCount = 1 ;
- while ( (cCount < 0x3F) && (nInSize != 0) )
- if (*pInBuffer != byData)
- break ;
- else
- {
- cCount++ ; pInBuffer++ ; nInSize-- ;
- }
- if (cCount == 1)
- {
- if ( byData >= 0xC0 )
- {
- *pOutBuffer++ = 0xC1 ;
- *pOutBuffer++ = byData ;
- }
- else
- *pOutBuffer++ = byData ;
- }
- else
- {
- *pOutBuffer++ = 0xC0 | cCount ;
- *pOutBuffer++ = byData ;
- }
- }
- return (int)(pOutBuffer - pOutStart) ;
- }
- inline int FCCompress::RLE_PCX_Decode (const BYTE* pInBuffer, int nInSize, BYTE* pOutBuffer)
- {
- const BYTE * pOutStart = pOutBuffer ;
- while (nInSize-- > 0)
- {
- const BYTE byData = *pInBuffer++ ;
- if ( byData >= 0xC0 )
- {
-
- if (nInSize <= 0)
- {
- assert(false) ; goto rleOver;
- }
- BYTE cNum = byData & 0x3F ;
- ::memset (pOutBuffer, *pInBuffer++, cNum) ;
- pOutBuffer += cNum ;
- nInSize-- ;
- }
- else
- *pOutBuffer++ = byData ;
- }
- rleOver:
- return (int)(pOutBuffer - pOutStart) ;
- }
- inline BYTE* FCCompress::RLE_TGA_EncodeLine (const BYTE* InBuffer, int iColorBit, int iNumPixel, BYTE* OutBuffer)
- {
- iColorBit /= 8 ;
- while (iNumPixel > 0)
- {
- DWORD Data = 0, Next = 0, Count = 1 ;
- FCColor::CopyPixel (&Data, InBuffer, iColorBit) ;
- InBuffer += iColorBit ; iNumPixel-- ;
- while ((Count < 0x80) && (iNumPixel > 0))
- {
- FCColor::CopyPixel (&Next, InBuffer, iColorBit) ;
- if (Next != Data)
- break ;
- InBuffer += iColorBit ; iNumPixel-- ; Count++ ;
- }
- *OutBuffer++ = 0x80 | (BYTE)--Count ;
- FCColor::CopyPixel (OutBuffer, &Data, iColorBit) ;
- OutBuffer += iColorBit ;
- }
- return OutBuffer ;
- }
- inline BYTE* FCCompress::RLE_TGA_DecodeLine (const BYTE* InBuffer, int iColorBit, int iNumPixel, BYTE* OutBuffer)
- {
- iColorBit /= 8 ;
- while (iNumPixel > 0)
- {
- const BYTE byData = *InBuffer++ ;
- if (byData & 0x80)
- {
- const int nNum = (byData & 0x7F) + 1 ;
- iNumPixel -= nNum ;
- for (int i=0 ; i < nNum ; i++, OutBuffer += iColorBit)
- FCColor::CopyPixel (OutBuffer, InBuffer, iColorBit) ;
- InBuffer += iColorBit ;
- }
- else
- {
-
- const int n = byData + 1,
- nByte = n * iColorBit ;
- iNumPixel -= n ;
- ::memcpy (OutBuffer, InBuffer, nByte) ;
- OutBuffer += nByte ;
- InBuffer += nByte ;
- }
- }
- assert (iNumPixel == 0) ;
- return const_cast<BYTE*>(InBuffer) ;
- }
- #endif
|