/******************************Module*Header**********************************\
*
*                           ***************
*                           * SAMPLE CODE *
*                           ***************
*
* Module Name: debug.h
*
* Debugging support interfaces.    
*
* Copyright (c) 1994-1998 3Dlabs Inc. Ltd. All rights reserved.
* Copyright (c) 1995-1999 Microsoft Corporation.  All rights reserved.
\*****************************************************************************/

extern
VOID
DebugPrint(
    LONG DebugPrintLevel,
    PCHAR DebugMessage,
    ...
    );


#if DBG

// In order to enable per component debugging, DebugFilter will
// contain the bit pattern that will turn on messages for them.
// Debug messages with a debuglevel of 0 will be printed regardless
// of the filter in effect.The DWORD in which the DebugFilter is
// stored and the patterns of the filter masks will allow up to
// 4 separate components to be tracked, each one with 8 separate
// subcomponents.

// Note: During the transition phase to this new functionality, a 
// filter of 0 will print ALL messages, but will later be switched 
// to print NONE (expect of course , those at level 0)

extern DWORD DebugFilter;
extern DWORD DebugPrintFilter;

#define DEBUG_FILTER_D3D   0x000000FF
#define DEBUG_FILTER_DD    0x0000FF00
#define DEBUG_FILTER_GDI   0x00FF0000

#define MINOR_DEBUG

#define DISPDBG(arg) DebugPrint arg

#define DBG_COMPONENT(arg, component)        \
{       DebugPrintFilter = component;        \
        DebugPrint arg ;                     \
        DebugPrintFilter = 0;                \
}

#define DBG_D3D(arg)        DBG_COMPONENT(arg,DEBUG_FILTER_D3D)
#define DBG_DD(arg)         DBG_COMPONENT(arg,DEBUG_FILTER_DD)
#define DBG_GDI(arg)        DBG_COMPONENT(arg,DEBUG_FILTER_GDI)

#define RIP(x) { DebugPrint(-1000, x); DebugBreak();}
#define ASSERTDD(x, y) if (!(x)) RIP (y)

extern VOID __cdecl DebugMsg(PCHAR DebugMessage, ...);
extern void DumpSurface(LONG Level, LPDDRAWI_DDRAWSURFACE_LCL lpDDSurface, LPDDSURFACEDESC lpDDSurfaceDesc);
extern void DecodeBlend(LONG Level, DWORD i );

#define DUMPSURFACE(a, b, c) DumpSurface(a, b, c); 
#define DECODEBLEND(a, b) DecodeBlend(a, b);

#define PRINTALLP2REGISTER    PrintAllP2Registers  
#define PRINTDIFFP2REGISTER   PrintDifferentP2Registers
#define SAVEALLP2REGISTER     SaveAllP2Registers  

VOID PrintAllP2Registers( ULONG ulDebugLevel, PPDev ppdev);
VOID SaveAllP2Registers( PPDev ppdev);
VOID PrintDifferentP2Registers(ULONG ulDebugLevel, PPDev ppdev);

#if TRACKMEMALLOC
//------------------------------------------------------------------------------
//
//  Memory Tracker
//
//------------------------------------------------------------------------------




VOID MemTrackerAddInstance();
VOID MemTrackerRemInstance();
PVOID MemTrackerAllocateMem(PVOID p, 
                           LONG lSize, 
                           PCHAR pModule, 
                           LONG lLineNo, 
                           BOOL bStopWhenFreed);
VOID MemTrackerFreeMem( VOID *p);
VOID MemTrackerDebugChk();

#define MEMTRACKERADDINSTANCE MemTrackerAddInstance
#define MEMTRACKERREMINSTANCE MemTrackerRemInstance
#define MEMTRACKERALLOCATEMEM MemTrackerAllocateMem
#define MEMTRACKERFREEMEM     MemTrackerFreeMem
#define MEMTRACKERDEBUGCHK    MemTrackerDebugChk

#else

#define MEMTRACKERADDINSTANCE / ## /
#define MEMTRACKERREMINSTANCE / ## /
#define MEMTRACKERALLOCATEMEM / ## /
#define MEMTRACKERFREEMEM     / ## /
#define MEMTRACKERDEBUGCHK    / ## /

#endif

//------------------------------------------------------------------------------
//
// THUNK_LAYER
//
// By Setting THUNK_LAYER equal to 1 you are adding a wrapper call on top of
// all DDI rendering functions.  In this thunk layer of wrapper calls
// several usefull debugging features are enabled.
//
// Surface checks--which can help catch errant rendering routines
// Event logging---which can record rendering evernts to a log file
//
//------------------------------------------------------------------------------


#define THUNK_LAYER 0

#if THUNK_LAYER

BOOL
xDrvBitBlt(SURFOBJ*  psoDst,
          SURFOBJ*  psoSrc,
          SURFOBJ*  psoMsk,
          CLIPOBJ*  pco,
          XLATEOBJ* pxlo,
          RECTL*    prclDst,
          POINTL*   pptlSrc,
          POINTL*   pptlMsk,
          BRUSHOBJ* pbo,
          POINTL*   pptlBrush,
          ROP4      rop4);

BOOL
xDrvCopyBits(
    SURFOBJ*  psoDst,
    SURFOBJ*  psoSrc,
    CLIPOBJ*  pco,
    XLATEOBJ* pxlo,
    RECTL*    prclDst,
    POINTL*   pptlSrc);

BOOL 
xDrvTransparentBlt(
   SURFOBJ *    psoDst,
   SURFOBJ *    psoSrc,
   CLIPOBJ *    pco,
   XLATEOBJ *   pxlo,
   RECTL *      prclDst,
   RECTL *      prclSrc,
   ULONG        iTransColor,
   ULONG        ulReserved);

BOOL xDrvAlphaBlend(
   SURFOBJ  *psoDst,
   SURFOBJ  *psoSrc,
   CLIPOBJ  *pco,
   XLATEOBJ *pxlo,
   RECTL    *prclDst,
   RECTL    *prclSrc,
   BLENDOBJ *pBlendObj);

BOOL
xDrvGradientFill(
   SURFOBJ      *psoDst,
   CLIPOBJ      *pco,
   XLATEOBJ     *pxlo,
   TRIVERTEX    *pVertex,
   ULONG        nVertex,
   PVOID        pMesh,
   ULONG        nMesh,
   RECTL        *prclExtents,
   POINTL       *pptlDitherOrg,
   ULONG        ulMode
   );

BOOL
xDrvTextOut(SURFOBJ*     pso,
           STROBJ*      pstro,
           FONTOBJ*     pfo,
           CLIPOBJ*     pco,
           RECTL*       prclExtra,
           RECTL*       prclOpaque,
           BRUSHOBJ*    pboFore,
           BRUSHOBJ*    pboOpaque,
           POINTL*      pptlBrush, 
           MIX          mix);

BOOL
xDrvFillPath(
    SURFOBJ*    pso,
    PATHOBJ*    ppo,
    CLIPOBJ*    pco,
    BRUSHOBJ*   pbo,
    POINTL*     pptlBrush,
    MIX         mix,
    FLONG       flOptions);

BOOL
xDrvLineTo(
    SURFOBJ*  pso,
    CLIPOBJ*  pco,
    BRUSHOBJ* pbo,
    LONG      x1,
    LONG      y1,
    LONG      x2,
    LONG      y2,
    RECTL*    prclBounds,
    MIX       mix);

BOOL
xDrvStrokePath(
    SURFOBJ*   pso,
    PATHOBJ*   ppo,
    CLIPOBJ*   pco,
    XFORMOBJ*  pxo,
    BRUSHOBJ*  pbo,
    POINTL*    pptlBrush,
    LINEATTRS* pla,
    MIX        mix);

#endif

#else

#define DISPDBG(arg)
#define DBG_D3D(arg)
#define DBG_DD(arg)
#define DBG_GDI(arg)
#define RIP(x)
#define ASSERTDD(x, y)
#define DUMPSURFACE(a, b, c)
#define DECODEBLEND(a, b)

#define MEMTRACKERADDINSTANCE / ## /
#define MEMTRACKERREMINSTANCE / ## /
#define MEMTRACKERALLOCATEMEM / ## /
#define MEMTRACKERFREEMEM     / ## /
#define MEMTRACKERDEBUGCHK    / ## /

#define PRINTALLP2REGISTER      / ## /  
#define PRINTDIFFP2REGISTER     / ## /
#define SAVEALLP2REGISTER       / ## /

#endif

#define DebugBreak              EngDebugBreak

#define MAKE_BITMAPS_OPAQUE 0

