(svn r3741) -Fix: [i686 OSX] reverted the change in rev 3670 for non PowerPC (done with #ifdef) since it appeared to crash intel based macs
authorbjarni
Thu, 02 Mar 2006 22:00:57 +0000
changeset 3128 1a6b26d523f4
parent 3127 c734d50ad134
child 3129 6643450b6aa4
(svn r3741) -Fix: [i686 OSX] reverted the change in rev 3670 for non PowerPC (done with #ifdef) since it appeared to crash intel based macs
This fix is not a good solution and might not work, but if it works, it's better than nothing until we get the real solution
video/cocoa_v.m
--- a/video/cocoa_v.m	Thu Mar 02 21:43:09 2006 +0000
+++ b/video/cocoa_v.m	Thu Mar 02 22:00:57 2006 +0000
@@ -1464,41 +1464,54 @@
 	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;
-	height = _cocoa_video_data.height;
 	width  = _cocoa_video_data.width;
 	pitch  = _cocoa_video_data.pitch;
-	num_dirty_rects = _cocoa_video_data.num_dirty_rects;
-
-	/* Check if we need to do anything */
-	if (_cocoa_video_data.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;
+#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;
 	}
-
+#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();
-	/* 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;
+	for (y = 0; y < height; y++) memcpy(dst + y * pitch, src + y * width, width);
+#endif
 }
 
 static int QZ_ListFullscreenModes(OTTDPoint* mode_list, int max_modes)