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;
+}
+