ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

ddraw_displaymode.c
Go to the documentation of this file.
00001 /* $Id: ddraw_displaymode.c 37776 2008-11-30 19:28:11Z hyperion $
00002  *
00003  * COPYRIGHT:            See COPYING in the top level directory
00004  * PROJECT:              ReactOS DirectX
00005  * FILE:                 ddraw/ddraw/ddraw_displaymode.c
00006  * PURPOSE:              IDirectDraw7 Implementation
00007  * PROGRAMMER:           Maarten Bosma, Magnus Olsen (add seh support)
00008  *
00009  */
00010 
00011 
00012 #include "rosdraw.h"
00013 
00014 HRESULT WINAPI
00015 Main_DirectDraw_EnumDisplayModes(LPDDRAWI_DIRECTDRAW_INT This, DWORD dwFlags,
00016                                   LPDDSURFACEDESC pDDSD, LPVOID pContext, LPDDENUMMODESCALLBACK pCallback)
00017 {
00018     HRESULT ret = DD_OK;
00019     INT iMode = 0;
00020     DEVMODE DevMode;
00021 
00022     DX_WINDBG_trace();
00023 
00024     ZeroMemory(&DevMode, sizeof(DEVMODE));
00025 
00026     _SEH2_TRY
00027     {
00028 
00029         if (pDDSD != NULL)
00030         {
00031             if (pDDSD->dwSize != sizeof(DDSURFACEDESC))
00032             {
00033                  ret = DDERR_INVALIDPARAMS;
00034             }
00035         }
00036 
00037         if (IsBadCodePtr((LPVOID)pCallback))
00038         {
00039             ret = DDERR_INVALIDPARAMS;
00040         }
00041         else if ( ret == DD_OK)
00042         {
00043 
00044             DevMode.dmSize = sizeof(DEVMODE);
00045 
00046             while (EnumDisplaySettingsEx(NULL, iMode, &DevMode, 0) == TRUE)
00047             {
00048                 DDSURFACEDESC SurfaceDesc;
00049 
00050                 ZeroMemory(&SurfaceDesc, sizeof(DDSURFACEDESC));
00051 
00052                 iMode++;
00053 
00054                 SurfaceDesc.dwSize = sizeof (DDSURFACEDESC);
00055                 SurfaceDesc.dwFlags = DDSD_HEIGHT | DDSD_WIDTH | DDSD_REFRESHRATE | DDSD_WIDTH | DDSD_PIXELFORMAT;
00056                 SurfaceDesc.dwHeight = DevMode.dmPelsHeight;
00057                 SurfaceDesc.dwWidth = DevMode.dmPelsWidth;
00058                 SurfaceDesc.lPitch = DevMode.dmPelsWidth * DevMode.dmBitsPerPel / 8;
00059                 SurfaceDesc.dwRefreshRate = DevMode.dmDisplayFrequency;
00060 
00061                 SurfaceDesc.ddpfPixelFormat.dwSize = sizeof (DDPIXELFORMAT);
00062                 SurfaceDesc.ddpfPixelFormat.dwFlags = DDPF_RGB;
00063                 // FIXME: get these
00064                 /*
00065                     SurfaceDesc.ddpfPixelFormat.dwRBitMask =
00066                     SurfaceDesc.ddpfPixelFormat.dwGBitMask =
00067                     SurfaceDesc.ddpfPixelFormat.dwBBitMask =
00068                     SurfaceDesc.ddpfPixelFormat.dwRGBAlphaBitMask =
00069                 */
00070                 SurfaceDesc.ddpfPixelFormat.dwRGBBitCount = DevMode.dmBitsPerPel;
00071 
00072                 // FIXME1: This->lpLcl->lpGbl->dwMonitorFrequency is not set !
00073                 if(dwFlags & DDEDM_REFRESHRATES && SurfaceDesc.dwRefreshRate != This->lpLcl->lpGbl->dwMonitorFrequency)
00074                 {
00075                     //continue;  // FIXME2: what is SurfaceDesc.dwRefreshRate supposed to be set to ?
00076                 }
00077 
00078                 // FIXME: Take case when DDEDM_STANDARDVGAMODES flag is not set in account
00079 
00080                 if(pDDSD)
00081                 {
00082                     if(pDDSD->dwFlags & DDSD_HEIGHT && pDDSD->dwHeight != SurfaceDesc.dwHeight)
00083                         continue;
00084 
00085                     else if(pDDSD->dwFlags & DDSD_WIDTH && pDDSD->dwWidth != SurfaceDesc.dwWidth)
00086                         continue;
00087 
00088                     else if(pDDSD->dwFlags & DDSD_PITCH && pDDSD->lPitch != SurfaceDesc.lPitch)
00089                         continue;
00090 
00091                     else if(pDDSD->dwFlags & DDSD_REFRESHRATE && pDDSD->dwRefreshRate != SurfaceDesc.dwRefreshRate)
00092                         continue;
00093 
00094                     else if(pDDSD->dwFlags & DDSD_PIXELFORMAT && pDDSD->ddpfPixelFormat.dwRGBBitCount != SurfaceDesc.ddpfPixelFormat.dwRGBBitCount)
00095                         continue;  // FIXME: test for the other members of ddpfPixelFormat as well
00096                 }
00097 
00098                 if((*pCallback)(&SurfaceDesc, pContext) == DDENUMRET_CANCEL)
00099                     break;
00100             }
00101         }
00102 
00103     }
00104     _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
00105     {
00106     }
00107     _SEH2_END;
00108 
00109     return ret;
00110 }
00111 
00112 HRESULT WINAPI
00113 Main_DirectDraw_EnumDisplayModes4(LPDDRAWI_DIRECTDRAW_INT This, DWORD dwFlags,
00114                                   LPDDSURFACEDESC2 pDDSD, LPVOID pContext, LPDDENUMMODESCALLBACK2 pCallback)
00115 {
00116     HRESULT ret = DD_OK;
00117     INT iMode = 0;
00118     DEVMODE DevMode;
00119 
00120     DX_WINDBG_trace();
00121 
00122     ZeroMemory(&DevMode, sizeof(DEVMODE));
00123 
00124     _SEH2_TRY
00125     {
00126 
00127         if (pDDSD != NULL)
00128         {
00129             if (pDDSD->dwSize != sizeof(DDSURFACEDESC2))
00130             {
00131                  ret = DDERR_INVALIDPARAMS;
00132             }
00133         }
00134 
00135         if (IsBadCodePtr((LPVOID)pCallback))
00136         {
00137             ret = DDERR_INVALIDPARAMS;
00138         }
00139         else if ( ret == DD_OK)
00140         {
00141 
00142             DevMode.dmSize = sizeof(DEVMODE);
00143 
00144             while (EnumDisplaySettingsEx(NULL, iMode, &DevMode, 0) == TRUE)
00145             {
00146                 DDSURFACEDESC2 SurfaceDesc;
00147 
00148                 ZeroMemory(&SurfaceDesc, sizeof(DDSURFACEDESC2));
00149 
00150                 iMode++;
00151 
00152                 SurfaceDesc.dwSize = sizeof (DDSURFACEDESC2);
00153                 SurfaceDesc.dwFlags = DDSD_HEIGHT | DDSD_WIDTH | DDSD_REFRESHRATE | DDSD_WIDTH | DDSD_PIXELFORMAT;
00154                 SurfaceDesc.dwHeight = DevMode.dmPelsHeight;
00155                 SurfaceDesc.dwWidth = DevMode.dmPelsWidth;
00156                 SurfaceDesc.lPitch = DevMode.dmPelsWidth * DevMode.dmBitsPerPel / 8;
00157                 SurfaceDesc.dwRefreshRate = DevMode.dmDisplayFrequency;
00158 
00159                 SurfaceDesc.ddpfPixelFormat.dwSize = sizeof (DDPIXELFORMAT);
00160                 SurfaceDesc.ddpfPixelFormat.dwFlags = DDPF_RGB;
00161                 // FIXME: get these
00162                 /*
00163                     SurfaceDesc.ddpfPixelFormat.dwRBitMask =
00164                     SurfaceDesc.ddpfPixelFormat.dwGBitMask =
00165                     SurfaceDesc.ddpfPixelFormat.dwBBitMask =
00166                     SurfaceDesc.ddpfPixelFormat.dwRGBAlphaBitMask =
00167                 */
00168                 SurfaceDesc.ddpfPixelFormat.dwRGBBitCount = DevMode.dmBitsPerPel;
00169 
00170                 // FIXME1: This->lpLcl->lpGbl->dwMonitorFrequency is not set !
00171                 if(dwFlags & DDEDM_REFRESHRATES && SurfaceDesc.dwRefreshRate != This->lpLcl->lpGbl->dwMonitorFrequency)
00172                 {
00173                     //continue;  // FIXME2: what is SurfaceDesc.dwRefreshRate supposed to be set to ?
00174                 }
00175 
00176                 // FIXME: Take case when DDEDM_STANDARDVGAMODES flag is not set in account
00177 
00178                 if(pDDSD)
00179                 {
00180                     if(pDDSD->dwFlags & DDSD_HEIGHT && pDDSD->dwHeight != SurfaceDesc.dwHeight)
00181                         continue;
00182 
00183                     else if(pDDSD->dwFlags & DDSD_WIDTH && pDDSD->dwWidth != SurfaceDesc.dwWidth)
00184                         continue;
00185 
00186                     else if(pDDSD->dwFlags & DDSD_PITCH && pDDSD->lPitch != SurfaceDesc.lPitch)
00187                         continue;
00188 
00189                     else if(pDDSD->dwFlags & DDSD_REFRESHRATE && pDDSD->dwRefreshRate != SurfaceDesc.dwRefreshRate)
00190                         continue;
00191 
00192                     else if(pDDSD->dwFlags & DDSD_PIXELFORMAT && pDDSD->ddpfPixelFormat.dwRGBBitCount != SurfaceDesc.ddpfPixelFormat.dwRGBBitCount)
00193                         continue;  // FIXME: test for the other members of ddpfPixelFormat as well
00194                 }
00195 
00196                 if((*pCallback)(&SurfaceDesc, pContext) == DDENUMRET_CANCEL)
00197                     break;
00198             }
00199         }
00200 
00201     }
00202     _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
00203     {
00204     }
00205     _SEH2_END;
00206 
00207     return ret;
00208 }
00209 
00210 HRESULT WINAPI
00211 Main_DirectDraw_SetDisplayMode (LPDDRAWI_DIRECTDRAW_INT This, DWORD dwWidth, DWORD dwHeight, DWORD dwBPP)
00212 {
00213     DX_WINDBG_trace();
00214 
00215     return Main_DirectDraw_SetDisplayMode2 (This, dwWidth, dwHeight, dwBPP, 0, 0 );
00216 }
00217 
00218 HRESULT WINAPI
00219 Main_DirectDraw_SetDisplayMode2 (LPDDRAWI_DIRECTDRAW_INT This, DWORD dwWidth, DWORD dwHeight,
00220                                  DWORD dwBPP, DWORD dwRefreshRate, DWORD dwFlags)
00221 {
00222     HRESULT ret = DD_OK;
00223     DX_WINDBG_trace();
00224 
00225     _SEH2_TRY
00226     {
00227         // FIXME: Check primary if surface is locked / busy etc.
00228 
00229         // Check Parameters
00230         if(dwFlags != 0)
00231         {
00232             ret = DDERR_INVALIDPARAMS;
00233         }
00234         else
00235         {
00236             if ((!dwHeight || This->lpLcl->lpGbl->vmiData.dwDisplayHeight == dwHeight) &&
00237                 (!dwWidth || This->lpLcl->lpGbl->vmiData.dwDisplayWidth == dwWidth)  &&
00238                 (!dwBPP || This->lpLcl->lpGbl->vmiData.ddpfDisplay.dwRGBBitCount == dwBPP) &&
00239                 (!dwRefreshRate || This->lpLcl->lpGbl->dwMonitorFrequency == dwRefreshRate))
00240             {
00241                 ret = DD_OK; // nothing to do here for us
00242             }
00243             else
00244             {
00245                 LONG retval;
00246                 // Here we go
00247                 DEVMODE DevMode;
00248                 ZeroMemory(&DevMode, sizeof(DEVMODE));
00249                 DevMode.dmSize = sizeof(DEVMODE);
00250 
00251                 if (dwHeight)
00252                     DevMode.dmFields |= DM_PELSHEIGHT;
00253                 if (dwWidth)
00254                     DevMode.dmFields |= DM_PELSWIDTH;
00255                 if (dwBPP)
00256                     DevMode.dmFields |= DM_BITSPERPEL;
00257                 if (dwRefreshRate)
00258                     DevMode.dmFields |= DM_DISPLAYFREQUENCY;
00259 
00260                 DevMode.dmPelsHeight = dwHeight;
00261                 DevMode.dmPelsWidth = dwWidth;
00262                 DevMode.dmBitsPerPel = dwBPP;
00263                 DevMode.dmDisplayFrequency = dwRefreshRate;
00264 
00265                 DX_WINDBG_trace_res(dwWidth, dwHeight,dwBPP, dwRefreshRate);
00266 
00267                 retval = ChangeDisplaySettings(&DevMode, CDS_FULLSCREEN);
00268                 /* FIXME: Are we supposed to set CDS_SET_PRIMARY as well ? */
00269 
00270                 if(retval == DISP_CHANGE_BADMODE)
00271                 {
00272                     /* Note : it seam ms ddraw ignore this and try using the bad mode any case.
00273                      * tested with Ati HD2400 that only support 16 and 32 Bpp in windows
00274                      */
00275                     DX_STUB_str("Warning ChangeDisplaySettings return DISP_CHANGE_BADMODE, but ddraw.dll ignore it\n");
00276 
00277                     //ret = DDERR_UNSUPPORTED;
00278                     BOOL ModeChanged;
00279                     This->lpLcl->lpGbl->hDD = This->lpLcl->hDD;
00280                     DdReenableDirectDrawObject(This->lpLcl->lpGbl, &ModeChanged);
00281                     StartDirectDraw((LPDIRECTDRAW)This, 0, TRUE);
00282                 }
00283                 else if(retval != DISP_CHANGE_SUCCESSFUL)
00284                 {
00285                     ret = DDERR_GENERIC;
00286                 }
00287                 else
00288                 {
00289                     // Update Interals
00290                     BOOL ModeChanged;
00291                     This->lpLcl->lpGbl->hDD = This->lpLcl->hDD;
00292                     DdReenableDirectDrawObject(This->lpLcl->lpGbl, &ModeChanged);
00293                     StartDirectDraw((LPDIRECTDRAW)This, 0, TRUE);
00294                 }
00295             }
00296         }
00297     }
00298     _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
00299     {
00300     }
00301     _SEH2_END;
00302 
00303     return ret;
00304 }
00305 
00306 HRESULT WINAPI
00307 Main_DirectDraw_RestoreDisplayMode (LPDDRAWI_DIRECTDRAW_INT This)
00308 {
00309     DX_WINDBG_trace();
00310 
00311     _SEH2_TRY
00312     {
00313         BOOL ModeChanged;
00314 
00315         ChangeDisplaySettings(NULL, 0);
00316 
00317         // Update Interals
00318 
00319 
00320         This->lpLcl->lpGbl->hDD = This->lpLcl->hDD;
00321         DdReenableDirectDrawObject(This->lpLcl->lpGbl, &ModeChanged);
00322         StartDirectDraw((LPDIRECTDRAW)This, 0, TRUE);
00323     }
00324     _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
00325     {
00326     }
00327     _SEH2_END;
00328 
00329 
00330     return DD_OK;
00331 }
00332 
00333 HRESULT WINAPI
00334 Main_DirectDraw_GetMonitorFrequency (LPDDRAWI_DIRECTDRAW_INT This, LPDWORD lpFreq)
00335 {
00336     HRESULT retVal = DD_OK;
00337     DX_WINDBG_trace();
00338 
00339     _SEH2_TRY
00340     {
00341         if(IsBadWritePtr(lpFreq,sizeof(LPDWORD)))
00342         {
00343             retVal = DDERR_INVALIDPARAMS;
00344         }
00345         else
00346         {
00347             if (This->lpLcl->lpGbl->dwMonitorFrequency)
00348             {
00349                 *lpFreq = This->lpLcl->lpGbl->dwMonitorFrequency;
00350             }
00351             else
00352             {
00353                 retVal = DDERR_UNSUPPORTED;
00354             }
00355         }
00356     }
00357     _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
00358     {
00359       retVal = DD_FALSE;
00360     }
00361     _SEH2_END;
00362 
00363     return retVal;
00364 }
00365 
00366 HRESULT WINAPI
00367 Main_DirectDraw_GetDisplayMode (LPDDRAWI_DIRECTDRAW_INT This, LPDDSURFACEDESC pDDSD)
00368 {
00369     HRESULT retVal = DD_OK;
00370     DX_WINDBG_trace();
00371 
00372     _SEH2_TRY
00373     {
00374         if(IsBadWritePtr(pDDSD,sizeof(LPDDSURFACEDESC)))
00375         {
00376             retVal = DDERR_INVALIDPARAMS;
00377         }
00378         else if (pDDSD->dwSize != sizeof(DDSURFACEDESC))
00379         {
00380              retVal = DDERR_INVALIDPARAMS;
00381         }
00382         else
00383         {
00384             // FIXME: More stucture members might need to be filled
00385 
00386             pDDSD->dwFlags |= DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT | DDSD_PITCH | DDSD_REFRESHRATE;
00387             pDDSD->dwHeight = This->lpLcl->lpGbl->vmiData.dwDisplayHeight;
00388             pDDSD->dwWidth = This->lpLcl->lpGbl->vmiData.dwDisplayWidth;
00389             pDDSD->ddpfPixelFormat = This->lpLcl->lpGbl->vmiData.ddpfDisplay;
00390             pDDSD->dwRefreshRate = This->lpLcl->lpGbl->dwMonitorFrequency;
00391             pDDSD->lPitch = This->lpLcl->lpGbl->vmiData.lDisplayPitch;
00392         }
00393     }
00394     _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
00395     {
00396     }
00397     _SEH2_END;
00398 
00399     return retVal;
00400 }
00401 
00402 HRESULT WINAPI
00403 Main_DirectDraw_GetDisplayMode4 (LPDDRAWI_DIRECTDRAW_INT This, LPDDSURFACEDESC2 pDDSD)
00404 {
00405     HRESULT retVal = DD_OK;
00406     DX_WINDBG_trace();
00407 
00408     _SEH2_TRY
00409     {
00410         if(IsBadWritePtr(pDDSD,sizeof(LPDDSURFACEDESC2)))
00411         {
00412             retVal = DDERR_INVALIDPARAMS;
00413         }
00414         else if (pDDSD->dwSize != sizeof(DDSURFACEDESC2))
00415         {
00416              retVal = DDERR_INVALIDPARAMS;
00417         }
00418         else
00419         {
00420             // FIXME: More stucture members might need to be filled
00421 
00422             pDDSD->dwFlags |= DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT | DDSD_PITCH | DDSD_REFRESHRATE;
00423             pDDSD->dwHeight = This->lpLcl->lpGbl->vmiData.dwDisplayHeight;
00424             pDDSD->dwWidth = This->lpLcl->lpGbl->vmiData.dwDisplayWidth;
00425             pDDSD->ddpfPixelFormat = This->lpLcl->lpGbl->vmiData.ddpfDisplay;
00426             pDDSD->dwRefreshRate = This->lpLcl->lpGbl->dwMonitorFrequency;
00427             pDDSD->lPitch = This->lpLcl->lpGbl->vmiData.lDisplayPitch;
00428         }
00429     }
00430     _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
00431     {
00432     }
00433     _SEH2_END;
00434 
00435     return retVal;
00436 }

Generated on Sun May 27 2012 04:21:24 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.