From 988d7a9c98c7184a08bce5c0aefc39426f3c8eaf Mon Sep 17 00:00:00 2001 From: Magnus Olsen Date: Sat, 8 Apr 2006 09:04:42 +0000 Subject: [PATCH] Implement Surface_GetDC svn path=/trunk/; revision=21516 --- reactos/dll/directx/ddraw/hal/surface_hal.c | 21 ++++++++--- reactos/dll/directx/ddraw/main/surface_main.c | 36 +++++++++++++++---- reactos/dll/directx/ddraw/rosdraw.h | 14 ++++++++ reactos/dll/directx/ddraw/soft/surface_hel.c | 9 +++++ 4 files changed, 69 insertions(+), 11 deletions(-) diff --git a/reactos/dll/directx/ddraw/hal/surface_hal.c b/reactos/dll/directx/ddraw/hal/surface_hal.c index 2133772279b..5a38b36a784 100644 --- a/reactos/dll/directx/ddraw/hal/surface_hal.c +++ b/reactos/dll/directx/ddraw/hal/surface_hal.c @@ -69,10 +69,13 @@ HRESULT Hal_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDESC2 pDDS That->Surf->mPrimaryLocal.ddsCaps.dwCaps = That->Surf->mddsdPrimary.ddsCaps.dwCaps; That->Surf->mpPrimaryLocals[0] = &That->Surf->mPrimaryLocal; + + mDdCreateSurface.lpDDSurfaceDesc = &That->Surf->mddsdPrimary; mDdCreateSurface.lplpSList = That->Surf->mpPrimaryLocals; mDdCreateSurface.dwSCnt = This->mDDrawGlobal.dsList->dwIntRefCnt ; + if (This->mHALInfo.lpDDCallbacks->CreateSurface(&mDdCreateSurface) == DDHAL_DRIVER_NOTHANDLED) { return DDERR_NOTINITIALIZED; @@ -82,12 +85,15 @@ HRESULT Hal_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDESC2 pDDS { return mDdCreateSurface.ddRVal; } + + return DD_OK; } else if (pDDSD->ddsCaps.dwCaps & DDSCAPS_OVERLAY) { + DX_STUB_str( "Can not create overlay surface"); ////memset(&This->mddsdOverlay, 0, sizeof(DDSURFACEDESC)); //memcpy(&This->mddsdOverlay,pDDSD,sizeof(DDSURFACEDESC)); //This->mddsdOverlay.dwSize = sizeof(DDSURFACEDESC); @@ -208,19 +214,19 @@ HRESULT Hal_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDESC2 pDDS } else if (pDDSD->ddsCaps.dwCaps & DDSCAPS_BACKBUFFER) { - DX_STUB; + DX_STUB_str( "Can not create backbuffer surface"); } else if (pDDSD->ddsCaps.dwCaps & DDSCAPS_TEXTURE) { - DX_STUB; + DX_STUB_str( "Can not create texture surface"); } else if (pDDSD->ddsCaps.dwCaps & DDSCAPS_ZBUFFER) { - DX_STUB; + DX_STUB_str( "Can not create zbuffer surface"); } else if (pDDSD->ddsCaps.dwCaps & DDSCAPS_OFFSCREENPLAIN) { - DX_STUB; + DX_STUB_str( "Can not create offscreenplain surface"); } return DDERR_INVALIDSURFACETYPE; @@ -289,6 +295,7 @@ HRESULT Hal_DDrawSurface_Blt(LPDIRECTDRAWSURFACE7 iface, LPRECT rDest, // This->Surf->mpPrimaryLocals[0]->hDC = This->owner->mDDrawGlobal.lpExclusiveOwner->hDC; // FIXME dectect if it clipped or not + DX_STUB_str( "Can not create offscreenplain surface"); mDdBlt.IsClipped = FALSE; if (mDdBlt.Blt(&mDdBlt) != DDHAL_DRIVER_HANDLED) @@ -304,3 +311,9 @@ HRESULT Hal_DDrawSurface_Blt(LPDIRECTDRAWSURFACE7 iface, LPRECT rDest, return DD_OK; } + +HRESULT Hal_DDrawSurface_Lock(LPDIRECTDRAWSURFACE7 iface, LPRECT prect, LPDDSURFACEDESC2 + pDDSD, DWORD flags, HANDLE event) +{ + DX_STUB; +} diff --git a/reactos/dll/directx/ddraw/main/surface_main.c b/reactos/dll/directx/ddraw/main/surface_main.c index e2ef4377fa6..d1e816ef2e8 100644 --- a/reactos/dll/directx/ddraw/main/surface_main.c +++ b/reactos/dll/directx/ddraw/main/surface_main.c @@ -61,16 +61,15 @@ HRESULT WINAPI Main_DDrawSurface_Blt(LPDIRECTDRAWSURFACE7 iface, LPRECT rdst, HRESULT WINAPI Main_DDrawSurface_Lock (LPDIRECTDRAWSURFACE7 iface, LPRECT prect, LPDDSURFACEDESC2 pDDSD, DWORD flags, HANDLE event) -{ /* - IDirectDrawSurfaceImpl* That = (IDirectDrawSurfaceImpl*)iface; +{ + IDirectDrawSurfaceImpl* This = (IDirectDrawSurfaceImpl*)iface; - if (This->mDDrawGlobal.lpDDCBtmp->HALDD.dwFlags & DDHAL_CB32_CREATESURFACE) + if (This->owner->mDDrawGlobal.lpDDCBtmp->HALDD.dwFlags & DDHAL_CB32_CREATESURFACE) { - return Hal_DDrawSurface_Lock( iiface, LPRECT prect, pDDSD, flags, event); + return Hal_DDrawSurface_Lock( iface, prect, pDDSD, flags, event); } - return Hel_DDrawSurface_Lock( iiface, LPRECT prect, pDDSD, flags, event);*/ - DX_STUB; + return Hel_DDrawSurface_Lock( iface, prect, pDDSD, flags, event); } HRESULT WINAPI Main_DDrawSurface_Unlock (LPDIRECTDRAWSURFACE7 iface, LPRECT pRect) @@ -224,7 +223,30 @@ Main_DDrawSurface_GetColorKey(LPDIRECTDRAWSURFACE7 iface, DWORD dwFlags, HRESULT WINAPI Main_DDrawSurface_GetDC(LPDIRECTDRAWSURFACE7 iface, HDC *phDC) { - DX_STUB; + IDirectDrawSurfaceImpl* This; + + if (iface == NULL) + { + return DDERR_INVALIDOBJECT; + } + + if (phDC == NULL) + { + return DDERR_INVALIDPARAMS; + } + + This = (IDirectDrawSurfaceImpl*)iface; + + if ((HDC)This->Surf->mPrimaryLocal.hDC == NULL) + { + *phDC = (HDC)This->owner->mDDrawGlobal.lpExclusiveOwner->hDC; + } + else + { + *phDC = (HDC)This->Surf->mpPrimaryLocals[0]->hDC; + } + + return DD_OK; } HRESULT WINAPI diff --git a/reactos/dll/directx/ddraw/rosdraw.h b/reactos/dll/directx/ddraw/rosdraw.h index 4b2c0819ebf..2973c76be14 100644 --- a/reactos/dll/directx/ddraw/rosdraw.h +++ b/reactos/dll/directx/ddraw/rosdraw.h @@ -147,8 +147,11 @@ HRESULT Hal_DirectDraw_FlipToGDISurface(LPDIRECTDRAW7 ); HRESULT Hal_DirectDraw_SetDisplayMode (LPDIRECTDRAW7, DWORD, DWORD, DWORD, DWORD, DWORD ); HRESULT Hal_DDrawSurface_Blt(LPDIRECTDRAWSURFACE7, LPRECT, LPDIRECTDRAWSURFACE7, LPRECT, DWORD, LPDDBLTFX ); HRESULT Hal_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDESC2 pDDSD, IDirectDrawSurfaceImpl *ppSurf, IUnknown *pUnkOuter); +HRESULT Hal_DDrawSurface_Lock(LPDIRECTDRAWSURFACE7 iface, LPRECT prect, LPDDSURFACEDESC2 pDDSD, DWORD flags, HANDLE event); + + HRESULT Hel_DirectDraw_Initialize (LPDIRECTDRAW7 ); HRESULT Hel_DirectDraw_SetCooperativeLevel (LPDIRECTDRAW7 ); VOID Hel_DirectDraw_Release (LPDIRECTDRAW7 ); @@ -159,6 +162,7 @@ HRESULT Hel_DirectDraw_FlipToGDISurface(LPDIRECTDRAW7 ); HRESULT Hel_DirectDraw_SetDisplayMode (LPDIRECTDRAW7 , DWORD , DWORD ,DWORD , DWORD , DWORD ); HRESULT Hel_DDrawSurface_Blt(LPDIRECTDRAWSURFACE7, LPRECT, LPDIRECTDRAWSURFACE7, LPRECT, DWORD, LPDDBLTFX ); HRESULT Hel_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDESC2 pDDSD, LPDIRECTDRAWSURFACE7 *ppSurf, IUnknown *pUnkOuter); +HRESULT Hel_DDrawSurface_Lock(LPDIRECTDRAWSURFACE7 iface, LPRECT prect, LPDDSURFACEDESC2 pDDSD, DWORD flags, HANDLE event); /* Setting for HEL should be move to ros special reg key ? */ @@ -178,4 +182,14 @@ HRESULT Hel_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDESC2 pDDS } \ return DDERR_UNSUPPORTED; +#define DX_STUB_str(x) \ + static BOOL firstcall = TRUE; \ + if (firstcall) \ + { \ + char buffer[1024]; \ + sprintf ( buffer, "Function %s %s (%s:%d)\n", __FUNCTION__,x,__FILE__,__LINE__ ); \ + OutputDebugStringA(buffer); \ + firstcall = FALSE; \ + } + #endif /* __DDRAW_PRIVATE */ diff --git a/reactos/dll/directx/ddraw/soft/surface_hel.c b/reactos/dll/directx/ddraw/soft/surface_hel.c index 830e27543b6..8a0ed41d20a 100644 --- a/reactos/dll/directx/ddraw/soft/surface_hel.c +++ b/reactos/dll/directx/ddraw/soft/surface_hel.c @@ -21,3 +21,12 @@ HRESULT Hel_DDrawSurface_Blt(LPDIRECTDRAWSURFACE7 iface, LPRECT rdst, { DX_STUB; } + +HRESULT Hel_DDrawSurface_Lock(LPDIRECTDRAWSURFACE7 iface, LPRECT prect, LPDDSURFACEDESC2 + pDDSD, DWORD flags, HANDLE event) +{ + DX_STUB; +} + + +