50% are implmene in DD->GetCaps now
authorMagnus Olsen <magnus@greatlord.com>
Sun, 17 Jun 2007 14:14:42 +0000 (14:14 +0000)
committerMagnus Olsen <magnus@greatlord.com>
Sun, 17 Jun 2007 14:14:42 +0000 (14:14 +0000)
svn path=/trunk/; revision=27213

reactos/dll/directx/ddraw/Ddraw/ddraw_main.c

index 8a25cf8..4704837 100644 (file)
@@ -455,96 +455,157 @@ HRESULT WINAPI
 Main_DirectDraw_GetCaps( LPDIRECTDRAW7 iface, LPDDCAPS pDriverCaps,
                          LPDDCAPS pHELCaps)
 {
-    HRESULT retVal = DD_OK;
+    HRESULT retVal = DDERR_INVALIDPARAMS;
+    LPDDRAWI_DIRECTDRAW_INT This = (LPDDRAWI_DIRECTDRAW_INT)iface;
 
     DX_WINDBG_trace();
-    if (!(IsBadWritePtr(pDriverCaps,sizeof(LPDDCAPS))))
+
+        _SEH_TRY
     {
-        if (!(IsBadWritePtr(pHELCaps,sizeof(LPDDCAPS))))
+        if ((!pDriverCaps) && (!pHELCaps))
         {
-            return DDERR_INVALIDPARAMS;
+                retVal = DDERR_INVALIDPARAMS;
+                _SEH_LEAVE;
         }
-    }
 
-     if ((IsBadWritePtr(pDriverCaps,sizeof(LPDDCAPS)))) 
-     {
-         DDSCAPS2 ddscaps = { 0 };
-         DWORD dwTotal = 0;
-         DWORD dwFree = 0;
-        /* Setup hardware caps */
+        if (pDriverCaps)
+        {
+            /* Setup hardware caps */
+            DDSCAPS2 ddscaps = { 0 };
+            LPDDCORECAPS CoreCaps = (LPDDCORECAPS)&This->lpLcl->lpGbl->ddCaps;
 
-         Main_DirectDraw_GetAvailableVidMem4(iface, &ddscaps, &dwTotal, &dwFree);
+            DWORD dwTotal = 0;
+            DWORD dwFree = 0;
 
+            Main_DirectDraw_GetAvailableVidMem4(iface, &ddscaps, &dwTotal, &dwFree);
 
-        switch (pDriverCaps->dwSize)
-        {
-            case sizeof(DDCAPS_DX1):
+            switch (pDriverCaps->dwSize)
+            {
+                case sizeof(DDCAPS_DX1):
                 {
                     LPDDCAPS_DX1 myCaps = (LPDDCAPS_DX1) pDriverCaps;
 
+                    if (CoreCaps->dwSize == sizeof(DDCORECAPS))
+                    {
+                        memcpy(myCaps, CoreCaps, sizeof(DDCAPS_DX1));
+                    }
+
                     myCaps->dwVidMemFree = dwFree;
                     myCaps->dwVidMemTotal = dwTotal;
+                    myCaps->dwSize = sizeof(DDCAPS_DX1);
+
+                    retVal = DD_OK;
                 }
                 break;
 
-            case sizeof(DDCAPS_DX3):
+                case sizeof(DDCAPS_DX3):
                 {
                     LPDDCAPS_DX3 myCaps = (LPDDCAPS_DX3) pDriverCaps;
 
+                    if (CoreCaps->dwSize == sizeof(DDCORECAPS))
+                    {
+                        memcpy(&myCaps->dwCaps, &CoreCaps->dwCaps, sizeof(DDCAPS_DX3));
+                    }
+
                     myCaps->dwVidMemFree = dwFree;
                     myCaps->dwVidMemTotal = dwTotal;
+                    myCaps->dwSize = sizeof(DDCAPS_DX3);
+
+                    retVal = DD_OK;
                 }
                 break;
 
-            case sizeof(DDCAPS_DX5):
+                case sizeof(DDCAPS_DX5):
                 {
                     LPDDCAPS_DX5 myCaps = (LPDDCAPS_DX5) pDriverCaps;
 
+                    if (CoreCaps->dwSize == sizeof(DDCORECAPS))
+                    {
+                        memcpy(&myCaps->dwCaps, &CoreCaps->dwCaps, sizeof(DDCORECAPS));
+                    }
+
+                   /* FIXME
+                      DWORD dwNLVBCaps;
+                      DWORD dwNLVBCaps2;
+                      DWORD dwNLVBCKeyCaps;
+                      DWORD dwNLVBFXCaps;
+                      DWORD dwNLVBRops[DD_ROP_SPACE];
+                    */
+
                     myCaps->dwVidMemFree = dwFree;
                     myCaps->dwVidMemTotal = dwTotal;
+                    myCaps->dwSize = sizeof(DDCAPS_DX5);
+
+                    retVal = DD_OK;
                 }
                 break;
 
-            /* DDCAPS_DX6 is same as DDCAPS_DX7 */
-            case sizeof(DDCAPS_DX7):
+                /* DDCAPS_DX6 is same as DDCAPS_DX7 */
+                case sizeof(DDCAPS_DX7):
                 {
                     LPDDCAPS_DX7 myCaps = (LPDDCAPS_DX7) pDriverCaps;
 
+                    if (CoreCaps->dwSize == sizeof(DDCORECAPS))
+                    {
+                        memcpy(&myCaps->dwCaps, &CoreCaps->dwCaps, sizeof(DDCORECAPS));
+                    }
+
                     myCaps->dwVidMemFree = dwFree;
                     myCaps->dwVidMemTotal = dwTotal;
+
+                    /* FIXME
+                      DWORD dwNLVBCaps;
+                      DWORD dwNLVBCaps2;
+                      DWORD dwNLVBCKeyCaps;
+                      DWORD dwNLVBFXCaps;
+                      DWORD dwNLVBRops[DD_ROP_SPACE];
+                    */
+
+                    myCaps->ddsCaps.dwCaps = ddscaps.dwCaps;
+                    myCaps->ddsCaps.dwCaps2 = ddscaps.dwCaps2;
+                    myCaps->ddsCaps.dwCaps3 = ddscaps.dwCaps3;
+                    myCaps->ddsCaps.dwCaps4 = ddscaps.dwCaps4;
+                    myCaps->dwSize = sizeof(DDCAPS_DX7);
+
                 }
                 break;
 
-            default:
-                retVal = DDERR_INVALIDPARAMS;
-                break;
+                default:
+                    retVal = DDERR_INVALIDPARAMS;
+                    break;
+            }
         }
-     }
 
-     if ((IsBadWritePtr(pHELCaps,sizeof(LPDDCAPS)))) 
-     {
-        /* Setup hardware caps */
-        switch (pHELCaps->dwSize)
+        if (pHELCaps)
         {
-            case sizeof(DDCAPS_DX1):
-                retVal = DDERR_INVALIDPARAMS;
-                break;
-            case sizeof(DDCAPS_DX3):
-                retVal = DDERR_INVALIDPARAMS;
-                break;
-            case sizeof(DDCAPS_DX5):
-                retVal = DDERR_INVALIDPARAMS;
-                break;
-
-            /* DDCAPS_DX6 is same as DDCAPS_DX7 */
-            case sizeof(DDCAPS_DX7):
-                retVal = DDERR_INVALIDPARAMS;
-                break;
-            default:
-                retVal = DDERR_INVALIDPARAMS;
-                break;
+            /* Setup software caps */
+            switch (pHELCaps->dwSize)
+            {
+                case sizeof(DDCAPS_DX1):
+                    retVal = DDERR_INVALIDPARAMS;
+                    break;
+                case sizeof(DDCAPS_DX3):
+                    retVal = DDERR_INVALIDPARAMS;
+                    break;
+                case sizeof(DDCAPS_DX5):
+                    retVal = DDERR_INVALIDPARAMS;
+                    break;
+
+                /* DDCAPS_DX6 is same as DDCAPS_DX7 */
+                case sizeof(DDCAPS_DX7):
+                    retVal = DDERR_INVALIDPARAMS;
+                    break;
+                default:
+                    retVal = DDERR_INVALIDPARAMS;
+                    break;
+            }
         }
-     }
+    }
+    _SEH_HANDLE
+    {
+        retVal = DD_FALSE;
+    }
+    _SEH_END;
 
      return  retVal;
 }