📄 ddhsurf.cpp
字号:
#include "precomp.h"
static void DumpDDSCAPS( DDSCAPS ddsCaps )
{
if( ddsCaps.dwCaps & DDSCAPS_OVERLAY )
DEBUGMSG(HAL_ZONE_CREATE,(TEXT("DDSCAPS_OVERLAY; ")));
if( ddsCaps.dwCaps & DDSCAPS_FRONTBUFFER )
DEBUGMSG(HAL_ZONE_CREATE,(TEXT("DDSCAPS_FRONTBUFFER; ")));
if( ddsCaps.dwCaps & DDSCAPS_BACKBUFFER )
DEBUGMSG(HAL_ZONE_CREATE,(TEXT("DDSCAPS_BACKBUFFER; ")));
if( ddsCaps.dwCaps & DDSCAPS_COMPLEX )
DEBUGMSG(HAL_ZONE_CREATE,(TEXT("DDSCAPS_COMPLEX; ")));
if( ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE )
DEBUGMSG(HAL_ZONE_CREATE,(TEXT("DDSCAPS_PRIMARYSURFACE; ")));
if( ddsCaps.dwCaps & DDSCAPS_OFFSCREENPLAIN )
DEBUGMSG(HAL_ZONE_CREATE,(TEXT("DDSCAPS_OFFSCREENPLAIN; ")));
if( ddsCaps.dwCaps & DDSCAPS_ZBUFFER )
DEBUGMSG(HAL_ZONE_CREATE,(TEXT("DDSCAPS_ZBUFFER; ")));
if( ddsCaps.dwCaps & DDSCAPS_MIPMAP )
DEBUGMSG(HAL_ZONE_CREATE,(TEXT("DDSCAPS_MIPMAP; ")));
if( ddsCaps.dwCaps & DDSCAPS_ALLOCONLOAD )
DEBUGMSG(HAL_ZONE_CREATE,(TEXT("DDSCAPS_ALLOCONLOAD; ")));
if( ddsCaps.dwCaps & DDSCAPS_TEXTURE )
DEBUGMSG(HAL_ZONE_CREATE,(TEXT("DDSCAPS_TEXTURE; ")));
if( ddsCaps.dwCaps & DDSCAPS_VIDEOMEMORY )
DEBUGMSG(HAL_ZONE_CREATE,(TEXT("DDSCAPS_VIDEOMEMORY; ")));
if( ddsCaps.dwCaps & DDSCAPS_SYSTEMMEMORY )
DEBUGMSG(HAL_ZONE_CREATE,(TEXT("DDSCAPS_SYSTEMMEMORY; ")));
if( ddsCaps.dwCaps & DDSCAPS_ALLOCONLOAD )
DEBUGMSG(HAL_ZONE_CREATE,(TEXT("DDSCAPS_ALLOCONLOAD; ")));
if( ddsCaps.dwCaps & DDSCAPS_TEXTURE )
DEBUGMSG(HAL_ZONE_CREATE,(TEXT("DDSCAPS_TEXTURE; ")));
DEBUGMSG(HAL_ZONE_CREATE,((TEXT("\r\n"))));
}
EXTERN_C DWORD WINAPI DDGPEFlipToGDISurface( LPDDHAL_FLIPTOGDISURFACEDATA pd )
{
/*
typedef struct _DDHAL_FLIPTOGDISURFACEDATA
{
LPDDRAWI_DIRECTDRAW_GBL lpDD; // driver struct
DWORD dwToGDI; // TRUE if flipping to the GDI surface, FALSE if flipping away
DWORD dwReserved; // reserved for future use
HRESULT ddRVal; // return value
LPDDHAL_FLIPTOGDISURFACE FlipToGDISurface; // PRIVATE: ptr to callback
} DDHAL_FLIPTOGDISURFACEDATA;
*/
HRESULT sc = S_OK;
pd->ddRVal = DD_OK;
DEBUGENTER(DDGPEFlipToGDISurface);
/*if (DDGPEGDIHasSplitFromDDraw())
{
DEBUGMSG(HAL_ZONE_INIT | HAL_ZONE_FLIP, (TEXT("DDGPEGDIHasSplitFromDDraw\r\n") ));
return DDHAL_DRIVER_HANDLED;
}
else*/
if (pd->dwToGDI == TRUE)
{
DDGPESurf* pPrimary = (DDGPESurf*)g_pGPE->PrimarySurface();
g_pGPE->SetVisibleSurface( pPrimary, NULL, TRUE );
g_pDDrawPrimarySurface = pPrimary; //reconfirm when non-gdi primary's gone - hi, TCI!
// restore the mode if it has changed
DWORD dwDDrawModeID = g_pGPE->GetModeId();
if (dwDDrawModeID != (DWORD)g_pGPE->GetPhysicalModeId())
{
HRESULT sc = S_OK;
DEBUGMSG(HAL_ZONE_INFO, (TEXT("Restoring GDI Primary mode to id %d\r\n"), dwDDrawModeID));
sc = g_pGPE->SetMode(dwDDrawModeID, NULL, FALSE); // don't change GDI mode (just HW)
// update HAL info
UpdateHALInit(pd->lpDD, dwDDrawModeID);
if (FAILED(sc))
{
DEBUGMSG(HAL_ZONE_ERROR, (TEXT("Failed to set the physical mode 0x%08x\r\n"), sc));
}
}
}
DEBUGMSG(HAL_ZONE_INFO, (TEXT("Done flipping to GDI Surface\r\n")));
DEBUGLEAVE(DDGPEFlipToGDISurface);
return DDHAL_DRIVER_HANDLED;
}
EXTERN_C DWORD WINAPI DDGPEDestroyDriver( LPDDHAL_DESTROYDRIVERDATA pd )
{
DEBUGENTER( DDGPEDestroyDriver );
/*
typedef struct _DDHAL_DESTROYDRIVERDATA
{
LPDDRAWI_DIRECTDRAW_GBL lpDD; // driver struct
HRESULT ddRVal; // return value
LPDDHAL_DESTROYDRIVER DestroyDriver; // PRIVATE: ptr to callback
} DDHAL_DESTROYDRIVERDATA;
*/
DDHAL_FLIPTOGDISURFACEDATA d;
memset(&d, 0, sizeof(d));
DEBUGMSG(HAL_ZONE_INFO, (TEXT("Destroying Driver\r\n") ));
//if (!DDGPEGDIHasSplitFromDDraw())
//{
d.lpDD = pd->lpDD;
d.dwToGDI = TRUE;
DDGPEFlipToGDISurface( &d );
/*}
else
{
DDGPESurf* pPrimary = (DDGPESurf*)g_pGPE->PrimarySurface();
g_pGPE->SetVisibleSurface( pPrimary, NULL, TRUE );
g_pDDrawPrimarySurface = pPrimary; //reconfirm when non-gdi primary's gone - hi, TCI!
// restore the mode if it has changed
DWORD dwDDrawModeID = g_pGPE->GetModeId();
if (dwDDrawModeID != (DWORD)g_pGPE->GetPhysicalModeId())
{
DEBUGMSG(HAL_ZONE_INIT, (TEXT("Restoring GDI Primary mode to id %d\r\n"), dwDDrawModeID));
HRESULT sc = g_pGPE->SetMode(dwDDrawModeID, NULL, FALSE); // don't change GDI mode (just HW)
if (FAILED(sc))
{
DEBUGMSG(HAL_ZONE_ERROR, (TEXT("Failed to set the physical mode 0x%08x\r\n"), sc));
}
}
}*/
DEBUGMSG(HAL_ZONE_INFO, (TEXT("Done Destroying Driver\r\n") ));
pd->ddRVal = DD_OK;
DEBUGLEAVE( DDGPEDestroyDriver );
return DDHAL_DRIVER_HANDLED;
}
#ifdef D_MISCELLANEOUSCECALLBACKS
EXTERN_C DWORD WINAPI DDGPEGetGDISurface( LPDDHAL_GETGDISURFACEDATA pd )
{
DEBUGENTER( HalGetGDISurface );
/*
typedef struct _DDHAL_GETGDISURFACEDATA
{
LPDDRAWI_DIRECTDRAW_GBL lpDD; // driver struct
LPDDRAWI_DDRAWSURFACE_LCL lpGDISurface; // gdi surface object
HRESULT ddRVal; // return value
LPDDHAL_CREATESURFACE GetGDISurface; // PRIVATE: ptr to callback
} DDHAL_GETGDISURFACEDATA;
*/
// Implementation
DDGPESurf* pPrimary = NULL; // Pointer to our primary surface
LPDDRAWI_DDRAWSURFACE_GBL pSurf = NULL; // Pointer to surface data
if (pd == NULL)
{
return DD_OK; // TODO: return some error code here
}
// GPE::PrimarySurface() will always return the DDGPESurf for the GDI primary surface,
// regardless of whether or not the DDraw primary surface is a separate surface.
pPrimary = (DDGPESurf*)g_pGPE->PrimarySurface();
if (pPrimary == NULL)
{
return DD_OK; // TODO: return some error code here
}
pSurf = pd->lpGDISurface->lpGbl;
if (pSurf == NULL)
{
return DD_OK; // TODO: return some error code here
}
pSurf->fpVidMem = (unsigned long)(g_pVideoMemory) + pPrimary->OffsetInVideoMemory();
pSurf->lPitch = pPrimary->Stride();
//pPrimary->SetDDGPESurf(pSurf); // don't do this... pSurf might get destroyed sometime.
DEBUGMSG(GPE_ZONE_CREATE,(TEXT("Create Primary GDI Surface! (&GPESurf = 0x%08x, fpvidmem=0x%08x)\r\n"),
(unsigned long)pPrimary,
pSurf->fpVidMem));
pd->ddRVal = DD_OK;
DEBUGLEAVE( HalGetGDISurface );
return DDHAL_DRIVER_HANDLED;
}
#endif //D_MISCELLANEOUSCECALLBACKS
EXTERN_C DWORD WINAPI DDGPESetColorKeyDrv( LPDDHAL_DRVSETCOLORKEYDATA pd )
{
DEBUGENTER( DDGPESetColorKey );
/*
typedef struct _DDHAL_DRVSETCOLORKEYDATA
{
LPDDRAWI_DDRAWSURFACE_LCL lpDDSurface; // surface struct
DWORD dwFlags; // flags
DDCOLORKEY ckNew; // new color key
HRESULT ddRVal; // return value
LPDDHAL_SETCOLORKEY SetColorKey; // PRIVATE: ptr to callback
} DDHAL_DRVSETCOLORKEYDATA;
*/
pd->ddRVal = DD_OK;
DDGPESurf* pSurf = DDGPESurf::GetDDGPESurf(pd->lpDDSurface);
if (pSurf != NULL)
{
pSurf->SetColorKeyLow(pd->ckNew.dwColorSpaceLowValue);
pSurf->SetColorKeyHigh(pd->ckNew.dwColorSpaceHighValue);
}
else
{
// TODO error code
}
DEBUGLEAVE( DDGPESetColorKey );
return DDHAL_DRIVER_HANDLED;
}
EXTERN_C DWORD WINAPI DDGPESetColorKey( LPDDHAL_SETCOLORKEYDATA pd )
{
DEBUGENTER( HalSetColorKey );
/*
typedef struct _DDHAL_SETCOLORKEYDATA
{
LPDDRAWI_DDRAWSURFACE_LCL lpDDSurface; // surface struct
DWORD dwFlags; // flags
DDCOLORKEY ckNew; // new color key
HRESULT ddRVal; // return value
LPDDHAL_SETCOLORKEY SetColorKey; // PRIVATE: ptr to callback
} DDHAL_SETCOLORKEYDATA;
*/
pd->ddRVal = DD_OK;
DDGPESurf* pSurf = DDGPESurf::GetDDGPESurf(pd->lpDDSurface);
if (pSurf != NULL)
{
pSurf->SetColorKeyLow(pd->ckNew.dwColorSpaceLowValue);
pSurf->SetColorKeyHigh(pd->ckNew.dwColorSpaceHighValue);
}
else
{
// TODO error code
}
DEBUGLEAVE( DDGPESetColorKey );
return DDHAL_DRIVER_HANDLED;
}
EXTERN_C DWORD WINAPI DDGPECanCreateSurface( LPDDHAL_CANCREATESURFACEDATA pd )
{
SCODE sc;
LPDDSURFACEDESC lpDDSurfaceDesc;
LPDDPIXELFORMAT lpDPF;
DWORD dwCaps;
unsigned int nWidth; // Width in pixels
unsigned int nHeight; // Height
EDDGPEPixelFormat pixelFormat; // Pixel format of surface(s) being created
EGPEFormat format;
DEBUGENTER( HalCanCreateSurface );
/*
typedef struct _DDHAL_CANCREATESURFACEDATA
{
LPDDRAWI_DIRECTDRAW_GBL lpDD; // driver struct
LPDDSURFACEDESC lpDDSurfaceDesc; // description of surface being created
DWORD bIsDifferentPixelFormat;
// pixel format differs from primary surface
HRESULT ddRVal; // return value
LPDDHAL_CANCREATESURFACE CanCreateSurface;
// PRIVATE: ptr to callback
} DDHAL_CANCREATESURFACEDATA;
*/
// Implementation
lpDDSurfaceDesc = pd->lpDDSurfaceDesc;
dwCaps = lpDDSurfaceDesc->ddsCaps.dwCaps;
lpDPF = &(pd->lpDDSurfaceDesc->ddpfPixelFormat);
nWidth = (pd->lpDDSurfaceDesc->dwFlags & DDSD_WIDTH) ?
( pd->lpDDSurfaceDesc->dwWidth ) : DDRAW_SCREEN_WIDTH; // resolves to a call to
// g_pDDrawPrimarySurface or a GPE query
nHeight = (pd->lpDDSurfaceDesc->dwFlags & DDSD_HEIGHT) ?
( pd->lpDDSurfaceDesc->dwHeight ) : DDRAW_SCREEN_HEIGHT; // resolves to a call to
// g_pDDrawPrimarySurface or a GPE query
sc = DDGPEGetPixelFormatFromSurfaceDesc(
lpDDSurfaceDesc,
&pixelFormat,
&format
);
if (FAILED(sc))
{
DEBUGMSG(HAL_ZONE_WARNING,(TEXT("DDGPECanCreateSurface ERROR - DDERR_UNSUPPORTEDFORMAT (0x%08x)\r\n"),
sc ));
pd->ddRVal = sc;
return DDHAL_DRIVER_HANDLED;
}
#if 0
if ( pSurf->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE )
{
// checking this is not necessary, as we need to prevent any primary
// from being created if it isn't supported
//if ( (pSurf->lpSurfMore->ddsCapsEx.dwCaps4 & DDSCAPS4_NONGDIPRIMARY) )
//{
//}
sc = S_OK;
if ( (pd->lpDDSurfaceDesc->dwFlags & DDSD_PIXELFORMAT) )
{
DEBUGMSG(HAL_ZONE_INFO, (TEXT("Using pixel format to check valid mode\r\n") ));
sc = g_pGPE->DetectMode(&dwModeID, nWidth, nHeight, format, pixelFormat, &pd->lpDDSurfaceDesc->ddpfPixelFormat);
}
else
{
DEBUGMSG(HAL_ZONE_INFO, (TEXT("NOT using pixel format to check valid mode\r\n") ));
sc = g_pGPE->DetectMode(&dwModeID, nWidth, nHeight, format, pixelFormat);
}
if (FAILED(sc))
{
DEBUGMSG(HAL_ZONE_WARNING, (TEXT("valid primary surface check failed 0x%08x\r\n"), sc ));
pccsd->ddRVal = DDERR_INVALIDPIXELFORMAT;
return DDHAL_DRIVER_HANDLED;
}
}
else
#endif
{
if( !pd->bIsDifferentPixelFormat )
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -