windows-nt/Source/XPSP1/NT/multimedia/media/avi/msrle/msrle.h
2020-09-26 16:20:57 +08:00

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