00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include <string.h>
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;
00072 strupr(DriverName);
00073 if (strstr(DriverName,"D3D")!=NULL)
00074 {
00075
00076
00077
00078
00079
00080
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
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;
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