[ros-diffs] [greatlrd] 23266: revert Revision: 23263 and Revision: 23262 something is wrong with them

greatlrd at svn.reactos.org greatlrd at svn.reactos.org
Mon Jul 24 17:37:03 CEST 2006


Author: greatlrd
Date: Mon Jul 24 19:37:03 2006
New Revision: 23266

URL: http://svn.reactos.org/svn/reactos?rev=23266&view=rev
Log:
revert Revision: 23263 and Revision: 23262 something is wrong with them


Modified:
    trunk/reactos/dll/directx/ddraw/hal/surface_hal.c
    trunk/reactos/dll/directx/ddraw/main/ddraw_main.c
    trunk/reactos/dll/directx/ddraw/main/surface_main.c
    trunk/reactos/dll/directx/ddraw/rosdraw.h
    trunk/reactos/dll/directx/ddraw/startup.c

Modified: trunk/reactos/dll/directx/ddraw/hal/surface_hal.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/directx/ddraw/hal/surface_hal.c?rev=23266&r1=23265&r2=23266&view=diff
==============================================================================
--- trunk/reactos/dll/directx/ddraw/hal/surface_hal.c (original)
+++ trunk/reactos/dll/directx/ddraw/hal/surface_hal.c Mon Jul 24 19:37:03 2006
@@ -35,9 +35,9 @@
               return DDERR_NODRIVERSUPPORT;
         }
 
-        mDdBlt.lpDDDestSurface = This->Surf->mpPrimaryLocals[0];
-
-        if (!DdResetVisrgn(This->Surf->mpPrimaryLocals[0], NULL)) 
+        mDdBlt.lpDDDestSurface = This->Owner->mpPrimaryLocals[0];
+
+        if (!DdResetVisrgn(This->Owner->mpPrimaryLocals[0], NULL)) 
         {      
               return DDERR_NOGDI;
         }
@@ -113,7 +113,7 @@
    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 @@
         {
             RtlZeroMemory(pDDSD,sizeof(DDSURFACEDESC2));
             // FIXME the interanl mddsdPrimary shall be DDSURFACEDESC2
-            memcpy(pDDSD,&This->Surf->mddsdPrimary,sizeof(DDSURFACEDESC2));
+            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);
         }
 

Modified: trunk/reactos/dll/directx/ddraw/main/ddraw_main.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/directx/ddraw/main/ddraw_main.c?rev=23266&r1=23265&r2=23266&view=diff
==============================================================================
--- trunk/reactos/dll/directx/ddraw/main/ddraw_main.c (original)
+++ trunk/reactos/dll/directx/ddraw/main/ddraw_main.c Mon Jul 24 19:37:03 2006
@@ -260,6 +260,315 @@
 
 
 
+const DDPIXELFORMAT pixelformats[] =
+{
+    /* 8bpp paletted */
+     { sizeof(DDPIXELFORMAT), DDPF_RGB, 0, { 24 }, { 0xFF0000 },
+      { 0x00FF00 }, { 0x0000FF } },
+    /* 15bpp 5/5/5 */
+    { sizeof(DDPIXELFORMAT), DDPF_RGB, 0, { 16 }, { 0x7C00 }, { 0x3E0 },
+      { 0x1F } },
+    /* 16bpp 5/6/5 */
+    { sizeof(DDPIXELFORMAT), DDPF_RGB, 0, { 16 }, { 0xF800 }, { 0x7E0 },
+      { 0x1F } },
+    /* 24bpp 8/8/8 */
+    { sizeof(DDPIXELFORMAT), DDPF_RGB, 0, { 24 }, { 0xFF0000 },
+      { 0x00FF00 }, { 0x0000FF } },
+    /* 32bpp 8/8/8 */
+    { sizeof(DDPIXELFORMAT), DDPF_RGB, 0, { 32 }, { 0xFF0000 },
+      { 0x00FF00 }, { 0x0000FF } }
+};
+
+const DWORD pixelformatsCount = sizeof(pixelformats) / sizeof(DDPIXELFORMAT);
+
+/* more surface format not adding it */
+      /* 4 bit  paletted  0 */
+      //   sizeof(DDPIXELFORMAT), DDPF_RGB | DDPF_PALETTEINDEXED4, 0, 4, 0x00, 0x00, 0x00, 0x00
+
+      ///* 8bpp paletted  1 */
+      //{sizeof(DDPIXELFORMAT), DDPF_RGB|DDPF_PALETTEINDEXED8, 0, 8, 0, 0, 0, 0},
+
+      ///* 15bpp 5:5:5 RGB  2 */
+      //{sizeof(DDPIXELFORMAT), DDPF_RGB, 0, 16, 0x7c00, 0x03e0, 0x001f, 0},
+
+      ///* 15bpp 1:5:5:5 ARGB 3 */
+      //{sizeof(DDPIXELFORMAT), DDPF_RGB | DDPF_ALPHAPIXELS, 0, 16, 0x7c00, 0x03e0, 0x001f, 0x8000},
+
+      ///* 16bpp 5:6:5 RGB  4 */
+      //{sizeof(DDPIXELFORMAT), DDPF_RGB, 0, 16, 0xf800, 0x07e0, 0x001f, 0}                                 
+
+      ///* 16bpp 4:4:4:4 ARGB 5 */
+      //{sizeof(DDPIXELFORMAT), DDPF_RGB | DDPF_ALPHAPIXELS,´0, 16,       0x0f00,      0x00f0, 0x000f, 0xf000},
+
+      /* 24bpp 8/8/8 RGB 6 */
+      //  {sizeof(DDPIXELFORMAT), DDPF_RGB,                    0,  24 ,  0x00FF0000, 0x0000FF00 , 0x000000FF, 0 },
+
+      /* 32bpp 8:8:8 RGB  7 */
+      //   {sizeof(DDPIXELFORMAT), DDPF_RGB, 0, 32, 0x00ff0000, 0x0000ff00, 0x000000ff, 0},                     
+ 
+      /* 32bpp 8:8:8:8 ARGB  8*/
+       // {sizeof(DDPIXELFORMAT), DDPF_RGB | DDPF_ALPHAPIXELS, 0, 32, 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000}
+      
+
+
+
+/*
+ * IMPLEMENT
+ * Status this api is finish and is 100% correct 
+ */
+HRESULT 
+WINAPI 
+Main_DirectDraw_Initialize (LPDIRECTDRAW7 iface, LPGUID lpGUID)
+{       
+    DX_WINDBG_trace();
+
+    IDirectDrawImpl* This = (IDirectDrawImpl*)iface;
+       
+	if (iface==NULL) 
+	{
+		return DDERR_NOTINITIALIZED;
+	}
+
+	if (This->InitializeDraw == TRUE)
+	{
+        return DDERR_ALREADYINITIALIZED;
+	}
+	else
+	{
+     This->InitializeDraw = TRUE;
+    }
+
+    return DD_OK;
+}
+
+
+
+
+
+
+/*
+ * IMPLEMENT
+ * Status 
+ * not finish yet but is working fine 
+ * it prevent memmory leaks at exit
+ */
+
+
+
+
+
+
+HRESULT WINAPI Main_DirectDraw_SetCooperativeLevel (LPDIRECTDRAW7 iface, HWND hwnd, DWORD cooplevel)
+{
+    // TODO:                                                            
+    // - create a scaner that check which driver we should get the HDC from    
+    //   for now we always asume it is the active dirver that should be use.
+    // - allow more Flags
+
+    DX_WINDBG_trace();
+
+    IDirectDrawImpl* This = (IDirectDrawImpl*)iface;
+    DDHAL_SETEXCLUSIVEMODEDATA SetExclusiveMode;
+    
+    // check the parameters
+    if ((This->cooperative_level == cooplevel) && ((HWND)This->mDDrawGlobal.lpExclusiveOwner->hWnd  == hwnd))
+        return DD_OK;
+    
+    if (This->cooperative_level)
+        return DDERR_EXCLUSIVEMODEALREADYSET;
+
+    if ((cooplevel&DDSCL_EXCLUSIVE) && !(cooplevel&DDSCL_FULLSCREEN))
+        return DDERR_INVALIDPARAMS;
+
+    if (cooplevel&DDSCL_NORMAL && cooplevel&DDSCL_FULLSCREEN)
+        return DDERR_INVALIDPARAMS;
+
+    // set the data
+    This->mDDrawGlobal.lpExclusiveOwner->hWnd = (ULONG_PTR) hwnd;
+    This->mDDrawGlobal.lpExclusiveOwner->hDC  = (ULONG_PTR)GetDC(hwnd);
+
+	
+	/* FIXME : fill the  mDDrawGlobal.lpExclusiveOwner->dwLocalFlags right */
+	//mDDrawGlobal.lpExclusiveOwner->dwLocalFlags
+
+    This->cooperative_level = cooplevel;
+
+    if ((This->mDDrawGlobal.lpDDCBtmp->HALDD.dwFlags & DDHAL_CB32_SETEXCLUSIVEMODE)) 
+    {       
+        DX_STUB_str("HAL \n");
+        SetExclusiveMode.SetExclusiveMode = This->mDDrawGlobal.lpDDCBtmp->HALDD.SetExclusiveMode;                            
+    }
+    else
+    {
+        DX_STUB_str("HEL \n");
+        SetExclusiveMode.SetExclusiveMode = This->mDDrawGlobal.lpDDCBtmp->HELDD.SetExclusiveMode;
+    }
+             
+    SetExclusiveMode.lpDD = &This->mDDrawGlobal;
+    SetExclusiveMode.ddRVal = DDERR_NOTPALETTIZED;
+    SetExclusiveMode.dwEnterExcl = This->cooperative_level;
+     
+    if (SetExclusiveMode.SetExclusiveMode(&SetExclusiveMode) != DDHAL_DRIVER_HANDLED)
+    {
+        return DDERR_NODRIVERSUPPORT;
+    }
+
+    return SetExclusiveMode.ddRVal;               
+}
+
+HRESULT WINAPI Main_DirectDraw_SetDisplayMode (LPDIRECTDRAW7 iface, DWORD dwWidth, DWORD dwHeight, 
+                                                                DWORD dwBPP, DWORD dwRefreshRate, DWORD dwFlags)
+{
+    DX_WINDBG_trace();
+
+    IDirectDrawImpl* This = (IDirectDrawImpl*)iface;
+	//BOOL dummy = TRUE;	
+		
+	DX_WINDBG_trace_res((int)dwWidth, (int)dwHeight, (int)dwBPP );
+	/* FIXME check the refresrate if it same if it not same do the mode switch */
+	if ((This->mDDrawGlobal.vmiData.dwDisplayHeight == dwHeight) && 
+		(This->mDDrawGlobal.vmiData.dwDisplayWidth == dwWidth)  && 
+		(This->mDDrawGlobal.vmiData.ddpfDisplay.dwRGBBitCount == dwBPP))  
+		{
+          
+		  return DD_OK;
+		}
+
+	if (This->mDdSetMode.SetMode == NULL )
+	{
+		return DDERR_NODRIVERSUPPORT;
+	}
+
+	
+	This->mDdSetMode.ddRVal = DDERR_NODRIVERSUPPORT;
+
+    // FIXME : fill the mode.inexcl; 
+    // FIXME : fill the mode.useRefreshRate; 
+    
+	/* FIXME 
+	   we hardcoding modIndex list we should 
+	   try getting it from ReactOS instead and compare it 
+	   for now a small hack for do, using VBE 3.0 mode
+	   index table todo it. 
+	*/
+
+	/* 320x200   15, 16, 32 */
+	if ((dwHeight == 200) && (dwWidth == 320)  && (dwBPP == 15))  
+	{          
+	    This->mDdSetMode.dwModeIndex  = 0x10d;
+	}
+
+	if ((dwHeight == 200) && (dwWidth == 320)  && (dwBPP == 16))  
+	{          
+	    This->mDdSetMode.dwModeIndex  = 0x10e;
+	}
+
+	if ((dwHeight == 200) && (dwWidth == 320)  && (dwBPP == 32))  
+	{          
+	    This->mDdSetMode.dwModeIndex  = 0x10f;
+	}
+
+
+	/* 640x400   8 */
+	if ((dwHeight == 400) && (dwWidth == 640)  && (dwBPP == 8))  
+	{          
+	    This->mDdSetMode.dwModeIndex  = 0x100;
+	}
+
+    /* 640x480   8, 15, 16 , 32*/
+	if ((dwHeight == 480) && (dwWidth == 640)  && (dwBPP == 8))  
+	{          
+	    This->mDdSetMode.dwModeIndex  = 0x101;
+	}
+
+	if ((dwHeight == 480) && (dwWidth == 640)  && (dwBPP == 15))  
+	{          
+	    This->mDdSetMode.dwModeIndex  = 0x110;
+	}
+
+	if ((dwHeight == 480) && (dwWidth == 640)  && (dwBPP == 16))  
+	{          
+	    This->mDdSetMode.dwModeIndex  = 0x111;
+	}
+
+	if ((dwHeight == 480) && (dwWidth == 640)  && (dwBPP == 32))  
+	{          
+	    This->mDdSetMode.dwModeIndex  = 0x112;
+	}
+
+	/* 800x600  4, 8, 15, 16 , 32*/
+	if ((dwHeight == 600) && (dwWidth == 800)  && (dwBPP == 4))  
+	{          
+	    This->mDdSetMode.dwModeIndex  = 0x102;
+	}
+	
+	if ((dwHeight == 600) && (dwWidth == 800)  && (dwBPP == 8))  
+	{          
+	    This->mDdSetMode.dwModeIndex  = 0x103;
+	}
+
+	if ((dwHeight == 600) && (dwWidth == 800)  && (dwBPP == 15))  
+	{          
+	    This->mDdSetMode.dwModeIndex  = 0x113;
+	}
+
+	if ((dwHeight == 600) && (dwWidth == 800)  && (dwBPP == 16))  
+	{          
+	    This->mDdSetMode.dwModeIndex  = 0x114;
+	}
+
+	if ((dwHeight == 600) && (dwWidth == 800)  && (dwBPP == 32))  
+	{          
+	    This->mDdSetMode.dwModeIndex  = 0x115;
+	}
+
+    /* 1024x768 8, 15, 16 , 32*/
+
+	if ((dwHeight == 768) && (dwWidth == 1024)  && (dwBPP == 4))  
+	{          
+	    This->mDdSetMode.dwModeIndex  = 0x104;
+	}
+
+	if ((dwHeight == 768) && (dwWidth == 1024)  && (dwBPP == 8))  
+	{          
+	    This->mDdSetMode.dwModeIndex  = 0x105;
+	}
+
+	if ((dwHeight == 768) && (dwWidth == 1024)  && (dwBPP == 15))  
+	{          
+	    This->mDdSetMode.dwModeIndex  = 0x116;
+	}
+	if ((dwHeight == 768) && (dwWidth == 1024)  && (dwBPP == 16))  
+	{          
+	    This->mDdSetMode.dwModeIndex  = 0x117;
+	}
+
+	if ((dwHeight == 768) && (dwWidth == 1024)  && (dwBPP == 32))  
+	{          
+	    This->mDdSetMode.dwModeIndex   = 0x118;
+	}
+
+	/* not coding for 1280x1024 */
+	
+
+	if (This->mDdSetMode.SetMode(&This->mDdSetMode)==DDHAL_DRIVER_HANDLED);
+    {
+		
+		//if (This->mDdSetMode.ddRVal == DD_OK)
+	    //{
+	    //	// DdReenableDirectDrawObject(&This->mDDrawGlobal, &dummy);
+	    //	/* FIXME fill the This->DirectDrawGlobal.vmiData right */
+	    //}
+
+		return This->mDdSetMode.ddRVal;
+	}
+	return  DDERR_NODRIVERSUPPORT;	 		    	
+}
+
+
+
+
+
 
 HRESULT WINAPI Main_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDESC2 pDDSD,
                                             LPDIRECTDRAWSURFACE7 *ppSurf, IUnknown *pUnkOuter) 
@@ -268,140 +577,113 @@
 
     DxSurf *surf;
 
-	IDirectDrawImpl* This = (IDirectDrawImpl*)iface;
+    if (pUnkOuter!=NULL) 
+        return DDERR_INVALIDPARAMS; 
+
+    if(sizeof(DDSURFACEDESC2)!=pDDSD->dwSize && sizeof(DDSURFACEDESC)!=pDDSD->dwSize)
+        return DDERR_UNSUPPORTED;
+
+    // the nasty com stuff
+    IDirectDrawImpl* This = (IDirectDrawImpl*)iface;
 
     IDirectDrawSurfaceImpl* That; 
 
-
-	if (pUnkOuter!=NULL)       
-    {
-		DX_STUB_str("Fail Main_DirectDraw_CreateSurface CLASS_E_NOAGGREGATION");
-        return CLASS_E_NOAGGREGATION; 
-    }
-
-	if( sizeof(DDSURFACEDESC2)!=pDDSD->dwSize && sizeof(DDSURFACEDESC)!=pDDSD->dwSize)
-	{
-		DX_STUB_str("Fail Main_DirectDraw_CreateSurface DDERR_UNSUPPORTED1");
-	    return DDERR_UNSUPPORTED;
-	}
-
-	if( This == NULL)
-	{
-		DX_STUB_str("Fail Main_DirectDraw_CreateSurface DDERR_UNSUPPORTED2");
-	    return DDERR_UNSUPPORTED;
-	}
-    
-	if (This->mDDrawGlobal.dsList == NULL)
-	{
-		/* Fail alloc memmory at startup */
-		DX_STUB_str("Fail Main_DirectDraw_CreateSurface E_OUTOFMEMORY1");
-	    return E_OUTOFMEMORY;
-	}
-      
-	if (pDDSD->ddsCaps.dwCaps == 0)
-    {        
-        pDDSD->ddsCaps.dwCaps = DDSCAPS_LOCALVIDMEM | DDSCAPS_VIDEOMEMORY;
-    }
-
-	if (pDDSD->ddsCaps.dwCaps & DDSCAPS_ALLOCONLOAD)
-    {       
-        pDDSD->dwFlags &= ~DDSD_LPSURFACE;
-    }
-
-	if ((pDDSD->dwFlags & DDSD_LPSURFACE) && (pDDSD->lpSurface == NULL))
-    {             
-         pDDSD->dwFlags &= ~DDSD_LPSURFACE;
-    }
-
-	That = (IDirectDrawSurfaceImpl*)DxHeapMemAlloc(sizeof(IDirectDrawSurfaceImpl));
+    That = (IDirectDrawSurfaceImpl*)HeapAlloc(GetProcessHeap(), 0, sizeof(IDirectDrawSurfaceImpl));
+    
     if (That == NULL) 
 	{
-		DX_STUB_str("Fail Main_DirectDraw_CreateSurface E_OUTOFMEMORY2");
         return E_OUTOFMEMORY;
 	}
-
-	surf = (DxSurf*)DxHeapMemAlloc(sizeof(DxSurf));
+    ZeroMemory(That, sizeof(IDirectDrawSurfaceImpl));
+    
+    surf = (DxSurf*)HeapAlloc(GetProcessHeap(), 0, sizeof(DxSurf));
+
     if (surf == NULL) 
 	{
-		DX_STUB_str("Fail Main_DirectDraw_CreateSurface E_OUTOFMEMORY3");
-        DxHeapMemFree(That);
+        // FIXME Free memmory at exit
         return E_OUTOFMEMORY;
 	}
-
-    // the nasty com stuff
+    
+ 
     That->lpVtbl = &DirectDrawSurface7_Vtable;
     That->lpVtbl_v3 = &DDRAW_IDDS3_Thunk_VTable;
-	*ppSurf = (LPDIRECTDRAWSURFACE7)That;        
-
-	/* setup some stuff */
+	*ppSurf = (LPDIRECTDRAWSURFACE7)That;
+
+    // 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->Surf = surf;
 
     /* we alwasy set to use the DirectDrawSurface7_Vtable as internel */
     That->Owner->mDDrawGlobal.dsList->lpVtbl = (PVOID) &DirectDrawSurface7_Vtable;
-             
+   
+   
+    That->Surf = surf;
+
+    // UINT i;
+    //IDirectDrawImpl* This = (IDirectDrawImpl*)iface;
+    //IDirectDrawSurfaceImpl* That = ppSurf;        
+
+    
+	
+  
+          
     if (pDDSD->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE)
     {              
-           memcpy(&That->Surf->mddsdPrimary,pDDSD,sizeof(DDSURFACEDESC));
-           That->Surf->mddsdPrimary.dwSize      = sizeof(DDSURFACEDESC);          
+           memcpy(&That->Owner->mddsdPrimary,pDDSD,sizeof(DDSURFACEDESC));
+           That->Owner->mddsdPrimary.dwSize      = sizeof(DDSURFACEDESC);          
            This->mDdCanCreateSurface.bIsDifferentPixelFormat = FALSE; 
-           This->mDdCanCreateSurface.lpDDSurfaceDesc = (DDSURFACEDESC*)&That->Surf->mddsdPrimary; 
+           This->mDdCanCreateSurface.lpDDSurfaceDesc = (DDSURFACEDESC*)&That->Owner->mddsdPrimary; 
 
            if (This->mDdCanCreateSurface.CanCreateSurface(&This->mDdCanCreateSurface)== DDHAL_DRIVER_NOTHANDLED) 
-           {  
-			  DX_STUB_str("Fail Main_DirectDraw_CreateSurface DDERR_NOTINITIALIZED1");
-			  DxHeapMemFree(That);
-			  DxHeapMemFree(surf);
+           {         
               return DDERR_NOTINITIALIZED;
            }
 
            if (This->mDdCanCreateSurface.ddRVal != DD_OK)
            {
-			  DX_STUB_str("Fail Main_DirectDraw_CreateSurface DDERR_NOTINITIALIZED2");
-			  DxHeapMemFree(That);
-			  DxHeapMemFree(surf);
               return DDERR_NOTINITIALIZED;
            }
 
-           memset(&That->Surf->mPrimaryMore,   0, sizeof(DDRAWI_DDRAWSURFACE_MORE));
-           That->Surf->mPrimaryMore.dwSize = sizeof(DDRAWI_DDRAWSURFACE_MORE);
-
-           memset(&That->Surf->mPrimaryLocal,  0, sizeof(DDRAWI_DDRAWSURFACE_LCL));
-           That->Surf->mPrimaryLocal.lpGbl = &That->Owner->mPrimaryGlobal;
-           That->Surf->mPrimaryLocal.lpSurfMore = &That->Surf->mPrimaryMore;
-           That->Surf->mPrimaryLocal.dwProcessId = GetCurrentProcessId();
+           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->Owner->mPrimaryMore,   0, sizeof(DDRAWI_DDRAWSURFACE_MORE));
+           That->Owner->mPrimaryMore.dwSize = sizeof(DDRAWI_DDRAWSURFACE_MORE);
+
+           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;
-
-		   /*
-		       FIXME we are now supproting DDSURFACEDESC2 in rosdraw.h we need make use of it it
-		    */
-           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 = (DDSURFACEDESC*)&That->Surf->mddsdPrimary;
-           This->mDdCreateSurface.lplpSList = That->Surf->mpPrimaryLocals;
+
+           This->mDdCreateSurface.lpDDSurfaceDesc = (DDSURFACEDESC*)&That->Owner->mddsdPrimary;
+           This->mDdCreateSurface.lplpSList = That->Owner->mpPrimaryLocals;
            This->mDdCreateSurface.dwSCnt = This->mDDrawGlobal.dsList->dwIntRefCnt ; 
 
             
            if (This->mDdCreateSurface.CreateSurface(&This->mDdCreateSurface) == DDHAL_DRIVER_NOTHANDLED)
            {
-			  DX_STUB_str("Fail Main_DirectDraw_CreateSurface DDERR_NOTINITIALIZED3");
-			  DxHeapMemFree(That);
-			  DxHeapMemFree(surf);
               return DDERR_NOTINITIALIZED;
            }
 
            if (This->mDdCreateSurface.ddRVal != DD_OK) 
            {   
-              DX_STUB_str("Fail Main_DirectDraw_CreateSurface ERROR");
-			  DxHeapMemFree(That);
-			  DxHeapMemFree(surf);
               return This->mDdCreateSurface.ddRVal;
            }
                      
@@ -418,51 +700,157 @@
               DDSD_ZBUFFERBITDEPTH
            */
 
-           That->Surf->mddsdPrimary.dwFlags = DDSD_CAPS + DDSD_PIXELFORMAT;
-           RtlCopyMemory(&That->Surf->mddsdPrimary.ddpfPixelFormat,&This->mDDrawGlobal.vmiData.ddpfDisplay,sizeof(DDPIXELFORMAT));
+           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;
            }
 
-           That->Surf->mpInUseSurfaceLocals[0] = &That->Surf->mPrimaryLocal;
-
-		   DX_STUB_str("Fail Main_DirectDraw_CreateSurface OK");
+           That->Surf->mpInUseSurfaceLocals[0] = &That->Owner->mPrimaryLocal;
            return DD_OK;
 
         }
         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;
+            That->Surf->mddsdOverlay.ddsCaps.dwCaps = DDSCAPS_OVERLAY | DDSCAPS_VIDEOMEMORY | DDSCAPS_LOCALVIDMEM | DDSCAPS_COMPLEX | DDSCAPS_FLIP;
+            
+            That->Surf->mddsdOverlay.dwWidth = pDDSD->dwWidth;  //pels;
+            That->Surf->mddsdOverlay.dwHeight = pDDSD->dwHeight; // lines;
+            That->Surf->mddsdOverlay.dwBackBufferCount = 1; //cBuffers;
+
+            That->Surf->mddsdOverlay.ddpfPixelFormat.dwSize = pDDSD->ddpfPixelFormat.dwSize;
+            That->Surf->mddsdOverlay.ddpfPixelFormat.dwFlags = pDDSD->ddpfPixelFormat.dwFlags;
+            That->Surf->mddsdOverlay.ddpfPixelFormat.dwRGBBitCount = pDDSD->ddpfPixelFormat.dwRGBBitCount;
+                                     
+            DDHAL_CANCREATESURFACEDATA   mDdCanCreateSurface;
+            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 (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;
+                      
+           memset(&That->Surf->mOverlayMore[0], 0, sizeof(DDRAWI_DDRAWSURFACE_MORE));
+           That->Surf->mOverlayMore[0].dwSize = sizeof(DDRAWI_DDRAWSURFACE_MORE);
+
+           memset(&That->Surf->mOverlayLocal[0],  0, sizeof(DDRAWI_DDRAWSURFACE_LCL));
+           That->Surf->mOverlayLocal[0].lpGbl = &That->Surf->mOverlayGlobal;
+           That->Surf->mOverlayLocal[0].lpSurfMore = &That->Surf->mOverlayMore[0];
+           That->Surf-> mOverlayLocal[0].dwProcessId = GetCurrentProcessId();
+           That->Surf->mOverlayLocal[0].dwFlags = DDRAWISURF_IMPLICITROOT|DDRAWISURF_FRONTBUFFER;
+
+           That->Surf->mOverlayLocal[0].dwFlags |= 
+                                DDRAWISURF_ATTACHED|DDRAWISURF_ATTACHED_FROM|
+                                DDRAWISURF_HASPIXELFORMAT|
+                                DDRAWISURF_HASOVERLAYDATA;
+
+            That->Surf->mOverlayLocal[0].ddsCaps.dwCaps = That->Surf->mddsdOverlay.ddsCaps.dwCaps;
+            That->Surf->mpOverlayLocals[0] = &That->Surf->mOverlayLocal[0];
+            
+
+           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;
+            }
+*/
+           
+            That->Surf->mpInUseSurfaceLocals[0] = That->Surf->mpOverlayLocals[0];            
+            return DD_OK;          
         }	
         else if (pDDSD->ddsCaps.dwCaps & DDSCAPS_BACKBUFFER)
         {
@@ -481,276 +869,9 @@
            DX_STUB_str( "Can not create offscreenplain surface");
         }
   
-	DxHeapMemFree(That);
-	DxHeapMemFree(surf);
     return DDERR_INVALIDSURFACETYPE;  
    
 }
-
-
-
-
-
-
-/*
- * IMPLEMENT
- * Status this api is finish and is 100% correct 
- */
-HRESULT 
-WINAPI 
-Main_DirectDraw_Initialize (LPDIRECTDRAW7 iface, LPGUID lpGUID)
-{       
-    DX_WINDBG_trace();
-
-    IDirectDrawImpl* This = (IDirectDrawImpl*)iface;
-       
-	if (iface==NULL) 
-	{
-		return DDERR_NOTINITIALIZED;
-	}
-
-	if (This->InitializeDraw == TRUE)
-	{
-        return DDERR_ALREADYINITIALIZED;
-	}
-	else
-	{
-     This->InitializeDraw = TRUE;
-    }
-
-    return DD_OK;
-}
-
-
-
-
-
-
-/*
- * IMPLEMENT
- * Status 
- * not finish yet but is working fine 
- * it prevent memmory leaks at exit
- */
-
-
-
-
-
-
-HRESULT WINAPI Main_DirectDraw_SetCooperativeLevel (LPDIRECTDRAW7 iface, HWND hwnd, DWORD cooplevel)
-{
-    // TODO:                                                            
-    // - create a scaner that check which driver we should get the HDC from    
-    //   for now we always asume it is the active dirver that should be use.
-    // - allow more Flags
-
-    DX_WINDBG_trace();
-
-    IDirectDrawImpl* This = (IDirectDrawImpl*)iface;
-    DDHAL_SETEXCLUSIVEMODEDATA SetExclusiveMode;
-    
-    // check the parameters
-    if ((This->cooperative_level == cooplevel) && ((HWND)This->mDDrawGlobal.lpExclusiveOwner->hWnd  == hwnd))
-        return DD_OK;
-    
-    if (This->cooperative_level)
-        return DDERR_EXCLUSIVEMODEALREADYSET;
-
-    if ((cooplevel&DDSCL_EXCLUSIVE) && !(cooplevel&DDSCL_FULLSCREEN))
-        return DDERR_INVALIDPARAMS;
-
-    if (cooplevel&DDSCL_NORMAL && cooplevel&DDSCL_FULLSCREEN)
-        return DDERR_INVALIDPARAMS;
-
-    // set the data
-    This->mDDrawGlobal.lpExclusiveOwner->hWnd = (ULONG_PTR) hwnd;
-    This->mDDrawGlobal.lpExclusiveOwner->hDC  = (ULONG_PTR)GetDC(hwnd);
-
-	
-	/* FIXME : fill the  mDDrawGlobal.lpExclusiveOwner->dwLocalFlags right */
-	//mDDrawGlobal.lpExclusiveOwner->dwLocalFlags
-
-    This->cooperative_level = cooplevel;
-
-    if ((This->mDDrawGlobal.lpDDCBtmp->HALDD.dwFlags & DDHAL_CB32_SETEXCLUSIVEMODE)) 
-    {       
-        DX_STUB_str("HAL \n");
-        SetExclusiveMode.SetExclusiveMode = This->mDDrawGlobal.lpDDCBtmp->HALDD.SetExclusiveMode;                            
-    }
-    else
-    {
-        DX_STUB_str("HEL \n");
-        SetExclusiveMode.SetExclusiveMode = This->mDDrawGlobal.lpDDCBtmp->HELDD.SetExclusiveMode;
-    }
-             
-    SetExclusiveMode.lpDD = &This->mDDrawGlobal;
-    SetExclusiveMode.ddRVal = DDERR_NOTPALETTIZED;
-    SetExclusiveMode.dwEnterExcl = This->cooperative_level;
-     
-    if (SetExclusiveMode.SetExclusiveMode(&SetExclusiveMode) != DDHAL_DRIVER_HANDLED)
-    {
-        return DDERR_NODRIVERSUPPORT;
-    }
-
-    return SetExclusiveMode.ddRVal;               
-}
-
-HRESULT WINAPI Main_DirectDraw_SetDisplayMode (LPDIRECTDRAW7 iface, DWORD dwWidth, DWORD dwHeight, 
-                                                                DWORD dwBPP, DWORD dwRefreshRate, DWORD dwFlags)
-{
-    DX_WINDBG_trace();
-
-    IDirectDrawImpl* This = (IDirectDrawImpl*)iface;
-	//BOOL dummy = TRUE;	
-		
-	DX_WINDBG_trace_res((int)dwWidth, (int)dwHeight, (int)dwBPP );
-	/* FIXME check the refresrate if it same if it not same do the mode switch */
-	if ((This->mDDrawGlobal.vmiData.dwDisplayHeight == dwHeight) && 
-		(This->mDDrawGlobal.vmiData.dwDisplayWidth == dwWidth)  && 
-		(This->mDDrawGlobal.vmiData.ddpfDisplay.dwRGBBitCount == dwBPP))  
-		{
-          
-		  return DD_OK;
-		}
-
-	if (This->mDdSetMode.SetMode == NULL )
-	{
-		return DDERR_NODRIVERSUPPORT;
-	}
-
-	
-	This->mDdSetMode.ddRVal = DDERR_NODRIVERSUPPORT;
-
-    // FIXME : fill the mode.inexcl; 
-    // FIXME : fill the mode.useRefreshRate; 
-    
-	/* FIXME 
-	   we hardcoding modIndex list we should 
-	   try getting it from ReactOS instead and compare it 
-	   for now a small hack for do, using VBE 3.0 mode
-	   index table todo it. 
-	*/
-
-	/* 320x200   15, 16, 32 */
-	if ((dwHeight == 200) && (dwWidth == 320)  && (dwBPP == 15))  
-	{          
-	    This->mDdSetMode.dwModeIndex  = 0x10d;
-	}
-
-	if ((dwHeight == 200) && (dwWidth == 320)  && (dwBPP == 16))  
-	{          
-	    This->mDdSetMode.dwModeIndex  = 0x10e;
-	}
-
-	if ((dwHeight == 200) && (dwWidth == 320)  && (dwBPP == 32))  
-	{          
-	    This->mDdSetMode.dwModeIndex  = 0x10f;
-	}
-
-
-	/* 640x400   8 */
-	if ((dwHeight == 400) && (dwWidth == 640)  && (dwBPP == 8))  
-	{          
-	    This->mDdSetMode.dwModeIndex  = 0x100;
-	}
-
-    /* 640x480   8, 15, 16 , 32*/
-	if ((dwHeight == 480) && (dwWidth == 640)  && (dwBPP == 8))  
-	{          
-	    This->mDdSetMode.dwModeIndex  = 0x101;
-	}
-
-	if ((dwHeight == 480) && (dwWidth == 640)  && (dwBPP == 15))  
-	{          
-	    This->mDdSetMode.dwModeIndex  = 0x110;
-	}
-
-	if ((dwHeight == 480) && (dwWidth == 640)  && (dwBPP == 16))  
-	{          
-	    This->mDdSetMode.dwModeIndex  = 0x111;
-	}
-
-	if ((dwHeight == 480) && (dwWidth == 640)  && (dwBPP == 32))  
-	{          
-	    This->mDdSetMode.dwModeIndex  = 0x112;
-	}
-
-	/* 800x600  4, 8, 15, 16 , 32*/
-	if ((dwHeight == 600) && (dwWidth == 800)  && (dwBPP == 4))  
-	{          
-	    This->mDdSetMode.dwModeIndex  = 0x102;
-	}
-	
-	if ((dwHeight == 600) && (dwWidth == 800)  && (dwBPP == 8))  
-	{          
-	    This->mDdSetMode.dwModeIndex  = 0x103;
-	}
-
-	if ((dwHeight == 600) && (dwWidth == 800)  && (dwBPP == 15))  
-	{          
-	    This->mDdSetMode.dwModeIndex  = 0x113;
-	}
-
-	if ((dwHeight == 600) && (dwWidth == 800)  && (dwBPP == 16))  
-	{          
-	    This->mDdSetMode.dwModeIndex  = 0x114;
-	}
-
-	if ((dwHeight == 600) && (dwWidth == 800)  && (dwBPP == 32))  
-	{          
-	    This->mDdSetMode.dwModeIndex  = 0x115;
-	}
-
-    /* 1024x768 8, 15, 16 , 32*/
-
-	if ((dwHeight == 768) && (dwWidth == 1024)  && (dwBPP == 4))  
-	{          
-	    This->mDdSetMode.dwModeIndex  = 0x104;
-	}
-
-	if ((dwHeight == 768) && (dwWidth == 1024)  && (dwBPP == 8))  
-	{          
-	    This->mDdSetMode.dwModeIndex  = 0x105;
-	}
-
-	if ((dwHeight == 768) && (dwWidth == 1024)  && (dwBPP == 15))  
-	{          
-	    This->mDdSetMode.dwModeIndex  = 0x116;
-	}
-	if ((dwHeight == 768) && (dwWidth == 1024)  && (dwBPP == 16))  
-	{          
-	    This->mDdSetMode.dwModeIndex  = 0x117;
-	}
-
-	if ((dwHeight == 768) && (dwWidth == 1024)  && (dwBPP == 32))  
-	{          
-	    This->mDdSetMode.dwModeIndex   = 0x118;
-	}
-
-	/* not coding for 1280x1024 */
-	
-
-	if (This->mDdSetMode.SetMode(&This->mDdSetMode)==DDHAL_DRIVER_HANDLED);
-    {
-		
-		//if (This->mDdSetMode.ddRVal == DD_OK)
-	    //{
-	    //	// DdReenableDirectDrawObject(&This->mDDrawGlobal, &dummy);
-	    //	/* FIXME fill the This->DirectDrawGlobal.vmiData right */
-	    //}
-
-		return This->mDdSetMode.ddRVal;
-	}
-	return  DDERR_NODRIVERSUPPORT;	 		    	
-}
-
-
-
-
-
-
-
 
 
 
@@ -945,7 +1066,108 @@
                  LPDDSURFACEDESC2 pDDSD, LPVOID context, LPDDENUMMODESCALLBACK2 callback) 
 {
     DX_WINDBG_trace();
-    DX_STUB;    
+    
+    IDirectDrawImpl* This = (IDirectDrawImpl*)iface;
+    DDSURFACEDESC2 desc_callback;
+    DEVMODE DevMode;   
+    int iMode=0;
+
+    if (pDDSD!=NULL)
+    {
+        // FIXME fill in pDDSD  
+    }
+
+    RtlZeroMemory(&desc_callback, sizeof(DDSURFACEDESC2));
+    desc_callback.dwSize = sizeof(DDSURFACEDESC2);
+
+    desc_callback.dwFlags = DDSD_HEIGHT|DDSD_WIDTH|DDSD_PIXELFORMAT|DDSD_CAPS | DDSD_PITCH;
+
+    if (dwFlags & DDEDM_REFRESHRATES)
+    {
+	    desc_callback.dwFlags |= DDSD_REFRESHRATE;
+        desc_callback.dwRefreshRate = This->mDDrawGlobal.dwMonitorFrequency;
+    }
+
+  
+    /// FIXME check if the mode are suppretd before sending it back 
+
+    while (EnumDisplaySettingsEx(NULL, iMode, &DevMode, 0))
+    {
+       
+	   if (pDDSD)
+	   {
+	       if ((pDDSD->dwFlags & DDSD_WIDTH) && (pDDSD->dwWidth != DevMode.dmPelsWidth))
+	       continue; 
+	       if ((pDDSD->dwFlags & DDSD_HEIGHT) && (pDDSD->dwHeight != DevMode.dmPelsHeight))
+		   continue; 
+	       if ((pDDSD->dwFlags & DDSD_PIXELFORMAT) && (pDDSD->ddpfPixelFormat.dwFlags & DDPF_RGB) &&
+		   (pDDSD->ddpfPixelFormat.dwRGBBitCount != DevMode.dmBitsPerPel))
+		    continue; 
+       } 
+
+	
+       desc_callback.dwHeight = DevMode.dmPelsHeight;
+	   desc_callback.dwWidth = DevMode.dmPelsWidth;
+
+       if (DevMode.dmFields & DM_DISPLAYFREQUENCY)
+       {
+            desc_callback.dwRefreshRate = DevMode.dmDisplayFrequency;
+       }
+         
+      switch(DevMode.dmBitsPerPel)
+      {
+        case  8:
+            memcpy(&desc_callback.ddpfPixelFormat,&pixelformats[0],sizeof(DDPIXELFORMAT));
+            break;
+
+        case 15:
+            memcpy(&desc_callback.ddpfPixelFormat,&pixelformats[1],sizeof(DDPIXELFORMAT));
+            break;
+
+        case 16: 
+            memcpy(&desc_callback.ddpfPixelFormat,&pixelformats[2],sizeof(DDPIXELFORMAT));
+            break;
+
+
+       case 24: 
+            memcpy(&desc_callback.ddpfPixelFormat,&pixelformats[3],sizeof(DDPIXELFORMAT));
+            break;
+
+       case 32: 
+            memcpy(&desc_callback.ddpfPixelFormat,&pixelformats[4],sizeof(DDPIXELFORMAT));
+            break;
+
+        default:
+            break;          
+      }
+                        
+       if (desc_callback.ddpfPixelFormat.dwRGBBitCount==15)
+       {           
+            desc_callback.lPitch =  DevMode.dmPelsWidth + (8 - ( DevMode.dmPelsWidth % 8)) % 8;
+       }
+       else
+       {
+           desc_callback.lPitch = DevMode.dmPelsWidth * (desc_callback.ddpfPixelFormat.dwRGBBitCount / 8);
+           desc_callback.lPitch =  desc_callback.lPitch + (8 - (desc_callback.lPitch % 8)) % 8;
+       }
+           
+       desc_callback.ddsCaps.dwCaps = 0;
+       if (desc_callback.ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED8) 
+       {
+           desc_callback.ddsCaps.dwCaps |= DDSCAPS_PALETTE;
+       }
+      
+
+       if (callback(&desc_callback, context) == DDENUMRET_CANCEL)
+       {
+
+           return DD_OK;       
+       }
+       
+      iMode++; 
+    }
+
+    return DD_OK;
 }
 
 HRESULT WINAPI Main_DirectDraw_EnumSurfaces(LPDIRECTDRAW7 iface, DWORD dwFlags,

Modified: trunk/reactos/dll/directx/ddraw/main/surface_main.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/directx/ddraw/main/surface_main.c?rev=23266&r1=23265&r2=23266&view=diff
==============================================================================
--- trunk/reactos/dll/directx/ddraw/main/surface_main.c (original)
+++ trunk/reactos/dll/directx/ddraw/main/surface_main.c Mon Jul 24 19:37:03 2006
@@ -125,7 +125,7 @@
    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." */
@@ -274,7 +274,7 @@
     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 @@
       for now we aussme the surface exits and create the hDC for it
     */
      
-    if ((HDC)This->Surf->mPrimaryLocal.hDC == NULL)
-    {
-         This->Surf->mPrimaryLocal.hDC = (ULONG_PTR)GetDC((HWND)This->Owner->mDDrawGlobal.lpExclusiveOwner->hWnd);
-        *phDC = (HDC)This->Surf->mPrimaryLocal.hDC;
+    if ((HDC)This->Owner->mPrimaryLocal.hDC == NULL)
+    {
+         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 @@
     }
     
     RtlZeroMemory(pDDSD,dwSize);
-    memcpy(pDDSD, &This->Surf->mddsdPrimary, sizeof(DDSURFACEDESC));
+    memcpy(pDDSD, &This->Owner->mddsdPrimary, sizeof(DDSURFACEDESC));
     pDDSD->dwSize = dwSize;
    
     return DD_OK;
@@ -482,7 +482,7 @@
    
     /* FIXME check if surface exits or not */
 
-    if ((HDC)This->Surf->mPrimaryLocal.hDC == NULL)
+    if ((HDC)This->Owner->mPrimaryLocal.hDC == NULL)
     {
         return DDERR_GENERIC;         
     }

Modified: trunk/reactos/dll/directx/ddraw/rosdraw.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/directx/ddraw/rosdraw.h?rev=23266&r1=23265&r2=23266&view=diff
==============================================================================
--- trunk/reactos/dll/directx/ddraw/rosdraw.h (original)
+++ trunk/reactos/dll/directx/ddraw/rosdraw.h Mon Jul 24 19:37:03 2006
@@ -94,27 +94,25 @@
     DDHAL_GETSCANLINEDATA mDdGetScanLine;
     DDHAL_SETEXCLUSIVEMODEDATA mDdSetExclusiveMode;
     DDHAL_FLIPTOGDISURFACEDATA mDdFlipToGDISurface;
-   
-	/* adding a switch */
-	DWORD devicetype;
-
-	 /* Primarey surface we must reach it from every where */
-	DDRAWI_DDRAWSURFACE_GBL mPrimaryGlobal;
-	DDRAWI_DDRAWCLIPPER_GBL mPrimaryClipperGlobal;
-
-} IDirectDrawImpl; 
-
-/******** Surface Object ********/
-typedef struct 
-{    
-	/* Primarey surface we must reach it from every where */    
+
+    /* 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;    
-	DDSURFACEDESC2 mddsdPrimary;
-
-
+    DDRAWI_DDRAWCLIPPER_LCL mPrimaryClipperLocal;
+    DDRAWI_DDRAWCLIPPER_GBL mPrimaryClipperGlobal;
+
+    DDSURFACEDESC2 mddsdPrimary;
+
+	/* adding a switch */
+	DWORD devicetype;
+
+} IDirectDrawImpl; 
+
+/******** Surface Object ********/
+typedef struct 
+{    
 
     DDRAWI_DDRAWSURFACE_LCL *mpInUseSurfaceLocals[1];
     
@@ -140,6 +138,12 @@
 	IDirectDrawSurface3Vtbl* lpVtbl_v3;
    
     IDirectDrawImpl* Owner;
+
+	DDRAWI_DDRAWSURFACE_GBL Global; 
+	DDRAWI_DDRAWSURFACE_MORE More; 
+	DDRAWI_DDRAWSURFACE_LCL Local;
+	DDRAWI_DDRAWSURFACE_LCL *pLocal[2]; 
+	DDSURFACEDESC ddsd; 
 
     DxSurf *Surf;
 

Modified: trunk/reactos/dll/directx/ddraw/startup.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/directx/ddraw/startup.c?rev=23266&r1=23265&r2=23266&view=diff
==============================================================================
--- trunk/reactos/dll/directx/ddraw/startup.c (original)
+++ trunk/reactos/dll/directx/ddraw/startup.c Mon Jul 24 19:37:03 2006
@@ -364,17 +364,6 @@
   DriverInfo.dwExpectedSize = sizeof(DDHAL_DDMISCELLANEOUSCALLBACKS);
   This->mHALInfo.GetDriverInfo(&DriverInfo);
 
-  /* Setup global surface */   
-  This->mPrimaryGlobal.dwGlobalFlags = DDRAWISURFGBL_ISGDISURFACE;
-  This->mPrimaryGlobal.lpDD       = &This->mDDrawGlobal;
-  This->mPrimaryGlobal.lpDDHandle = &This->mDDrawGlobal;
-  This->mPrimaryGlobal.wWidth  = (WORD)This->mpModeInfos[0].dwWidth;
-  This->mPrimaryGlobal.wHeight = (WORD)This->mpModeInfos[0].dwHeight;
-  This->mPrimaryGlobal.lPitch  = This->mpModeInfos[0].lPitch;
-
-  /* FIXME free it in cleanup */
-  This->mDDrawGlobal.dsList = (LPDDRAWI_DDRAWSURFACE_INT)DxHeapMemAlloc(sizeof(DDRAWI_DDRAWSURFACE_INT)); 
-
   return DD_OK;
 }
 




More information about the Ros-diffs mailing list