summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--video/cocoa_v.m34
1 files changed, 31 insertions, 3 deletions
diff --git a/video/cocoa_v.m b/video/cocoa_v.m
index 0daffd8f1..654b5a9fb 100644
--- a/video/cocoa_v.m
+++ b/video/cocoa_v.m
@@ -1470,15 +1470,43 @@ static void QZ_DrawScreen(void)
uint width;
uint pitch;
uint y;
-
- QZ_WaitForVerticalBlank();
+ 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;
- for (y = 0; y < height; y++) memcpy(dst + y * pitch, src + y * width, width);
+ 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;
+ }
+
+ 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;
}
static int QZ_ListFullscreenModes(OTTDPoint* mode_list, int max_modes)