[ros-diffs] [mbosma] 26849: Implement IDirectDraw7::EnumDisplayModes and IDirectDraw7::RestoreDisplayMode

mbosma at svn.reactos.org mbosma at svn.reactos.org
Mon May 21 14:01:08 CEST 2007


Author: mbosma
Date: Mon May 21 16:01:07 2007
New Revision: 26849

URL: http://svn.reactos.org/svn/reactos?rev=26849&view=rev
Log:
Implement IDirectDraw7::EnumDisplayModes and IDirectDraw7::RestoreDisplayMode

Modified:
    trunk/reactos/dll/directx/ddraw/Ddraw/ddraw_displaymode.c
    trunk/reactos/dll/directx/ddraw/Ddraw/ddraw_stubs.c

Modified: trunk/reactos/dll/directx/ddraw/Ddraw/ddraw_displaymode.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/directx/ddraw/Ddraw/ddraw_displaymode.c?rev=26849&r1=26848&r2=26849&view=diff
==============================================================================
--- trunk/reactos/dll/directx/ddraw/Ddraw/ddraw_displaymode.c (original)
+++ trunk/reactos/dll/directx/ddraw/Ddraw/ddraw_displaymode.c Mon May 21 16:01:07 2007
@@ -11,6 +11,68 @@
 
 #include "rosdraw.h"
 
+HRESULT WINAPI 
+Main_DirectDraw_EnumDisplayModes(LPDIRECTDRAW7 iface, DWORD dwFlags,
+                                  LPDDSURFACEDESC2 pDDSD, LPVOID pContext, LPDDENUMMODESCALLBACK2 pCallback)
+{
+    LPDDRAWI_DIRECTDRAW_INT This = (LPDDRAWI_DIRECTDRAW_INT)iface;
+    DX_WINDBG_trace();
+
+    if(!pCallback)
+        return DDERR_INVALIDPARAMS;
+
+    // FIXME: Process DDEDM_STANDARDVGAMODES flag
+
+    int i;
+    for (i=0; i<This->lpLcl->lpGbl->dwNumModes; i++)
+    {
+        DDSURFACEDESC2 SurfaceDesc; 
+
+        // FIXME: do we need to set/test more sturcture members ?
+        SurfaceDesc.dwSize = sizeof (DDSURFACEDESC2);
+        SurfaceDesc.dwFlags = DDSD_HEIGHT | DDSD_WIDTH | DDSD_REFRESHRATE | DDSD_WIDTH | DDSD_PIXELFORMAT;
+        SurfaceDesc.dwHeight = This->lpLcl->lpGbl->lpModeInfo[i].dwWidth;
+        SurfaceDesc.dwWidth = This->lpLcl->lpGbl->lpModeInfo[i].dwHeight;
+        SurfaceDesc.lPitch = This->lpLcl->lpGbl->lpModeInfo[i].lPitch;
+        SurfaceDesc.dwRefreshRate = This->lpLcl->lpGbl->lpModeInfo[i].wRefreshRate;
+
+        SurfaceDesc.ddpfPixelFormat.dwSize = sizeof (DDPIXELFORMAT);
+        SurfaceDesc.ddpfPixelFormat.dwFlags = DDPF_RGB;
+        SurfaceDesc.ddpfPixelFormat.dwRBitMask = This->lpLcl->lpGbl->lpModeInfo[i].dwRBitMask;
+        SurfaceDesc.ddpfPixelFormat.dwGBitMask = This->lpLcl->lpGbl->lpModeInfo[i].dwGBitMask;
+        SurfaceDesc.ddpfPixelFormat.dwBBitMask = This->lpLcl->lpGbl->lpModeInfo[i].dwBBitMask;
+        SurfaceDesc.ddpfPixelFormat.dwRGBAlphaBitMask = This->lpLcl->lpGbl->lpModeInfo[i].dwAlphaBitMask;
+        SurfaceDesc.ddpfPixelFormat.dwRGBBitCount = This->lpLcl->lpGbl->lpModeInfo[i].dwBPP;
+
+        if(dwFlags & DDEDM_REFRESHRATES && SurfaceDesc.dwRefreshRate != This->lpLcl->lpGbl->dwMonitorFrequency)
+        {
+            continue;
+        }
+
+        if(pDDSD)
+        {
+            if(pDDSD->dwFlags & DDSD_HEIGHT && pDDSD->dwHeight != SurfaceDesc.dwHeight)
+                continue;
+
+            else if(pDDSD->dwFlags & DDSD_WIDTH && pDDSD->dwWidth != SurfaceDesc.dwWidth)
+                continue;
+
+            else if(pDDSD->dwFlags & DDSD_PITCH && pDDSD->lPitch != SurfaceDesc.lPitch)
+                continue;
+
+            else if(pDDSD->dwFlags & DDSD_REFRESHRATE && pDDSD->dwRefreshRate != SurfaceDesc.dwRefreshRate)
+                continue;
+
+            else if(pDDSD->dwFlags & DDSD_PIXELFORMAT && pDDSD->ddpfPixelFormat.dwRGBBitCount != SurfaceDesc.ddpfPixelFormat.dwRGBBitCount)
+                continue;  // FIXME: test for the other members of ddpfPixelFormat as well
+        }
+
+        (*pCallback)(&SurfaceDesc, pContext);
+    }
+
+    return DD_OK;
+}
+
 HRESULT WINAPI
 Main_DirectDraw_SetDisplayMode (LPDIRECTDRAW7 iface, DWORD dwWidth, DWORD dwHeight,
                                                                 DWORD dwBPP, DWORD dwRefreshRate, DWORD dwFlags)
@@ -20,7 +82,7 @@
 
     // FIXME: Check primary if surface is locked / busy etc.
 
-    // Check Parameter
+    // Check Parameters
     if(dwFlags != 0)
     {
         return DDERR_INVALIDPARAMS;
@@ -71,6 +133,22 @@
 }
 
 HRESULT WINAPI
+Main_DirectDraw_RestoreDisplayMode (LPDIRECTDRAW7 iface)
+{
+    LPDDRAWI_DIRECTDRAW_INT This = (LPDDRAWI_DIRECTDRAW_INT)iface;
+    DX_WINDBG_trace();
+
+    ChangeDisplaySettings(NULL, 0);
+
+    // Update Interals
+    BOOL ModeChanged;
+    DdReenableDirectDrawObject(This->lpLcl->lpGbl, &ModeChanged);
+    StartDirectDraw((LPDIRECTDRAW)iface, 0, TRUE);
+
+    return DD_OK;
+}
+
+HRESULT WINAPI
 Main_DirectDraw_GetMonitorFrequency (LPDIRECTDRAW7 iface, LPDWORD lpFreq)
 {
     LPDDRAWI_DIRECTDRAW_INT This = (LPDDRAWI_DIRECTDRAW_INT)iface;
@@ -96,6 +174,8 @@
     if (pDDSD->dwSize != sizeof(LPDDSURFACEDESC2))
         return DDERR_INVALIDPARAMS;
 
+    // FIXME: More stucture members might need to be filled
+
     pDDSD->dwFlags |= DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT | DDSD_PITCH | DDSD_REFRESHRATE;
     pDDSD->dwHeight = This->lpLcl->lpGbl->vmiData.dwDisplayWidth;
     pDDSD->dwWidth = This->lpLcl->lpGbl->vmiData.dwDisplayHeight;

Modified: trunk/reactos/dll/directx/ddraw/Ddraw/ddraw_stubs.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/directx/ddraw/Ddraw/ddraw_stubs.c?rev=26849&r1=26848&r2=26849&view=diff
==============================================================================
--- trunk/reactos/dll/directx/ddraw/Ddraw/ddraw_stubs.c (original)
+++ trunk/reactos/dll/directx/ddraw/Ddraw/ddraw_stubs.c Mon May 21 16:01:07 2007
@@ -33,16 +33,6 @@
 
 HRESULT WINAPI Main_DirectDraw_DuplicateSurface(LPDIRECTDRAW7 iface, LPDIRECTDRAWSURFACE7 src,
                  LPDIRECTDRAWSURFACE7* dst)
-{
-	DX_WINDBG_trace();
-	DX_STUB;
-}
-
-/*
- * Status: Implentation removed due to rewrite
- */
-HRESULT WINAPI Main_DirectDraw_EnumDisplayModes(LPDIRECTDRAW7 iface, DWORD dwFlags,
-                 LPDDSURFACEDESC2 pDDSD, LPVOID context, LPDDENUMMODESCALLBACK2 callback)
 {
 	DX_WINDBG_trace();
 	DX_STUB;
@@ -111,16 +101,6 @@
  * Status: Implentation removed due to rewrite
  */
 HRESULT WINAPI
-Main_DirectDraw_RestoreDisplayMode(LPDIRECTDRAW7 iface)
-{
-	DX_WINDBG_trace();
-	DX_STUB;
-}
-
-/*
- * Status: Implentation removed due to rewrite
- */
-HRESULT WINAPI
 Main_DirectDraw_WaitForVerticalBlank(LPDIRECTDRAW7 iface, DWORD dwFlags,
                                                    HANDLE h)
 {




More information about the Ros-diffs mailing list