Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members   Related Pages  

OgreD3D9VideoModeList.cpp

Go to the documentation of this file.
00001 /*
00002 -----------------------------------------------------------------------------
00003 This source file is part of OGRE
00004     (Object-oriented Graphics Rendering Engine)
00005 For the latest info, see http://www.ogre3d.org/
00006 
00007 Copyright © 2000-2002 The OGRE Team
00008 Also see acknowledgements in Readme.html
00009 
00010 This program is free software; you can redistribute it and/or modify it under
00011 the terms of the GNU Lesser General Public License as published by the Free Software
00012 Foundation; either version 2 of the License, or (at your option) any later
00013 version.
00014 
00015 This program is distributed in the hope that it will be useful, but WITHOUT
00016 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
00017 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
00018 
00019 You should have received a copy of the GNU Lesser General Public License along with
00020 this program; if not, write to the Free Software Foundation, Inc., 59 Temple
00021 Place - Suite 330, Boston, MA 02111-1307, USA, or go to
00022 http://www.gnu.org/copyleft/lesser.txt.
00023 -----------------------------------------------------------------------------
00024 */
00025 #include "OgreD3D9VideoModeList.h"
00026 #include "OgreException.h"
00027 
00028 namespace Ogre 
00029 {
00030     D3D9VideoModeList::D3D9VideoModeList( D3D9Driver* pDriver )
00031     {
00032         if( NULL == pDriver )
00033             Except( Exception::ERR_INVALIDPARAMS, "pDriver parameter is NULL", "D3D9VideoModeList::D3D9VideoModeList" );
00034 
00035         mpDriver = pDriver;
00036         enumerate();
00037     }
00038 
00039     D3D9VideoModeList::~D3D9VideoModeList()
00040     {
00041         mpDriver = NULL;
00042         mModeList.clear();
00043     }
00044 
00045     BOOL D3D9VideoModeList::enumerate()
00046     {
00047         UINT iMode;
00048         LPDIRECT3D9 pD3D = mpDriver->getD3D();
00049         UINT adapter = mpDriver->getAdapterNumber();
00050 
00051         for( iMode=0; iMode < pD3D->GetAdapterModeCount( adapter, D3DFMT_R5G6B5 ); iMode++ )
00052         {
00053             D3DDISPLAYMODE displayMode;
00054             pD3D->EnumAdapterModes( adapter, D3DFMT_R5G6B5, iMode, &displayMode );
00055 
00056             // Filter out low-resolutions
00057             if( displayMode.Width < 640 || displayMode.Height < 400 )
00058                 continue;
00059 
00060             // Check to see if it is already in the list (to filter out refresh rates)
00061             BOOL found = FALSE;
00062             std::vector<D3D9VideoMode>::iterator it;
00063             for( it = mModeList.begin(); it != mModeList.end(); it++ )
00064             {
00065                 D3DDISPLAYMODE oldDisp = it->getDisplayMode();
00066                 if( oldDisp.Width == displayMode.Width &&
00067                     oldDisp.Height == displayMode.Height &&
00068                     oldDisp.Format == displayMode.Format )
00069                 {
00070                     // Check refresh rate and favour higher if poss
00071                     if (oldDisp.RefreshRate < displayMode.RefreshRate)
00072                         it->increaseRefreshRate(displayMode.RefreshRate);
00073                     found = TRUE;
00074                     break;
00075                 }
00076             }
00077 
00078             if( !found )
00079                 mModeList.push_back( D3D9VideoMode( displayMode ) );
00080         }
00081 
00082         for( iMode=0; iMode < pD3D->GetAdapterModeCount( adapter, D3DFMT_X8R8G8B8 ); iMode++ )
00083         {
00084             D3DDISPLAYMODE displayMode;
00085             pD3D->EnumAdapterModes( adapter, D3DFMT_X8R8G8B8, iMode, &displayMode );
00086 
00087             // Filter out low-resolutions
00088             if( displayMode.Width < 640 || displayMode.Height < 400 )
00089                 continue;
00090 
00091             // Check to see if it is already in the list (to filter out refresh rates)
00092             BOOL found = FALSE;
00093             std::vector<D3D9VideoMode>::iterator it;
00094             for( it = mModeList.begin(); it != mModeList.end(); it++ )
00095             {
00096                 D3DDISPLAYMODE oldDisp = it->getDisplayMode();
00097                 if( oldDisp.Width == displayMode.Width &&
00098                     oldDisp.Height == displayMode.Height &&
00099                     oldDisp.Format == displayMode.Format )
00100                 {
00101                     // Check refresh rate and favour higher if poss
00102                     if (oldDisp.RefreshRate < displayMode.RefreshRate)
00103                         it->increaseRefreshRate(displayMode.RefreshRate);
00104                     found = TRUE;
00105                     break;
00106                 }
00107             }
00108 
00109             if( !found )
00110                 mModeList.push_back( D3D9VideoMode( displayMode ) );
00111         }
00112 
00113         return TRUE;
00114     }
00115 
00116     size_t D3D9VideoModeList::count()
00117     {
00118         return mModeList.size();
00119     }
00120 
00121     D3D9VideoMode* D3D9VideoModeList::item( size_t index )
00122     {
00123         std::vector<D3D9VideoMode>::iterator p = mModeList.begin();
00124 
00125         return &p[index];
00126     }
00127 
00128     D3D9VideoMode* D3D9VideoModeList::item( const String &name )
00129     {
00130         std::vector<D3D9VideoMode>::iterator it = mModeList.begin();
00131         if (it == mModeList.end())
00132             return NULL;
00133 
00134         for (;it != mModeList.end(); ++it)
00135         {
00136             if (it->getDescription() == name)
00137                 return &(*it);
00138         }
00139 
00140         return NULL;
00141     }
00142 }

Copyright © 2002-2003 by The OGRE Team
Last modified Sun Nov 28 19:48:22 2004