Forgot cleanup the code. in Main_setDisplayMode.
[reactos.git] / reactos / lib / ddraw / main / ddraw.c
index d3dc849..295afe5 100644 (file)
@@ -71,83 +71,30 @@ HRESULT WINAPI Main_DirectDraw_SetCooperativeLevel (LPDIRECTDRAW7 iface, HWND hw
        This->hdc = GetDC(hwnd);
        This->cooperative_level = cooplevel;
 
-       if((ret = Hel_DirectDraw_SetCooperativeLevel (iface)) != DD_OK)
-               return ret;
+       
 
        if((ret = Hal_DirectDraw_SetCooperativeLevel (iface)) != DD_OK)
                return ret;
 
+       if((ret = Hel_DirectDraw_SetCooperativeLevel (iface)) != DD_OK)
+               return ret;
+
        return DD_OK;
 }
 
 HRESULT WINAPI Main_DirectDraw_SetDisplayMode (LPDIRECTDRAW7 iface, DWORD dwWidth, DWORD dwHeight, 
                                                                                                                                DWORD dwBPP, DWORD dwRefreshRate, DWORD dwFlags)
 {
-    IDirectDrawImpl* This = (IDirectDrawImpl*)iface;
-
-       // this only for exclusive mode
-       if(!(This->cooperative_level & DDSCL_EXCLUSIVE))
-               return DDERR_NOEXCLUSIVEMODE;
-
-       // change the resolution using normal WinAPI function
-       DEVMODE mode;
-       mode.dmSize = sizeof(mode);
-       mode.dmPelsWidth = dwWidth;
-       mode.dmPelsHeight = dwHeight;
-       mode.dmBitsPerPel = dwBPP;
-       mode.dmDisplayFrequency = dwRefreshRate;
-       mode.dmFields = 0;
-
-       if(dwWidth)
-               mode.dmFields |= DM_PELSWIDTH;
-       if(dwHeight)
-               mode.dmFields |= DM_PELSHEIGHT;
-       if(dwBPP)
-               mode.dmFields |= DM_BITSPERPEL;
-       if(dwRefreshRate)
-               mode.dmFields |= DM_DISPLAYFREQUENCY;
-
-       if (ChangeDisplaySettings(&mode, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL)
-               return DDERR_UNSUPPORTEDMODE;
-       
-       // TODO: reactivate ddraw object, maximize window, set it in foreground 
-       // and set excluive mode (if implemented by the driver)
-
-       if(dwWidth)
-               This->Height = dwWidth;
-       if(dwHeight)
-               This->Width = dwHeight;
-       if(dwBPP)
-               This->Bpp = dwBPP;
-
-       return DD_OK;
-}
-
-HRESULT WINAPI Main_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDESC2 pDDSD,
-                                                                                       LPDIRECTDRAWSURFACE7 *ppSurf, IUnknown *pUnkOuter) 
-{
-    if (pUnkOuter!=NULL) 
-               return DDERR_INVALIDPARAMS; 
-
-       if(sizeof(DDSURFACEDESC2)!=pDDSD->dwSize)
-               return DDERR_UNSUPPORTED;
-
-       // the nasty com stuff
-       IDirectDrawSurfaceImpl* That; 
-
-       That = (IDirectDrawSurfaceImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectDrawSurfaceImpl));
-
-       if (That == NULL) 
-               return E_OUTOFMEMORY;
-
-       That->lpVtbl = &DirectDrawSurface7_Vtable;
-       That->lpVtbl_v3 = &DDRAW_IDDS3_Thunk_VTable;
+       DWORD ret;
+       if((ret = Hal_DirectDraw_SetDisplayMode(iface,  dwWidth,  dwHeight, 
+                                            dwBPP,  dwRefreshRate,  dwFlags)) == DD_OK)
+       {
+               return ret;
+       }       
 
-       That->ref = 1;
-       *ppSurf = (LPDIRECTDRAWSURFACE7)That;
+       ret = Hel_DirectDraw_SetDisplayMode(iface,  dwWidth,  dwHeight, dwBPP,  dwRefreshRate,  dwFlags);
 
-       // the real surface object creation
-       return That->lpVtbl->Initialize (*ppSurf, (LPDIRECTDRAW)iface, pDDSD);
+       return ret; 
 }
 
 ULONG WINAPI Main_DirectDraw_AddRef (LPDIRECTDRAW7 iface) 
@@ -206,22 +153,89 @@ HRESULT WINAPI Main_DirectDraw_QueryInterface (
     return S_OK;
 }
 
-/**** Stubs ****/
-
-HRESULT WINAPI Main_DirectDraw_Compact(LPDIRECTDRAW7 iface) 
+HRESULT WINAPI Main_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDESC2 pDDSD,
+                                                                                       LPDIRECTDRAWSURFACE7 *ppSurf, IUnknown *pUnkOuter) 
 {
-       DX_STUB;
+    if (pUnkOuter!=NULL) 
+               return DDERR_INVALIDPARAMS; 
+
+       if(sizeof(DDSURFACEDESC2)!=pDDSD->dwSize)
+               return DDERR_UNSUPPORTED;
+
+       // the nasty com stuff
+       IDirectDrawSurfaceImpl* That; 
+
+       That = (IDirectDrawSurfaceImpl*)HeapAlloc(GetProcessHeap(), 0, sizeof(IDirectDrawSurfaceImpl));
+
+       if (That == NULL) 
+               return E_OUTOFMEMORY;
+
+       ZeroMemory(That, sizeof(IDirectDrawSurfaceImpl));
+
+       That->lpVtbl = &DirectDrawSurface7_Vtable;
+       That->lpVtbl_v3 = &DDRAW_IDDS3_Thunk_VTable;
+       That->ref = 1;
+
+       *ppSurf = (LPDIRECTDRAWSURFACE7)That;
+
+       // the real surface object creation
+       return That->lpVtbl->Initialize (*ppSurf, (LPDIRECTDRAW)iface, pDDSD);
 }
 
 HRESULT WINAPI Main_DirectDraw_CreateClipper(LPDIRECTDRAW7 iface, DWORD dwFlags, 
                                                                                         LPDIRECTDRAWCLIPPER *ppClipper, IUnknown *pUnkOuter)
 {
-       DX_STUB;
+    if (pUnkOuter!=NULL) 
+               return DDERR_INVALIDPARAMS; 
+
+       IDirectDrawClipperImpl* That; 
+       That = (IDirectDrawClipperImpl*)HeapAlloc(GetProcessHeap(), 0, sizeof(IDirectDrawClipperImpl));
+
+       if (That == NULL) 
+               return E_OUTOFMEMORY;
+
+       ZeroMemory(That, sizeof(IDirectDrawClipperImpl));
+
+       That->lpVtbl = &DirectDrawClipper_Vtable;
+       That->ref = 1;
+       *ppClipper = (LPDIRECTDRAWCLIPPER)That;
+
+       return That->lpVtbl->Initialize (*ppClipper, (LPDIRECTDRAW)iface, dwFlags);
+}
+
+// This function is exported by the dll
+HRESULT WINAPI DirectDrawCreateClipper (DWORD dwFlags, 
+                                                                               LPDIRECTDRAWCLIPPER* lplpDDClipper, LPUNKNOWN pUnkOuter)
+{
+    return Main_DirectDraw_CreateClipper(NULL, dwFlags, lplpDDClipper, pUnkOuter);
 }
+
 HRESULT WINAPI Main_DirectDraw_CreatePalette(LPDIRECTDRAW7 iface, DWORD dwFlags,
-                             LPPALETTEENTRY palent,LPDIRECTDRAWPALETTE* ppPalette,LPUNKNOWN pUnknown)
+                             LPPALETTEENTRY palent, LPDIRECTDRAWPALETTE* ppPalette, LPUNKNOWN pUnkOuter)
 {
-       DX_STUB;
+    if (pUnkOuter!=NULL) 
+               return DDERR_INVALIDPARAMS; 
+
+       IDirectDrawPaletteImpl* That; 
+       That = (IDirectDrawPaletteImpl*)HeapAlloc(GetProcessHeap(), 0, sizeof(IDirectDrawPaletteImpl));
+
+       if (That == NULL) 
+               return E_OUTOFMEMORY;
+
+       ZeroMemory(That, sizeof(IDirectDrawPaletteImpl));
+
+       That->lpVtbl = &DirectDrawPalette_Vtable;
+       That->ref = 1;
+       *ppPalette = (LPDIRECTDRAWPALETTE)That;
+
+       return That->lpVtbl->Initialize (*ppPalette, (LPDIRECTDRAW)iface, dwFlags, palent);
+}
+
+/**** Stubs ****/
+
+HRESULT WINAPI Main_DirectDraw_Compact(LPDIRECTDRAW7 iface) 
+{
+       DX_STUB;
 }
 
 HRESULT WINAPI Main_DirectDraw_DuplicateSurface(LPDIRECTDRAW7 iface, LPDIRECTDRAWSURFACE7 src,
@@ -245,7 +259,15 @@ HRESULT WINAPI Main_DirectDraw_EnumSurfaces(LPDIRECTDRAW7 iface, DWORD dwFlags,
 
 HRESULT WINAPI Main_DirectDraw_FlipToGDISurface(LPDIRECTDRAW7 iface) 
 {
-       DX_STUB;
+       DWORD ret;
+
+       if((ret = Hal_DirectDraw_FlipToGDISurface( iface)) == DD_OK)
+               return ret;
+
+       if((ret = Hel_DirectDraw_FlipToGDISurface( iface)) == DD_OK)
+               return ret;
+
+       return DDERR_NOTINITIALIZED;  
 }
 
 HRESULT WINAPI Main_DirectDraw_GetCaps(LPDIRECTDRAW7 iface, LPDDCAPS pDriverCaps,
@@ -310,7 +332,8 @@ HRESULT WINAPI Main_DirectDraw_GetDisplayMode(LPDIRECTDRAW7 iface, LPDDSURFACEDE
     DDCOLORKEY    ddckCKSrcOverlay;
     DDCOLORKEY    ddckCKSrcBlt;
        */
-
+    
+       
     RtlCopyMemory(&pDDSD->ddpfPixelFormat,&This->DirectDrawGlobal.vmiData.ddpfDisplay,sizeof(DDPIXELFORMAT));
     RtlCopyMemory(&pDDSD->ddsCaps,&This->DirectDrawGlobal.ddCaps,sizeof(DDCORECAPS));
        
@@ -348,7 +371,15 @@ HRESULT WINAPI Main_DirectDraw_GetMonitorFrequency(LPDIRECTDRAW7 iface,LPDWORD f
 
 HRESULT WINAPI Main_DirectDraw_GetScanLine(LPDIRECTDRAW7 iface, LPDWORD lpdwScanLine)
 {
-       DX_STUB;
+       DWORD ret;
+
+       if((ret = Hal_DirectDraw_GetScanLine( iface,  lpdwScanLine)) == DD_OK)
+               return ret;
+
+       if((ret = Hel_DirectDraw_GetScanLine( iface,  lpdwScanLine)) == DD_OK)
+               return ret;
+
+       return DDERR_NOTINITIALIZED;    
 }
 
 HRESULT WINAPI Main_DirectDraw_GetVerticalBlankStatus(LPDIRECTDRAW7 iface, LPBOOL status)
@@ -364,15 +395,31 @@ HRESULT WINAPI Main_DirectDraw_RestoreDisplayMode(LPDIRECTDRAW7 iface)
 HRESULT WINAPI Main_DirectDraw_WaitForVerticalBlank(LPDIRECTDRAW7 iface, DWORD dwFlags,
                                                                                                   HANDLE h)
 {
-  
-       DX_STUB;
+    DWORD ret;
+
+    if((ret = Hal_DirectDraw_WaitForVerticalBlank( iface,  dwFlags, h)) == DD_OK)
+               return ret;
+
+       if((ret = Hel_DirectDraw_WaitForVerticalBlank( iface,  dwFlags, h)) == DD_OK)
+               return ret;
+
+       return DDERR_NOTINITIALIZED;    
 }
 
 HRESULT WINAPI Main_DirectDraw_GetAvailableVidMem(LPDIRECTDRAW7 iface, LPDDSCAPS2 ddscaps,
                                   LPDWORD total, LPDWORD free)                                                                                    
-{
-  
-       DX_STUB;
+{      
+       DWORD ret;
+
+    if((ret = Hal_DirectDraw_GetAvailableVidMem (iface,ddscaps,total,free)) == DD_OK)
+               return ret;
+
+       if((ret = Hel_DirectDraw_GetAvailableVidMem (iface,ddscaps,total,free)) == DD_OK)
+               return ret;
+
+
+       return DDERR_NOTINITIALIZED;
+
 }
                                                                                                   
 HRESULT WINAPI Main_DirectDraw_GetSurfaceFromDC(LPDIRECTDRAW7 iface, HDC hdc,