📄 ddraw_main.c
字号:
// IDirectDrawImpl* This = (IDirectDrawImpl*)iface;
// DDSURFACEDESC2 desc_callback;
// DEVMODE DevMode;
// int iMode=0;
//
//RtlZeroMemory(&desc_callback, sizeof(DDSURFACEDESC2));
//
// desc_callback.dwSize = sizeof(DDSURFACEDESC2);
// desc_callback.dwFlags = DDSD_HEIGHT|DDSD_WIDTH|DDSD_PIXELFORMAT|DDSD_PITCH;
// if (dwFlags & DDEDM_REFRESHRATES)
// {
// desc_callback.dwFlags |= DDSD_REFRESHRATE;
// desc_callback.dwRefreshRate = This->lpLcl->lpGbl->dwMonitorFrequency;
// }
//
// /* FIXME check if the mode are suppretd before sending it back */
//memset(&DevMode,0,sizeof(DEVMODE));
//DevMode.dmSize = (WORD)sizeof(DEVMODE);
//DevMode.dmDriverExtra = 0;
// while (EnumDisplaySettingsEx(NULL, iMode, &DevMode, 0))
// {
//
// if (pDDSD)
// {
// if ((pDDSD->dwFlags & DDSD_WIDTH) && (pDDSD->dwWidth != DevMode.dmPelsWidth))
// continue;
// if ((pDDSD->dwFlags & DDSD_HEIGHT) && (pDDSD->dwHeight != DevMode.dmPelsHeight))
// continue;
// if ((pDDSD->dwFlags & DDSD_PIXELFORMAT) && (pDDSD->ddpfPixelFormat.dwFlags & DDPF_RGB) &&
// (pDDSD->ddpfPixelFormat.dwRGBBitCount != DevMode.dmBitsPerPel))
// continue;
// }
//
// desc_callback.dwHeight = DevMode.dmPelsHeight;
// desc_callback.dwWidth = DevMode.dmPelsWidth;
//
// if (DevMode.dmFields & DM_DISPLAYFREQUENCY)
// {
// desc_callback.dwRefreshRate = DevMode.dmDisplayFrequency;
// }
// if (desc_callback.dwRefreshRate == 0)
// {
// DX_STUB_str("dwRefreshRate = 0, we hard code it to value 60");
// desc_callback.dwRefreshRate = 60; /* Maybe the valye should be biger */
// }
// /* above same as wine */
// if ((pDDSD->dwFlags & DDSD_PIXELFORMAT) && (pDDSD->ddpfPixelFormat.dwFlags & DDPF_RGB) )
// {
// switch(DevMode.dmBitsPerPel)
// {
// case 8:
// desc_callback.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT);
// desc_callback.ddpfPixelFormat.dwFlags = DDPF_RGB;
// desc_callback.ddpfPixelFormat.dwFourCC = 0;
// desc_callback.ddpfPixelFormat.dwRGBBitCount=8;
// /* FIXME right value */
// desc_callback.ddpfPixelFormat.dwRBitMask = 0xFF0000; /* red bitmask */
// desc_callback.ddpfPixelFormat.dwGBitMask = 0; /* Green bitmask */
// desc_callback.ddpfPixelFormat.dwBBitMask = 0; /* Blue bitmask */
// break;
// case 15:
// desc_callback.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT);
// desc_callback.ddpfPixelFormat.dwFlags = DDPF_RGB;
// desc_callback.ddpfPixelFormat.dwFourCC = 0;
// desc_callback.ddpfPixelFormat.dwRGBBitCount=15;
// /* FIXME right value */
// desc_callback.ddpfPixelFormat.dwRBitMask = 0x7C00; /* red bitmask */
// desc_callback.ddpfPixelFormat.dwGBitMask = 0x3E0; /* Green bitmask */
// desc_callback.ddpfPixelFormat.dwBBitMask = 0x1F; /* Blue bitmask */
// break;
// case 16:
// desc_callback.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT);
// desc_callback.ddpfPixelFormat.dwFlags = DDPF_RGB;
// desc_callback.ddpfPixelFormat.dwFourCC = 0;
// desc_callback.ddpfPixelFormat.dwRGBBitCount=16;
// /* FIXME right value */
// desc_callback.ddpfPixelFormat.dwRBitMask = 0xF800; /* red bitmask */
// desc_callback.ddpfPixelFormat.dwGBitMask = 0x7E0; /* Green bitmask */
// desc_callback.ddpfPixelFormat.dwBBitMask = 0x1F; /* Blue bitmask */
// break;
// case 24:
// desc_callback.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT);
// desc_callback.ddpfPixelFormat.dwFlags = DDPF_RGB;
// desc_callback.ddpfPixelFormat.dwFourCC = 0;
// desc_callback.ddpfPixelFormat.dwRGBBitCount=24;
// /* FIXME right value */
// desc_callback.ddpfPixelFormat.dwRBitMask = 0xFF0000; /* red bitmask */
// desc_callback.ddpfPixelFormat.dwGBitMask = 0x00FF00; /* Green bitmask */
// desc_callback.ddpfPixelFormat.dwBBitMask = 0x0000FF; /* Blue bitmask */
// break;
// case 32:
// desc_callback.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT);
// desc_callback.ddpfPixelFormat.dwFlags = DDPF_RGB;
// desc_callback.ddpfPixelFormat.dwFourCC = 0;
// desc_callback.ddpfPixelFormat.dwRGBBitCount=8;
// /* FIXME right value */
// desc_callback.ddpfPixelFormat.dwRBitMask = 0xFF0000; /* red bitmask */
// desc_callback.ddpfPixelFormat.dwGBitMask = 0x00FF00; /* Green bitmask */
// desc_callback.ddpfPixelFormat.dwBBitMask = 0x0000FF; /* Blue bitmask */
// break;
// default:
// break;
// }
// desc_callback.ddsCaps.dwCaps = 0;
// if (desc_callback.ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED8)
// {
// /* FIXME srt DDCS Caps flag */
// desc_callback.ddsCaps.dwCaps |= DDSCAPS_PALETTE;
// }
// }
//
// if (DevMode.dmBitsPerPel==15)
// {
// desc_callback.lPitch = DevMode.dmPelsWidth + (8 - ( DevMode.dmPelsWidth % 8)) % 8;
// }
// else
// {
// desc_callback.lPitch = DevMode.dmPelsWidth * (DevMode.dmBitsPerPel / 8);
// desc_callback.lPitch = desc_callback.lPitch + (8 - (desc_callback.lPitch % 8)) % 8;
// }
//
// if (callback(&desc_callback, context) == DDENUMRET_CANCEL)
// {
// return DD_OK;
// }
//
// iMode++;
// }
// return DD_OK;
}
/*
* stub
* Status not done
*/
HRESULT WINAPI
Main_DirectDraw_EnumSurfaces(LPDIRECTDRAW7 iface, DWORD dwFlags,
LPDDSURFACEDESC2 lpDDSD2, LPVOID context,
LPDDENUMSURFACESCALLBACK7 callback)
{
DX_WINDBG_trace();
DX_STUB;
}
/*
* IMPLEMENT
* Status ok
*/
HRESULT WINAPI
Main_DirectDraw_FlipToGDISurface(LPDIRECTDRAW7 iface)
{
LPDDRAWI_DIRECTDRAW_INT This = (LPDDRAWI_DIRECTDRAW_INT)iface;
DDHAL_FLIPTOGDISURFACEDATA mDdFlipToGDISurface;
DX_WINDBG_trace();
mDdFlipToGDISurface.ddRVal = DDERR_NOTINITIALIZED;
mDdFlipToGDISurface.dwReserved = 0;
mDdFlipToGDISurface.dwToGDI = TRUE;
mDdFlipToGDISurface.FlipToGDISurface = This->lpLcl->lpDDCB->cbDDCallbacks.FlipToGDISurface;
if (mDdFlipToGDISurface.FlipToGDISurface == NULL)
{
return DDERR_NODRIVERSUPPORT;
}
if (mDdFlipToGDISurface.FlipToGDISurface(&mDdFlipToGDISurface)==DDHAL_DRIVER_HANDLED);
{
return mDdFlipToGDISurface.ddRVal;
}
return DDERR_NODRIVERSUPPORT;
}
/*
* IMPLEMENT
* Status ok
*/
HRESULT WINAPI
Main_DirectDraw_GetCaps(LPDIRECTDRAW7 iface, LPDDCAPS pDriverCaps,
LPDDCAPS pHELCaps)
{
DDSCAPS2 ddscaps = {0};
DWORD status = DD_FALSE;
LPDDRAWI_DIRECTDRAW_INT This = (LPDDRAWI_DIRECTDRAW_INT)iface;
DX_WINDBG_trace();
if (pDriverCaps != NULL)
{
Main_DirectDraw_GetAvailableVidMem(iface,
&ddscaps,
&This->lpLcl->lpGbl->ddCaps.dwVidMemTotal,
&This->lpLcl->lpGbl->ddCaps.dwVidMemFree);
RtlCopyMemory(pDriverCaps,&This->lpLcl->lpGbl->ddCaps,sizeof(DDCORECAPS));
pDriverCaps->dwSize=sizeof(DDCAPS);
status = DD_OK;
}
if (pHELCaps != NULL)
{
Main_DirectDraw_GetAvailableVidMem(iface,
&ddscaps,
&This->lpLcl->lpGbl->ddHELCaps.dwVidMemTotal,
&This->lpLcl->lpGbl->ddHELCaps.dwVidMemFree);
RtlCopyMemory(pDriverCaps,&This->lpLcl->lpGbl->ddHELCaps,sizeof(DDCORECAPS));
status = DD_OK;
}
return status;
}
/*
* IMPLEMENT
* Status ok
*/
HRESULT WINAPI Main_DirectDraw_GetDisplayMode(LPDIRECTDRAW7 iface, LPDDSURFACEDESC2 pDDSD)
{
LPDDRAWI_DIRECTDRAW_INT This = (LPDDRAWI_DIRECTDRAW_INT)iface;
DX_WINDBG_trace();
if (pDDSD == NULL)
{
return DD_FALSE;
}
pDDSD->dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_PITCH | DDSD_PIXELFORMAT | DDSD_REFRESHRATE | DDSD_WIDTH;
pDDSD->dwHeight = This->lpLcl->lpGbl->vmiData.dwDisplayHeight;
pDDSD->dwWidth = This->lpLcl->lpGbl->vmiData.dwDisplayWidth;
pDDSD->lPitch = This->lpLcl->lpGbl->vmiData.lDisplayPitch;
pDDSD->dwRefreshRate = This->lpLcl->lpGbl->dwMonitorFrequency;
pDDSD->dwAlphaBitDepth = This->lpLcl->lpGbl->vmiData.ddpfDisplay.dwAlphaBitDepth;
RtlCopyMemory(&pDDSD->ddpfPixelFormat,&This->lpLcl->lpGbl->vmiData.ddpfDisplay,sizeof(DDPIXELFORMAT));
RtlCopyMemory(&pDDSD->ddsCaps,&This->lpLcl->lpGbl->ddCaps,sizeof(DDCORECAPS));
RtlCopyMemory(&pDDSD->ddckCKDestOverlay,&This->lpLcl->lpGbl->ddckCKDestOverlay,sizeof(DDCOLORKEY));
RtlCopyMemory(&pDDSD->ddckCKSrcOverlay,&This->lpLcl->lpGbl->ddckCKSrcOverlay,sizeof(DDCOLORKEY));
/* have not check where I should get hold of this info yet
DWORD dwBackBufferCount;
DWORD dwReserved;
LPVOID lpSurface;
DDCOLORKEY ddckCKDestBlt;
DDCOLORKEY ddckCKSrcBlt;
DWORD dwTextureStage;
*/
return DD_OK;
}
/*
* Stub
* Status todo
*/
HRESULT WINAPI
Main_DirectDraw_GetFourCCCodes(LPDIRECTDRAW7 iface, LPDWORD pNumCodes, LPDWORD pCodes)
{
DX_WINDBG_trace();
DX_STUB;
}
/*
* Stub
* Status todo
*/
HRESULT WINAPI
Main_DirectDraw_GetGDISurface(LPDIRECTDRAW7 iface,
LPDIRECTDRAWSURFACE7 *lplpGDIDDSSurface)
{
DX_WINDBG_trace();
DX_STUB;
}
/*
* IMPLEMENT
* Status ok
*/
HRESULT WINAPI
Main_DirectDraw_GetMonitorFrequency(LPDIRECTDRAW7 iface,LPDWORD freq)
{
LPDDRAWI_DIRECTDRAW_INT This = (LPDDRAWI_DIRECTDRAW_INT)iface;
DX_WINDBG_trace();
if (freq == NULL)
{
return DD_FALSE;
}
*freq = This->lpLcl->lpGbl->dwMonitorFrequency;
return DD_OK;
}
/*
* IMPLEMENT
* Status ok
*/
HRESULT WINAPI
Main_DirectDraw_GetScanLine(LPDIRECTDRAW7 iface, LPDWORD lpdwScanLine)
{
LPDDRAWI_DIRECTDRAW_INT This = (LPDDRAWI_DIRECTDRAW_INT)iface;
DDHAL_GETSCANLINEDATA mDdGetScanLine;
DX_WINDBG_trace();
*lpdwScanLine = 0;
mDdGetScanLine.ddRVal = DDERR_NOTINITIALIZED;
mDdGetScanLine.dwScanLine = 0;
mDdGetScanLine.GetScanLine = This->lpLcl->lpDDCB->cbDDCallbacks.GetScanLine;
mDdGetScanLine.lpDD = This->lpLcl->lpGbl;
if (mDdGetScanLine.GetScanLine == NULL)
{
return DDERR_NODRIVERSUPPORT;
}
mDdGetScanLine.ddRVal = DDERR_NOTPALETTIZED;
mDdGetScanLine.dwScanLine = 0;
if (mDdGetScanLine.GetScanLine(&mDdGetScanLine)==DDHAL_DRIVER_HANDLED);
{
*lpdwScanLine = mDdGetScanLine.dwScanLine;
return mDdGetScanLine.ddRVal;
}
return DDERR_NODRIVERSUPPORT;
}
/*
* Stub
* Status todo
*/
HRESULT WINAPI
Main_DirectDraw_GetVerticalBlankStatus(LPDIRECTDRAW7 iface, LPBOOL lpbIsInVB)
{
DX_WINDBG_trace();
DX_STUB;
}
/*
* IMPLEMENT
* Status ok
*/
HRESULT
WINAPI
Main_DirectDraw_Initialize (LPDIRECTDRAW7 iface, LPGUID lpGUID)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -