📄 gdientry.c
字号:
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS GDI32
* PURPOSE: GDI DirectX inteface
* FILE: lib/gdi32/misc/gdientry.c
* PROGRAMERS: Alex Ionescu (alex@relsoft.net)
* Magnus Olsen (magnus@greatlord.com)
*/
/* INCLUDES ******************************************************************/
#include "precomp.h"
#include <ddraw.h>
#include <ddrawi.h>
#include <ddrawint.h>
#include <ddrawgdi.h>
#include <ntgdi.h>
/* DATA **********************************************************************/
HANDLE ghDirectDraw;
ULONG gcDirectDraw;
#define GetDdHandle(Handle) ((HANDLE)Handle ? (HANDLE)Handle : ghDirectDraw)
/* CALLBACKS *****************************************************************/
/*
* Dd Surface Callbacks
*/
DWORD
WINAPI
DdAddAttachedSurface(LPDDHAL_ADDATTACHEDSURFACEDATA Attach)
{
/* Call win32k */
return NtGdiDdAddAttachedSurface((HANDLE)Attach->lpDDSurface->hDDSurface,
(HANDLE)Attach->lpSurfAttached->hDDSurface,
(PDD_ADDATTACHEDSURFACEDATA)Attach);
}
DWORD
WINAPI
DdBlt(LPDDHAL_BLTDATA Blt)
{
HANDLE Surface = 0;
/* Use the right surface */
if (Blt->lpDDSrcSurface) Surface = (HANDLE)Blt->lpDDSrcSurface->hDDSurface;
/* Call win32k */
return NtGdiDdBlt((HANDLE)Blt->lpDDDestSurface->hDDSurface, Surface, (PDD_BLTDATA)Blt);
}
DWORD
APIENTRY
DdDestroySurface(LPDDHAL_DESTROYSURFACEDATA pDestroySurface)
{
DWORD Return = DDHAL_DRIVER_NOTHANDLED;
BOOL RealDestroy = TRUE;
LPDDRAWI_DDRAWSURFACE_LCL pSurfaceLocal;
/* Get the local surface */
pSurfaceLocal = pDestroySurface->lpDDSurface;
/* Make sure there's a surface */
if (pSurfaceLocal->hDDSurface)
{
/* Check if we shoudl really destroy it */
if ((pSurfaceLocal->dwFlags & DDRAWISURF_DRIVERMANAGED) &&
(pSurfaceLocal->dwFlags & DDRAWISURF_INVALID))
{
RealDestroy = FALSE;
}
/* Call win32k */
Return = NtGdiDdDestroySurface((HANDLE)pSurfaceLocal->hDDSurface,
RealDestroy);
}
return Return;
}
DWORD
WINAPI
DdFlip(LPDDHAL_FLIPDATA Flip)
{
/* Call win32k */
return NtGdiDdFlip( (HANDLE)Flip->lpSurfCurr->hDDSurface,
(HANDLE)Flip->lpSurfTarg->hDDSurface,
/* FIXME the two last should be current left handler */
(HANDLE)Flip->lpSurfCurr->hDDSurface,
(HANDLE)Flip->lpSurfTarg->hDDSurface,
(PDD_FLIPDATA)Flip);
}
DWORD
WINAPI
DdLock(LPDDHAL_LOCKDATA Lock)
{
/* Call win32k */
return NtGdiDdLock((HANDLE)Lock->lpDDSurface->hDDSurface,
(PDD_LOCKDATA)Lock,
(HANDLE)Lock->lpDDSurface->hDC);
}
DWORD
WINAPI
DdUnlock(LPDDHAL_UNLOCKDATA Unlock)
{
/* Call win32k */
return NtGdiDdUnlock((HANDLE)Unlock->lpDDSurface->hDDSurface,
(PDD_UNLOCKDATA)Unlock);
}
DWORD
WINAPI
DdGetBltStatus(LPDDHAL_GETBLTSTATUSDATA GetBltStatus)
{
/* Call win32k */
return NtGdiDdGetBltStatus((HANDLE)GetBltStatus->lpDDSurface->hDDSurface,
(PDD_GETBLTSTATUSDATA)GetBltStatus);
}
DWORD
WINAPI
DdGetFlipStatus(LPDDHAL_GETFLIPSTATUSDATA GetFlipStatus)
{
/* Call win32k */
return NtGdiDdGetFlipStatus((HANDLE)GetFlipStatus->lpDDSurface->hDDSurface,
(PDD_GETFLIPSTATUSDATA)GetFlipStatus);
}
DWORD
APIENTRY
DdUpdateOverlay(LPDDHAL_UPDATEOVERLAYDATA UpdateOverlay)
{
/* We have to handle this manually here */
if (UpdateOverlay->dwFlags & DDOVER_KEYDEST)
{
/* Use the override */
UpdateOverlay->dwFlags &= ~DDOVER_KEYDEST;
UpdateOverlay->dwFlags |= DDOVER_KEYDESTOVERRIDE;
/* Set the overlay */
UpdateOverlay->overlayFX.dckDestColorkey =
UpdateOverlay->lpDDDestSurface->ddckCKDestOverlay;
}
if (UpdateOverlay->dwFlags & DDOVER_KEYSRC)
{
/* Use the override */
UpdateOverlay->dwFlags &= ~DDOVER_KEYSRC;
UpdateOverlay->dwFlags |= DDOVER_KEYSRCOVERRIDE;
/* Set the overlay */
UpdateOverlay->overlayFX.dckSrcColorkey =
UpdateOverlay->lpDDSrcSurface->ddckCKSrcOverlay;
}
/* Call win32k */
return NtGdiDdUpdateOverlay((HANDLE)UpdateOverlay->lpDDDestSurface->hDDSurface,
(HANDLE)UpdateOverlay->lpDDSrcSurface->hDDSurface,
(PDD_UPDATEOVERLAYDATA)UpdateOverlay);
}
DWORD
APIENTRY
DdSetOverlayPosition(LPDDHAL_SETOVERLAYPOSITIONDATA SetOverlayPosition)
{
/* Call win32k */
return NtGdiDdSetOverlayPosition((HANDLE)SetOverlayPosition->
lpDDSrcSurface->hDDSurface,
(HANDLE)SetOverlayPosition->
lpDDDestSurface->hDDSurface,
(PDD_SETOVERLAYPOSITIONDATA)
SetOverlayPosition);
}
/*
* Dd Callbacks
*/
DWORD
WINAPI
DdWaitForVerticalBlank(LPDDHAL_WAITFORVERTICALBLANKDATA WaitForVerticalBlank)
{
/* Call win32k */
return NtGdiDdWaitForVerticalBlank(GetDdHandle(
WaitForVerticalBlank->lpDD->hDD),
(PDD_WAITFORVERTICALBLANKDATA)
WaitForVerticalBlank);
}
DWORD
WINAPI
DdCanCreateSurface(LPDDHAL_CANCREATESURFACEDATA CanCreateSurface)
{
/* Call win32k */
return NtGdiDdCanCreateSurface(GetDdHandle(CanCreateSurface->lpDD->hDD),
(PDD_CANCREATESURFACEDATA)CanCreateSurface);
}
DWORD
APIENTRY
DdCreateSurface(LPDDHAL_CREATESURFACEDATA pCreateSurface)
{
DWORD Return = DDHAL_DRIVER_NOTHANDLED;
ULONG SurfaceCount = pCreateSurface->dwSCnt;
DD_SURFACE_LOCAL DdSurfaceLocal;
DD_SURFACE_MORE DdSurfaceMore;
DD_SURFACE_GLOBAL DdSurfaceGlobal;
HANDLE hPrevSurface, hSurface;
PDD_SURFACE_LOCAL pDdSurfaceLocal = NULL;
PDD_SURFACE_MORE pDdSurfaceMore = NULL;
PDD_SURFACE_GLOBAL pDdSurfaceGlobal = NULL;
PDD_SURFACE_LOCAL ptmpDdSurfaceLocal = NULL;
PDD_SURFACE_MORE ptmpDdSurfaceMore = NULL;
PDD_SURFACE_GLOBAL ptmpDdSurfaceGlobal = NULL;
PHANDLE phSurface = NULL, puhSurface = NULL;
ULONG i;
LPDDSURFACEDESC pSurfaceDesc = NULL;
/* Check how many surfaces there are */
if (SurfaceCount != 1)
{
/* We'll have to allocate more data, our stack isn't big enough */
}
else
{
/* We'll use what we have on the stack */
pDdSurfaceLocal = &DdSurfaceLocal;
pDdSurfaceMore = &DdSurfaceMore;
pDdSurfaceGlobal = &DdSurfaceGlobal;
phSurface = &hPrevSurface;
puhSurface = &hSurface;
/* Clear the structures */
RtlZeroMemory(&DdSurfaceLocal, sizeof(DdSurfaceLocal));
RtlZeroMemory(&DdSurfaceGlobal, sizeof(DdSurfaceGlobal));
RtlZeroMemory(&DdSurfaceMore, sizeof(DdSurfaceMore));
}
/* check if we got a surface or not */
if (SurfaceCount!=0)
{
/* Loop for each surface */
ptmpDdSurfaceGlobal = pDdSurfaceGlobal;
ptmpDdSurfaceLocal = pDdSurfaceLocal;
ptmpDdSurfaceMore = pDdSurfaceMore;
pSurfaceDesc = pCreateSurface->lpDDSurfaceDesc;
for (i = 0; i < SurfaceCount; i++)
{
LPDDRAWI_DDRAWSURFACE_LCL lcl = pCreateSurface->lplpSList[i];
LPDDRAWI_DDRAWSURFACE_GBL gpl = pCreateSurface->lplpSList[i]->lpGbl;
phSurface[i] = (HANDLE)lcl->hDDSurface;
ptmpDdSurfaceLocal->ddsCaps.dwCaps = lcl->ddsCaps.dwCaps;
ptmpDdSurfaceLocal->dwFlags = (ptmpDdSurfaceLocal->dwFlags &
(0xB0000000 | DDRAWISURF_INMASTERSPRITELIST |
DDRAWISURF_HELCB | DDRAWISURF_FRONTBUFFER |
DDRAWISURF_BACKBUFFER | DDRAWISURF_INVALID |
DDRAWISURF_DCIBUSY | DDRAWISURF_DCILOCK)) |
(lcl->dwFlags & DDRAWISURF_DRIVERMANAGED);
ptmpDdSurfaceGlobal->wWidth = gpl->wWidth;
ptmpDdSurfaceGlobal->wHeight = gpl->wHeight;
ptmpDdSurfaceGlobal->lPitch = gpl->lPitch;
ptmpDdSurfaceGlobal->fpVidMem = gpl->fpVidMem;
ptmpDdSurfaceGlobal->dwBlockSizeX = gpl->dwBlockSizeX;
ptmpDdSurfaceGlobal->dwBlockSizeY = gpl->dwBlockSizeY;
if (lcl->dwFlags & DDRAWISURF_HASPIXELFORMAT)
{
RtlCopyMemory( &ptmpDdSurfaceGlobal->ddpfSurface ,
&gpl->ddpfSurface,
sizeof(DDPIXELFORMAT));
ptmpDdSurfaceGlobal->ddpfSurface.dwSize = sizeof(DDPIXELFORMAT);
}
else
{
RtlCopyMemory( &ptmpDdSurfaceGlobal->ddpfSurface ,
&gpl->lpDD->vmiData.ddpfDisplay,
sizeof(DDPIXELFORMAT));
}
if (lcl->lpSurfMore)
{
ptmpDdSurfaceMore->ddsCapsEx.dwCaps2 = lcl->lpSurfMore->ddsCapsEx.dwCaps2;
ptmpDdSurfaceMore->ddsCapsEx.dwCaps3 = lcl->lpSurfMore->ddsCapsEx.dwCaps3;
ptmpDdSurfaceMore->ddsCapsEx.dwCaps4 = lcl->lpSurfMore->ddsCapsEx.dwCaps4;
ptmpDdSurfaceMore->dwSurfaceHandle = (DWORD) pCreateSurface->lplpSList[i]->dbnOverlayNode.object_int;
}
/* FIXME count to next SurfaceCount for
ptmpDdSurfaceGlobal = pDdSurfaceGlobal;
ptmpDdSurfaceLocal = pDdSurfaceLocal;
ptmpDdSurfaceMore = pDdSurfaceMore;
we only support one surface create at moment
*/
}
}
/* Call win32k now */
pCreateSurface->ddRVal = DDERR_GENERIC;
Return = NtGdiDdCreateSurface(GetDdHandle(pCreateSurface->lpDD->hDD),
(HANDLE *)phSurface,
pSurfaceDesc,
pDdSurfaceGlobal,
pDdSurfaceLocal,
pDdSurfaceMore,
(PDD_CREATESURFACEDATA)pCreateSurface,
puhSurface);
if (SurfaceCount == 0)
{
pCreateSurface->ddRVal = DDERR_GENERIC;
}
else
{
ptmpDdSurfaceMore = pDdSurfaceMore;
ptmpDdSurfaceGlobal = pDdSurfaceGlobal;
ptmpDdSurfaceLocal = pDdSurfaceLocal;
for (i=0;i<SurfaceCount;i++)
{
LPDDRAWI_DDRAWSURFACE_LCL lcl = pCreateSurface->lplpSList[i];
LPDDRAWI_DDRAWSURFACE_GBL gpl = pCreateSurface->lplpSList[i]->lpGbl;
gpl->lPitch = ptmpDdSurfaceGlobal->lPitch;
gpl->fpVidMem = ptmpDdSurfaceGlobal->fpVidMem;
gpl->dwBlockSizeX = ptmpDdSurfaceGlobal->dwBlockSizeX;
gpl->dwBlockSizeY = ptmpDdSurfaceGlobal->dwBlockSizeY;
if (lcl->dwFlags & DDRAWISURF_HASPIXELFORMAT)
{
RtlCopyMemory( &gpl->ddpfSurface, &ptmpDdSurfaceGlobal->ddpfSurface , sizeof(DDPIXELFORMAT));
}
if (pCreateSurface->ddRVal != DD_OK)
{
gpl->fpVidMem = 0;
if (lcl->hDDSurface)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -