diff --git a/reactos/dll/directx/ddraw/hal/surface_hal.c b/reactos/dll/directx/ddraw/hal/surface_hal.c index 85f83d7ca94..4198684f1df 100644 --- a/reactos/dll/directx/ddraw/hal/surface_hal.c +++ b/reactos/dll/directx/ddraw/hal/surface_hal.c @@ -30,14 +30,14 @@ HRESULT Hal_DDrawSurface_Blt(LPDIRECTDRAWSURFACE7 iface, LPRECT rDest, return DD_FALSE; } - if (!(This->owner->mDDrawGlobal.lpDDCBtmp->HALDDSurface.dwFlags & DDHAL_SURFCB32_BLT)) + if (!(This->Owner->mDDrawGlobal.lpDDCBtmp->HALDDSurface.dwFlags & DDHAL_SURFCB32_BLT)) { return DDERR_NODRIVERSUPPORT; } - mDdBlt.lpDDDestSurface = This->Surf->mpPrimaryLocals[0]; + mDdBlt.lpDDDestSurface = This->Owner->mpPrimaryLocals[0]; - if (!DdResetVisrgn(This->Surf->mpPrimaryLocals[0], NULL)) + if (!DdResetVisrgn(This->Owner->mpPrimaryLocals[0], NULL)) { return DDERR_NOGDI; } @@ -62,12 +62,12 @@ HRESULT Hal_DDrawSurface_Blt(LPDIRECTDRAWSURFACE7 iface, LPRECT rDest, if (src != NULL) { - mDdBlt.lpDDSrcSurface = That->Surf->mpPrimaryLocals[0]; + mDdBlt.lpDDSrcSurface = That->Surf->mpSurfLocals[0]; } - mDdBlt.lpDD = &This->owner->mDDrawGlobal; - mDdBlt.Blt = This->owner->mCallbacks.HALDDSurface.Blt; - mDdBlt.lpDDDestSurface = This->Surf->mpPrimaryLocals[0]; + mDdBlt.lpDD = &This->Owner->mDDrawGlobal; + mDdBlt.Blt = This->Owner->mCallbacks.HALDDSurface.Blt; + mDdBlt.lpDDDestSurface = This->Owner->mpPrimaryLocals[0]; mDdBlt.dwFlags = dwFlags; @@ -107,13 +107,13 @@ HRESULT Hal_DDrawSurface_Lock(LPDIRECTDRAWSURFACE7 iface, LPRECT prect, LPDDSURF } Lock.ddRVal = DDERR_NOTPALETTIZED; - Lock.Lock = This->owner->mCallbacks.HALDDSurface.Lock; + Lock.Lock = This->Owner->mCallbacks.HALDDSurface.Lock; Lock.dwFlags = flags; - Lock.lpDDSurface = &This->Surf->mPrimaryLocal; - Lock.lpDD = &This->owner->mDDrawGlobal; + Lock.lpDDSurface = &This->Owner->mPrimaryLocal; + Lock.lpDD = &This->Owner->mDDrawGlobal; Lock.lpSurfData = NULL; - if (!DdResetVisrgn(&This->Surf->mPrimaryLocal, NULL)) + if (!DdResetVisrgn(&This->Owner->mPrimaryLocal, NULL)) { OutputDebugStringA("Here DdResetVisrgn lock"); return DDERR_UNSUPPORTED; @@ -138,13 +138,13 @@ HRESULT Hal_DDrawSurface_Lock(LPDIRECTDRAWSURFACE7 iface, LPRECT prect, LPDDSURF { RtlZeroMemory(pDDSD,sizeof(DDSURFACEDESC2)); // FIXME the interanl mddsdPrimary shall be DDSURFACEDESC2 - memcpy(pDDSD,&This->Surf->mddsdPrimary,sizeof(DDSURFACEDESC)); + memcpy(pDDSD,&This->Owner->mddsdPrimary,sizeof(DDSURFACEDESC)); pDDSD->dwSize = sizeof(DDSURFACEDESC2); } if (pDDSD->dwSize == sizeof(DDSURFACEDESC)) { RtlZeroMemory(pDDSD,sizeof(DDSURFACEDESC)); - memcpy(pDDSD,&This->Surf->mddsdPrimary,sizeof(DDSURFACEDESC)); + memcpy(pDDSD,&This->Owner->mddsdPrimary,sizeof(DDSURFACEDESC)); pDDSD->dwSize = sizeof(DDSURFACEDESC); } @@ -159,9 +159,9 @@ HRESULT Hal_DDrawSurface_Unlock(LPDIRECTDRAWSURFACE7 iface, LPRECT pRect) DDHAL_UNLOCKDATA unLock; unLock.ddRVal = DDERR_NOTPALETTIZED; - unLock.lpDD = &This->owner->mDDrawGlobal; - unLock.lpDDSurface = &This->Surf->mPrimaryLocal; - unLock.Unlock = This->owner->mCallbacks.HALDDSurface.Unlock; + unLock.lpDD = &This->Owner->mDDrawGlobal; + unLock.lpDDSurface = &This->Owner->mPrimaryLocal; + unLock.Unlock = This->Owner->mCallbacks.HALDDSurface.Unlock; diff --git a/reactos/dll/directx/ddraw/main/ddraw_main.c b/reactos/dll/directx/ddraw/main/ddraw_main.c index e35c1fa1151..c8243518b6d 100644 --- a/reactos/dll/directx/ddraw/main/ddraw_main.c +++ b/reactos/dll/directx/ddraw/main/ddraw_main.c @@ -357,6 +357,11 @@ HRESULT WINAPI Main_DirectDraw_SetDisplayMode (LPDIRECTDRAW7 iface, DWORD dwWidt DdReenableDirectDrawObject(&This->mDDrawGlobal, &dummy); /* FIXME fill the This->DirectDrawGlobal.vmiData right */ } + + //This->mDDrawGlobal.lpExclusiveOwner->hDC = (ULONG_PTR)GetDC( (HWND)This->mDDrawGlobal.lpExclusiveOwner->hWnd); + + + return ret; } @@ -446,11 +451,11 @@ HRESULT WINAPI Main_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDE // FIXME free This->mDDrawGlobal.dsList on release This->mDDrawGlobal.dsList = (LPDDRAWI_DDRAWSURFACE_INT)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DDRAWI_DDRAWSURFACE_INT)); - That->owner = (IDirectDrawImpl *)This; - That->owner->mDDrawGlobal.dsList->dwIntRefCnt =1; + That->Owner = (IDirectDrawImpl *)This; + That->Owner->mDDrawGlobal.dsList->dwIntRefCnt =1; /* we alwasy set to use the DirectDrawSurface7_Vtable as internel */ - That->owner->mDDrawGlobal.dsList->lpVtbl = (PVOID) &DirectDrawSurface7_Vtable; + That->Owner->mDDrawGlobal.dsList->lpVtbl = (PVOID) &DirectDrawSurface7_Vtable; That->Surf = surf; @@ -465,11 +470,11 @@ HRESULT WINAPI Main_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDE if (pDDSD->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE) { - - memcpy(&That->Surf->mddsdPrimary,pDDSD,sizeof(DDSURFACEDESC)); - That->Surf->mddsdPrimary.dwSize = sizeof(DDSURFACEDESC); + OutputDebugStringA("Create DDSCAPS_PRIMARYSURFACE\n"); + memcpy(&That->Owner->mddsdPrimary,pDDSD,sizeof(DDSURFACEDESC)); + That->Owner->mddsdPrimary.dwSize = sizeof(DDSURFACEDESC); This->mDdCanCreateSurface.bIsDifferentPixelFormat = FALSE; - This->mDdCanCreateSurface.lpDDSurfaceDesc = &That->Surf->mddsdPrimary; + This->mDdCanCreateSurface.lpDDSurfaceDesc = &That->Owner->mddsdPrimary; if (This->mDdCanCreateSurface.CanCreateSurface(&This->mDdCanCreateSurface)== DDHAL_DRIVER_NOTHANDLED) { @@ -481,34 +486,34 @@ HRESULT WINAPI Main_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDE return DDERR_NOTINITIALIZED; } - memset(&That->Surf->mPrimaryGlobal, 0, sizeof(DDRAWI_DDRAWSURFACE_GBL)); - That->Surf->mPrimaryGlobal.dwGlobalFlags = DDRAWISURFGBL_ISGDISURFACE; - That->Surf->mPrimaryGlobal.lpDD = &This->mDDrawGlobal; - That->Surf->mPrimaryGlobal.lpDDHandle = &This->mDDrawGlobal; - That->Surf->mPrimaryGlobal.wWidth = (WORD)This->mpModeInfos[0].dwWidth; - That->Surf->mPrimaryGlobal.wHeight = (WORD)This->mpModeInfos[0].dwHeight; - That->Surf->mPrimaryGlobal.lPitch = This->mpModeInfos[0].lPitch; + memset(&That->Owner->mPrimaryGlobal, 0, sizeof(DDRAWI_DDRAWSURFACE_GBL)); + That->Owner->mPrimaryGlobal.dwGlobalFlags = DDRAWISURFGBL_ISGDISURFACE; + That->Owner->mPrimaryGlobal.lpDD = &This->mDDrawGlobal; + That->Owner->mPrimaryGlobal.lpDDHandle = &This->mDDrawGlobal; + That->Owner->mPrimaryGlobal.wWidth = (WORD)This->mpModeInfos[0].dwWidth; + That->Owner->mPrimaryGlobal.wHeight = (WORD)This->mpModeInfos[0].dwHeight; + That->Owner->mPrimaryGlobal.lPitch = This->mpModeInfos[0].lPitch; - memset(&That->Surf->mPrimaryMore, 0, sizeof(DDRAWI_DDRAWSURFACE_MORE)); - That->Surf->mPrimaryMore.dwSize = sizeof(DDRAWI_DDRAWSURFACE_MORE); + memset(&That->Owner->mPrimaryMore, 0, sizeof(DDRAWI_DDRAWSURFACE_MORE)); + That->Owner->mPrimaryMore.dwSize = sizeof(DDRAWI_DDRAWSURFACE_MORE); - memset(&That->Surf->mPrimaryLocal, 0, sizeof(DDRAWI_DDRAWSURFACE_LCL)); - That->Surf->mPrimaryLocal.lpGbl = &That->Surf->mPrimaryGlobal; - That->Surf->mPrimaryLocal.lpSurfMore = &That->Surf->mPrimaryMore; - That->Surf->mPrimaryLocal.dwProcessId = GetCurrentProcessId(); + memset(&That->Owner->mPrimaryLocal, 0, sizeof(DDRAWI_DDRAWSURFACE_LCL)); + That->Owner->mPrimaryLocal.lpGbl = &That->Owner->mPrimaryGlobal; + That->Owner->mPrimaryLocal.lpSurfMore = &That->Owner->mPrimaryMore; + That->Owner->mPrimaryLocal.dwProcessId = GetCurrentProcessId(); /* FIXME Check the flags if we shall create a primaresurface for overlay or something else Examine windows which flags are being set for we assume this is right unsue I think */ //That->Surf->mPrimaryLocal.dwFlags = DDRAWISURF_PARTOFPRIMARYCHAIN|DDRAWISURF_HASOVERLAYDATA; - That->Surf->mPrimaryLocal.ddsCaps.dwCaps = That->Surf->mddsdPrimary.ddsCaps.dwCaps; - That->Surf->mpPrimaryLocals[0] = &That->Surf->mPrimaryLocal; + That->Owner->mPrimaryLocal.ddsCaps.dwCaps = That->Owner->mddsdPrimary.ddsCaps.dwCaps; + That->Owner->mpPrimaryLocals[0] = &That->Owner->mPrimaryLocal; - This->mDdCreateSurface.lpDDSurfaceDesc = &That->Surf->mddsdPrimary; - This->mDdCreateSurface.lplpSList = That->Surf->mpPrimaryLocals; + This->mDdCreateSurface.lpDDSurfaceDesc = &That->Owner->mddsdPrimary; + This->mDdCreateSurface.lplpSList = That->Owner->mpPrimaryLocals; This->mDdCreateSurface.dwSCnt = This->mDDrawGlobal.dsList->dwIntRefCnt ; @@ -535,41 +540,41 @@ HRESULT WINAPI Main_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDE DDSD_ZBUFFERBITDEPTH */ - That->Surf->mddsdPrimary.dwFlags = DDSD_CAPS + DDSD_PIXELFORMAT; - RtlCopyMemory(&That->Surf->mddsdPrimary.ddpfPixelFormat,&This->mDDrawGlobal.vmiData.ddpfDisplay,sizeof(DDPIXELFORMAT)); - RtlCopyMemory(&That->Surf->mddsdPrimary.ddsCaps,&This->mDDrawGlobal.ddCaps,sizeof(DDCORECAPS)); + That->Owner->mddsdPrimary.dwFlags = DDSD_CAPS + DDSD_PIXELFORMAT; + RtlCopyMemory(&That->Owner->mddsdPrimary.ddpfPixelFormat,&This->mDDrawGlobal.vmiData.ddpfDisplay,sizeof(DDPIXELFORMAT)); + //RtlCopyMemory(&That->Surf->mddsdPrimary.ddsCaps,&This->mDDrawGlobal.ddCaps,sizeof(DDCORECAPS)); //RtlCopyMemory(&pDDSD->ddckCKDestOverlay,&This->mDDrawGlobal.ddckCKDestOverlay,sizeof(DDCOLORKEY)); //RtlCopyMemory(&pDDSD->ddckCKSrcOverlay,&This->mDDrawGlobal.ddckCKSrcOverlay,sizeof(DDCOLORKEY)); if (This->mDDrawGlobal.vmiData.dwDisplayHeight != 0) { - That->Surf->mddsdPrimary.dwFlags += DDSD_HEIGHT ; - That->Surf->mddsdPrimary.dwHeight = This->mDDrawGlobal.vmiData.dwDisplayHeight; + That->Owner->mddsdPrimary.dwFlags += DDSD_HEIGHT ; + That->Owner->mddsdPrimary.dwHeight = This->mDDrawGlobal.vmiData.dwDisplayHeight; } if (This->mDDrawGlobal.vmiData.dwDisplayWidth != 0) { - That->Surf->mddsdPrimary.dwFlags += DDSD_WIDTH ; - That->Surf->mddsdPrimary.dwWidth = This->mDDrawGlobal.vmiData.dwDisplayWidth; + That->Owner->mddsdPrimary.dwFlags += DDSD_WIDTH ; + That->Owner->mddsdPrimary.dwWidth = This->mDDrawGlobal.vmiData.dwDisplayWidth; } if (This->mDDrawGlobal.vmiData.lDisplayPitch != 0) { - That->Surf->mddsdPrimary.dwFlags += DDSD_PITCH ; - That->Surf->mddsdPrimary.lPitch = This->mDDrawGlobal.vmiData.lDisplayPitch; + That->Owner->mddsdPrimary.dwFlags += DDSD_PITCH ; + That->Owner->mddsdPrimary.lPitch = This->mDDrawGlobal.vmiData.lDisplayPitch; } if ( This->mDDrawGlobal.dwMonitorFrequency != 0) { - That->Surf->mddsdPrimary.dwFlags += DDSD_REFRESHRATE ; - That->Surf->mddsdPrimary.dwRefreshRate = This->mDDrawGlobal.dwMonitorFrequency; + That->Owner->mddsdPrimary.dwFlags += DDSD_REFRESHRATE ; + That->Owner->mddsdPrimary.dwRefreshRate = This->mDDrawGlobal.dwMonitorFrequency; } if (This->mDDrawGlobal.vmiData.ddpfDisplay.dwAlphaBitDepth != 0) { - That->Surf->mddsdPrimary.dwFlags += DDSD_ALPHABITDEPTH ; - That->Surf->mddsdPrimary.dwAlphaBitDepth = This->mDDrawGlobal.vmiData.ddpfDisplay.dwAlphaBitDepth; + That->Owner->mddsdPrimary.dwFlags += DDSD_ALPHABITDEPTH ; + That->Owner->mddsdPrimary.dwAlphaBitDepth = This->mDDrawGlobal.vmiData.ddpfDisplay.dwAlphaBitDepth; } return DD_OK; @@ -578,123 +583,136 @@ HRESULT WINAPI Main_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDE else if (pDDSD->ddsCaps.dwCaps & DDSCAPS_OVERLAY) { // DX_STUB_str( "Can not create overlay surface"); - // memset(&That->Surf->mddsdOverlay, 0, sizeof(DDSURFACEDESC)); - // memcpy(&That->Surf->mddsdOverlay,pDDSD,sizeof(DDSURFACEDESC)); - // That->Surf->mddsdOverlay.dwSize = sizeof(DDSURFACEDESC); - //That->Surf->mddsdOverlay.dwFlags = DDSD_CAPS | DDSD_PIXELFORMAT | DDSD_BACKBUFFERCOUNT | DDSD_WIDTH | DDSD_HEIGHT; + OutputDebugStringA("Create DDSCAPS_OVERLAY\n"); - //That->Surf->mddsdOverlay.ddsCaps.dwCaps = DDSCAPS_OVERLAY | DDSCAPS_VIDEOMEMORY | DDSCAPS_LOCALVIDMEM | DDSCAPS_COMPLEX | DDSCAPS_FLIP; + memset(&That->Surf->mddsdOverlay, 0, sizeof(DDSURFACEDESC)); + That->Surf->mddsdOverlay.dwSize = sizeof(DDSURFACEDESC); + That->Surf->mddsdOverlay.dwFlags = DDSD_CAPS | DDSD_PIXELFORMAT | DDSD_BACKBUFFERCOUNT | DDSD_WIDTH | DDSD_HEIGHT; + That->Surf->mddsdOverlay.ddsCaps.dwCaps = DDSCAPS_OVERLAY | DDSCAPS_VIDEOMEMORY | DDSCAPS_LOCALVIDMEM | DDSCAPS_COMPLEX | DDSCAPS_FLIP; +// + That->Surf->mddsdOverlay.dwWidth = 100; //pels; + That->Surf->mddsdOverlay.dwHeight = 100; // lines; + That->Surf->mddsdOverlay.dwBackBufferCount = 1; //cBuffers; - //That->Surf->mddsdOverlay.dwWidth = 100; //pels; - //That->Surf->mddsdOverlay.dwHeight = 100; // lines; - //That->Surf->mddsdOverlay.dwBackBufferCount = 1; //cBuffers; + That->Surf->mddsdOverlay.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); + That->Surf->mddsdOverlay.ddpfPixelFormat.dwFlags = DDPF_RGB; + That->Surf->mddsdOverlay.ddpfPixelFormat.dwRGBBitCount = 32; +// +// + DDHAL_CANCREATESURFACEDATA mDdCanCreateSurface; + mDdCanCreateSurface.lpDD = &This->mDDrawGlobal; + mDdCanCreateSurface.CanCreateSurface = This->mCallbacks.HALDD.CanCreateSurface; + mDdCanCreateSurface.bIsDifferentPixelFormat = TRUE; //isDifferentPixelFormat; + mDdCanCreateSurface.lpDDSurfaceDesc = &That->Surf->mddsdOverlay; // pDDSD; - //That->Surf->mddsdOverlay.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); - //That->Surf->mddsdOverlay.ddpfPixelFormat.dwFlags = DDPF_RGB; - //That->Surf->mddsdOverlay.ddpfPixelFormat.dwRGBBitCount = 32; - - //mDdCanCreateSurface.lpDD = &This->mDDrawGlobal; - //mDdCanCreateSurface.CanCreateSurface = This->mCallbacks.HALDD.CanCreateSurface; - //mDdCanCreateSurface.bIsDifferentPixelFormat = TRUE; //isDifferentPixelFormat; - //mDdCanCreateSurface.lpDDSurfaceDesc = &That->Surf->mddsdOverlay; // pDDSD; - - - //if (This->mHALInfo.lpDDCallbacks->CanCreateSurface(&mDdCanCreateSurface)== DDHAL_DRIVER_NOTHANDLED) - //{ - // return DDERR_NOTINITIALIZED; - //} + if (This->mHALInfo.lpDDCallbacks->CanCreateSurface(&mDdCanCreateSurface)== DDHAL_DRIVER_NOTHANDLED) + { + // derr(L"DirectDrawImpl[%08x]::__createPrimary Cannot create primary [%08x]", this, rv); + return DDERR_NOTINITIALIZED; + } - //if (mDdCanCreateSurface.ddRVal != DD_OK) - //{ - // return DDERR_NOTINITIALIZED; - //} + if (mDdCanCreateSurface.ddRVal != DD_OK) + { + return DDERR_NOTINITIALIZED; + } - //memset(&That->Surf->mOverlayGlobal, 0, sizeof(DDRAWI_DDRAWSURFACE_GBL)); - //That->Surf->mOverlayGlobal.dwGlobalFlags = 0; - //That->Surf->mOverlayGlobal.lpDD = &This->mDDrawGlobal; - //That->Surf->mOverlayGlobal.lpDDHandle = &This->mDDrawGlobal; - //That->Surf->mOverlayGlobal.wWidth = (WORD)That->Surf->mddsdOverlay.dwWidth; - //That->Surf->mOverlayGlobal.wHeight = (WORD)That->Surf->mddsdOverlay.dwHeight; - //That->Surf->mOverlayGlobal.lPitch = -1; - //That->Surf->mOverlayGlobal.ddpfSurface = That->Surf->mddsdOverlay.ddpfPixelFormat; - - //// setup front- and backbuffer surfaces - //UINT cSurfaces = That->Surf->mddsdOverlay.dwBackBufferCount + 1; - //for (i = 0; i < cSurfaces; i++) - //{ - // memset(&That->Surf->mOverlayMore[i], 0, sizeof(DDRAWI_DDRAWSURFACE_MORE)); - // That->Surf->mOverlayMore[i].dwSize = sizeof(DDRAWI_DDRAWSURFACE_MORE); - - // memset(&That->Surf->mOverlayLocal[i], 0, sizeof(DDRAWI_DDRAWSURFACE_LCL)); - // That->Surf->mOverlayLocal[i].lpGbl = &That->Surf->mOverlayGlobal; - // That->Surf->mOverlayLocal[i].lpSurfMore = &That->Surf->mOverlayMore[i]; - // That->Surf->mOverlayLocal[i].dwProcessId = GetCurrentProcessId(); - // That->Surf->mOverlayLocal[i].dwFlags = (i == 0) ? - // (DDRAWISURF_IMPLICITROOT|DDRAWISURF_FRONTBUFFER): - // (DDRAWISURF_IMPLICITCREATE|DDRAWISURF_BACKBUFFER); - - // That->Surf->mOverlayLocal[i].dwFlags |= DDRAWISURF_ATTACHED|DDRAWISURF_ATTACHED_FROM| DDRAWISURF_HASPIXELFORMAT| DDRAWISURF_HASOVERLAYDATA; - - // That->Surf->mOverlayLocal[i].ddsCaps.dwCaps = That->Surf->mddsdOverlay.ddsCaps.dwCaps; - // That->Surf->mpOverlayLocals[i] = &That->Surf->mOverlayLocal[i]; - //} - - //for (i = 0; i < cSurfaces; i++) - //{ - // UINT j = (i + 1) % cSurfaces; - // if (!DdAttachSurface(That->Surf->mpOverlayLocals[i], That->Surf->mpOverlayLocals[j])) - // { - // // derr(L"DirectDrawImpl[%08x]::__setupDevice DdAttachSurface(%d, %d) failed", this, i, j); - // return DD_FALSE; - // } - //} - - //mDdCreateSurface.lpDD = &This->mDDrawGlobal; - //mDdCreateSurface.CreateSurface = This->mCallbacks.HALDD.CreateSurface; - //mDdCreateSurface.lpDDSurfaceDesc = &That->Surf->mddsdOverlay;//pDDSD; - //mDdCreateSurface.lplpSList = That->Surf->mpOverlayLocals; //cSurfaces; - //mDdCreateSurface.dwSCnt = 1 ; //ppSurfaces; - - //if (This->mHALInfo.lpDDCallbacks->CreateSurface(&mDdCreateSurface) == DDHAL_DRIVER_NOTHANDLED) - //{ - // return DDERR_NOTINITIALIZED; - //} - - //if (mDdCreateSurface.ddRVal != DD_OK) - //{ - // return mDdCreateSurface.ddRVal; - //} - - //DDHAL_UPDATEOVERLAYDATA mDdUpdateOverlay; - //mDdUpdateOverlay.lpDD = &This->mDDrawGlobal; - //mDdUpdateOverlay.UpdateOverlay = This->mCallbacks.HALDDSurface.UpdateOverlay; - //mDdUpdateOverlay.lpDDDestSurface = That->Surf->mpPrimaryLocals[0]; - //mDdUpdateOverlay.lpDDSrcSurface = That->Surf->mpOverlayLocals[0];//pDDSurface; - //mDdUpdateOverlay.dwFlags = DDOVER_SHOW; - - //mDdUpdateOverlay.rDest.top = 0; - //mDdUpdateOverlay.rDest.left = 0; - //mDdUpdateOverlay.rDest.right = 50; - //mDdUpdateOverlay.rDest.bottom = 50; - - //mDdUpdateOverlay.rSrc.top = 0; - //mDdUpdateOverlay.rSrc.left = 0; - //mDdUpdateOverlay.rSrc.right = 50; - //mDdUpdateOverlay.rSrc.bottom = 50; - - //if (mDdUpdateOverlay.UpdateOverlay(&mDdUpdateOverlay) == DDHAL_DRIVER_NOTHANDLED) - //{ - // return DDERR_NOTINITIALIZED; - //} - - //if (mDdUpdateOverlay.ddRVal != DD_OK) - //{ - // return mDdUpdateOverlay.ddRVal; - //} - - return DD_OK; - return DDERR_INVALIDSURFACETYPE; + memset(&That->Surf->mOverlayGlobal, 0, sizeof(DDRAWI_DDRAWSURFACE_GBL)); + That->Surf->mOverlayGlobal.dwGlobalFlags = 0; + That->Surf->mOverlayGlobal.lpDD = &This->mDDrawGlobal; + That->Surf->mOverlayGlobal.lpDDHandle = &This->mDDrawGlobal; + That->Surf->mOverlayGlobal.wWidth = (WORD)That->Surf->mddsdOverlay.dwWidth; + That->Surf->mOverlayGlobal.wHeight = (WORD)That->Surf->mddsdOverlay.dwHeight; + That->Surf->mOverlayGlobal.lPitch = -1; + That->Surf->mOverlayGlobal.ddpfSurface = That->Surf->mddsdOverlay.ddpfPixelFormat; +// +// // setup front- and backbuffer surfaces + UINT cSurfaces = That->Surf->mddsdOverlay.dwBackBufferCount + 1; + UINT i; + for ( i = 0; i < cSurfaces; i++) + { + memset(&That->Surf->mOverlayMore[i], 0, sizeof(DDRAWI_DDRAWSURFACE_MORE)); + That->Surf->mOverlayMore[i].dwSize = sizeof(DDRAWI_DDRAWSURFACE_MORE); + + memset(&That->Surf->mOverlayLocal[i], 0, sizeof(DDRAWI_DDRAWSURFACE_LCL)); + That->Surf->mOverlayLocal[i].lpGbl = &That->Surf->mOverlayGlobal; + That->Surf->mOverlayLocal[i].lpSurfMore = &That->Surf->mOverlayMore[i]; + That->Surf-> mOverlayLocal[i].dwProcessId = GetCurrentProcessId(); + That->Surf->mOverlayLocal[i].dwFlags = (i == 0) ? + (DDRAWISURF_IMPLICITROOT|DDRAWISURF_FRONTBUFFER): + (DDRAWISURF_IMPLICITCREATE|DDRAWISURF_BACKBUFFER); + + That->Surf->mOverlayLocal[i].dwFlags |= + DDRAWISURF_ATTACHED|DDRAWISURF_ATTACHED_FROM| + DDRAWISURF_HASPIXELFORMAT| + DDRAWISURF_HASOVERLAYDATA; + + That->Surf->mOverlayLocal[i].ddsCaps.dwCaps = That->Surf->mddsdOverlay.ddsCaps.dwCaps; + That->Surf->mpOverlayLocals[i] = &That->Surf->mOverlayLocal[i]; + } + + for ( i = 0; i < cSurfaces; i++) + { + UINT j = (i + 1) % cSurfaces; + + + + + if (!DdAttachSurface(That->Surf->mpOverlayLocals[i], That->Surf->mpOverlayLocals[j])) + { + return DD_FALSE; + } + + } + + + DDHAL_CREATESURFACEDATA mDdCreateSurface; + mDdCreateSurface.lpDD = &This->mDDrawGlobal; + mDdCreateSurface.CreateSurface = This->mCallbacks.HALDD.CreateSurface; + mDdCreateSurface.lpDDSurfaceDesc = &That->Surf->mddsdOverlay;//pDDSD; + mDdCreateSurface.lplpSList = That->Surf->mpOverlayLocals; //cSurfaces; + mDdCreateSurface.dwSCnt = 1 ; //ppSurfaces; + + if (This->mHALInfo.lpDDCallbacks->CreateSurface(&mDdCreateSurface) == DDHAL_DRIVER_NOTHANDLED) + { + return DDERR_NOTINITIALIZED; + } + + + if (mDdCreateSurface.ddRVal != DD_OK) + { + return mDdCreateSurface.ddRVal; + } + + DDHAL_UPDATEOVERLAYDATA mDdUpdateOverlay; + mDdUpdateOverlay.lpDD = &This->mDDrawGlobal; + mDdUpdateOverlay.UpdateOverlay = This->mCallbacks.HALDDSurface.UpdateOverlay; + mDdUpdateOverlay.lpDDDestSurface = This->mpPrimaryLocals[0]; + mDdUpdateOverlay.lpDDSrcSurface = That->Surf->mpOverlayLocals[0];//pDDSurface; + mDdUpdateOverlay.dwFlags = DDOVER_SHOW; + + + mDdUpdateOverlay.rDest.top = 0; + mDdUpdateOverlay.rDest.left = 0; + mDdUpdateOverlay.rDest.right = 50; + mDdUpdateOverlay.rDest.bottom = 50; + + mDdUpdateOverlay.rSrc.top = 0; + mDdUpdateOverlay.rSrc.left = 0; + mDdUpdateOverlay.rSrc.right = 50; + mDdUpdateOverlay.rSrc.bottom = 50; + + if ( mDdUpdateOverlay.UpdateOverlay(&mDdUpdateOverlay) == DDHAL_DRIVER_NOTHANDLED) + { + return DDERR_NOTINITIALIZED; + } + + if (mDdUpdateOverlay.ddRVal != DD_OK) + { + return mDdUpdateOverlay.ddRVal; + } + + return DD_OK; } else if (pDDSD->ddsCaps.dwCaps & DDSCAPS_BACKBUFFER) { diff --git a/reactos/dll/directx/ddraw/main/surface_main.c b/reactos/dll/directx/ddraw/main/surface_main.c index bc0335fef98..9b3d1562677 100644 --- a/reactos/dll/directx/ddraw/main/surface_main.c +++ b/reactos/dll/directx/ddraw/main/surface_main.c @@ -32,14 +32,14 @@ ULONG WINAPI Main_DDrawSurface_AddRef(LPDIRECTDRAWSURFACE7 iface) DX_WINDBG_trace(); - return InterlockedIncrement((PLONG)&This->owner->mDDrawGlobal.dsList->dwIntRefCnt); + return InterlockedIncrement((PLONG)&This->Owner->mDDrawGlobal.dsList->dwIntRefCnt); } ULONG WINAPI Main_DDrawSurface_Release(LPDIRECTDRAWSURFACE7 iface) { IDirectDrawSurfaceImpl* This = (IDirectDrawSurfaceImpl*)iface; - ULONG ref = InterlockedDecrement((PLONG)&This->owner->mDDrawGlobal.dsList->dwIntRefCnt); + ULONG ref = InterlockedDecrement((PLONG)&This->Owner->mDDrawGlobal.dsList->dwIntRefCnt); if (ref == 0) HeapFree(GetProcessHeap(), 0, This); @@ -66,7 +66,7 @@ HRESULT WINAPI Main_DDrawSurface_Blt(LPDIRECTDRAWSURFACE7 iface, LPRECT rdst, IDirectDrawSurfaceImpl* This = (IDirectDrawSurfaceImpl*)iface; - if (This->owner->mCallbacks.HALDDSurface.dwFlags & DDHAL_SURFCB32_BLT) + if (This->Owner->mCallbacks.HALDDSurface.dwFlags & DDHAL_SURFCB32_BLT) { return Hal_DDrawSurface_Blt( iface, rdst, src, rsrc, dwFlags, lpbltfx); } @@ -87,7 +87,7 @@ HRESULT WINAPI Main_DDrawSurface_Lock (LPDIRECTDRAWSURFACE7 iface, LPRECT prect, return DDERR_INVALIDPARAMS; } - if (This->owner->mCallbacks.HALDDSurface.dwFlags & DDHAL_SURFCB32_LOCK) + if (This->Owner->mCallbacks.HALDDSurface.dwFlags & DDHAL_SURFCB32_LOCK) { return Hal_DDrawSurface_Lock( iface, prect, pDDSD, flags, event); } @@ -101,7 +101,7 @@ HRESULT WINAPI Main_DDrawSurface_Unlock (LPDIRECTDRAWSURFACE7 iface, LPRECT pRec IDirectDrawSurfaceImpl* This = (IDirectDrawSurfaceImpl*)iface; - if (This->owner->mCallbacks.HALDDSurface.dwFlags & DDHAL_SURFCB32_LOCK) + if (This->Owner->mCallbacks.HALDDSurface.dwFlags & DDHAL_SURFCB32_LOCK) { return Hal_DDrawSurface_Unlock( iface, pRect); } @@ -125,7 +125,7 @@ Main_DDrawSurface_AddAttachedSurface(LPDIRECTDRAWSURFACE7 iface, That = (IDirectDrawSurfaceImpl*)pAttach; //FIXME Have I put This and That in right order ?? DdAttachSurface(from, to) - return DdAttachSurface( That->Surf->mpPrimaryLocals[0],This->Surf->mpPrimaryLocals[0]); + return DdAttachSurface( That->Owner->mpPrimaryLocals[0],This->Owner->mpPrimaryLocals[0]); } /* MSDN: "not currently implemented." */ @@ -213,7 +213,7 @@ Main_DDrawSurface_Flip(LPDIRECTDRAWSURFACE7 iface, IDirectDrawSurfaceImpl* This = (IDirectDrawSurfaceImpl*)iface; - if (This->owner->mCallbacks.HALDDSurface.dwFlags & DDHAL_SURFCB32_FLIP) + if (This->Owner->mCallbacks.HALDDSurface.dwFlags & DDHAL_SURFCB32_FLIP) { return Hal_DDrawSurface_Flip(iface, override, dwFlags); } @@ -246,7 +246,7 @@ Main_DDrawSurface_GetBltStatus(LPDIRECTDRAWSURFACE7 iface, DWORD dwFlags) IDirectDrawSurfaceImpl* This = (IDirectDrawSurfaceImpl*)iface; - if (This->owner->mCallbacks.HALDDSurface.dwFlags & DDHAL_SURFCB32_FLIP) + if (This->Owner->mCallbacks.HALDDSurface.dwFlags & DDHAL_SURFCB32_FLIP) { return Hal_DDrawSurface_GetBltStatus( iface, dwFlags); } @@ -274,7 +274,7 @@ Main_DDrawSurface_GetCaps(LPDIRECTDRAWSURFACE7 iface, LPDDSCAPS2 pCaps) This = (IDirectDrawSurfaceImpl*)iface; RtlZeroMemory(pCaps,sizeof(DDSCAPS2)); - pCaps->dwCaps = This->Surf->mddsdPrimary.ddsCaps.dwCaps; + pCaps->dwCaps = This->Owner->mddsdPrimary.ddsCaps.dwCaps; return DD_OK; } @@ -321,14 +321,14 @@ Main_DDrawSurface_GetDC(LPDIRECTDRAWSURFACE7 iface, HDC *phDC) for now we aussme the surface exits and create the hDC for it */ - if ((HDC)This->Surf->mPrimaryLocal.hDC == NULL) + if ((HDC)This->Owner->mPrimaryLocal.hDC == NULL) { - This->Surf->mPrimaryLocal.hDC = (ULONG_PTR)GetDC((HWND)This->owner->mDDrawGlobal.lpExclusiveOwner->hWnd); - *phDC = (HDC)This->Surf->mPrimaryLocal.hDC; + This->Owner->mPrimaryLocal.hDC = (ULONG_PTR)GetDC((HWND)This->Owner->mDDrawGlobal.lpExclusiveOwner->hWnd); + *phDC = (HDC)This->Owner->mPrimaryLocal.hDC; } else { - *phDC = (HDC)This->Surf->mpPrimaryLocals[0]->hDC; + *phDC = (HDC)This->Owner->mpPrimaryLocals[0]->hDC; } return DD_OK; @@ -420,7 +420,7 @@ Main_DDrawSurface_GetSurfaceDesc(LPDIRECTDRAWSURFACE7 iface, } RtlZeroMemory(pDDSD,dwSize); - memcpy(pDDSD, &This->Surf->mddsdPrimary, sizeof(DDSURFACEDESC)); + memcpy(pDDSD, &This->Owner->mddsdPrimary, sizeof(DDSURFACEDESC)); pDDSD->dwSize = dwSize; return DD_OK; @@ -480,12 +480,12 @@ Main_DDrawSurface_ReleaseDC(LPDIRECTDRAWSURFACE7 iface, HDC hDC) /* FIXME check if surface exits or not */ - if ((HDC)This->Surf->mPrimaryLocal.hDC == NULL) + if ((HDC)This->Owner->mPrimaryLocal.hDC == NULL) { return DDERR_GENERIC; } - ReleaseDC((HWND)This->owner->mDDrawGlobal.lpExclusiveOwner->hWnd,hDC); + ReleaseDC((HWND)This->Owner->mDDrawGlobal.lpExclusiveOwner->hWnd,hDC); return DD_OK; } @@ -507,7 +507,7 @@ Main_DDrawSurface_SetColorKey (LPDIRECTDRAWSURFACE7 iface, IDirectDrawSurfaceImpl* This = (IDirectDrawSurfaceImpl*)iface; - if (This->owner->mCallbacks.HALDDSurface.dwFlags & DDHAL_SURFCB32_SETCOLORKEY) + if (This->Owner->mCallbacks.HALDDSurface.dwFlags & DDHAL_SURFCB32_SETCOLORKEY) { return Hal_DDrawSurface_SetColorKey (iface, dwFlags, pCKey); } @@ -575,7 +575,7 @@ Main_DDrawSurface_UpdateOverlayDisplay (LPDIRECTDRAWSURFACE7 iface, IDirectDrawSurfaceImpl* This = (IDirectDrawSurfaceImpl*)iface; - if (This->owner->mCallbacks.HALDDSurface.dwFlags & DDHAL_SURFCB32_UPDATEOVERLAY) + if (This->Owner->mCallbacks.HALDDSurface.dwFlags & DDHAL_SURFCB32_UPDATEOVERLAY) { return Hal_DDrawSurface_UpdateOverlayDisplay ( iface, dwFlags); } diff --git a/reactos/dll/directx/ddraw/rosdraw.h b/reactos/dll/directx/ddraw/rosdraw.h index 0c23f5fc738..b1240ca783b 100644 --- a/reactos/dll/directx/ddraw/rosdraw.h +++ b/reactos/dll/directx/ddraw/rosdraw.h @@ -82,20 +82,28 @@ typedef struct DDHAL_CREATESURFACEDATA mDdCreateSurface; DDHAL_CANCREATESURFACEDATA mDdCanCreateSurface; + /* Primarey surface we must reach it from every where */ + DDRAWI_DDRAWSURFACE_GBL mPrimaryGlobal; + DDRAWI_DDRAWSURFACE_MORE mPrimaryMore; + DDRAWI_DDRAWSURFACE_LCL mPrimaryLocal; + DDRAWI_DDRAWSURFACE_LCL *mpPrimaryLocals[1]; + DDRAWI_DDRAWCLIPPER_LCL mPrimaryClipperLocal; + DDRAWI_DDRAWCLIPPER_GBL mPrimaryClipperGlobal; + + DDSURFACEDESC mddsdPrimary; + } IDirectDrawImpl; /******** Surface Object ********/ typedef struct { - DDRAWI_DDRAWSURFACE_GBL mPrimaryGlobal; - DDRAWI_DDRAWSURFACE_MORE mPrimaryMore; - DDRAWI_DDRAWSURFACE_LCL mPrimaryLocal; - DDRAWI_DDRAWSURFACE_LCL *mpPrimaryLocals[1]; - DDRAWI_DDRAWCLIPPER_LCL mPrimaryClipperLocal; - DDRAWI_DDRAWCLIPPER_GBL mPrimaryClipperGlobal; - - DDSURFACEDESC mddsdPrimary; + DDRAWI_DDRAWSURFACE_GBL mSurfGlobal; + DDRAWI_DDRAWSURFACE_MORE mSurfMore; + DDRAWI_DDRAWSURFACE_LCL mSurfLocal; + DDRAWI_DDRAWSURFACE_LCL *mpSurfLocals[1]; + DDRAWI_DDRAWCLIPPER_LCL mSurfClipperLocal; + DDRAWI_DDRAWCLIPPER_GBL mSurfClipperGlobal; DDRAWI_DDRAWSURFACE_GBL mOverlayGlobal; DDRAWI_DDRAWSURFACE_LCL mOverlayLocal[6]; @@ -111,7 +119,7 @@ typedef struct IDirectDrawSurface7Vtbl* lpVtbl; IDirectDrawSurface3Vtbl* lpVtbl_v3; - IDirectDrawImpl* owner; + IDirectDrawImpl* Owner; DDRAWI_DDRAWSURFACE_GBL Global; DDRAWI_DDRAWSURFACE_MORE More; @@ -233,9 +241,9 @@ DWORD CALLBACK HelDdCreateSurface(LPDDHAL_CREATESURFACEDATA lpCreateSurface); firstcall = FALSE; \ } -#define DX_WINDBG_trace() +//#define DX_WINDBG_trace() + -/* #define DX_WINDBG_trace() \ static BOOL firstcallx = TRUE; \ if (firstcallx) \ @@ -245,7 +253,7 @@ DWORD CALLBACK HelDdCreateSurface(LPDDHAL_CREATESURFACEDATA lpCreateSurface); OutputDebugStringA(buffer); \ firstcallx = TRUE; \ } -*/ + #define DX_WINDBG_trace_res(width,height,bpp) \ static BOOL firstcallxx = TRUE; \