Main Page | Alphabetical List | Compound List | File List | Compound Members | File Members

modelist.c

Go to the documentation of this file.
00001 /****************************************************************************************/
00002 /*  ModeList.c                                                                          */
00003 /*                                                                                      */
00004 /*  Author: Mike Sandige                                                                */
00005 /*  Description:    Builds handy list of available modes                                */
00006 /*                                                                                      */
00007 /*  Copyright (c) 1997, 1999, Eclipse Entertainment; All rights reserved.               */
00008 /*                                                                                      */
00009 /*  See the accompanying file LICENSE.TXT for terms on the use of this library.         */
00010 /*  This library is distributed in the hope that it will be useful but WITHOUT          */
00011 /*  ANY WARRANTY OF ANY KIND and without any implied warranty of MERCHANTABILITY        */
00012 /*  or FITNESS FOR ANY PURPOSE.  Refer to LICENSE.TXT for more details.                 */
00013 /*                                                                                      */
00014 /****************************************************************************************/
00015 #include <string.h>     // strupr, strncpy
00016 #include <assert.h>
00017 
00018 #include "modelist.h"
00019 #include "ram.h"
00020 #include "errorlog.h"
00021 
00022 #define MODELIST_MAX_NAME (1000)
00023 #define MODELIST_ALLOCATION_BLOCK_SIZE (10)
00024 
00025 static char *ModeList_640WindowString="640x480 Window";
00026 static char *ModeList_320WindowString="320x240 Window";
00027 static char *ModeList_800WindowString="800x600 Window";
00028 
00029 
00030 void    ModeList_Destroy(ModeList *List)
00031 {
00032         assert( List );
00033         geRam_Free( List );
00034 }
00035 
00036 
00037 ModeList *ModeList_Create(geEngine *Engine,int *ListLength)
00038 {
00039         geDriver_System *DriverSystem;
00040         geDriver                *Driver;
00041         geDriver_Mode   *Mode;
00042         ModeList                *DriverList=NULL;
00043         ModeList                *NewDriverList;
00044         int                              Allocated = 0;
00045         int                              Needed    = 0;
00046         const char              *DriverNamePtr;
00047         const char              *ModeNamePtr;
00048         char                     DriverName[MODELIST_MAX_NAME];
00049         char                     ModeName[MODELIST_MAX_NAME];
00050 
00051         *ListLength = 0;
00052         DriverSystem = geEngine_GetDriverSystem(Engine);
00053         if      (DriverSystem == NULL)
00054                 {
00055                         geErrorLog_AddString(-1,"AutoSelect: Failed to get driver system",NULL);
00056                         goto ModeList_Exit;
00057                 }
00058                 
00059         Driver = geDriver_SystemGetNextDriver(DriverSystem, NULL);
00060         while   (Driver != NULL)
00061         {
00062                 ModeList *      dinfo;
00063                 ModeList_DriverType DriverType;
00064 
00065                 if (geDriver_GetName(Driver, &DriverNamePtr)==GE_FALSE)
00066                         {
00067                                 geErrorLog_AddString(-1,"AutoSelect: Failed to get driver name",NULL);
00068                                 goto ModeList_Exit;
00069                         }
00070                 strncpy(DriverName,DriverNamePtr,MODELIST_MAX_NAME);
00071                 DriverName[MODELIST_MAX_NAME-1]=0;              // just in case
00072                 strupr(DriverName);
00073                 if (strstr(DriverName,"D3D")!=NULL)
00074                         {
00075                                 /*
00076                                 if (  (strstr(DriverName,"3DFX")!=NULL) || (strstr(DriverName,"VOODOO")!=NULL) )
00077                                         {
00078                                                 DriverType = MODELIST_TYPE_D3D_3DFX;
00079                                         }
00080                                 else
00081                                 */
00082                                         {
00083                                                 if (strstr(DriverName,"PRIMARY")!=NULL)
00084                                                         DriverType = MODELIST_TYPE_D3D_PRIMARY;
00085                                                 else
00086                                                         DriverType = MODELIST_TYPE_D3D_SECONDARY;
00087                                         }
00088                         }
00089                 else if (strstr(DriverName,"GLIDE")!=NULL)
00090                         {
00091                                 DriverType = MODELIST_TYPE_GLIDE;
00092                         }
00093                 else if (strstr(DriverName,"SOFT") != NULL)
00094                         {
00095                                 DriverType = MODELIST_TYPE_SOFTWARE;
00096                         }
00097                 else 
00098                         {
00099                                 DriverType = MODELIST_TYPE_UNKNOWN;
00100                         }
00101                 
00102 
00103                 Mode = geDriver_GetNextMode(Driver, NULL);
00104                 while   (Mode != NULL)
00105                 {
00106                         if (geDriver_ModeGetName(Mode, &ModeNamePtr)==GE_FALSE)
00107                                 {
00108                                         geErrorLog_AddString(-1,"AutoSelect: Failed to get mode name",NULL);
00109                                         goto ModeList_Exit;
00110                                 }
00111 
00112                         Needed++;
00113                         if (Allocated<Needed)
00114                                 {
00115                                         Allocated += MODELIST_ALLOCATION_BLOCK_SIZE;
00116                                         NewDriverList = geRam_Realloc(DriverList,sizeof(ModeList) * Allocated);
00117                                         if (NewDriverList == NULL)
00118                                                 {
00119                                                         geErrorLog_AddString(-1,"AutoSelect: Memory allocation failed",NULL);
00120                                                         goto ModeList_Exit;
00121                                                 }
00122                                         DriverList = NewDriverList;
00123                                 }
00124                         dinfo = &(DriverList[Needed-1]);
00125                         dinfo->DriverNamePtr = DriverNamePtr;
00126                         dinfo->ModeNamePtr   = ModeNamePtr;
00127                         dinfo->Driver = Driver;
00128                         dinfo->Mode = Mode;
00129                         dinfo->DriverType = DriverType;
00130                         if (!geDriver_ModeGetWidthHeight(Mode, &(dinfo->Width), &(dinfo->Height)))
00131                                 {
00132                                         geErrorLog_AddString(-1,"AutoSelect: Failed to get mode width & height.  (recovering)",ModeNamePtr);
00133                                         dinfo->Evaluation = MODELIST_EVALUATED_TRIED_FAILED;
00134                                 }
00135                         if ((dinfo->Width<=640) && (dinfo->Height<=480))
00136                                 {
00137                                         dinfo->Evaluation = MODELIST_EVALUATED_OK;
00138                                 }
00139                         else
00140                                 {
00141                                         dinfo->Evaluation = MODELIST_EVALUATED_UNDESIRABLE;
00142                                 }
00143                         if (dinfo->DriverType == MODELIST_TYPE_D3D_3DFX)
00144                                 {
00145                                         dinfo->Evaluation = MODELIST_EVALUATED_UNDESIRABLE;
00146                                 }
00147 
00148                         if ((dinfo->Width == -1) && (dinfo->Height==-1))
00149                                 {
00150                                         // add some 'virtual modes'  for software window preselected resolutions
00151                                         
00152                                         dinfo->InAWindow = GE_TRUE;
00153                                         dinfo->ModeNamePtr   = ModeList_800WindowString;
00154                                         dinfo->Width = 800;
00155                                         dinfo->Height = 600;
00156                                         dinfo->Evaluation = MODELIST_EVALUATED_UNDESIRABLE;
00157                         
00158                                         Needed++;
00159                                         if (Allocated<Needed)
00160                                                 {
00161                                                         Allocated += MODELIST_ALLOCATION_BLOCK_SIZE;
00162                                                         NewDriverList = geRam_Realloc(DriverList,sizeof(ModeList) * Allocated);
00163                                                         if (NewDriverList == NULL)
00164                                                                 {
00165                                                                         geErrorLog_AddString(-1,"AutoSelect: Memory allocation failed",NULL);
00166                                                                         goto ModeList_Exit;
00167                                                                 }
00168                                                         DriverList = NewDriverList;
00169                                                 }
00170                                         dinfo = &(DriverList[Needed-1]);
00171                                         dinfo->InAWindow = GE_TRUE;
00172                                         dinfo->DriverNamePtr = DriverNamePtr;
00173                                         dinfo->ModeNamePtr   = ModeList_640WindowString;
00174                                         dinfo->Driver = Driver;
00175                                         dinfo->Mode = Mode;
00176                                         dinfo->DriverType = DriverType;
00177                                         dinfo->Width = 640;
00178                                         dinfo->Height = 480;
00179                                         dinfo->Evaluation = MODELIST_EVALUATED_OK;
00180 
00181                                         Needed++;
00182                                         if (Allocated<Needed)
00183                                                 {
00184                                                         Allocated += MODELIST_ALLOCATION_BLOCK_SIZE;
00185                                                         NewDriverList = geRam_Realloc(DriverList,sizeof(ModeList) * Allocated);
00186                                                         if (NewDriverList == NULL)
00187                                                                 {
00188                                                                         geErrorLog_AddString(-1,"AutoSelect: Memory allocation failed",NULL);
00189                                                                         goto ModeList_Exit;
00190                                                                 }
00191                                                         DriverList = NewDriverList;
00192                                                 }
00193                                         dinfo = &(DriverList[Needed-1]);
00194                                         dinfo->InAWindow = GE_TRUE;
00195                                         dinfo->DriverNamePtr = DriverNamePtr;
00196                                         dinfo->ModeNamePtr   = ModeList_320WindowString;
00197                                         dinfo->Driver = Driver;
00198                                         dinfo->Mode = Mode;
00199                                         dinfo->DriverType = DriverType;
00200                                         dinfo->Width = 320;
00201                                         dinfo->Height = 240;
00202                                         dinfo->Evaluation = MODELIST_EVALUATED_OK;
00203 
00204                                 }
00205                         else
00206                                 {
00207                                         strncpy(ModeName,ModeNamePtr,MODELIST_MAX_NAME);
00208                                         ModeName[MODELIST_MAX_NAME-1]=0;                // just in case
00209                                         strupr(ModeName);
00210                                         if (strstr(ModeName,"WIN")!=NULL)
00211                                                 {
00212                                                         dinfo->InAWindow = GE_TRUE;
00213                                                 }
00214                                         else
00215                                                 {
00216                                                         dinfo->InAWindow = GE_FALSE;
00217                                                 }
00218                                 }
00219 
00220                         
00221                         Mode = geDriver_GetNextMode(Driver, Mode);
00222                 }
00223                 Driver = geDriver_SystemGetNextDriver(DriverSystem, Driver);
00224         }
00225 
00226         
00227         *ListLength = Needed;
00228         return DriverList;
00229         
00230         ModeList_Exit:
00231         
00232         if (DriverList!=NULL)
00233                 {
00234                         ModeList_Destroy(DriverList);
00235                 }
00236                         
00237         return NULL;
00238 }
00239 

Generated on Tue Sep 30 12:36:01 2003 for GTestAndEngine by doxygen 1.3.2