mirror of
https://github.com/OpenTTD/OpenTTD.git
synced 2025-03-06 14:27:16 +00:00
(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
This commit is contained in:
parent
1931b8ea96
commit
e29a435226
@ -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;
|
||||
|
||||
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;
|
||||
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)
|
||||
|
Loading…
Reference in New Issue
Block a user