Windows2003-3790/windows/advcore/gdiplus/test/simpsons/mdmutils.h
2020-09-30 16:53:55 +02:00

259 lines
7.4 KiB
C

#ifndef _MDMUtils_h
#define _MDMUtils_h
// File: MDMUtils.h
// Author: Michael Marr (mikemarr)
//
// Description:
// This header contains miscellaneous utility functions.
//
// History:
// -@- 08/04/95 (mikemarr) - created
// -@- 09/09/97 (mikemarr) - snarfed from d2d\d2dutils\src\mmutils.cpp
// -@- 09/09/97 (mikemarr) - will only create code when in debug mode
// -@- 11/12/97 (mikemarr) - added CopyDWORDAligned
#include <stdlib.h>
#include <stdio.h>
#include <stddef.h>
#include <stdarg.h>
#include <limits.h>
#include <memory.h>
#define nTMPBUFSIZE 1024
extern char g_rgchTmpBuf[nTMPBUFSIZE];
#if defined(_WINDOWS) || defined(WIN32)
#ifndef _INC_WINDOWS
#define WIN32_EXTRA_LEAN
#define WIN32_LEAN_AND_MEAN
#include <WINDOWS.H>
#endif
#endif
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
#ifndef FALSE
#define FALSE false
#endif
#ifndef TRUE
#define TRUE true
#endif
#ifndef IN
#define IN
#endif
#ifndef OUT
#define OUT
#endif
#ifndef INOUT
#define INOUT
#endif
#ifndef BOOL
typedef int BOOL;
typedef BOOL far *LPBOOL;
#endif
#ifndef BYTE
typedef unsigned char BYTE;
typedef BYTE far *LPBYTE;
#endif
#ifndef WORD
typedef unsigned short WORD;
typedef WORD far *LPWORD;
#endif
#ifndef DWORD
typedef unsigned long DWORD;
typedef DWORD far *LPDWORD;
#endif
#ifndef LPVOID
typedef void far *LPVOID;
#endif
#define maskBYTE 0xFF
#define maskWORD 0xFFFF
#define maskDWORD 0xFFFFFFFF
#define maxBYTE 0xFF
#define maxWORD 0xFFFF
#define maxDWORD 0xFFFFFFFF
#define chSPC ' '
#define chTAB ' '
#define chEOL '\0'
#define chNULL '\0'
#define chLINEFEED 0x0D
#define chCARRIAGERETURN 0x0A
#ifndef max
#define max(a,b) (((a) > (b)) ? (a) : (b))
#endif
#ifndef min
#define min(a,b) (((a) < (b)) ? (a) : (b))
#endif
#define MACSTART do {
#define MACEND } while(0)
// Macro: ISWAP
// This macro swaps two integer registers using 3 xor's.
// This is unsafe because a & b are not guaranteed to get 2 regs.
#define ISWAP(a,b) MACSTART (a)^=(b); (b)^=(a); (a)^=(b); MACEND
// Macro: PSWAP
// This macro swaps two pointers in place using 3 xor's.
#define PSWAP(a,b,type) MACSTART \
a = (type *)(int(a) ^ int(b)); \
b = (type *)(int(a) ^ int(b)); \
a = (type *)(int(a) ^ int(b)); \
MACEND
#define MMINITSTRUCT(__s) memset(&(__s), 0, sizeof(__s))
#ifndef ZERO_DXSTRUCT
#define ZERO_DXSTRUCT(__dxstruct) MACSTART \
MMINITSTRUCT(__dxstruct); (__dxstruct).dwSize = sizeof(__dxstruct); MACEND
#endif
#ifndef INIT_DXSTRUCT
#define INIT_DXSTRUCT(__dxstruct) MACSTART \
MMINITSTRUCT(__dxstruct); (__dxstruct).dwSize = sizeof(__dxstruct); MACEND
#endif
#ifdef DBG
#define CHECK_HR(__hr) MACSTART if (FAILED(__hr)) { printf("%s(%d): CHECK_HR failed (0x%X)\n", __FILE__, __LINE__, hr); goto e_Exit; } MACEND
#else
#define CHECK_HR(__hr) MACSTART if (FAILED(__hr)) goto e_Exit; MACEND
#endif
#define CHECK_MEM(__p) MACSTART if ((__p) == NULL) { hr = E_OUTOFMEMORY; goto e_Exit; } MACEND
#define INRANGE(x, xmin, xmax) (((x) >= (xmin)) && ((x) <= (xmax)))
#define INARRAY(x, xmax) (((x) >= 0) && ((x) < (xmax)))
#define SETABS(x) MACSTART if ((x) < 0) (x) = -(x); MACEND
#define SETMAX(dst, src1, src2) MACSTART if ((src1) < (src2)) (dst) = (src2); else (dst) = (src1); MACEND
#define SETMIN(dst, src1, src2) MACSTART if ((src1) > (src2)) (dst) = (src2); else (dst) = (src1); MACEND
#define UPDATEMAX(dst, src) MACSTART if ((src) > (dst)) (dst) = (src); MACEND
#define UPDATEMIN(dst, src) MACSTART if ((src) < (dst)) (dst) = (src); MACEND
#define UPDATEMINMAX(xmin, xmax, x) MACSTART if ((x) < (xmin)) (xmin) = (x); else if ((x) > (xmax)) (xmax) = (x); MACEND
#define CLAMPMAX(x, xmax) MACSTART if ((x) > (xmax)) (x) = (xmax); MACEND
#define CLAMPMIN(x, xmin) MACSTART if ((x) < (xmin)) (x) = (xmin); MACEND
#define CLAMP(x, xmin, xmax) MACSTART \
if ((x) > (xmax)) (x) = (xmax); \
else if ((x) < (xmin)) (x) = (xmin); \
MACEND
//
// BIT MANIPULATION: BitVector
//
// **Hungarian Prefix: bv
typedef unsigned int BitVector;
#define NUMBITS(Type) (sizeof(Type) << 3)
// Macro: MASKRANGE
// Create a bit mask in the specified range, where the lo value is inclusive, and the
// hi value is exclusive.
// For example, MASKRANGE(8, 16) == 0x0000FF00.
#define MASKRANGE(lo, hi) \
(((((BitVector) ~0) >> (lo)) << ((lo) + (NUMBITS(BitVector) - (hi)))) >> (NUMBITS(BitVector) - (hi)))
#define SETBIT(bv, i) ((bv) |= (((BitVector) 1) << (i)))
#define UNSETBIT(bv, i) ((bv) &= ~(((BitVector) 1) << (i)))
#define SETRANGE(bv, lo, hi) ((bv) |= MASKRANGE(lo, hi))
#define UNSETRANGE(bv, lo, hi) ((bv) &= ~MASKRANGE(lo, hi))
#define SETFLAG(_dwFlags, _flag, _b) MACSTART if (_b) _dwFlags |= _flag; else _dwFlags &= ~_flag; MACEND
//
// DEBUG STUFF
//
#ifndef __AFX_H__
#ifdef _DEBUG
void _MMStall(const char *szExp, const char *szFile, int nLine);
void _MMTrace(const char *szFmt, ...);
#define MMASSERT(exp) (void)((exp) || (_MMStall(#exp, __FILE__, __LINE__),0))
#define MMASSERT_VALID(exp) MMASSERT(exp)
#define MMVERIFY(exp) MMASSERT(exp)
#define MMDEBUG_ONLY(exp) (exp)
#define MMTRACE ::_MMTrace
#else
// void _MMIgnore(const char *szFmt, ...) {}
#define MMASSERT(exp) ((void)0)
#define MMASSERT_VALID(exp) ((void)0)
#define MMVERIFY(exp) ((void)(exp))
#define MMDEBUG_ONLY(exp) ((void)0)
#define MMTRACE 1 ? (void)0 : ::printf
#endif
#else
#define MMASSERT(exp) ASSERT(exp)
#define MMASSERT_VALID(exp) ASSERT_VALID(exp)
#define MMVERIFY(exp) VERIFY(exp)
#define MMDEBUG_ONLY(exp) DEBUG_ONLY(exp)
#define MMTRACE TRACE
#endif
// Macro: MMRELEASE
// Safe release for COM objects
// ***this code should never change - there is stuff that relies on the pointer being
// set to NULL after being released
#ifndef MMRELEASE
#define MMRELEASE(_p) MACSTART if ((_p) != NULL) {(_p)->Release(); (_p) = NULL;} MACEND
#endif
#define MMDELETE(__ptr) MACSTART delete (__ptr); (__ptr) = NULL; MACEND
#define MMDELETERG(__ptr) MACSTART delete [] (__ptr); (__ptr) = NULL; MACEND
#define MMSETREF(_pOld, _pNew) MACSTART if (_pOld) (_pOld)->Release(); if ((_pOld) = (_pNew)) (_pOld)->AddRef(); MACEND
#define MAKE_USERERROR(code) MAKE_HRESULT(1,FACILITY_ITF,code)
#define E_NOTINITIALIZED MAKE_USERERROR(0xFFFC)
#define E_ALREADYINITIALIZED MAKE_USERERROR(0xFFFB)
#define E_NOTFOUND MAKE_USERERROR(0xFFFA)
#define E_INSUFFICIENTDATA MAKE_USERERROR(0xFFF9)
extern char g_szEOFMessage[];
// Macro for memory mapped file stuff
#define CHECKEOF(__pFilePos, __pFileLimit) MACSTART \
if ((__pFilePos) >= (__pFileLimit)) { \
MMTRACE(g_szEOFMessage); \
return E_UNEXPECTED; \
} MACEND
void ZeroDWORDAligned(LPDWORD pdw, DWORD cEntries);
void CopyDWORDAligned(DWORD *pdwDst, const DWORD *pdwSrc, DWORD cEntries);
inline void
ZeroPointers(void **ppv, DWORD cEntries)
{
// use a Duff-Marr machine
void **ppvLimit = ppv;
ppv += (cEntries & ~0x7);
switch (cEntries & 0x7) {
do {
ppv -= 8;
ppv[7] = NULL;
case 7: ppv[6] = NULL;
case 6: ppv[5] = NULL;
case 5: ppv[4] = NULL;
case 4: ppv[3] = NULL;
case 3: ppv[2] = NULL;
case 2: ppv[1] = NULL;
case 1: ppv[0] = NULL;
case 0: ;
} while (ppv != ppvLimit);
}
}
DWORD GetClosestMultipleOf4(DWORD n, bool bGreater);
DWORD GetClosestPowerOf2(DWORD n, bool bGreater);
#endif