10.2 enhancements, eliminated some warnings, added alpha channel mask stuff

This commit is contained in:
nigel 2002-12-19 10:40:40 +00:00
parent 75e3b116a2
commit 1527cac014

View File

@ -37,6 +37,7 @@
#include "video_macosx.h" #include "video_macosx.h"
#define DEBUG 0 #define DEBUG 0
#define VERBOSE 0
#include "debug.h" #include "debug.h"
#ifdef NSBITMAP #ifdef NSBITMAP
@ -180,7 +181,7 @@ static void add_standard_modes(const video_depth depth)
// Helper function to get a 32bit int from a dictionary // Helper function to get a 32bit int from a dictionary
static int32 getCFint32 (CFDictionaryRef dict, CFStringRef key) static int32 getCFint32 (CFDictionaryRef dict, CFStringRef key)
{ {
CFNumberRef ref = CFDictionaryGetValue(dict, key); CFNumberRef ref = (CFNumberRef) CFDictionaryGetValue(dict, key);
if ( ref ) if ( ref )
{ {
@ -197,7 +198,7 @@ static int32 getCFint32 (CFDictionaryRef dict, CFStringRef key)
return 0; return 0;
} }
// Nasty hack. CGDisplayAvailableModes() does not provide bytes per row, // Nasty hack. Under 10.1, CGDisplayAvailableModes() does not provide bytes per row,
// and the emulator doesn't like setting the bytes per row after the screen, // and the emulator doesn't like setting the bytes per row after the screen,
// so we use a lot of magic numbers here. // so we use a lot of magic numbers here.
// This will probably fail on some video hardware. // This will probably fail on some video hardware.
@ -258,11 +259,17 @@ static bool add_CGDirectDisplay_modes()
for ( CFIndex mc = 0; mc < nModes; ++mc ) for ( CFIndex mc = 0; mc < nModes; ++mc )
{ {
CFDictionaryRef modeSpec = CFArrayGetValueAtIndex(m, mc); CFDictionaryRef modeSpec = (CFDictionaryRef)
CFArrayGetValueAtIndex(m, mc);
int32 bpp = getCFint32(modeSpec, kCGDisplayBitsPerPixel); int32 bpp = getCFint32(modeSpec, kCGDisplayBitsPerPixel);
int32 height = getCFint32(modeSpec, kCGDisplayHeight); int32 height = getCFint32(modeSpec, kCGDisplayHeight);
int32 width = getCFint32(modeSpec, kCGDisplayWidth); int32 width = getCFint32(modeSpec, kCGDisplayWidth);
#ifdef MAC_OS_X_VERSION_10_2
int32 bytes = getCFint32(modeSpec, kCGDisplayBytesPerRow);
#else
int32 bytes = 0;
#endif
video_depth depth = DepthModeForPixelDepth(bpp); video_depth depth = DepthModeForPixelDepth(bpp);
if ( ! bpp || ! height || ! width ) if ( ! bpp || ! height || ! width )
@ -276,6 +283,12 @@ static bool add_CGDirectDisplay_modes()
NSLog(@"Display %ld, spec = %@", d, modeSpec); NSLog(@"Display %ld, spec = %@", d, modeSpec);
#endif #endif
if ( ! bytes )
{
NSLog(@"Could not get bytes per row, guessing");
bytes = CGBytesPerRow(width, depth);
}
if ( ! oldRes ) if ( ! oldRes )
oldRes = width * height; oldRes = width * height;
else else
@ -285,8 +298,7 @@ static bool add_CGDirectDisplay_modes()
++res_id; ++res_id;
} }
add_mode(width, height, res_id, add_mode(width, height, res_id, bytes, (const uint32) d, depth);
CGBytesPerRow(width, depth), (const uint32) d, depth);
} }
} }
} }
@ -294,6 +306,40 @@ static bool add_CGDirectDisplay_modes()
return true; return true;
} }
#ifdef CG_USE_ALPHA
// memset() by long instead of byte
static void memsetl (long *buffer, long pattern, size_t length)
{
long *buf = (long *) buffer,
*end = buf + length/4;
while ( ++buf < end )
*buf = pattern;
}
// Sets the alpha channel in a image to full on, except for the corners
static void mask_buffer (void *buffer, size_t width, size_t size)
{
long *bufl = (long *) buffer;
char *bufc = (char *) buffer;
memsetl(bufl, 0xFF000000, size);
// Round upper-left corner
*bufl = 0, *bufc+4 = 0; // XXXXX
bufc += width, *bufc++ = 0, *bufc++ = 0, *bufc++ = 0; // XXX
bufc += width, *bufc++ = 0, *bufc = 0; // XX
bufc += width, *bufc = 0; // X
bufc += width, *bufc = 0; // X
NSLog(@"Masked buffer");
}
#endif
// monitor_desc subclass for Mac OS X displays // monitor_desc subclass for Mac OS X displays
@ -369,11 +415,11 @@ OSX_monitor::set_mac_frame_buffer(const video_mode mode)
set_mac_frame_base(MacFrameBaseMac); set_mac_frame_base(MacFrameBaseMac);
// Set variables used by UAE memory banking // Set variables used by UAE memory banking
MacFrameBaseHost = the_buffer; MacFrameBaseHost = (uint8 *) the_buffer;
MacFrameSize = mode.bytes_per_row * mode.y; MacFrameSize = mode.bytes_per_row * mode.y;
InitFrameBufferMapping(); InitFrameBufferMapping();
#else #else
set_mac_frame_base(Host2MacAddr(the_buffer)); set_mac_frame_base((unsigned int)Host2MacAddr((uint8 *)the_buffer));
#endif #endif
D(bug("mac_frame_base = %08x\n", get_mac_frame_base())); D(bug("mac_frame_base = %08x\n", get_mac_frame_base()));
} }
@ -484,10 +530,14 @@ OSX_monitor::init_window(const video_mode &mode)
bits_from_depth(mode.depth), bits_from_depth(mode.depth),
mode.bytes_per_row, mode.bytes_per_row,
colourSpace, colourSpace,
#ifdef CG_USE_ALPHA
kCGImageAlphaPremultipliedFirst,
#else
kCGImageAlphaNoneSkipFirst, kCGImageAlphaNoneSkipFirst,
#endif
provider, provider,
NULL, // colourMap NULL, // colourMap translation table
NO, // shouldInterpolate NO, // shouldInterpolate colours?
kCGRenderingIntentDefault); kCGRenderingIntentDefault);
if ( ! imageRef ) if ( ! imageRef )
{ {
@ -500,8 +550,12 @@ OSX_monitor::init_window(const video_mode &mode)
[output readyToDraw: imageRef [output readyToDraw: imageRef
imageWidth: mode.x imageWidth: mode.x
imageHeight: mode.y]; imageHeight: mode.y];
#ifdef CG_USE_ALPHA
mask_buffer(the_buffer, mode.x, the_buffer_size);
#endif
#else #else
unsigned char *offsetBuffer = the_buffer; unsigned char *offsetBuffer = (unsigned char *) the_buffer;
offsetBuffer += 1; // OS X NSBitmaps are RGBA, but Basilisk generates ARGB offsetBuffer += 1; // OS X NSBitmaps are RGBA, but Basilisk generates ARGB
#endif #endif
@ -607,8 +661,10 @@ OSX_monitor::init_screen(video_mode &mode)
ErrorSheet(@"Could not get base address of screen", the_win); ErrorSheet(@"Could not get base address of screen", the_win);
return false; return false;
} }
NSLog(@"Starting full screen mode, height = %d",
CGDisplayPixelsHigh(theDisplay)); D(NSLog(@"Starting full screen mode, height = %d",
CGDisplayPixelsHigh(theDisplay)));
[output startedFullScreen: theDisplay]; // For mouse event processing [output startedFullScreen: theDisplay]; // For mouse event processing
if ( mode.bytes_per_row != CGDisplayBytesPerRow(theDisplay) ) if ( mode.bytes_per_row != CGDisplayBytesPerRow(theDisplay) )