Changeset - r8156:a6b6768b0508
[Not reviewed]
master
0 4 0
egladil - 17 years ago 2007-12-29 05:15:13
egladil@openttd.org
(svn r11718) -Fix [FS#1483]: Show the fullscreen modes available to the cocoa driver in windowed mode too.
4 files changed with 85 insertions and 86 deletions:
0 comments (0 inline, 0 general)
src/video/cocoa/cocoa_v.h
Show inline comments
 
@@ -79,4 +79,6 @@ void QZ_GameLoop();
 
void QZ_ShowMouse();
 
void QZ_HideMouse();
 

	
 
uint QZ_ListModes(OTTD_Point* modes, uint max_modes, CGDirectDisplayID display_id, int display_depth);
 

	
 
#endif /* VIDEO_COCOA_H */
src/video/cocoa/fullscreen.mm
Show inline comments
 
@@ -76,6 +76,86 @@ struct OTTD_QuartzGammaTable {
 
@end
 

	
 

	
 

	
 
uint QZ_ListModes(OTTD_Point* modes, uint max_modes, CGDirectDisplayID display_id, int display_depth)
 
{
 
	CFArrayRef mode_list;
 
	CFIndex num_modes;
 
	CFIndex i;
 
	uint count = 0;
 

	
 
	mode_list  = CGDisplayAvailableModes(display_id);
 
	num_modes = CFArrayGetCount(mode_list);
 

	
 
	/* Build list of modes with the requested bpp */
 
	for (i = 0; i < num_modes && count < max_modes; i++) {
 
		CFDictionaryRef onemode;
 
		CFNumberRef     number;
 
		int bpp;
 
		int intvalue;
 
		bool hasMode;
 
		uint16 width, height;
 

	
 
		onemode = (const __CFDictionary*)CFArrayGetValueAtIndex(mode_list, i);
 
		number = (const __CFNumber*)CFDictionaryGetValue(onemode, kCGDisplayBitsPerPixel);
 
		CFNumberGetValue (number, kCFNumberSInt32Type, &bpp);
 

	
 
		if (bpp != display_depth) continue;
 

	
 
		number = (const __CFNumber*)CFDictionaryGetValue(onemode, kCGDisplayWidth);
 
		CFNumberGetValue(number, kCFNumberSInt32Type, &intvalue);
 
		width = (uint16)intvalue;
 

	
 
		number = (const __CFNumber*)CFDictionaryGetValue(onemode, kCGDisplayHeight);
 
		CFNumberGetValue(number, kCFNumberSInt32Type, &intvalue);
 
		height = (uint16)intvalue;
 

	
 
		/* Check if mode is already in the list */
 
		{
 
			uint i;
 
			hasMode = false;
 
			for (i = 0; i < count; i++) {
 
				if (modes[i].x == width &&  modes[i].y == height) {
 
					hasMode = true;
 
					break;
 
				}
 
			}
 
		}
 

	
 
		if (hasMode) continue;
 

	
 
		/* Add mode to the list */
 
		modes[count].x = width;
 
		modes[count].y = height;
 
		count++;
 
	}
 

	
 
	/* Sort list smallest to largest */
 
	{
 
		uint i, j;
 
		for (i = 0; i < count; i++) {
 
			for (j = 0; j < count-1; j++) {
 
				if (modes[j].x > modes[j + 1].x || (
 
					modes[j].x == modes[j + 1].x &&
 
					modes[j].y >  modes[j + 1].y
 
					)) {
 
					uint tmpw = modes[j].x;
 
					uint tmph = modes[j].y;
 

	
 
					modes[j].x = modes[j + 1].x;
 
					modes[j].y = modes[j + 1].y;
 

	
 
					modes[j + 1].x = tmpw;
 
					modes[j + 1].y = tmph;
 
				}
 
			}
 
		}
 
	}
 

	
 
	return count;
 
}
 

	
 

	
 
class FullscreenSubdriver: public CocoaSubdriver {
 
	int                display_width;
 
	int                display_height;
 
@@ -449,80 +529,7 @@ public:
 

	
 
	virtual uint ListModes(OTTD_Point* modes, uint max_modes)
 
	{
 
		CFArrayRef mode_list;
 
		CFIndex num_modes;
 
		CFIndex i;
 
		uint count = 0;
 

	
 
		mode_list  = CGDisplayAvailableModes(display_id);
 
		num_modes = CFArrayGetCount(mode_list);
 

	
 
		/* Build list of modes with the requested bpp */
 
		for (i = 0; i < num_modes && count < max_modes; i++) {
 
			CFDictionaryRef onemode;
 
			CFNumberRef     number;
 
			int bpp;
 
			int intvalue;
 
			bool hasMode;
 
			uint16 width, height;
 

	
 
			onemode = (const __CFDictionary*)CFArrayGetValueAtIndex(mode_list, i);
 
			number = (const __CFNumber*)CFDictionaryGetValue(onemode, kCGDisplayBitsPerPixel);
 
			CFNumberGetValue (number, kCFNumberSInt32Type, &bpp);
 

	
 
			if (bpp != display_depth) continue;
 

	
 
			number = (const __CFNumber*)CFDictionaryGetValue(onemode, kCGDisplayWidth);
 
			CFNumberGetValue(number, kCFNumberSInt32Type, &intvalue);
 
			width = (uint16)intvalue;
 

	
 
			number = (const __CFNumber*)CFDictionaryGetValue(onemode, kCGDisplayHeight);
 
			CFNumberGetValue(number, kCFNumberSInt32Type, &intvalue);
 
			height = (uint16)intvalue;
 

	
 
			/* Check if mode is already in the list */
 
			{
 
				uint i;
 
				hasMode = false;
 
				for (i = 0; i < count; i++) {
 
					if (modes[i].x == width &&  modes[i].y == height) {
 
						hasMode = true;
 
						break;
 
					}
 
				}
 
			}
 

	
 
			if (hasMode) continue;
 

	
 
			/* Add mode to the list */
 
			modes[count].x = width;
 
			modes[count].y = height;
 
			count++;
 
		}
 

	
 
		/* Sort list smallest to largest */
 
		{
 
			uint i, j;
 
			for (i = 0; i < count; i++) {
 
				for (j = 0; j < count-1; j++) {
 
					if (modes[j].x > modes[j + 1].x || (
 
						modes[j].x == modes[j + 1].x &&
 
						modes[j].y >  modes[j + 1].y
 
						)) {
 
						uint tmpw = modes[j].x;
 
						uint tmph = modes[j].y;
 

	
 
						modes[j].x = modes[j + 1].x;
 
						modes[j].y = modes[j + 1].y;
 

	
 
						modes[j + 1].x = tmpw;
 
						modes[j + 1].y = tmph;
 
					}
 
				}
 
			}
 
		}
 

	
 
		return count;
 
		return QZ_ListModes(modes, max_modes, display_id, display_depth);
 
	}
 

	
 
	virtual bool ChangeResolution(int w, int h)
src/video/cocoa/wnd_quartz.mm
Show inline comments
 
@@ -660,12 +660,7 @@ void WindowQuartzSubdriver::UpdatePalett
 

	
 
uint WindowQuartzSubdriver::ListModes(OTTD_Point* modes, uint max_modes)
 
{
 
	if (max_modes == 0) return 0;
 

	
 
	modes[0].x = window_width;
 
	modes[0].y = window_height;
 

	
 
	return 1;
 
	return QZ_ListModes(modes, max_modes, kCGDirectMainDisplay, buffer_depth);
 
}
 

	
 
bool WindowQuartzSubdriver::ChangeResolution(int w, int h)
src/video/cocoa/wnd_quickdraw.mm
Show inline comments
 
@@ -685,12 +685,7 @@ void WindowQuickdrawSubdriver::UpdatePal
 

	
 
uint WindowQuickdrawSubdriver::ListModes(OTTD_Point* modes, uint max_modes)
 
{
 
	if (max_modes == 0) return 0;
 

	
 
	modes[0].x = window_width;
 
	modes[0].y = window_height;
 

	
 
	return 1;
 
	return QZ_ListModes(modes, max_modes, kCGDirectMainDisplay, buffer_depth);
 
}
 

	
 
bool WindowQuickdrawSubdriver::ChangeResolution(int w, int h)
0 comments (0 inline, 0 general)