(svn r4100) -Backported 4082 and 4099 0.4
authorbjarni
Sat, 25 Mar 2006 07:40:02 +0000
branch0.4
changeset 9964 d4a7ce61b6e9
parent 9963 2a389f0ebd7c
child 9965 40a3a784609a
(svn r4100) -Backported 4082 and 4099
the cocoa driver no longer crashes when going to fullscreen (this one depended on the resolution)
teh cocoa driver speedup of around 1000% applies to Intel macs, so the driver is now just as fast as the PPC one
video/cocoa_v.m
--- a/video/cocoa_v.m	Fri Mar 24 23:33:30 2006 +0000
+++ b/video/cocoa_v.m	Sat Mar 25 07:40:02 2006 +0000
@@ -1507,54 +1507,41 @@
 	uint width;
 	uint pitch;
 	uint y;
+	uint num_dirty_rects;
+	uint length_drawn;
+	uint left;
+	uint i;
 
 	src = _cocoa_video_data.pixels;
 	dst = (uint8*)_cocoa_video_data.realpixels;
 	width  = _cocoa_video_data.width;
 	pitch  = _cocoa_video_data.pitch;
-
-#ifdef __POWERPC__
-	// PPC appears to handle updating of rectangles right
-	{
-		uint num_dirty_rects;
-		uint length_drawn;
-		uint left;
-		uint i;
-
-		num_dirty_rects = _cocoa_video_data.num_dirty_rects;
-
-		/* Check if we need to do anything */
-		if (num_dirty_rects == 0 ) return;
-
-		if (num_dirty_rects >= MAX_DIRTY_RECTS) {
-			num_dirty_rects = 1;
-			_cocoa_video_data.dirty_rects[0].left = 0;
-			_cocoa_video_data.dirty_rects[0].top = 0;
-			_cocoa_video_data.dirty_rects[0].right = _cocoa_video_data.width;
-			_cocoa_video_data.dirty_rects[0].bottom = _cocoa_video_data.height;
-		}
-
-		QZ_WaitForVerticalBlank();
-		/* Build the region of dirty rectangles */
-		for (i = 0; i < num_dirty_rects; i++) {
-
-			y = _cocoa_video_data.dirty_rects[i].top;
-			left = _cocoa_video_data.dirty_rects[i].left;
-			length_drawn = _cocoa_video_data.dirty_rects[i].right - left + 1;
-			height = _cocoa_video_data.dirty_rects[i].bottom;
-			for (; y <= height; y++) memcpy(dst + y * pitch + left, src + y * width +left, length_drawn);
-		}
-
-		_cocoa_video_data.num_dirty_rects = 0;
+	num_dirty_rects = _cocoa_video_data.num_dirty_rects;
+
+	/* Check if we need to do anything */
+	if (num_dirty_rects == 0 ) return;
+
+	if (num_dirty_rects >= MAX_DIRTY_RECTS) {
+		num_dirty_rects = 1;
+		_cocoa_video_data.dirty_rects[0].left = 0;
+		_cocoa_video_data.dirty_rects[0].top = 0;
+		_cocoa_video_data.dirty_rects[0].right = _cocoa_video_data.width;
+		_cocoa_video_data.dirty_rects[0].bottom = _cocoa_video_data.height;
 	}
-#else
-	// it appears that Intel based macs didn't like to only update parts of the screen at a time, so they still update everything at each frame
-	// we need to switch to use Quartz exclusively (no QuickDraw commands at all) to fix this
-	// to use Quartz exclusively, we should use 16 or 32 bit graphics since 8 bit coloured graphic support sucks
-	height  = _cocoa_video_data.height;
+
 	QZ_WaitForVerticalBlank();
-	for (y = 0; y < height; y++) memcpy(dst + y * pitch, src + y * width, width);
-#endif
+	/* Build the region of dirty rectangles */
+	for (i = 0; i < num_dirty_rects; i++) {
+
+		y = _cocoa_video_data.dirty_rects[i].top;
+		left = _cocoa_video_data.dirty_rects[i].left;
+		length_drawn = _cocoa_video_data.dirty_rects[i].right - left;
+		height = _cocoa_video_data.dirty_rects[i].bottom;
+		for (; y < height; y++) memcpy(dst + y * pitch + left, src + y * width +left, length_drawn);
+	}
+
+	_cocoa_video_data.num_dirty_rects = 0;
+
 }
 
 static int QZ_ListFullscreenModes (OTTDPoint *mode_list, int max_modes) {
@@ -1701,9 +1688,11 @@
 		current_modes = _default_resolutions;
 	}
 
-	for(i = 0, j = 0; j < lengthof(_resolutions) && i < count; i++) {
-		if (_cocoa_video_data.fullscreen || ((uint) current_modes[i].x <= _cocoa_video_data.device_width &&
-				  							 (uint) current_modes[i].y <= _cocoa_video_data.device_height)) {
+	for (i = 0, j = 0; j < lengthof(_resolutions) && i < count; i++) {
+		if (_cocoa_video_data.fullscreen || (
+					(uint)current_modes[i].x < _cocoa_video_data.device_width &&
+					(uint)current_modes[i].y < _cocoa_video_data.device_height)
+				) {
 			_resolutions[j][0] = current_modes[i].x;
 			_resolutions[j][1] = current_modes[i].y;
 			j++;