Leaked source code of windows server 2003
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.
 
 
 
 
 
 

202 lines
5.7 KiB

/******************************Module*Header**********************************\
*
* **************************
* * DirectDraw SAMPLE CODE *
* **************************
*
* Module Name: ddenable.c
*
* Content:
*
* Copyright (c) 1994-1998 3Dlabs Inc. Ltd. All rights reserved.
* Copyright (c) 1995-1999 Microsoft Corporation. All rights reserved.
\*****************************************************************************/
#include "precomp.h"
#include "directx.h"
#include "dd.h"
//-----------------------------------------------------------------------------
//
// SetDdPixelFormat
//
// fill a DDPIXELFORMAT structure based with the current mode info
//
//-----------------------------------------------------------------------------
VOID
SetDdPixelFormat(PPDev ppdev,
LPDDPIXELFORMAT pdpf )
{
pdpf->dwSize = sizeof( DDPIXELFORMAT );
pdpf->dwFourCC = 0;
pdpf->dwFlags = DDPF_RGB;
pdpf->dwRBitMask = ppdev->flRed;
pdpf->dwGBitMask = ppdev->flGreen;
pdpf->dwBBitMask = ppdev->flBlue;
// Calculate some bitdepth dependent stuff
switch (ppdev->iBitmapFormat)
{
case BMF_8BPP:
pdpf->dwRGBAlphaBitMask = 0;
pdpf->dwRGBBitCount=8;
pdpf->dwFlags |= DDPF_PALETTEINDEXED8;
break;
case BMF_16BPP:
pdpf->dwRGBBitCount=16;
switch(ppdev->flRed)
{
case 0x7C00:
pdpf->dwRGBAlphaBitMask = 0x8000L;
break;
default:
pdpf->dwRGBAlphaBitMask = 0x0L;
}
break;
case BMF_24BPP:
pdpf->dwRGBAlphaBitMask = 0x00000000L;
pdpf->dwRGBBitCount=24;
break;
case BMF_32BPP:
pdpf->dwRGBAlphaBitMask = 0xff000000L;
pdpf->dwRGBBitCount=32;
break;
default:
ASSERTDD(FALSE,"trying to build unknown pixelformat");
break;
}
} // buildPixelFormat
//-----------------------------------------------------------------------------
//
// SetupDDData
//
// Called to fill in DirectDraw specific information in the ppdev.
//
//-----------------------------------------------------------------------------
VOID
SetupDDData(PPDev ppdev)
{
DBG_DD((7, "SetupDDData"));
SetDdPixelFormat(ppdev, &ppdev->ddpfDisplay);
//
// Setup the display size information
// cxMemory = Pixels across for one scanline
// (not necessarily the same as the screen width)
// cyMemory = Scanline height of the memory
//
ppdev->cxMemory = ppdev->cxScreen;
ppdev->cyMemory = ppdev->FrameBufferLength /
(ppdev->cxScreen << ppdev->bPixShift);
// reset some DDraw specific vars
ppdev->bDdStereoMode=FALSE;
ppdev->dwNewDDSurfaceOffset=0xffffffff;
// Reset the GART copies.
ppdev->dwGARTLin = 0;
ppdev->dwGARTDev = 0;
}// SetupDDData()
//-----------------------------------------------------------------------------
//
// DrvEnableDirectDraw
//
// This function is called by GDI at start of day or after a mode switch
// to enable DirectDraw
//
//-----------------------------------------------------------------------------
BOOL
DrvEnableDirectDraw(DHPDEV dhpdev,
DD_CALLBACKS* pCallBacks,
DD_SURFACECALLBACKS* pSurfaceCallBacks,
DD_PALETTECALLBACKS* pPaletteCallBacks)
{
PPDev ppdev = (PDev*)dhpdev;
DBG_DD((7,"DrvEnableDirectDraw called"));
ppdev->pDDContext = P2AllocateNewContext(ppdev,
(PULONG)P2DisableAllUnits,
0,
P2CtxtUserFunc);
if ( ppdev->pDDContext == NULL )
{
DBG_DD((0, "DrvEnableDirectDraw: ERROR: "
"failed to allocate DDRAW context"));
//
// Since we have already got the ppdev->pvmList, pointer to video memory
// heap list, in DrvGetDirectDrawInfo(), we better NULL it out here.
// The reason is that we can't enable DirectDraw. So the system won't
// initialize the DDRAW heap manager for us. Then we won't be able to
// use the video memory heap at all.
//
ppdev->pvmList = NULL;
return(FALSE);
}
DBG_DD((7," Created DD Register context: 0x%p", ppdev->pDDContext));
//
// setup some DirectDraw/D3D specific data in ppdev
//
SetupDDData(ppdev);
InitDDHAL(ppdev);
//
// Fill in the function pointers at start of day.
// We copy these from the Initialisation done in InitDDHAL32Bit.
//
memcpy(pCallBacks, &ppdev->DDHALCallbacks, sizeof(DD_CALLBACKS));
memcpy(pSurfaceCallBacks, &ppdev->DDSurfCallbacks,
sizeof(DD_SURFACECALLBACKS));
return(TRUE);
} // DrvEnableDirectDraw()
//-----------------------------------------------------------------------------
//
// DrvDisableDirectDraw
//
// This function is called by GDI at end of day or after a mode switch
//
//-----------------------------------------------------------------------------
VOID
DrvDisableDirectDraw( DHPDEV dhpdev)
{
PPDev ppdev;
DBG_DD((0, "DrvDisableDirectDraw(%lx)", dhpdev));
ppdev = (PDev*) dhpdev;
P2FreeContext (ppdev, ppdev->pDDContext);
ppdev->pDDContext = NULL;
ppdev->pvmList = NULL;
MEMTRACKERDEBUGCHK();
DBG_DD((3," freed Register context: 0x%x", ppdev->pDDContext));
} /* DrvDisableDirectDraw */