filling in bit more info to DDRAW_GLOBAL struct in halinistate.
[reactos.git] / reactos / lib / ddraw / main / ddraw.c
index 8ff4537..ccdeab9 100644 (file)
@@ -3,7 +3,7 @@
  * COPYRIGHT:            See COPYING in the top level directory
  * PROJECT:              ReactOS
  * FILE:                 lib/ddraw/main/ddraw.c
- * PURPOSE:              DirectDraw Implementation 
+ * PURPOSE:              IDirectDraw7 Implementation 
  * PROGRAMMER:           Magnus Olsen, Maarten Bosma
  *
  */
@@ -25,8 +25,8 @@ HRESULT WINAPI Main_DirectDraw_Initialize (LPDIRECTDRAW7 iface, LPGUID lpGUID)
 
        // get the HDC
        This->hdc = GetWindowDC(GetDesktopWindow());
-       This->Height = GetDeviceCaps(This->hdc, HORZRES);
-       This->Width = GetDeviceCaps(This->hdc, VERTRES);
+       This->Height = GetDeviceCaps(This->hdc, VERTRES);
+       This->Width = GetDeviceCaps(This->hdc, HORZRES);
        This->Bpp = GetDeviceCaps(This->hdc, BITSPIXEL);
 
        // call software first
@@ -71,12 +71,14 @@ 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;
 }
 
@@ -140,7 +142,9 @@ HRESULT WINAPI Main_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDE
        if (That == NULL) 
                return E_OUTOFMEMORY;
 
-       That->lpVtbl = &DDrawSurface_VTable;
+       That->lpVtbl = &DirectDrawSurface7_Vtable;
+       That->lpVtbl_v3 = &DDRAW_IDDS3_Thunk_VTable;
+
        That->ref = 1;
        *ppSurf = (LPDIRECTDRAWSURFACE7)That;
 
@@ -151,7 +155,7 @@ HRESULT WINAPI Main_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDE
 ULONG WINAPI Main_DirectDraw_AddRef (LPDIRECTDRAW7 iface) 
 {
     IDirectDrawImpl* This = (IDirectDrawImpl*)iface;
-    ULONG ref = InterlockedIncrement(&This->ref);
+    ULONG ref = InterlockedIncrement((PLONG)&This->DirectDrawGlobal.dwRefCnt);
 
        return ref;
 }
@@ -159,7 +163,7 @@ ULONG WINAPI Main_DirectDraw_AddRef (LPDIRECTDRAW7 iface)
 ULONG WINAPI Main_DirectDraw_Release (LPDIRECTDRAW7 iface) 
 {
     IDirectDrawImpl* This = (IDirectDrawImpl*)iface;
-    ULONG ref = InterlockedDecrement(&This->ref);
+    ULONG ref = InterlockedDecrement((PLONG)&This->DirectDrawGlobal.dwRefCnt);
     
     if (ref == 0)
     {
@@ -173,144 +177,240 @@ ULONG WINAPI Main_DirectDraw_Release (LPDIRECTDRAW7 iface)
        return ref;
 }
 
-/**** Stubs ****/
-
-HRESULT WINAPI Main_DirectDraw_QueryInterface (LPDIRECTDRAW7 iface,REFIID refiid,LPVOID *obj) 
+HRESULT WINAPI Main_DirectDraw_QueryInterface (
+       LPDIRECTDRAW7 iface, REFIID id, LPVOID *obj ) 
 {
-       return DDERR_UNSUPPORTED;
+    IDirectDrawImpl* This = (IDirectDrawImpl*)iface;
+    
+    if (IsEqualGUID(&IID_IDirectDraw7, id))
+       {
+               *obj = &This->lpVtbl;
+    }
+    else if (IsEqualGUID(&IID_IDirectDraw, id))
+       {
+               *obj = &This->lpVtbl_v1;
+    }
+    else if (IsEqualGUID(&IID_IDirectDraw2, id))
+       {
+               *obj = &This->lpVtbl_v2;
+    }
+    else if (IsEqualGUID(&IID_IDirectDraw4, id))
+       {
+               *obj = &This->lpVtbl_v4;
+    }
+    else
+       {
+               *obj = NULL;
+               return E_NOINTERFACE;
+    }
+
+    Main_DirectDraw_AddRef(iface);
+    return S_OK;
 }
 
+/**** Stubs ****/
+
 HRESULT WINAPI Main_DirectDraw_Compact(LPDIRECTDRAW7 iface) 
 {
-       return DDERR_UNSUPPORTED;
+       DX_STUB;
 }
 
 HRESULT WINAPI Main_DirectDraw_CreateClipper(LPDIRECTDRAW7 iface, DWORD dwFlags, 
                                                                                         LPDIRECTDRAWCLIPPER *ppClipper, IUnknown *pUnkOuter)
 {
-       return DDERR_UNSUPPORTED;
+       DX_STUB;
 }
 HRESULT WINAPI Main_DirectDraw_CreatePalette(LPDIRECTDRAW7 iface, DWORD dwFlags,
                              LPPALETTEENTRY palent,LPDIRECTDRAWPALETTE* ppPalette,LPUNKNOWN pUnknown)
 {
-       return DDERR_UNSUPPORTED;
+       DX_STUB;
 }
 
 HRESULT WINAPI Main_DirectDraw_DuplicateSurface(LPDIRECTDRAW7 iface, LPDIRECTDRAWSURFACE7 src,
                                 LPDIRECTDRAWSURFACE7* dst) 
 {
-       return DDERR_UNSUPPORTED;       
+       DX_STUB;        
 }
 
 HRESULT WINAPI Main_DirectDraw_EnumDisplayModes(LPDIRECTDRAW7 iface, DWORD dwFlags,
                                 LPDDSURFACEDESC2 pDDSD, LPVOID context, LPDDENUMMODESCALLBACK2 callback) 
 {
-       return DDERR_UNSUPPORTED;
+       DX_STUB;
 }
 
 HRESULT WINAPI Main_DirectDraw_EnumSurfaces(LPDIRECTDRAW7 iface, DWORD dwFlags,
                             LPDDSURFACEDESC2 lpDDSD2, LPVOID context,
                             LPDDENUMSURFACESCALLBACK7 callback) 
 {
-       return DDERR_UNSUPPORTED;
+       DX_STUB;
 }
 
 HRESULT WINAPI Main_DirectDraw_FlipToGDISurface(LPDIRECTDRAW7 iface) 
 {
-       return DDERR_UNSUPPORTED;
+       DX_STUB;
 }
 
 HRESULT WINAPI Main_DirectDraw_GetCaps(LPDIRECTDRAW7 iface, LPDDCAPS pDriverCaps,
                        LPDDCAPS pHELCaps) 
 {
-       return DDERR_UNSUPPORTED;
+       DWORD status = DD_FALSE;
+       IDirectDrawImpl *This = (IDirectDrawImpl *)iface;
+
+       if (pDriverCaps != NULL) 
+       {
+         RtlCopyMemory(pDriverCaps,&This->DirectDrawGlobal.ddCaps,sizeof(DDCORECAPS));
+         status = DD_OK;
+       }
+
+       if (pHELCaps != NULL) 
+       {
+         RtlCopyMemory(pDriverCaps,&This->DirectDrawGlobal.ddHELCaps,sizeof(DDCORECAPS));
+         status = DD_OK;
+       }
+
+       /* Both caps mixed ?? */
+       /* DDCORECAPS ddBothCaps; */
+       
+       return status;
 }
 
 HRESULT WINAPI Main_DirectDraw_GetDisplayMode(LPDIRECTDRAW7 iface, LPDDSURFACEDESC2 pDDSD) 
-{
-       return DDERR_UNSUPPORTED;
+{    
+       IDirectDrawImpl *This = (IDirectDrawImpl *)iface;
+
+       if (pDDSD == NULL)
+       {
+      return DD_FALSE;
+       }
+       
+       pDDSD->dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_PITCH | DDSD_PIXELFORMAT | DDSD_REFRESHRATE | DDSD_WIDTH; 
+       pDDSD->dwHeight  = This->DirectDrawGlobal.vmiData.dwDisplayHeight;
+    pDDSD->dwWidth = This->DirectDrawGlobal.vmiData.dwDisplayWidth; 
+
+       /* FIXME Do not use DUMMYUNIONNAME1 some how union lPitch does not see by the compiler
+          but rest of the union are visable. more header problem ??? 
+    */
+    pDDSD->DUMMYUNIONNAME1.lPitch  = This->DirectDrawGlobal.vmiData.lDisplayPitch;
+       
+    
+       /* have not check where I should get hold of this info yet
+    DWORD  dwBackBufferCount;
+    */
+
+    pDDSD->dwRefreshRate = This->DirectDrawGlobal.dwMonitorFrequency;
+
+       /* have not check where I should get hold of this info yet
+    DWORD  dwAlphaBitDepth;
+    DWORD  dwReserved;
+    LPVOID lpSurface;
+    union
+    {
+        DDCOLORKEY    ddckCKDestOverlay;
+        DWORD         dwEmptyFaceColor;
+    } 
+    DDCOLORKEY    ddckCKDestBlt;
+    DDCOLORKEY    ddckCKSrcOverlay;
+    DDCOLORKEY    ddckCKSrcBlt;
+       */
+
+    RtlCopyMemory(&pDDSD->ddpfPixelFormat,&This->DirectDrawGlobal.vmiData.ddpfDisplay,sizeof(DDPIXELFORMAT));
+    RtlCopyMemory(&pDDSD->ddsCaps,&This->DirectDrawGlobal.ddCaps,sizeof(DDCORECAPS));
+       
+       /* have not check where I should get hold of this info yet    
+    DWORD         dwTextureStage;
+    */
+  
+       return DD_OK;
 }
 
 
 HRESULT WINAPI Main_DirectDraw_GetFourCCCodes(LPDIRECTDRAW7 iface, LPDWORD pNumCodes, LPDWORD pCodes)
 {
-       return DDERR_UNSUPPORTED;
+       DX_STUB;
 }
 
 HRESULT WINAPI Main_DirectDraw_GetGDISurface(LPDIRECTDRAW7 iface, 
                                                                                         LPDIRECTDRAWSURFACE7 *lplpGDIDDSSurface)
 {
-       return DDERR_UNSUPPORTED;
+       DX_STUB;
 }
 
 HRESULT WINAPI Main_DirectDraw_GetMonitorFrequency(LPDIRECTDRAW7 iface,LPDWORD freq)
 {  
-       return DDERR_UNSUPPORTED;
+    IDirectDrawImpl *This = (IDirectDrawImpl *)iface;
+
+       if (freq == NULL)
+       {
+        return DD_FALSE;
+       }
+
+       *freq = This->DirectDrawGlobal.dwMonitorFrequency;
+       return DD_OK;
 }
 
 HRESULT WINAPI Main_DirectDraw_GetScanLine(LPDIRECTDRAW7 iface, LPDWORD lpdwScanLine)
 {
-       return DDERR_UNSUPPORTED;
+       DX_STUB;
 }
 
 HRESULT WINAPI Main_DirectDraw_GetVerticalBlankStatus(LPDIRECTDRAW7 iface, LPBOOL status)
 {
-       return DDERR_UNSUPPORTED;
+       DX_STUB;
 }
 
 HRESULT WINAPI Main_DirectDraw_RestoreDisplayMode(LPDIRECTDRAW7 iface)
 {
-       return DDERR_UNSUPPORTED;
+       DX_STUB;
 }
 
 HRESULT WINAPI Main_DirectDraw_WaitForVerticalBlank(LPDIRECTDRAW7 iface, DWORD dwFlags,
                                                                                                   HANDLE h)
 {
   
-       return DDERR_UNSUPPORTED;
+       DX_STUB;
 }
 
 HRESULT WINAPI Main_DirectDraw_GetAvailableVidMem(LPDIRECTDRAW7 iface, LPDDSCAPS2 ddscaps,
                                   LPDWORD total, LPDWORD free)                                                                                    
 {
-  
-       return DDERR_UNSUPPORTED;
+     
+       DX_STUB;
 }
                                                                                                   
 HRESULT WINAPI Main_DirectDraw_GetSurfaceFromDC(LPDIRECTDRAW7 iface, HDC hdc,
                                                                                                LPDIRECTDRAWSURFACE7 *lpDDS)
 {  
-       return DDERR_UNSUPPORTED;
+       DX_STUB;
 }
 
 HRESULT WINAPI Main_DirectDraw_RestoreAllSurfaces(LPDIRECTDRAW7 iface)
 {
-       return DDERR_UNSUPPORTED;
+       DX_STUB;
 }
 
 HRESULT WINAPI Main_DirectDraw_TestCooperativeLevel(LPDIRECTDRAW7 iface) 
 {
-       return DDERR_UNSUPPORTED;
+       DX_STUB;
 }
 
 HRESULT WINAPI Main_DirectDraw_GetDeviceIdentifier(LPDIRECTDRAW7 iface,
                                   LPDDDEVICEIDENTIFIER2 pDDDI, DWORD dwFlags)
 {    
-       return DDERR_UNSUPPORTED;
+       DX_STUB;
 }
 
 HRESULT WINAPI Main_DirectDraw_StartModeTest(LPDIRECTDRAW7 iface, LPSIZE pModes,
                              DWORD dwNumModes, DWORD dwFlags)
 {    
-       return DDERR_UNSUPPORTED;
+       DX_STUB;
 }
 
 HRESULT WINAPI Main_DirectDraw_EvaluateMode(LPDIRECTDRAW7 iface,DWORD a,DWORD* b)
 {    
-       return DDERR_UNSUPPORTED;
+       DX_STUB;
 }
 
-IDirectDraw7Vtbl DirectDraw_VTable =
+IDirectDraw7Vtbl DirectDraw7_Vtable =
 {
     Main_DirectDraw_QueryInterface,
     Main_DirectDraw_AddRef,