ddraw.c
来自「一个类似windows」· C语言 代码 · 共 1,138 行 · 第 1/3 页
C
1,138 行
/* it exsist two version of NtGdiDdGetDriverInfo we need check for both flags */
if (!(pDirectDraw->Hal.dwFlags & DDHALINFO_GETDRIVERINFOSET))
ddRVal++;
if (!(pDirectDraw->Hal.dwFlags & DDHALINFO_GETDRIVERINFO2))
ddRVal++;
/* Now we are doing the call to drv DrvGetDriverInfo */
if (ddRVal == 2)
{
#ifdef DX_DEBUG
DPRINT1("NtGdiDdGetDriverInfo DDHAL_DRIVER_NOTHANDLED");
#endif
ddRVal = DDHAL_DRIVER_NOTHANDLED;
}
else
ddRVal = pDirectDraw->Hal.GetDriverInfo(puGetDriverInfoData);
GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw);
return ddRVal;
}
/************************************************************************/
/* DD CALLBACKS */
/* FIXME NtGdiDdCreateSurface we do not call to ddCreateSurface */
/************************************************************************/
DWORD STDCALL NtGdiDdCreateSurface(
HANDLE hDirectDrawLocal,
HANDLE *hSurface,
DDSURFACEDESC *puSurfaceDescription,
DD_SURFACE_GLOBAL *puSurfaceGlobalData,
DD_SURFACE_LOCAL *puSurfaceLocalData,
DD_SURFACE_MORE *puSurfaceMoreData,
PDD_CREATESURFACEDATA puCreateSurfaceData,
HANDLE *puhSurface
)
{
DWORD ddRVal = DDHAL_DRIVER_NOTHANDLED;
PDD_DIRECTDRAW pDirectDraw;
PDD_DIRECTDRAW_GLOBAL lgpl;
#ifdef DX_DEBUG
DPRINT1("NtGdiDdCreateSurface\n");
#endif
pDirectDraw = GDIOBJ_LockObj(DdHandleTable, hDirectDrawLocal, GDI_OBJECT_TYPE_DIRECTDRAW);
if (pDirectDraw == NULL)
{
#ifdef DX_DEBUG
DPRINT1("Can not lock the DirectDraw handle\n");
#endif
return DDHAL_DRIVER_NOTHANDLED;
}
/* backup the orignal PDev and info */
lgpl = puCreateSurfaceData->lpDD;
/* use our cache version instead */
puCreateSurfaceData->lpDD = &pDirectDraw->Global;
/* make the call */
if (!(pDirectDraw->DD.dwFlags & DDHAL_CB32_CANCREATESURFACE))
{
#ifdef DX_DEBUG
DPRINT1("DirectDraw HAL does not support Create Surface");
#endif
ddRVal = DDHAL_DRIVER_NOTHANDLED;
}
else
{
ddRVal = pDirectDraw->DD.CreateSurface(puCreateSurfaceData);
}
/* But back the orignal PDev */
puCreateSurfaceData->lpDD = lgpl;
GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw);
return ddRVal;
}
DWORD STDCALL NtGdiDdWaitForVerticalBlank(
HANDLE hDirectDrawLocal,
PDD_WAITFORVERTICALBLANKDATA puWaitForVerticalBlankData
)
{
DWORD ddRVal;
PDD_DIRECTDRAW_GLOBAL lgpl;
PDD_DIRECTDRAW pDirectDraw;
#ifdef DX_DEBUG
DPRINT1("NtGdiDdWaitForVerticalBlank\n");
#endif
pDirectDraw = GDIOBJ_LockObj(DdHandleTable, hDirectDrawLocal, GDI_OBJECT_TYPE_DIRECTDRAW);
if (pDirectDraw == NULL)
return DDHAL_DRIVER_NOTHANDLED;
/* backup the orignal PDev and info */
lgpl = puWaitForVerticalBlankData->lpDD;
/* use our cache version instead */
puWaitForVerticalBlankData->lpDD = &pDirectDraw->Global;
/* make the call */
if (!(pDirectDraw->DD.dwFlags & DDHAL_CB32_WAITFORVERTICALBLANK))
ddRVal = DDHAL_DRIVER_NOTHANDLED;
else
ddRVal = pDirectDraw->DD.WaitForVerticalBlank(puWaitForVerticalBlankData);
/* But back the orignal PDev */
puWaitForVerticalBlankData->lpDD = lgpl;
GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw);
return ddRVal;
}
DWORD STDCALL NtGdiDdCanCreateSurface(
HANDLE hDirectDrawLocal,
PDD_CANCREATESURFACEDATA puCanCreateSurfaceData
)
{
DWORD ddRVal;
PDD_DIRECTDRAW_GLOBAL lgpl;
PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(DdHandleTable, hDirectDrawLocal, GDI_OBJECT_TYPE_DIRECTDRAW);
#ifdef DX_DEBUG
DPRINT1("NtGdiDdCanCreateSurface\n");
#endif
if (pDirectDraw == NULL)
return DDHAL_DRIVER_NOTHANDLED;
/* backup the orignal PDev and info */
lgpl = puCanCreateSurfaceData->lpDD;
/* use our cache version instead */
puCanCreateSurfaceData->lpDD = &pDirectDraw->Global;
/* make the call */
if (!(pDirectDraw->DD.dwFlags & DDHAL_CB32_CANCREATESURFACE))
ddRVal = DDHAL_DRIVER_NOTHANDLED;
else
ddRVal = pDirectDraw->DD.CanCreateSurface(puCanCreateSurfaceData);
/* But back the orignal PDev */
puCanCreateSurfaceData->lpDD = lgpl;
GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw);
return ddRVal;
}
DWORD STDCALL NtGdiDdGetScanLine(
HANDLE hDirectDrawLocal,
PDD_GETSCANLINEDATA puGetScanLineData
)
{
DWORD ddRVal;
PDD_DIRECTDRAW_GLOBAL lgpl;
PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(DdHandleTable, hDirectDrawLocal, GDI_OBJECT_TYPE_DIRECTDRAW);
#ifdef DX_DEBUG
DPRINT1("NtGdiDdGetScanLine\n");
#endif
if (pDirectDraw == NULL)
return DDHAL_DRIVER_NOTHANDLED;
/* backup the orignal PDev and info */
lgpl = puGetScanLineData->lpDD;
/* use our cache version instead */
puGetScanLineData->lpDD = &pDirectDraw->Global;
/* make the call */
if (!(pDirectDraw->DD.dwFlags & DDHAL_CB32_GETSCANLINE))
ddRVal = DDHAL_DRIVER_NOTHANDLED;
else
ddRVal = pDirectDraw->DD.GetScanLine(puGetScanLineData);
/* But back the orignal PDev */
puGetScanLineData->lpDD = lgpl;
GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw);
return ddRVal;
}
/************************************************************************/
/* Surface CALLBACKS */
/* FIXME */
/* NtGdiDdDestroySurface */
/************************************************************************/
DWORD STDCALL NtGdiDdDestroySurface(
HANDLE hSurface,
BOOL bRealDestroy
)
{
DWORD ddRVal = DDHAL_DRIVER_NOTHANDLED;
PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(DdHandleTable, hSurface, GDI_OBJECT_TYPE_DIRECTDRAW);
#ifdef DX_DEBUG
DPRINT1("NtGdiDdDestroySurface\n");
#endif
if (pDirectDraw == NULL)
return DDHAL_DRIVER_NOTHANDLED;
if (!(pDirectDraw->Surf.dwFlags & DDHAL_SURFCB32_DESTROYSURFACE))
ddRVal = DDHAL_DRIVER_NOTHANDLED;
else
{
DD_DESTROYSURFACEDATA DestroySurf;
/* FIXME
* bRealDestroy
* are we doing right ??
*/
DestroySurf.lpDD = &pDirectDraw->Global;
DestroySurf.lpDDSurface = hSurface; // ?
DestroySurf.DestroySurface = pDirectDraw->Surf.DestroySurface;
ddRVal = pDirectDraw->Surf.DestroySurface(&DestroySurf);
}
GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw);
return ddRVal;
}
DWORD STDCALL NtGdiDdFlip(
HANDLE hSurfaceCurrent,
HANDLE hSurfaceTarget,
HANDLE hSurfaceCurrentLeft,
HANDLE hSurfaceTargetLeft,
PDD_FLIPDATA puFlipData
)
{
DWORD ddRVal;
PDD_DIRECTDRAW_GLOBAL lgpl;
PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(DdHandleTable, hSurfaceTarget, GDI_OBJECT_TYPE_DIRECTDRAW);
#ifdef DX_DEBUG
DPRINT1("NtGdiDdFlip\n");
#endif
if (pDirectDraw == NULL)
return DDHAL_DRIVER_NOTHANDLED;
/* backup the orignal PDev and info */
lgpl = puFlipData->lpDD;
/* use our cache version instead */
puFlipData->lpDD = &pDirectDraw->Global;
/* make the call */
if (!(pDirectDraw->Surf.dwFlags & DDHAL_SURFCB32_FLIP))
ddRVal = DDHAL_DRIVER_NOTHANDLED;
else
ddRVal = pDirectDraw->Surf.Flip(puFlipData);
/* But back the orignal PDev */
puFlipData->lpDD = lgpl;
GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw);
return ddRVal;
}
DWORD STDCALL NtGdiDdLock(
HANDLE hSurface,
PDD_LOCKDATA puLockData,
HDC hdcClip
)
{
DWORD ddRVal;
PDD_DIRECTDRAW_GLOBAL lgpl;
PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(DdHandleTable, hSurface, GDI_OBJECT_TYPE_DIRECTDRAW);
#ifdef DX_DEBUG
DPRINT1("NtGdiDdLock\n");
#endif
if (pDirectDraw == NULL)
return DDHAL_DRIVER_NOTHANDLED;
/* backup the orignal PDev and info */
lgpl = puLockData->lpDD;
/* use our cache version instead */
puLockData->lpDD = &pDirectDraw->Global;
/* make the call */
if (!(pDirectDraw->Surf.dwFlags & DDHAL_SURFCB32_LOCK))
ddRVal = DDHAL_DRIVER_NOTHANDLED;
else
ddRVal = pDirectDraw->Surf.Lock(puLockData);
/* But back the orignal PDev */
puLockData->lpDD = lgpl;
GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw);
return ddRVal;
}
DWORD STDCALL NtGdiDdUnlock(
HANDLE hSurface,
PDD_UNLOCKDATA puUnlockData
)
{
DWORD ddRVal;
PDD_DIRECTDRAW_GLOBAL lgpl;
PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(DdHandleTable, hSurface, GDI_OBJECT_TYPE_DIRECTDRAW);
#ifdef DX_DEBUG
DPRINT1("NtGdiDdUnlock\n");
#endif
if (pDirectDraw == NULL)
return DDHAL_DRIVER_NOTHANDLED;
/* backup the orignal PDev and info */
lgpl = puUnlockData->lpDD;
/* use our cache version instead */
puUnlockData->lpDD = &pDirectDraw->Global;
/* make the call */
if (!(pDirectDraw->Surf.dwFlags & DDHAL_SURFCB32_UNLOCK))
ddRVal = DDHAL_DRIVER_NOTHANDLED;
else
ddRVal = pDirectDraw->Surf.Unlock(puUnlockData);
/* But back the orignal PDev */
puUnlockData->lpDD = lgpl;
GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw);
return ddRVal;
}
DWORD STDCALL NtGdiDdBlt(
HANDLE hSurfaceDest,
HANDLE hSurfaceSrc,
PDD_BLTDATA puBltData
)
{
DWORD ddRVal;
PDD_DIRECTDRAW_GLOBAL lgpl;
PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(DdHandleTable, hSurfaceDest, GDI_OBJECT_TYPE_DIRECTDRAW);
#ifdef DX_DEBUG
DPRINT1("NtGdiDdBlt\n");
#endif
if (pDirectDraw == NULL)
return DDHAL_DRIVER_NOTHANDLED;
/* backup the orignal PDev and info */
lgpl = puBltData->lpDD;
/* use our cache version instead */
puBltData->lpDD = &pDirectDraw->Global;
/* make the call */
if (!(pDirectDraw->Surf.dwFlags & DDHAL_SURFCB32_BLT))
ddRVal = DDHAL_DRIVER_NOTHANDLED;
else
ddRVal = pDirectDraw->Surf.Blt(puBltData);
/* But back the orignal PDev */
puBltData->lpDD = lgpl;
GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw);
return ddRVal;
}
DWORD STDCALL NtGdiDdSetColorKey(
HANDLE hSurface,
PDD_SETCOLORKEYDATA puSetColorKeyData
)
{
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?