From c515c8db371c7547f81720c85367807a96aedaf0 Mon Sep 17 00:00:00 2001 From: Maarten Bosma Date: Sun, 30 Oct 2005 15:34:03 +0000 Subject: [PATCH] Implement IDirectDrawSurface::Blt for HAL svn path=/trunk/; revision=18884 --- reactos/lib/ddraw/hal/surface_hal.c | 27 +++++++++++---------- reactos/lib/ddraw/main/surface_main.c | 34 +++++++++++---------------- reactos/lib/ddraw/rosdraw.h | 4 ++++ 3 files changed, 32 insertions(+), 33 deletions(-) diff --git a/reactos/lib/ddraw/hal/surface_hal.c b/reactos/lib/ddraw/hal/surface_hal.c index e4654c5fc86..f313ca0fbd0 100644 --- a/reactos/lib/ddraw/hal/surface_hal.c +++ b/reactos/lib/ddraw/hal/surface_hal.c @@ -10,30 +10,31 @@ #include "rosdraw.h" -HRESULT Hal_DDrawSurface_Blt(LPDIRECTDRAWSURFACE7 iface, LPRECT rdst, - LPDIRECTDRAWSURFACE7 src, LPRECT rsrc, DWORD dwFlags, LPDDBLTFX lpbltfx) +HRESULT Hal_DDrawSurface_Blt(LPDIRECTDRAWSURFACE7 iface, LPRECT rDest, + LPDIRECTDRAWSURFACE7 src, LPRECT rSrc, DWORD dwFlags, LPDDBLTFX lpbltfx) { - - DDHAL_BLTDATA BltData; - IDirectDrawImpl* This = (IDirectDrawImpl*)iface; + IDirectDrawSurfaceImpl* This = (IDirectDrawSurfaceImpl*)iface; + IDirectDrawSurfaceImpl* That = (IDirectDrawSurfaceImpl*)src; - if (!(This->DirectDrawGlobal.lpDDCBtmp->HALDDSurface.dwFlags & DDHAL_SURFCB32_BLT)) + if (!(This->owner->DirectDrawGlobal.lpDDCBtmp->HALDDSurface.dwFlags & DDHAL_SURFCB32_BLT)) { return DDERR_NODRIVERSUPPORT; } - BltData.lpDD = &This->DirectDrawGlobal; - /* RtlCopyMemory( &BltData.bltFX, lpbltfx,sizeof(DDBLTFX)); */ - BltData.dwFlags = dwFlags; + DDHAL_BLTDATA BltData; + BltData.lpDD = &This->owner->DirectDrawGlobal; + BltData.dwFlags = dwFlags; + BltData.lpDDDestSurface = This->local; + if(rDest) BltData.rDest = *(RECTL*)rDest; + if(rSrc) BltData.rSrc = *(RECTL*)rSrc; + if(That) BltData.lpDDSrcSurface = That->local; + if(lpbltfx) BltData.bltFX = *lpbltfx; - /* FIXME blt is not complete */ - - if (This->DirectDrawGlobal.lpDDCBtmp->HALDDSurface.Blt(&BltData) != DDHAL_DRIVER_HANDLED) + if (This->owner->DirectDrawGlobal.lpDDCBtmp->HALDDSurface.Blt(&BltData) != DDHAL_DRIVER_HANDLED) { return DDERR_NODRIVERSUPPORT; } return BltData.ddRVal; - } diff --git a/reactos/lib/ddraw/main/surface_main.c b/reactos/lib/ddraw/main/surface_main.c index 5f89c46c099..247deff0833 100644 --- a/reactos/lib/ddraw/main/surface_main.c +++ b/reactos/lib/ddraw/main/surface_main.c @@ -41,38 +41,33 @@ HRESULT WINAPI Main_DDrawSurface_Initialize (LPDIRECTDRAWSURFACE7 iface, LPDIREC return CanCreateData.ddRVal; } - /* down here we got a crach */ - /* surface global struct */ - DDRAWI_DDRAWSURFACE_GBL Global; - memset(&Global, 0, sizeof(DDRAWI_DDRAWSURFACE_GBL)); - Global.lpDD = &This->owner->DirectDrawGlobal; - Global.wHeight = This->owner->Height; - Global.wWidth = This->owner->Width; - Global.dwLinearSize = Global.wWidth * This->owner->Bpp/8; + memset(&This->Global, 0, sizeof(DDRAWI_DDRAWSURFACE_GBL)); + This->Global.lpDD = &This->owner->DirectDrawThis->Global; + This->Global.wHeight = This->owner->Height; + This->Global.wWidth = This->owner->Width; + This->Global.dwLinearSize = This->Global.wWidth * This->owner->Bpp/8; /* surface more struct */ - DDRAWI_DDRAWSURFACE_MORE More; - memset(&More, 0, sizeof(DDRAWI_DDRAWSURFACE_MORE)); - More.dwSize = sizeof(DDRAWI_DDRAWSURFACE_MORE); + memset(&This->More, 0, sizeof(DDRAWI_DDRAWSURFACE_MORE)); + This->More.dwSize = sizeof(DDRAWI_DDRAWSURFACE_MORE); /* surface local struct */ - DDRAWI_DDRAWSURFACE_LCL Local; - memset(&Local, 0, sizeof(DDRAWI_DDRAWSURFACE_LCL)); - Local.lpGbl = &Global; - Local.lpSurfMore = &More; - Local.ddsCaps = *(DDSCAPS*)&pDDSD->ddsCaps; + memset(&This->Local, 0, sizeof(DDRAWI_DDRAWSURFACE_LCL)); + This->Local.lpGbl = &This->Global; + This->Local.lpSurfMore = &This->More; + This->Local.ddsCaps = *(DDSCAPS*)&pDDSD->ddsCaps; /* we need to set some flags if we create the primary surface */ if(pDDSD->ddsCaps.dwCaps == DDSCAPS_PRIMARYSURFACE) { - Local.dwFlags |= DDRAWISURF_FRONTBUFFER; - Global.dwGlobalFlags |= DDRAWISURFGBL_ISGDISURFACE; + This->Local.dwFlags |= DDRAWISURF_FRONTBUFFER; + This->Global.dwGlobalFlags |= DDRAWISURFGBL_ISGDISURFACE; } /* for the double pointer below */ DDRAWI_DDRAWSURFACE_LCL *pLocal[2]; - pLocal[0] = &Local; + pLocal[0] = &This->Local; pLocal[1] = NULL; // we need this one for bad written drivers /* the parameter struct */ @@ -84,7 +79,6 @@ HRESULT WINAPI Main_DDrawSurface_Initialize (LPDIRECTDRAWSURFACE7 iface, LPDIREC CreateData.lplpSList = pLocal; /* this is the call we were waiting for */ - MessageBox(0,0,0,0); if(This->owner->DirectDrawGlobal.lpDDCBtmp->HALDD.CreateSurface(&CreateData) == DDHAL_DRIVER_NOTHANDLED) return DDERR_INVALIDPARAMS; diff --git a/reactos/lib/ddraw/rosdraw.h b/reactos/lib/ddraw/rosdraw.h index c2cad52a287..05245c77a11 100644 --- a/reactos/lib/ddraw/rosdraw.h +++ b/reactos/lib/ddraw/rosdraw.h @@ -41,6 +41,10 @@ typedef struct LONG ref; + DDRAWI_DDRAWSURFACE_GBL Global; + DDRAWI_DDRAWSURFACE_MORE More; + DDRAWI_DDRAWSURFACE_LCL Local; + IDirectDrawImpl* owner; } IDirectDrawSurfaceImpl;