# HG changeset patch # User bjarni # Date 1143061865 0 # Node ID 5dd99185f8876d7bf1a28b6f7e8b043132a3e918 # Parent 7a623ae69d114b9b5bb6fa729cf76ade9ef76ca3 (svn r4034) merged 3618:3971 for video/cocoa_v.m (major speedup for PPC fullscreen fix) diff -r 7a623ae69d11 -r 5dd99185f887 video/cocoa_v.m --- a/video/cocoa_v.m Wed Mar 22 21:04:13 2006 +0000 +++ b/video/cocoa_v.m Wed Mar 22 21:11:05 2006 +0000 @@ -903,7 +903,6 @@ - (void)appDidHide:(NSNotification*)note { _cocoa_video_data.active = false; -// DEBUG(driver, 1)("cocoa_v: appDidHide"); } @@ -921,7 +920,6 @@ [ self restoreCachedImage ]; _cocoa_video_data.active = true; -// DEBUG(driver, 1)("cocoa_v: appDidUnhide"); } @@ -953,25 +951,21 @@ - (void)windowDidBecomeKey:(NSNotification *)aNotification { _cocoa_video_data.active = true; -// DEBUG(driver, 1)("cocoa_v: windowDidBecomeKey"); } - (void)windowDidResignKey:(NSNotification *)aNotification { _cocoa_video_data.active = false; -// DEBUG(driver, 1)("cocoa_v: windowDidResignKey"); } - (void)windowDidBecomeMain:(NSNotification *)aNotification { _cocoa_video_data.active = true; -// DEBUG(driver, 1)("cocoa_v: windowDidBecomeMain"); } - (void)windowDidResignMain:(NSNotification *)aNotification { _cocoa_video_data.active = false; -// DEBUG(driver, 1)("cocoa_v: windowDidResignMain"); } @end @@ -1507,17 +1501,60 @@ static void QZ_DrawScreen(void) { + const uint8* src; + uint8* dst; + uint height; + uint width; + uint pitch; uint y; - uint8 *src, *dst; - + + 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; + } +#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 < _cocoa_video_data.height; y++) { - src = _cocoa_video_data.pixels + y * _cocoa_video_data.width; - dst = ((uint8 *) _cocoa_video_data.realpixels) + y * _cocoa_video_data.pitch; - - memcpy(dst, src, _cocoa_video_data.width); - } + 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) { @@ -1830,7 +1867,6 @@ CGWarpMouseCursorPosition (cgp); /* Generate the mouse moved event */ -// SDL_PrivateMouseMotion (0, 0, x, y); } void QZ_ShowMouse (void) { @@ -1885,7 +1921,6 @@ /* Display the in game quit confirmation dialog */ - (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *) sender { -// DEBUG(driver, 1)("cocoa_v: applicationShouldTerminate"); QZ_AskQuit();