From e29a4352260b3aba075be615fd6a73bd961ec2d5 Mon Sep 17 00:00:00 2001 From: bjarni Date: Thu, 2 Mar 2006 22:00:57 +0000 Subject: (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 | 63 ++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 38 insertions(+), 25 deletions(-) (limited to 'video') diff --git a/video/cocoa_v.m b/video/cocoa_v.m index a1b3650df..71065cd25 100644 --- a/video/cocoa_v.m +++ b/video/cocoa_v.m @@ -1464,41 +1464,54 @@ static void QZ_DrawScreen(void) 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; +#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; + } - 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++) { - 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); + } - 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; } - - _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(); + 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) -- cgit v1.2.3-70-g09d2