234 lines
8.2 KiB
C
234 lines
8.2 KiB
C
|
/*--------------------------------------------------------------------------*\
|
||
|
| |
|
||
|
| MSRLE.H |
|
||
|
\*--------------------------------------------------------------------------*/
|
||
|
|
||
|
/**************************************************************************
|
||
|
*
|
||
|
* THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
|
||
|
* KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
|
||
|
* PURPOSE.
|
||
|
*
|
||
|
* Copyright (c) 1991 - 1995 Microsoft Corporation. All Rights Reserved.
|
||
|
*
|
||
|
**************************************************************************/
|
||
|
|
||
|
#ifdef _WIN32
|
||
|
#define huge
|
||
|
|
||
|
// NT and WIN95 use different debug switches.
|
||
|
// NT defines DBG to be 0 or 1
|
||
|
// Win95 defines DEBUG, or does not define it
|
||
|
// Map one methodology to the other
|
||
|
|
||
|
#ifndef DBG
|
||
|
#ifdef DEBUG
|
||
|
#define DBG 1
|
||
|
#else
|
||
|
#define DBG 0
|
||
|
#endif
|
||
|
#endif
|
||
|
|
||
|
#undef DEBUG
|
||
|
|
||
|
#if DBG
|
||
|
#define DEBUG
|
||
|
#define STATICFN
|
||
|
#define STATICDT
|
||
|
#else
|
||
|
#define STATICFN static
|
||
|
#define STATICDT static
|
||
|
#endif
|
||
|
#endif
|
||
|
|
||
|
//
|
||
|
// compressor state info
|
||
|
//
|
||
|
typedef struct {
|
||
|
long lMinFrameSize;
|
||
|
long lMaxFrameSize;
|
||
|
long tolTemporal;
|
||
|
long tolSpatial;
|
||
|
long tolMax;
|
||
|
int iMaxRunLen;
|
||
|
} RLESTATE, FAR *LPRLESTATE, *PRLESTATE;
|
||
|
|
||
|
typedef struct {
|
||
|
LPVOID lpbiPrev;
|
||
|
int iStart;
|
||
|
long lLastParm;
|
||
|
long lFrames;
|
||
|
RLESTATE RleState;
|
||
|
BOOL fCompressBegin;
|
||
|
BOOL fDecompressBegin;
|
||
|
} RLEINST, *PRLEINST;
|
||
|
|
||
|
#define BI_DIBX 0x78626964l // 'dibx'
|
||
|
#define BI_DIBC 0x63626964l // 'dibc'
|
||
|
|
||
|
#define QUALITY_DEFAULT 8500
|
||
|
|
||
|
#define IDS_DESCRIPTION 42
|
||
|
#define IDS_NAME 43
|
||
|
|
||
|
extern HMODULE ghModule;
|
||
|
|
||
|
/****************************************************************************
|
||
|
***************************************************************************/
|
||
|
|
||
|
#ifdef _INC_COMPDDK
|
||
|
|
||
|
void NEAR PASCAL RleLoad(void);
|
||
|
void NEAR PASCAL RleFree(void);
|
||
|
PRLEINST NEAR PASCAL RleOpen(void);
|
||
|
DWORD NEAR PASCAL RleClose(PRLEINST pri);
|
||
|
DWORD NEAR PASCAL RleGetState(PRLEINST pri, LPVOID pv, DWORD dwSize);
|
||
|
DWORD NEAR PASCAL RleSetState(PRLEINST pri, LPVOID pv, DWORD dwSize);
|
||
|
|
||
|
DWORD NEAR PASCAL RleGetInfo(PRLEINST pri, ICINFO FAR *icinfo, DWORD dwSize);
|
||
|
|
||
|
DWORD NEAR PASCAL RleCompressBegin(PRLEINST pri, LPBITMAPINFOHEADER lpbiIn, LPBITMAPINFOHEADER lpbiOut);
|
||
|
DWORD NEAR PASCAL RleCompressQuery(PRLEINST pri, LPBITMAPINFOHEADER lpbiIn,LPBITMAPINFOHEADER lpbiOut);
|
||
|
DWORD NEAR PASCAL RleCompressGetFormat(PRLEINST pri, LPBITMAPINFOHEADER lpbiIn, LPBITMAPINFOHEADER lpbiOut);
|
||
|
DWORD NEAR PASCAL RleCompress(PRLEINST pri,ICCOMPRESS FAR *icinfo, DWORD dwSize);
|
||
|
DWORD NEAR PASCAL RleCompressGetSize(PRLEINST pri, LPBITMAPINFOHEADER lpbiIn, LPBITMAPINFOHEADER lpbiOut);
|
||
|
DWORD NEAR PASCAL RleCompressEnd(PRLEINST lpri);
|
||
|
|
||
|
DWORD NEAR PASCAL RleDecompressBegin(PRLEINST pri, LPBITMAPINFOHEADER lpbiIn, LPBITMAPINFOHEADER lpbiOut);
|
||
|
DWORD NEAR PASCAL RleDecompressQuery(PRLEINST pri, LPBITMAPINFOHEADER lpbiIn,LPBITMAPINFOHEADER lpbiOut);
|
||
|
DWORD NEAR PASCAL RleDecompressGetFormat(PRLEINST pri, LPBITMAPINFOHEADER lpbiIn, LPBITMAPINFOHEADER lpbiOut);
|
||
|
DWORD NEAR PASCAL RleDecompress(PRLEINST pri,ICDECOMPRESS FAR *icinfo, DWORD dwSize);
|
||
|
DWORD NEAR PASCAL RleDecompressEnd(PRLEINST pri);
|
||
|
|
||
|
#endif
|
||
|
|
||
|
/****************************************************************************
|
||
|
***************************************************************************/
|
||
|
|
||
|
BOOL FAR PASCAL CrunchDib(PRLEINST pri,
|
||
|
LPBITMAPINFOHEADER lpbiRle, LPVOID lpRle,
|
||
|
LPBITMAPINFOHEADER lpbiPrev,LPVOID lpPrev,
|
||
|
LPBITMAPINFOHEADER lpbiDib, LPVOID lpDib);
|
||
|
|
||
|
BOOL FAR PASCAL SplitDib (PRLEINST pri,
|
||
|
LPBITMAPINFOHEADER lpbiRle, LPVOID lpRle,
|
||
|
LPBITMAPINFOHEADER lpbiPrev,LPVOID lpPrev,
|
||
|
LPBITMAPINFOHEADER lpbiDib, LPVOID lpDib);
|
||
|
|
||
|
//#define MAXSUMSQUARES 195075L
|
||
|
#define MAXTOL 0x00FFFFFFL
|
||
|
#define ADAPTIVE -1
|
||
|
#define NO_LIMIT -1
|
||
|
|
||
|
/****************************************************************************
|
||
|
***************************************************************************/
|
||
|
|
||
|
/* RgbTol Table structure */
|
||
|
|
||
|
typedef struct {
|
||
|
int ClrUsed;
|
||
|
RGBQUAD argbq[256];
|
||
|
DWORD huge *hpTable;
|
||
|
} RGBTOL;
|
||
|
|
||
|
extern RGBTOL gRgbTol;
|
||
|
|
||
|
/* Public functions anyone can call */
|
||
|
|
||
|
BOOL FAR PASCAL RleDeltaFrame(
|
||
|
LPBITMAPINFOHEADER lpbiRle, LPBYTE pbRle,
|
||
|
LPBITMAPINFOHEADER lpbiPrev, LPBYTE pbPrev,
|
||
|
LPBITMAPINFOHEADER lpbiDib, LPBYTE pbDib,
|
||
|
int iStart,
|
||
|
int iLen,
|
||
|
long tolTemporal,
|
||
|
long tolSpatial,
|
||
|
int maxRun,
|
||
|
int minJump);
|
||
|
|
||
|
BOOL NEAR PASCAL MakeRgbTable(LPBITMAPINFOHEADER lpbi);
|
||
|
|
||
|
void NEAR PASCAL DecodeRle(LPBITMAPINFOHEADER lpbi, LPVOID pb, LPVOID prle, DWORD dwSize);
|
||
|
#ifndef _WIN32
|
||
|
void NEAR PASCAL DecodeRle386(LPBITMAPINFOHEADER lpbi, LPVOID pb, LPVOID prle);
|
||
|
void NEAR PASCAL DecodeRle286(LPBITMAPINFOHEADER lpbi, LPVOID pb, LPVOID prle);
|
||
|
#endif
|
||
|
|
||
|
// in DF.ASM
|
||
|
|
||
|
#ifndef _WIN32
|
||
|
extern void FAR PASCAL DeltaFrame386(
|
||
|
LPBITMAPINFOHEADER lpbi,
|
||
|
LPVOID pbPrev,
|
||
|
LPVOID pbDib,
|
||
|
LPVOID pbRle,
|
||
|
WORD MaxRunLength,
|
||
|
WORD MinJumpLength,
|
||
|
LPVOID TolTable,
|
||
|
DWORD tolTemporal,
|
||
|
DWORD tolSpatial);
|
||
|
#else
|
||
|
extern void DeltaFrameC(
|
||
|
LPBITMAPINFOHEADER lpbi,
|
||
|
LPBYTE pbPrev,
|
||
|
LPBYTE pbDib,
|
||
|
LPBYTE pbRle,
|
||
|
UINT MaxRunLength,
|
||
|
UINT MinJumpLength,
|
||
|
LPDWORD TolTable,
|
||
|
DWORD tolTemporal,
|
||
|
DWORD tolSpatial);
|
||
|
#endif
|
||
|
|
||
|
/****************************************************************************
|
||
|
DIB macros.
|
||
|
***************************************************************************/
|
||
|
|
||
|
#define WIDTHBYTES(i) ((unsigned)((i+31)&(~31))/8) /* ULONG aligned ! */
|
||
|
|
||
|
#define DibWidthBytesN(lpbi, n) (UINT)WIDTHBYTES((UINT)(lpbi)->biWidth * (UINT)(n))
|
||
|
#define DibWidthBytes(lpbi) DibWidthBytesN(lpbi, (lpbi)->biBitCount)
|
||
|
|
||
|
#define DibSizeImage(lpbi) ((lpbi)->biSizeImage == 0 \
|
||
|
? ((DWORD)(UINT)DibWidthBytes(lpbi) * (DWORD)(UINT)(lpbi)->biHeight) \
|
||
|
: (lpbi)->biSizeImage)
|
||
|
|
||
|
// Use when biSizeImage is known to be correct (e.g. after FixBitmapInfo)
|
||
|
#define DibSizeImageX(lpbi) ((lpbi)->biSizeImage)
|
||
|
|
||
|
#define DibSize(lpbi) ((lpbi)->biSize + (lpbi)->biSizeImage + (int)(lpbi)->biClrUsed * sizeof(RGBQUAD))
|
||
|
#define DibPaletteSize(lpbi) (DibNumColors(lpbi) * sizeof(RGBQUAD))
|
||
|
|
||
|
#define DibPtr(lpbi) (LPVOID)(DibColors(lpbi) + (UINT)(lpbi)->biClrUsed)
|
||
|
#define DibColors(lpbi) ((LPRGBQUAD)((LPBYTE)(lpbi) + (int)(lpbi)->biSize))
|
||
|
|
||
|
#define DibNumColors(lpbi) ((lpbi)->biClrUsed == 0 && (lpbi)->biBitCount <= 8 \
|
||
|
? (int)(1 << (int)(lpbi)->biBitCount) \
|
||
|
: (int)(lpbi)->biClrUsed)
|
||
|
|
||
|
#define DibXYN(lpbi,pb,x,y,n) (LPVOID)( \
|
||
|
(LPBYTE)(pb) + \
|
||
|
(UINT)((UINT)(x) * (UINT)(n) / 8u) + \
|
||
|
((DWORD)DibWidthBytesN(lpbi,n) * (DWORD)(UINT)(y)))
|
||
|
|
||
|
#define DibXY(lpbi,x,y) DibXYN(lpbi,DibPtr(lpbi),x,y,(lpbi)->biBitCount)
|
||
|
|
||
|
|
||
|
#define FixBitmapInfo(lpbi) if ((lpbi)->biSizeImage == 0) \
|
||
|
(lpbi)->biSizeImage = DibSizeImage(lpbi); \
|
||
|
if ((lpbi)->biClrUsed == 0) \
|
||
|
(lpbi)->biClrUsed = DibNumColors(lpbi);
|
||
|
|
||
|
|
||
|
|
||
|
/****************************************************************************
|
||
|
***************************************************************************/
|
||
|
|
||
|
#ifdef DEBUG
|
||
|
extern void FAR CDECL dprintf(LPSTR, ...);
|
||
|
#define DPF(_x_) dprintf _x_
|
||
|
#else
|
||
|
#define DPF ; / ## /
|
||
|
#endif
|