diff engine/core/video/devicecaps.cpp @ 636:f7863bfa92cd

* Changed the way screen resolutions are detected * Added the ability to query the video driver name
author prock@33b003aa-7bff-0310-803a-e67f0ece8222
date Wed, 06 Oct 2010 20:54:28 +0000
parents 3094988564d5
children 3822b30fd98c
line wrap: on
line diff
--- a/engine/core/video/devicecaps.cpp	Wed Oct 06 19:19:08 2010 +0000
+++ b/engine/core/video/devicecaps.cpp	Wed Oct 06 20:54:28 2010 +0000
@@ -57,10 +57,13 @@
 	}
 
 	void DeviceCaps::fillDeviceCaps() {
+		int bufferSize = 256;
+		char buffer[bufferSize];
+
 		int numBPP = 1;
 		int bpps[numBPP];
 
-		int numResolutions = 15;
+		SDL_Rect **modes;
 
 		//FLAGS
 #ifdef HAVE_OPENGL
@@ -88,41 +91,34 @@
 
 		bpps[0] = 32;
 
+		for (int i = 0; i < numBPP; ++i){
+			for (int j = 0; j < numFlags; ++j) {
+				modes = SDL_ListModes(NULL, flags[j]);
 
-		//RESOLUTIONS
-		int resolutions[15][2] = {
-			{640, 480},
-			{800, 600},
-			{1024, 768},
-			{1152, 864},
-			{1280, 768},
-			{1280, 800},
-			{1280, 960},
-			{1280, 1024},
-			{1366, 768},
-			{1440, 900},
-			{1600, 900},
-			{1600, 1200},
-			{1680, 1050},
-			{1920, 1080},
-			{1920, 1200}
-		};
+				if (modes == (SDL_Rect**)-1) {
+					//All screen modes are available with the specified flags (a windowed mode most likely)
+					ScreenMode mode = ScreenMode(0, 0, bpps[i], flags[j]);
+					m_screenModes.push_back(mode);
+					continue;
+				}
 
-		int bpp;
-
-		for (int i = 0; i < numBPP; i++){
-			for (int j = 0; j < numFlags; j++) {
-				for (int k = 0; k < numResolutions; k++) {
-					bpp = SDL_VideoModeOK(resolutions[k][0], resolutions[k][1], bpps[i], flags[j]);
+				for (int k = 0; modes[k]; ++k) {
+					int bpp = SDL_VideoModeOK(modes[k]->w, modes[k]->h, bpps[i], flags[j]);
 					if (bpp > 0) {
-//						std::cout << resolutions[k][0] << "x" << resolutions[k][1] << ":" << bpp << std::endl;
-						ScreenMode mode = ScreenMode(resolutions[k][0], resolutions[k][1], bpps[i], flags[j]);
+						ScreenMode mode = ScreenMode(modes[k]->w, modes[k]->h, bpps[i], flags[j]);
 						m_screenModes.push_back(mode);
 					}
 				}
 			}
 		}
 
+		if(SDL_VideoDriverName(buffer, bufferSize) != NULL) {
+			m_driverName = std::string(buffer);
+		}
+		else {
+			m_driverName = "Unknown";
+		}
+
 	}
 
 } //FIFE