diff --git a/reactos/dll/directx/ddraw/ddraw.rbuild b/reactos/dll/directx/ddraw/ddraw.rbuild index ab1a4c792f3..bd194793e48 100644 --- a/reactos/dll/directx/ddraw/ddraw.rbuild +++ b/reactos/dll/directx/ddraw/ddraw.rbuild @@ -17,6 +17,7 @@ ddraw.rc main.c regsvr.c + startup.c helinterface.c clipper.c diff --git a/reactos/dll/directx/ddraw/main.c b/reactos/dll/directx/ddraw/main.c index 259c1c712f3..1b211375fa7 100644 --- a/reactos/dll/directx/ddraw/main.c +++ b/reactos/dll/directx/ddraw/main.c @@ -14,39 +14,6 @@ #include "d3dhal.h" - -/* - * IMPLEMENT - * Status this api is finish and is 100% correct - */ - -HRESULT -WINAPI -Create_DirectDraw (LPGUID pGUID, - LPDIRECTDRAW* pIface, - REFIID id, - BOOL ex) -{ - IDirectDrawImpl* This = (IDirectDrawImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectDrawImpl)); - - if (This == NULL) - return E_OUTOFMEMORY; - - ZeroMemory(This,sizeof(IDirectDrawImpl)); - - This->lpVtbl = &DirectDraw7_Vtable; - This->lpVtbl_v1 = &DDRAW_IDirectDraw_VTable; - This->lpVtbl_v2 = &DDRAW_IDirectDraw2_VTable; - This->lpVtbl_v4 = &DDRAW_IDirectDraw4_VTable; - - *pIface = (LPDIRECTDRAW)This; - - if(This->lpVtbl->QueryInterface ((LPDIRECTDRAW7)This, id, (void**)&pIface) != S_OK) - return DDERR_INVALIDPARAMS; - - return This->lpVtbl->Initialize ((LPDIRECTDRAW7)This, pGUID); -} - /* * IMPLEMENT * Status this api is finish and is 100% correct diff --git a/reactos/dll/directx/ddraw/main/ddraw_main.c b/reactos/dll/directx/ddraw/main/ddraw_main.c index ca2071afecc..7730fac7fcf 100644 --- a/reactos/dll/directx/ddraw/main/ddraw_main.c +++ b/reactos/dll/directx/ddraw/main/ddraw_main.c @@ -69,17 +69,7 @@ const DWORD pixelformatsCount = sizeof(pixelformats) / sizeof(DDPIXELFORMAT); HRESULT WINAPI Main_DirectDraw_Initialize (LPDIRECTDRAW7 iface, LPGUID lpGUID) -{ - DWORD hal_ret; - DWORD hel_ret; - DEVMODE devmode; - HBITMAP hbmp; - const UINT bmiSize = sizeof(BITMAPINFOHEADER) + 0x10; - UCHAR *pbmiData; - BITMAPINFO *pbmi; - DWORD *pMasks; - - +{ DX_WINDBG_trace(); IDirectDrawImpl* This = (IDirectDrawImpl*)iface; @@ -89,7 +79,6 @@ Main_DirectDraw_Initialize (LPDIRECTDRAW7 iface, LPGUID lpGUID) return DDERR_NOTINITIALIZED; } - if (This->InitializeDraw == TRUE) { return DDERR_ALREADYINITIALIZED; @@ -99,121 +88,6 @@ Main_DirectDraw_Initialize (LPDIRECTDRAW7 iface, LPGUID lpGUID) This->InitializeDraw = TRUE; } - RtlZeroMemory(&This->mDDrawGlobal, sizeof(DDRAWI_DIRECTDRAW_GBL)); - - - /* cObsolete is undoc in msdn it being use in CreateDCA */ - RtlCopyMemory(&This->mDDrawGlobal.cObsolete,&"DISPLAY",7); - RtlCopyMemory(&This->mDDrawGlobal.cDriverName,&"DISPLAY",7); - - /* Same for HEL and HAL */ - This->mcModeInfos = 1; - This->mpModeInfos = (DDHALMODEINFO*) DxHeapMemAlloc(This->mcModeInfos * sizeof(DDHALMODEINFO)); - - if (This->mpModeInfos == NULL) - { - return DD_FALSE; - } - - EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &devmode); - - This->mpModeInfos[0].dwWidth = devmode.dmPelsWidth; - This->mpModeInfos[0].dwHeight = devmode.dmPelsHeight; - This->mpModeInfos[0].dwBPP = devmode.dmBitsPerPel; - This->mpModeInfos[0].lPitch = (devmode.dmPelsWidth*devmode.dmBitsPerPel)/8; - This->mpModeInfos[0].wRefreshRate = (WORD)devmode.dmDisplayFrequency; - - This->hdc = CreateDCW(L"DISPLAY",L"DISPLAY",NULL,NULL); - - if (This->hdc == NULL) - { - return DDERR_OUTOFMEMORY ; - } - - hbmp = CreateCompatibleBitmap(This->hdc, 1, 1); - if (hbmp==NULL) - { - DxHeapMemFree(This->mpModeInfos); - DeleteDC(This->hdc); - return DDERR_OUTOFMEMORY; - } - - pbmiData = (UCHAR *) DxHeapMemAlloc(bmiSize); - pbmi = (BITMAPINFO*)pbmiData; - - if (pbmiData==NULL) - { - DxHeapMemFree(This->mpModeInfos); - DeleteDC(This->hdc); - DeleteObject(hbmp); - return DDERR_OUTOFMEMORY; - } - - pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); - pbmi->bmiHeader.biBitCount = (WORD)devmode.dmBitsPerPel; - pbmi->bmiHeader.biCompression = BI_BITFIELDS; - pbmi->bmiHeader.biWidth = 1; - pbmi->bmiHeader.biHeight = 1; - - GetDIBits(This->hdc, hbmp, 0, 0, NULL, pbmi, 0); - DeleteObject(hbmp); - - pMasks = (DWORD*)(pbmiData + sizeof(BITMAPINFOHEADER)); - This->mpModeInfos[0].dwRBitMask = pMasks[0]; - This->mpModeInfos[0].dwGBitMask = pMasks[1]; - This->mpModeInfos[0].dwBBitMask = pMasks[2]; - This->mpModeInfos[0].dwAlphaBitMask = pMasks[3]; - - DxHeapMemFree(pbmiData); - - /* Startup HEL and HAL */ - RtlZeroMemory(&This->mDDrawGlobal, sizeof(DDRAWI_DIRECTDRAW_GBL)); - RtlZeroMemory(&This->mHALInfo, sizeof(DDHALINFO)); - RtlZeroMemory(&This->mCallbacks, sizeof(DDHAL_CALLBACKS)); - - This->mDDrawLocal.lpDDCB = &This->mCallbacks; - This->mDDrawLocal.lpGbl = &This->mDDrawGlobal; - This->mDDrawLocal.dwProcessId = GetCurrentProcessId(); - - This->mDDrawGlobal.lpDDCBtmp = &This->mCallbacks; - This->mDDrawGlobal.lpExclusiveOwner = &This->mDDrawLocal; - - hal_ret = Hal_DirectDraw_Initialize (iface); - hel_ret = Hel_DirectDraw_Initialize (iface); - if ((hal_ret!=DD_OK) && (hel_ret!=DD_OK)) - { - return DDERR_NODIRECTDRAWSUPPORT; - } - - /* - Try figout which api we shall use, first we try see if HAL exits - if it does not we select HEL instead - */ - - if (This->mDDrawGlobal.lpDDCBtmp->HALDD.dwFlags & DDHAL_CB32_CANCREATESURFACE) - { - This->mDdCanCreateSurface.CanCreateSurface = This->mCallbacks.HALDD.CanCreateSurface; - } - else - { - This->mDdCanCreateSurface.CanCreateSurface = This->mCallbacks.HELDD.CanCreateSurface; - } - - This->mDdCreateSurface.lpDD = &This->mDDrawGlobal; - - if (This->mDDrawGlobal.lpDDCBtmp->HALDD.dwFlags & DDHAL_CB32_CREATESURFACE) - { - This->mDdCreateSurface.CreateSurface = This->mCallbacks.HALDD.CreateSurface; - } - else - { - This->mDdCreateSurface.CreateSurface = This->mCallbacks.HELDD.CreateSurface; - } - - /* Setup calback struct so we do not need refill same info again */ - This->mDdCreateSurface.lpDD = &This->mDDrawGlobal; - This->mDdCanCreateSurface.lpDD = &This->mDDrawGlobal; - return DD_OK; } diff --git a/reactos/dll/directx/ddraw/rosdraw.h b/reactos/dll/directx/ddraw/rosdraw.h index 576f1296476..b47a15d0257 100644 --- a/reactos/dll/directx/ddraw/rosdraw.h +++ b/reactos/dll/directx/ddraw/rosdraw.h @@ -10,21 +10,10 @@ #include #include +HRESULT WINAPI Create_DirectDraw (LPGUID pGUID, LPDIRECTDRAW* pIface, REFIID id, BOOL ex); -/* this sturct are not longer in DDK - I did recrate it by looking diffent betwin DD_xx struct and _DDHAL strucrt - only diffent I found was the global pointer have been change from LPDDRAWI_DDRAWSURFACE_GBL - to DD_DIRECTDRAW_GLOBAL -*/ - -typedef struct _DDHAL_MAPMEMORYDATA -{ - LPDDRAWI_DDRAWSURFACE_GBL lpDD; - BOOL bMap; - HANDLE hProcess; - FLATPTR fpProcess; - HRESULT ddRVal; -} DDHAL_MAPMEMORYDATA; +HRESULT Hal_DirectDraw_Initialize (LPDIRECTDRAW7 ); +HRESULT Hel_DirectDraw_Initialize (LPDIRECTDRAW7 ); /* own macro to alloc memmory */ #define DxHeapMemAlloc(m) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, m) @@ -228,8 +217,7 @@ extern IDirectDrawSurfaceKernelVtbl DirectDrawSurfaceKernel_Vtable; HRESULT WINAPI Main_DirectDraw_GetAvailableVidMem(LPDIRECTDRAW7 iface, LPDDSCAPS2 ddscaps, LPDWORD total, LPDWORD free); -HRESULT Hal_DirectDraw_Initialize (LPDIRECTDRAW7 ); -HRESULT Hal_DirectDraw_SetCooperativeLevel (LPDIRECTDRAW7 ); + VOID Hal_DirectDraw_Release (LPDIRECTDRAW7 ); HRESULT Hal_DirectDraw_GetAvailableVidMem(LPDIRECTDRAW7, LPDDSCAPS2, LPDWORD, LPDWORD ); HRESULT Hal_DirectDraw_WaitForVerticalBlank(LPDIRECTDRAW7, DWORD, HANDLE ); diff --git a/reactos/dll/directx/ddraw/startup.c b/reactos/dll/directx/ddraw/startup.c new file mode 100644 index 00000000000..5b2bb9d68a4 --- /dev/null +++ b/reactos/dll/directx/ddraw/startup.c @@ -0,0 +1,188 @@ +/* $Id: main.c 21434 2006-04-01 19:12:56Z greatlrd $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * FILE: lib/ddraw/ddraw.c + * PURPOSE: DirectDraw Library + * PROGRAMMER: Magnus Olsen (greatlrd) + * + */ + +#include +#include "rosdraw.h" +#include "d3dhal.h" + + +HRESULT WINAPI +StartDirectDraw(LPDIRECTDRAW* iface) +{ + IDirectDrawImpl* This = (IDirectDrawImpl*)iface; + DWORD hal_ret; + DWORD hel_ret; + DEVMODE devmode; + HBITMAP hbmp; + const UINT bmiSize = sizeof(BITMAPINFOHEADER) + 0x10; + UCHAR *pbmiData; + BITMAPINFO *pbmi; + DWORD *pMasks; + + DX_WINDBG_trace(); + + RtlZeroMemory(&This->mDDrawGlobal, sizeof(DDRAWI_DIRECTDRAW_GBL)); + + /* cObsolete is undoc in msdn it being use in CreateDCA */ + RtlCopyMemory(&This->mDDrawGlobal.cObsolete,&"DISPLAY",7); + RtlCopyMemory(&This->mDDrawGlobal.cDriverName,&"DISPLAY",7); + + /* Same for HEL and HAL */ + This->mcModeInfos = 1; + This->mpModeInfos = (DDHALMODEINFO*) DxHeapMemAlloc(This->mcModeInfos * sizeof(DDHALMODEINFO)); + + if (This->mpModeInfos == NULL) + { + DX_STUB_str("DD_FALSE"); + return DD_FALSE; + } + + EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &devmode); + + This->mpModeInfos[0].dwWidth = devmode.dmPelsWidth; + This->mpModeInfos[0].dwHeight = devmode.dmPelsHeight; + This->mpModeInfos[0].dwBPP = devmode.dmBitsPerPel; + This->mpModeInfos[0].lPitch = (devmode.dmPelsWidth*devmode.dmBitsPerPel)/8; + This->mpModeInfos[0].wRefreshRate = (WORD)devmode.dmDisplayFrequency; + + This->hdc = CreateDCW(L"DISPLAY",L"DISPLAY",NULL,NULL); + + if (This->hdc == NULL) + { + DX_STUB_str("DDERR_OUTOFMEMORY"); + return DDERR_OUTOFMEMORY ; + } + + hbmp = CreateCompatibleBitmap(This->hdc, 1, 1); + if (hbmp==NULL) + { + DxHeapMemFree(This->mpModeInfos); + DeleteDC(This->hdc); + DX_STUB_str("DDERR_OUTOFMEMORY"); + return DDERR_OUTOFMEMORY; + } + + pbmiData = (UCHAR *) DxHeapMemAlloc(bmiSize); + pbmi = (BITMAPINFO*)pbmiData; + + if (pbmiData==NULL) + { + DxHeapMemFree(This->mpModeInfos); + DeleteDC(This->hdc); + DeleteObject(hbmp); + DX_STUB_str("DDERR_OUTOFMEMORY"); + return DDERR_OUTOFMEMORY; + } + + pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + pbmi->bmiHeader.biBitCount = (WORD)devmode.dmBitsPerPel; + pbmi->bmiHeader.biCompression = BI_BITFIELDS; + pbmi->bmiHeader.biWidth = 1; + pbmi->bmiHeader.biHeight = 1; + + GetDIBits(This->hdc, hbmp, 0, 0, NULL, pbmi, 0); + DeleteObject(hbmp); + + pMasks = (DWORD*)(pbmiData + sizeof(BITMAPINFOHEADER)); + This->mpModeInfos[0].dwRBitMask = pMasks[0]; + This->mpModeInfos[0].dwGBitMask = pMasks[1]; + This->mpModeInfos[0].dwBBitMask = pMasks[2]; + This->mpModeInfos[0].dwAlphaBitMask = pMasks[3]; + + DxHeapMemFree(pbmiData); + + /* Startup HEL and HAL */ + RtlZeroMemory(&This->mDDrawGlobal, sizeof(DDRAWI_DIRECTDRAW_GBL)); + RtlZeroMemory(&This->mHALInfo, sizeof(DDHALINFO)); + RtlZeroMemory(&This->mCallbacks, sizeof(DDHAL_CALLBACKS)); + + This->mDDrawLocal.lpDDCB = &This->mCallbacks; + This->mDDrawLocal.lpGbl = &This->mDDrawGlobal; + This->mDDrawLocal.dwProcessId = GetCurrentProcessId(); + + This->mDDrawGlobal.lpDDCBtmp = &This->mCallbacks; + This->mDDrawGlobal.lpExclusiveOwner = &This->mDDrawLocal; + + hal_ret = Hal_DirectDraw_Initialize ((LPDIRECTDRAW7)iface); + hel_ret = Hel_DirectDraw_Initialize ((LPDIRECTDRAW7)iface); + if ((hal_ret!=DD_OK) && (hel_ret!=DD_OK)) + { + DX_STUB_str("DDERR_NODIRECTDRAWSUPPORT"); + return DDERR_NODIRECTDRAWSUPPORT; + } + + /* + Try figout which api we shall use, first we try see if HAL exits + if it does not we select HEL instead + */ + + if (This->mDDrawGlobal.lpDDCBtmp->HALDD.dwFlags & DDHAL_CB32_CANCREATESURFACE) + { + This->mDdCanCreateSurface.CanCreateSurface = This->mCallbacks.HALDD.CanCreateSurface; + } + else + { + This->mDdCanCreateSurface.CanCreateSurface = This->mCallbacks.HELDD.CanCreateSurface; + } + + This->mDdCreateSurface.lpDD = &This->mDDrawGlobal; + + if (This->mDDrawGlobal.lpDDCBtmp->HALDD.dwFlags & DDHAL_CB32_CREATESURFACE) + { + This->mDdCreateSurface.CreateSurface = This->mCallbacks.HALDD.CreateSurface; + } + else + { + This->mDdCreateSurface.CreateSurface = This->mCallbacks.HELDD.CreateSurface; + } + + /* Setup calback struct so we do not need refill same info again */ + This->mDdCreateSurface.lpDD = &This->mDDrawGlobal; + This->mDdCanCreateSurface.lpDD = &This->mDDrawGlobal; + + return DD_OK; +} + +HRESULT +WINAPI +Create_DirectDraw (LPGUID pGUID, + LPDIRECTDRAW* pIface, + REFIID id, + BOOL ex) +{ + IDirectDrawImpl* This = (IDirectDrawImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectDrawImpl)); + + DX_WINDBG_trace(); + + if (This == NULL) + return E_OUTOFMEMORY; + + ZeroMemory(This,sizeof(IDirectDrawImpl)); + + This->lpVtbl = &DirectDraw7_Vtable; + This->lpVtbl_v1 = &DDRAW_IDirectDraw_VTable; + This->lpVtbl_v2 = &DDRAW_IDirectDraw2_VTable; + This->lpVtbl_v4 = &DDRAW_IDirectDraw4_VTable; + + *pIface = (LPDIRECTDRAW)This; + + if(This->lpVtbl->QueryInterface ((LPDIRECTDRAW7)This, id, (void**)&pIface) != S_OK) + { + return DDERR_INVALIDPARAMS; + } + + if (StartDirectDraw((LPDIRECTDRAW*)This) == DD_OK); + { + return This->lpVtbl->Initialize ((LPDIRECTDRAW7)This, pGUID); + } + + return DDERR_INVALIDPARAMS; +} +