You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
481 lines
26 KiB
481 lines
26 KiB
/**INC+**********************************************************************/
|
|
/* */
|
|
/* adcgmcro.h */
|
|
/* */
|
|
/* DC-Groupware common macros - portable include file. */
|
|
/* */
|
|
/* Copyright(c) Microsoft 1996-1997 */
|
|
/* */
|
|
/****************************************************************************/
|
|
/* Changes: */
|
|
/* */
|
|
// $Log: Y:/logs/h/dcl/adcgmcro.h_v $
|
|
//
|
|
// Rev 1.9 22 Aug 1997 10:34:52 MD
|
|
// SFR1162: Retire DC_LOCAL_TO_WIRE16
|
|
//
|
|
// Rev 1.8 24 Jul 1997 16:48:28 KH
|
|
// SFR1033: Add DCMAKEDCUINT16
|
|
//
|
|
// Rev 1.7 23 Jul 1997 10:47:56 mr
|
|
// SFR1079: Merged \server\h duplicates to \h\dcl
|
|
//
|
|
// Rev 1.2 30 Jun 1997 15:23:52 OBK
|
|
// SFR0000: Fix erroneous DCHI8 macro
|
|
//
|
|
// Rev 1.1 19 Jun 1997 21:45:40 OBK
|
|
// SFR0000: Start of RNS codebase
|
|
/* */
|
|
/**INC-**********************************************************************/
|
|
#ifndef _H_ADCGMCRO
|
|
#define _H_ADCGMCRO
|
|
|
|
/****************************************************************************/
|
|
/* */
|
|
/* INCLUDES */
|
|
/* */
|
|
/****************************************************************************/
|
|
/****************************************************************************/
|
|
/* Include the Windows header. This will then include the appropriate */
|
|
/* specific header (Win31, Win NT, etc). */
|
|
/****************************************************************************/
|
|
#include <wdcgmcro.h>
|
|
|
|
/****************************************************************************/
|
|
/* */
|
|
/* STRUCTURES */
|
|
/* */
|
|
/****************************************************************************/
|
|
/****************************************************************************/
|
|
/* DC_ID_STAMP2 */
|
|
/* ============ */
|
|
/* This is used by the stamp macros below. */
|
|
/* */
|
|
/* component : */
|
|
/* structure : */
|
|
/* instance : */
|
|
/****************************************************************************/
|
|
typedef struct tagDC_ID_STAMP2
|
|
{
|
|
DCUINT16 component;
|
|
DCUINT16 structure;
|
|
DCUINT32 instance;
|
|
} DC_ID_STAMP2;
|
|
typedef DC_ID_STAMP2 DCPTR PDC_ID_STAMP2;
|
|
|
|
/****************************************************************************/
|
|
/* */
|
|
/* MACROS */
|
|
/* */
|
|
/****************************************************************************/
|
|
/****************************************************************************/
|
|
/* Common function macros used throughout the product. */
|
|
/****************************************************************************/
|
|
#define DC_QUIT goto DC_EXIT_POINT
|
|
#define DC_QUIT_ON_FAIL(hr) if (FAILED(hr)) DC_QUIT;
|
|
|
|
/****************************************************************************/
|
|
/* New function entry/exit macros. */
|
|
/****************************************************************************/
|
|
#define DC_BEGIN_FN(str) TRC_FN(str); TRC_ENTRY;
|
|
#define DC_END_FN() TRC_EXIT;
|
|
|
|
/****************************************************************************/
|
|
/* Conversion macros. */
|
|
/****************************************************************************/
|
|
#define DCMAKEDCUINT32(lo16, hi16) ((DCUINT32)(((DCUINT16)(lo16)) | \
|
|
(((DCUINT32)((DCUINT16)(hi16))) << 16)))
|
|
#define DCMAKEDCUINT16(lowByte, highByte) \
|
|
((DCUINT16)(((DCUINT8)(lowByte)) | \
|
|
(((DCUINT16)((DCUINT8)(highByte))) << 8)))
|
|
|
|
#define DCLO16(u32) ((DCUINT16)((u32) & 0xFFFF))
|
|
#define DCHI16(u32) ((DCUINT16)((((DCUINT32)(u32)) >> 16) & 0xFFFF))
|
|
#define DCLO8(w) ((DCUINT8)((w) & 0xFF))
|
|
#define DCHI8(w) ((DCUINT8)(((DCUINT16)(w) >> 8) & 0xFF))
|
|
|
|
/****************************************************************************/
|
|
/* Macro to round up a number to the nearest multiple of four. */
|
|
/****************************************************************************/
|
|
#define DC_ROUND_UP_4(x) ((x + 3) & ~((DCUINT32)0X03))
|
|
|
|
/****************************************************************************/
|
|
/* PAD macro - use it to add X pad bytes to a structure. */
|
|
/* */
|
|
/* Can only be used once per structure. */
|
|
/****************************************************************************/
|
|
#define DCPAD(X) DCINT8 padBytes[X]
|
|
|
|
/****************************************************************************/
|
|
/* Byte swapping macros for different endian architectures. */
|
|
/* */
|
|
/* DC_xx_WIRExx converts in a functional form */
|
|
/* DC_xx_WIRExx_INPLACE converts a given field (must be an lvalue) */
|
|
/* */
|
|
/* Note that these macros require aligned access. See below for unaligned */
|
|
/* access macros. */
|
|
/* */
|
|
/* Note that on bigendian machines DC_{TO,FROM}_WIRE16 casts to a DCUINT16. */
|
|
/* In code of the form */
|
|
/* B = DC_{TO,FROM}_WIRE16(A) */
|
|
/* there is an implicit cast to the type of B. So if A is a DCINT16 and is */
|
|
/* negative, and B has > 16 bits, then B will end up being large and */
|
|
/* positive. It is therefore necessary to add a cast to a DCINT16. */
|
|
/* */
|
|
/****************************************************************************/
|
|
#ifndef DC_BIGEND
|
|
|
|
#define DC_TO_WIRE16(A) (A)
|
|
#define DC_TO_WIRE32(A) (A)
|
|
#define DC_FROM_WIRE16(A) (A)
|
|
#define DC_FROM_WIRE32(A) (A)
|
|
#define DC_TO_WIRE16_INPLACE(A)
|
|
#define DC_TO_WIRE32_INPLACE(A)
|
|
#define DC_FROM_WIRE16_INPLACE(A)
|
|
#define DC_FROM_WIRE32_INPLACE(A)
|
|
|
|
#else
|
|
|
|
#define DC_TO_WIRE16(A) \
|
|
(DCUINT16) (((DCUINT16)(((PDCUINT8)&(A))[1]) << 8) | \
|
|
((DCUINT16)(((PDCUINT8)&(A))[0])))
|
|
#define DC_FROM_WIRE16(A) \
|
|
(DCUINT16) (((DCUINT16)(((PDCUINT8)&(A))[1]) << 8) | \
|
|
((DCUINT16)(((PDCUINT8)&(A))[0])))
|
|
#define DC_TO_WIRE32(A) \
|
|
(DCUINT32) (((DCUINT32)(((PDCUINT8)&(A))[3]) << 24)| \
|
|
((DCUINT32)(((PDCUINT8)&(A))[2]) << 16)| \
|
|
((DCUINT32)(((PDCUINT8)&(A))[1]) << 8) | \
|
|
((DCUINT32)(((PDCUINT8)&(A))[0])))
|
|
#define DC_FROM_WIRE32(A) \
|
|
(DCUINT32) (((DCUINT32)(((PDCUINT8)&(A))[3]) << 24)| \
|
|
((DCUINT32)(((PDCUINT8)&(A))[2]) << 16)| \
|
|
((DCUINT32)(((PDCUINT8)&(A))[1]) << 8) | \
|
|
((DCUINT32)(((PDCUINT8)&(A))[0])))
|
|
|
|
#define DC_TO_WIRE16_INPLACE(A) (A) = DC_TO_WIRE16(A)
|
|
#define DC_TO_WIRE32_INPLACE(A) (A) = DC_TO_WIRE32(A)
|
|
#define DC_FROM_WIRE16_INPLACE(A) (A) = DC_FROM_WIRE16(A)
|
|
#define DC_FROM_WIRE32_INPLACE(A) (A) = DC_FROM_WIRE32(A)
|
|
|
|
#endif
|
|
|
|
/****************************************************************************/
|
|
/* Unaligned pointer access macros -- first macros to extract an integer */
|
|
/* from an unaligned pointer. Note that these macros assume that the */
|
|
/* integer is in local byte order */
|
|
/****************************************************************************/
|
|
#ifndef DC_NO_UNALIGNED
|
|
|
|
#define DC_EXTRACT_UINT16_UA(pA) (*(PDCUINT16_UA)(pA))
|
|
#define DC_EXTRACT_INT16_UA(pA) (*(PDCINT16_UA)(pA))
|
|
#define DC_EXTRACT_UINT32_UA(pA) (*(PDCUINT32_UA)(pA))
|
|
#define DC_EXTRACT_INT32_UA(pA) (*(PDCINT32_UA)(pA))
|
|
|
|
#else
|
|
|
|
#ifndef DC_BIGEND
|
|
#define DC_EXTRACT_UINT16_UA(pA) ((DCUINT16) (((PDCUINT8)(pA))[0]) | \
|
|
(DCUINT16) ((((PDCUINT8)(pA))[1]) << 8) )
|
|
|
|
#define DC_EXTRACT_INT16_UA(pA) ((DCINT16) (((PDCUINT8)(pA))[0]) | \
|
|
(DCINT16) ((((PDCUINT8)(pA))[1]) << 8) )
|
|
|
|
#define DC_EXTRACT_UINT32_UA(pA) ((DCUINT32) (((PDCUINT8)(pA))[0]) | \
|
|
(DCUINT32) ((((PDCUINT8)(pA))[1]) << 8) | \
|
|
(DCUINT32) ((((PDCUINT8)(pA))[2]) << 16) | \
|
|
(DCUINT32) ((((PDCUINT8)(pA))[3]) << 24) )
|
|
|
|
#define DC_EXTRACT_INT32_UA(pA) ((DCINT32) (((PDCUINT8)(pA))[0]) | \
|
|
(DCINT32) ((((PDCUINT8)(pA))[1]) << 8) | \
|
|
(DCINT32) ((((PDCUINT8)(pA))[2]) << 16) | \
|
|
(DCINT32) ((((PDCUINT8)(pA))[3]) << 24) )
|
|
#else
|
|
#define DC_EXTRACT_UINT16_UA(pA) ((DCUINT16) (((PDCUINT8)(pA))[1]) | \
|
|
(DCUINT16) ((((PDCUINT8)(pA))[0]) << 8) )
|
|
|
|
#define DC_EXTRACT_INT16_UA(pA) ((DCINT16) (((PDCUINT8)(pA))[1]) | \
|
|
(DCINT16) ((((PDCUINT8)(pA))[0]) << 8) )
|
|
|
|
#define DC_EXTRACT_UINT32_UA(pA) ((DCUINT32) (((PDCUINT8)(pA))[3]) | \
|
|
(DCUINT32) ((((PDCUINT8)(pA))[2]) << 8) | \
|
|
(DCUINT32) ((((PDCUINT8)(pA))[1]) << 16) | \
|
|
(DCUINT32) ((((PDCUINT8)(pA))[0]) << 24) )
|
|
|
|
#define DC_EXTRACT_INT32_UA(pA) ((DCINT32) (((PDCUINT8)(pA))[3]) | \
|
|
(DCINT32) ((((PDCUINT8)(pA))[2]) << 8) | \
|
|
(DCINT32) ((((PDCUINT8)(pA))[1]) << 16) | \
|
|
(DCINT32) ((((PDCUINT8)(pA))[0]) << 24) )
|
|
#endif
|
|
|
|
#endif
|
|
|
|
/****************************************************************************/
|
|
/* Now macros to insert an integer at an unaligned pointer value. Again, */
|
|
/* the value inserted will be in local format. */
|
|
/****************************************************************************/
|
|
#ifndef DC_NO_UNALIGNED
|
|
|
|
#define DC_INSERT_UINT16_UA(pA,V) (*(PDCUINT16_UA)(pA)) = (V)
|
|
#define DC_INSERT_INT16_UA(pA,V) (*(PDCINT16_UA)(pA)) = (V)
|
|
#define DC_INSERT_UINT32_UA(pA,V) (*(PDCUINT32_UA)(pA)) = (V)
|
|
#define DC_INSERT_INT32_UA(pA,V) (*(PDCINT32_UA)(pA)) = (V)
|
|
|
|
#else
|
|
|
|
#ifndef DC_BIGEND
|
|
#define DC_INSERT_UINT16_UA(pA,V) \
|
|
{ \
|
|
(((PDCUINT8)(pA))[0]) = (DCUINT8)( (V) & 0x00FF); \
|
|
(((PDCUINT8)(pA))[1]) = (DCUINT8)(((V)>>8) & 0x00FF); \
|
|
}
|
|
#define DC_INSERT_INT16_UA(pA,V) \
|
|
{ \
|
|
(((PDCUINT8)(pA))[0]) = (DCUINT8)( (V) & 0x00FF); \
|
|
(((PDCUINT8)(pA))[1]) = (DCUINT8)(((V)>>8) & 0x00FF); \
|
|
}
|
|
#define DC_INSERT_UINT32_UA(pA,V) \
|
|
{ \
|
|
(((PDCUINT8)(pA))[0]) = (DCUINT8)( (V) & 0x000000FF); \
|
|
(((PDCUINT8)(pA))[1]) = (DCUINT8)(((V)>>8) & 0x000000FF); \
|
|
(((PDCUINT8)(pA))[2]) = (DCUINT8)(((V)>>16) & 0x000000FF); \
|
|
(((PDCUINT8)(pA))[3]) = (DCUINT8)(((V)>>24) & 0x000000FF); \
|
|
}
|
|
#define DC_INSERT_INT32_UA(pA,V) \
|
|
{ \
|
|
(((PDCUINT8)(pA))[0]) = (DCUINT8)( (V) & 0x000000FF); \
|
|
(((PDCUINT8)(pA))[1]) = (DCUINT8)(((V)>>8) & 0x000000FF); \
|
|
(((PDCUINT8)(pA))[2]) = (DCUINT8)(((V)>>16) & 0x000000FF); \
|
|
(((PDCUINT8)(pA))[3]) = (DCUINT8)(((V)>>24) & 0x000000FF); \
|
|
}
|
|
#else
|
|
#define DC_INSERT_UINT16_UA(pA,V) \
|
|
{ \
|
|
(((PDCUINT8)(pA))[1]) = (DCUINT8)( (V) & 0x00FF); \
|
|
(((PDCUINT8)(pA))[0]) = (DCUINT8)(((V)>>8) & 0x00FF); \
|
|
}
|
|
#define DC_INSERT_INT16_UA(pA,V) \
|
|
{ \
|
|
(((PDCUINT8)(pA))[1]) = (DCUINT8)( (V) & 0x00FF); \
|
|
(((PDCUINT8)(pA))[0]) = (DCUINT8)(((V)>>8) & 0x00FF); \
|
|
}
|
|
#define DC_INSERT_UINT32_UA(pA,V) \
|
|
{ \
|
|
(((PDCUINT8)(pA))[3]) = (DCUINT8)( (V) & 0x000000FF); \
|
|
(((PDCUINT8)(pA))[2]) = (DCUINT8)(((V)>>8) & 0x000000FF); \
|
|
(((PDCUINT8)(pA))[1]) = (DCUINT8)(((V)>>16) & 0x000000FF); \
|
|
(((PDCUINT8)(pA))[0]) = (DCUINT8)(((V)>>24) & 0x000000FF); \
|
|
}
|
|
#define DC_INSERT_INT32_UA(pA,V) \
|
|
{ \
|
|
(((PDCUINT8)(pA))[3]) = (DCUINT8)( (V) & 0x000000FF); \
|
|
(((PDCUINT8)(pA))[2]) = (DCUINT8)(((V)>>8) & 0x000000FF); \
|
|
(((PDCUINT8)(pA))[1]) = (DCUINT8)(((V)>>16) & 0x000000FF); \
|
|
(((PDCUINT8)(pA))[0]) = (DCUINT8)(((V)>>24) & 0x000000FF); \
|
|
}
|
|
#endif
|
|
|
|
#endif
|
|
|
|
/****************************************************************************/
|
|
/* Now another version of these macros, to insert an integer at an */
|
|
/* unaligned pointer value. This time, the value inserted should be in */
|
|
/* wire format. */
|
|
/****************************************************************************/
|
|
#ifndef DC_NO_UNALIGNED
|
|
|
|
#define DC_INSERT_WIRE_UINT16_UA(pA,V) \
|
|
(*(PDCUINT16_UA)(pA)) = DC_TO_WIRE16(V)
|
|
#define DC_INSERT_WIRE_INT16_UA(pA,V) \
|
|
(*(PDCINT16_UA)(pA)) = DC_TO_WIRE16(V)
|
|
#define DC_INSERT_WIRE_UINT32_UA(pA,V) \
|
|
(*(PDCUINT32_UA)(pA)) = DC_TO_WIRE32(V)
|
|
#define DC_INSERT_WIRE_INT32_UA(pA,V) \
|
|
(*(PDCINT32_UA)(pA)) = DC_TO_WIRE32(V)
|
|
|
|
#else
|
|
|
|
#define DC_INSERT_WIRE_UINT16_UA(pA,V) \
|
|
{ \
|
|
(((PDCUINT8)(pA))[0]) = (DCUINT8)( (V) & 0x00FF); \
|
|
(((PDCUINT8)(pA))[1]) = (DCUINT8)(((V)>>8) & 0x00FF); \
|
|
}
|
|
#define DC_INSERT_WIRE_INT16_UA(pA,V) \
|
|
{ \
|
|
(((PDCUINT8)(pA))[0]) = (DCUINT8)( (V) & 0x00FF); \
|
|
(((PDCUINT8)(pA))[1]) = (DCUINT8)(((V)>>8) & 0x00FF); \
|
|
}
|
|
#define DC_INSERT_WIRE_UINT32_UA(pA,V) \
|
|
{ \
|
|
(((PDCUINT8)(pA))[0]) = (DCUINT8)( (V) & 0x000000FF); \
|
|
(((PDCUINT8)(pA))[1]) = (DCUINT8)(((V)>>8) & 0x000000FF); \
|
|
(((PDCUINT8)(pA))[2]) = (DCUINT8)(((V)>>16) & 0x000000FF); \
|
|
(((PDCUINT8)(pA))[3]) = (DCUINT8)(((V)>>24) & 0x000000FF); \
|
|
}
|
|
#define DC_INSERT_WIRE_INT32_UA(pA,V) \
|
|
{ \
|
|
(((PDCUINT8)(pA))[0]) = (DCUINT8)( (V) & 0x000000FF); \
|
|
(((PDCUINT8)(pA))[1]) = (DCUINT8)(((V)>>8) & 0x000000FF); \
|
|
(((PDCUINT8)(pA))[2]) = (DCUINT8)(((V)>>16) & 0x000000FF); \
|
|
(((PDCUINT8)(pA))[3]) = (DCUINT8)(((V)>>24) & 0x000000FF); \
|
|
}
|
|
#endif
|
|
|
|
/****************************************************************************/
|
|
/* Unaligned pointer in-place flipping macros. These macros flip an */
|
|
/* integer field to or from wire format in-place, but do not do any */
|
|
/* unaligned accesses while they are doing it. */
|
|
/****************************************************************************/
|
|
#ifndef DC_BIGEND
|
|
|
|
#define DC_TO_WIRE16_INPLACE_UA(A)
|
|
#define DC_TO_WIRE32_INPLACE_UA(A)
|
|
#define DC_FROM_WIRE16_INPLACE_UA(A)
|
|
#define DC_FROM_WIRE32_INPLACE_UA(A)
|
|
|
|
#else
|
|
|
|
#ifndef DC_NO_UNALIGNED
|
|
#define DC_TO_WIRE16_INPLACE_UA(A) DC_TO_WIRE16_INPLACE(A)
|
|
#define DC_TO_WIRE32_INPLACE_UA(A) DC_TO_WIRE32_INPLACE(A)
|
|
#define DC_FROM_WIRE16_INPLACE_UA(A) DC_FROM_WIRE16_INPLACE(A)
|
|
#define DC_FROM_WIRE32_INPLACE_UA(A) DC_FROM_WIRE32_INPLACE(A)
|
|
#else
|
|
#define DC_TO_WIRE16_INPLACE_UA(A) \
|
|
{ \
|
|
DCUINT16 val; \
|
|
val = DC_TO_WIRE16(A); \
|
|
DC_INSERT_UINT16_UA(&(A), val) \
|
|
}
|
|
#define DC_TO_WIRE32_INPLACE_UA(A) \
|
|
{ \
|
|
DCUINT32 val; \
|
|
val = DC_TO_WIRE32(A); \
|
|
DC_INSERT_UINT32_UA(&(A), val) \
|
|
}
|
|
#define DC_FROM_WIRE16_INPLACE_UA(A) \
|
|
{ \
|
|
DCUINT16 val; \
|
|
val = DC_FROM_WIRE16(A); \
|
|
DC_INSERT_UINT16_UA(&(A), val) \
|
|
}
|
|
#define DC_FROM_WIRE32_INPLACE_UA(A) \
|
|
{ \
|
|
DCUINT32 val; \
|
|
val = DC_FROM_WIRE32(A); \
|
|
DC_INSERT_UINT32_UA(&(A), val) \
|
|
}
|
|
#endif
|
|
|
|
#endif
|
|
|
|
/****************************************************************************/
|
|
/* FLAG macro - parameter indicates bit which flag uses - use as follows: */
|
|
/* */
|
|
/* #define FILE_OPEN DCFLAG8(0) */
|
|
/* #define FILE_LOCKED DCFLAG8(1) */
|
|
/****************************************************************************/
|
|
#define DCFLAG(X) ((DCUINT8) (1 << X))
|
|
#define DCFLAG8(X) ((DCUINT8) (1 << X))
|
|
#define DCFLAG16(X) ((DCUINT16) (1 << X))
|
|
#define DCFLAG32(X) ((DCUINT32) (1 << X))
|
|
#define DCFLAGN(X) ((DCUINT) (1 << X))
|
|
|
|
/****************************************************************************/
|
|
/* Flag manipulation macros: */
|
|
/* */
|
|
/* SET_FLAG : sets a flag (i.e. assigns 1 to it). */
|
|
/* CLEAR_FLAG : clears a flag (i.e. assigns 0 to it). */
|
|
/* TEST_FLAG : returns the value of a flag. */
|
|
/* ASSIGN_FLAG : takes a boolean value and uses it to set or clear a */
|
|
/* flag. */
|
|
/****************************************************************************/
|
|
#define SET_FLAG(var, flag) ((var) |= (flag))
|
|
|
|
#ifndef CLEAR_FLAG
|
|
#define CLEAR_FLAG(var, flag) ((var) &= ~(flag))
|
|
#endif
|
|
|
|
#define TEST_FLAG(var, flag) (((var) & (flag)) != 0)
|
|
|
|
#define ASSIGN_FLAG(var, flag, value) \
|
|
if (TRUE == value) \
|
|
{ \
|
|
SET_FLAG(var, flag); \
|
|
} \
|
|
else \
|
|
{ \
|
|
CLEAR_FLAG(var, flag); \
|
|
}
|
|
|
|
/****************************************************************************/
|
|
/* Stamp type and macro: each module should use these when stamping its */
|
|
/* data structures. */
|
|
/****************************************************************************/
|
|
typedef DCUINT32 DC_ID_STAMP;
|
|
|
|
#define DC_MAKE_ID_STAMP(X1, X2, X3, X4) \
|
|
((DC_ID_STAMP) (((DCUINT32) X4) << 24) | \
|
|
(((DCUINT32) X3) << 16) | \
|
|
(((DCUINT32) X2) << 8) | \
|
|
(((DCUINT32) X1) << 0) )
|
|
|
|
#define MAKE_STAMP16(X1, X2) \
|
|
((DCUINT16) (((DCUINT16) X2) << 8) | \
|
|
(((DCUINT16) X1) << 0) )
|
|
|
|
#define MAKE_STAMP32(X1, X2, X3, X4) \
|
|
((DCUINT32) (((DCUINT32) X4) << 24) | \
|
|
(((DCUINT32) X3) << 16) | \
|
|
(((DCUINT32) X2) << 8) | \
|
|
(((DCUINT32) X1) << 0) )
|
|
|
|
/****************************************************************************/
|
|
/* Other common macros. */
|
|
/****************************************************************************/
|
|
#define COM_SIZEOF_RECT(r) \
|
|
(DCUINT32)((DCUINT32)((r).SRXMAX-(r).SRXMIN)* \
|
|
(DCUINT32)((r).SRYMAX-(r).SRYMIN))
|
|
|
|
/****************************************************************************/
|
|
/* Macro to remove the "Unreferenced parameter" warning. */
|
|
/****************************************************************************/
|
|
#define DC_IGNORE_PARAMETER(PARAMETER) \
|
|
PARAMETER;
|
|
|
|
/****************************************************************************/
|
|
/* Convert a non-zero value to 1. */
|
|
/****************************************************************************/
|
|
#define MAKE_BOOL(A) (!(!(A)))
|
|
|
|
/****************************************************************************/
|
|
/* This macro works on 32 bit unsigned ticks and returns TRUE if TIME is */
|
|
/* between BEGIN and END (both inclusive) allowing for the wraparound. */
|
|
/****************************************************************************/
|
|
#define IN_TIME_RANGE(BEGIN, END, TIME) \
|
|
(((BEGIN) < (END)) ? \
|
|
(((TIME) >= (BEGIN)) && ((TIME) <= (END))) : \
|
|
(((TIME) >= (BEGIN)) || ((TIME) <= (END))))
|
|
|
|
/****************************************************************************/
|
|
/* Minimum and maximum macros. */
|
|
/****************************************************************************/
|
|
#define DC_MIN(a, b) (((a) < (b)) ? (a) : (b))
|
|
#define DC_MAX(a, b) (((a) > (b)) ? (a) : (b))
|
|
|
|
/****************************************************************************/
|
|
/* Convert BPP to number of colors. */
|
|
/****************************************************************************/
|
|
#define COLORS_FOR_BPP(BPP) (((BPP) > 8) ? 0 : (1 << (BPP)))
|
|
|
|
/****************************************************************************/
|
|
/* Normalize PALETTEINDEX macro across platforms */
|
|
/****************************************************************************/
|
|
#ifdef OS_WINCE
|
|
#define DC_PALINDEX(i) ((COLORREF)(0x01000000 | (DWORD)(WORD)(i)))
|
|
#else // OS_WINCE
|
|
#define DC_PALINDEX(i) PALETTEINDEX(i)
|
|
#endif // OS_WINCE
|
|
|
|
#endif /* _H_ADCGMCRO */
|
|
|