The Mac OS X Cocoa video driver is under construction...

Note that SDLmain is no longer necessary on Mac OS X. :)

--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%401976
This commit is contained in:
Sam Lantinga 2006-07-23 09:11:10 +00:00
parent d4e887aa04
commit 6822a805b4
34 changed files with 644 additions and 5151 deletions

View File

@ -1046,36 +1046,11 @@ CheckBWINDOW()
fi
}
dnl Set up the Carbon/QuickDraw video driver for Mac OS X (but not Darwin)
CheckCARBON()
{
AC_ARG_ENABLE(video-carbon,
AC_HELP_STRING([--enable-video-carbon], [use Carbon/QuickDraw video driver [[default=no]]]),
, enable_video_carbon=no)
if test x$enable_video = xyes -a x$enable_video_carbon = xyes; then
AC_MSG_CHECKING(for Carbon framework)
have_carbon=no
AC_TRY_COMPILE([
#include <Carbon/Carbon.h>
],[
],[
have_carbon=yes
])
AC_MSG_RESULT($have_carbon)
if test x$have_carbon = xyes; then
AC_DEFINE(SDL_VIDEO_DRIVER_TOOLBOX)
SOURCES="$SOURCES $srcdir/src/video/maccommon/*.c"
SOURCES="$SOURCES $srcdir/src/video/macrom/*.c"
have_video=yes
fi
fi
}
dnl Set up the Cocoa/Quartz video driver for Mac OS X (but not Darwin)
dnl Set up the Cocoa video driver for Mac OS X (but not Darwin)
CheckCOCOA()
{
AC_ARG_ENABLE(video-cocoa,
AC_HELP_STRING([--enable-video-cocoa], [use Cocoa/Quartz video driver [[default=yes]]]),
AC_HELP_STRING([--enable-video-cocoa], [use Cocoa video driver [[default=yes]]]),
, enable_video_cocoa=yes)
if test x$enable_video = xyes -a x$enable_video_cocoa = xyes; then
save_CFLAGS="$CFLAGS"
@ -1092,8 +1067,8 @@ AC_HELP_STRING([--enable-video-cocoa], [use Cocoa/Quartz video driver [[default=
AC_MSG_RESULT($have_cocoa)
CFLAGS="$save_CFLAGS"
if test x$have_cocoa = xyes; then
AC_DEFINE(SDL_VIDEO_DRIVER_QUARTZ)
SOURCES="$SOURCES $srcdir/src/video/quartz/*.m"
AC_DEFINE(SDL_VIDEO_DRIVER_COCOA)
SOURCES="$SOURCES $srcdir/src/video/cocoa/*.m"
have_video=yes
fi
fi
@ -1526,9 +1501,6 @@ CheckMacGL()
if test x$enable_video_cocoa = xyes; then
EXTRA_LDFLAGS="$EXTRA_LDFLAGS -Wl,-framework,OpenGL"
fi
if test x$enable_video_carbon = xyes; then
EXTRA_LDFLAGS="$EXTRA_LDFLAGS -Wl,-framework,AGL"
fi
esac
fi
}
@ -2453,7 +2425,6 @@ AC_HELP_STRING([--enable-render-d3d], [enable the Direct3D render driver [[defau
fi
CheckCOCOA
CheckCARBON
CheckX11
CheckMacGL
CheckOpenGLX11
@ -2492,11 +2463,9 @@ AC_HELP_STRING([--enable-render-d3d], [enable the Direct3D render driver [[defau
have_timers=yes
fi
# The Mac OS X platform requires special setup.
SDLMAIN_SOURCES="$srcdir/src/main/macosx/*.m"
EXTRA_CFLAGS="$EXTRA_CFLAGS -fpascal-strings"
EXTRA_LDFLAGS="$EXTRA_LDFLAGS -Wl,-framework,Cocoa"
EXTRA_LDFLAGS="$EXTRA_LDFLAGS -Wl,-framework,Carbon"
SDL_LIBS="-lSDLmain $SDL_LIBS"
# If either the audio or CD driver is used, add the AudioUnit framework
if test x$enable_audio = xyes -o x$enable_cdrom = xyes; then
EXTRA_LDFLAGS="$EXTRA_LDFLAGS -Wl,-framework,AudioToolbox -Wl,-framework,AudioUnit"
@ -2623,7 +2592,6 @@ OBJECTS=`echo $OBJECTS | sed 's,[[^ ]]*/\([[^ ]]*\)\.c,$(objects)/\1.lo,g'`
OBJECTS=`echo $OBJECTS | sed 's,[[^ ]]*/\([[^ ]]*\)\.S,$(objects)/\1.lo,g'`
SDLMAIN_OBJECTS=`echo $SDLMAIN_SOURCES | sed 's,[[^ ]]*/\([[^ ]]*\)\.cc,$(objects)/\1.o,g'`
SDLMAIN_OBJECTS=`echo $SDLMAIN_OBJECTS | sed 's,[[^ ]]*/\([[^ ]]*\)\.m,$(objects)/\1.o,g'`
SDLMAIN_OBJECTS=`echo $SDLMAIN_OBJECTS | sed 's,[[^ ]]*/\([[^ ]]*\)\.c,$(objects)/\1.o,g'`
# Set runtime shared library paths as needed
@ -2642,12 +2610,8 @@ fi
case "$ARCH" in
macosx)
SDL_LIBS="$SDL_LIBS -Wl,-framework,Cocoa"
# Is this still needed?
#if test x$enable_video = xyes -a x$enable_video_carbon = xyes; then
# SDL_LIBS="$SDL_LIBS -Wl,-framework,Carbon"
#fi
# Evil hack to allow static linking on Mac OS X
SDL_STATIC_LIBS="\${exec_prefix}/lib/libSDLmain.a \${exec_prefix}/lib/libSDL.a $EXTRA_LDFLAGS"
SDL_STATIC_LIBS="\${exec_prefix}/lib/libSDL.a $EXTRA_LDFLAGS"
;;
*)
SDL_STATIC_LIBS="$SDL_LIBS"

View File

@ -251,6 +251,7 @@
/* Enable various video drivers */
#undef SDL_VIDEO_DRIVER_AALIB
#undef SDL_VIDEO_DRIVER_BWINDOW
#undef SDL_VIDEO_DRIVER_COCOA
#undef SDL_VIDEO_DRIVER_CYBERGRAPHICS
#undef SDL_VIDEO_DRIVER_DC
#undef SDL_VIDEO_DRIVER_DGA
@ -270,7 +271,6 @@
#undef SDL_VIDEO_DRIVER_PICOGUI
#undef SDL_VIDEO_DRIVER_PS2GS
#undef SDL_VIDEO_DRIVER_QTOPIA
#undef SDL_VIDEO_DRIVER_QUARTZ
#undef SDL_VIDEO_DRIVER_RISCOS
#undef SDL_VIDEO_DRIVER_SVGALIB
#undef SDL_VIDEO_DRIVER_TOOLBOX

View File

@ -113,12 +113,8 @@
#define SDL_TIMER_UNIX 1
/* Enable various video drivers */
#define SDL_VIDEO_DRIVER_COCOA 1
#define SDL_VIDEO_DRIVER_DUMMY 1
#if TARGET_API_MAC_CARBON
#define SDL_VIDEO_DRIVER_TOOLBOX 1
#else
#define SDL_VIDEO_DRIVER_QUARTZ 1
#endif
/* Enable OpenGL support */
#define SDL_VIDEO_OPENGL 1

View File

@ -25,11 +25,11 @@
#include "SDL_stdinc.h"
/* Redefine main() on Win32 and MacOS so that it is called by winmain.c */
/* Redefine main() on some platforms so that it is called by SDL */
#if defined(__WIN32__) || \
(defined(__MWERKS__) && !defined(__BEOS__)) || \
defined(__MACOS__) || defined(__MACOSX__) || \
defined(__MACOS__) || \
defined(__SYMBIAN32__) || defined(QWS)
#ifdef __cplusplus

View File

@ -1,24 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist SYSTEM "file://localhost/System/Library/DTDs/PropertyList.dtd">
<plist version="0.9">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleExecutable</key>
<string>@EXECUTABLE_NAME@</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>@PACKAGE@</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>@VERSION@</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>NSMainNibFile</key>
<string>SDLMain.nib</string>
<key>NSPrincipalClass</key>
<string>NSApplication</string>
</dict>
</plist>

View File

@ -1,11 +0,0 @@
/* SDLMain.m - main entry point for our Cocoa-ized SDL app
Initial Version: Darrell Walisser <dwaliss1@purdue.edu>
Non-NIB-Code & other changes: Max Horn <max@quendi.de>
Feel free to customize this file to suit your needs
*/
#import <Cocoa/Cocoa.h>
@ interface SDLMain:NSObject @ end
/* vi: set ts=4 sw=4 expandtab: */

View File

@ -1,384 +0,0 @@
/* SDLMain.m - main entry point for our Cocoa-ized SDL app
Initial Version: Darrell Walisser <dwaliss1@purdue.edu>
Non-NIB-Code & other changes: Max Horn <max@quendi.de>
Feel free to customize this file to suit your needs
*/
#import "SDL.h"
#import "SDLMain.h"
#import <sys/param.h> /* for MAXPATHLEN */
#import <unistd.h>
/* For some reaon, Apple removed setAppleMenu from the headers in 10.4,
but the method still is there and works. To avoid warnings, we declare
it ourselves here. */
@interface NSApplication(SDL_Missing_Methods)
- (void)setAppleMenu:(NSMenu *)menu;
@end
/* Use this flag to determine whether we use SDLMain.nib or not */
#define SDL_USE_NIB_FILE 0
/* Use this flag to determine whether we use CPS (docking) or not */
#define SDL_USE_CPS 1
#ifdef SDL_USE_CPS
/* Portions of CPS.h */
typedef struct CPSProcessSerNum
{
UInt32 lo;
UInt32 hi;
} CPSProcessSerNum;
extern OSErr CPSGetCurrentProcess( CPSProcessSerNum *psn);
extern OSErr CPSEnableForegroundOperation( CPSProcessSerNum *psn, UInt32 _arg2, UInt32 _arg3, UInt32 _arg4, UInt32 _arg5);
extern OSErr CPSSetFrontProcess( CPSProcessSerNum *psn);
#endif /* SDL_USE_CPS */
static int gArgc;
static char **gArgv;
static BOOL gFinderLaunch;
static BOOL gCalledAppMainline = FALSE;
static NSString *getApplicationName(void)
{
NSDictionary *dict;
NSString *appName = 0;
/* Determine the application name */
dict = (NSDictionary *)CFBundleGetInfoDictionary(CFBundleGetMainBundle());
if (dict)
appName = [dict objectForKey: @"CFBundleName"];
if (![appName length])
appName = [[NSProcessInfo processInfo] processName];
return appName;
}
#if SDL_USE_NIB_FILE
/* A helper category for NSString */
@interface NSString (ReplaceSubString)
- (NSString *)stringByReplacingRange:(NSRange)aRange with:(NSString *)aString;
@end
#endif
@interface SDLApplication : NSApplication
@end
@implementation SDLApplication
/* Invoked from the Quit menu item */
- (void)terminate:(id)sender
{
/* Post a SDL_QUIT event */
SDL_Event event;
event.type = SDL_QUIT;
SDL_PushEvent(&event);
}
@end
/* The main class of the application, the application's delegate */
@implementation SDLMain
/* Set the working directory to the .app's parent directory */
- (void) setupWorkingDirectory:(BOOL)shouldChdir
{
if (shouldChdir)
{
char parentdir[MAXPATHLEN];
CFURLRef url = CFBundleCopyBundleURL(CFBundleGetMainBundle());
CFURLRef url2 = CFURLCreateCopyDeletingLastPathComponent(0, url);
if (CFURLGetFileSystemRepresentation(url2, true, (UInt8 *)parentdir, MAXPATHLEN)) {
assert ( chdir (parentdir) == 0 ); /* chdir to the binary app's parent */
}
CFRelease(url);
CFRelease(url2);
}
}
#if SDL_USE_NIB_FILE
/* Fix menu to contain the real app name instead of "SDL App" */
- (void)fixMenu:(NSMenu *)aMenu withAppName:(NSString *)appName
{
NSRange aRange;
NSEnumerator *enumerator;
NSMenuItem *menuItem;
aRange = [[aMenu title] rangeOfString:@"SDL App"];
if (aRange.length != 0)
[aMenu setTitle: [[aMenu title] stringByReplacingRange:aRange with:appName]];
enumerator = [[aMenu itemArray] objectEnumerator];
while ((menuItem = [enumerator nextObject]))
{
aRange = [[menuItem title] rangeOfString:@"SDL App"];
if (aRange.length != 0)
[menuItem setTitle: [[menuItem title] stringByReplacingRange:aRange with:appName]];
if ([menuItem hasSubmenu])
[self fixMenu:[menuItem submenu] withAppName:appName];
}
[ aMenu sizeToFit ];
}
#else
static void setApplicationMenu(void)
{
/* warning: this code is very odd */
NSMenu *appleMenu;
NSMenuItem *menuItem;
NSString *title;
NSString *appName;
appName = getApplicationName();
appleMenu = [[NSMenu alloc] initWithTitle:@""];
/* Add menu items */
title = [@"About " stringByAppendingString:appName];
[appleMenu addItemWithTitle:title action:@selector(orderFrontStandardAboutPanel:) keyEquivalent:@""];
[appleMenu addItem:[NSMenuItem separatorItem]];
title = [@"Hide " stringByAppendingString:appName];
[appleMenu addItemWithTitle:title action:@selector(hide:) keyEquivalent:@"h"];
menuItem = (NSMenuItem *)[appleMenu addItemWithTitle:@"Hide Others" action:@selector(hideOtherApplications:) keyEquivalent:@"h"];
[menuItem setKeyEquivalentModifierMask:(NSAlternateKeyMask|NSCommandKeyMask)];
[appleMenu addItemWithTitle:@"Show All" action:@selector(unhideAllApplications:) keyEquivalent:@""];
[appleMenu addItem:[NSMenuItem separatorItem]];
title = [@"Quit " stringByAppendingString:appName];
[appleMenu addItemWithTitle:title action:@selector(terminate:) keyEquivalent:@"q"];
/* Put menu into the menubar */
menuItem = [[NSMenuItem alloc] initWithTitle:@"" action:nil keyEquivalent:@""];
[menuItem setSubmenu:appleMenu];
[[NSApp mainMenu] addItem:menuItem];
/* Tell the application object that this is now the application menu */
[NSApp setAppleMenu:appleMenu];
/* Finally give up our references to the objects */
[appleMenu release];
[menuItem release];
}
/* Create a window menu */
static void setupWindowMenu(void)
{
NSMenu *windowMenu;
NSMenuItem *windowMenuItem;
NSMenuItem *menuItem;
windowMenu = [[NSMenu alloc] initWithTitle:@"Window"];
/* "Minimize" item */
menuItem = [[NSMenuItem alloc] initWithTitle:@"Minimize" action:@selector(performMiniaturize:) keyEquivalent:@"m"];
[windowMenu addItem:menuItem];
[menuItem release];
/* Put menu into the menubar */
windowMenuItem = [[NSMenuItem alloc] initWithTitle:@"Window" action:nil keyEquivalent:@""];
[windowMenuItem setSubmenu:windowMenu];
[[NSApp mainMenu] addItem:windowMenuItem];
/* Tell the application object that this is now the window menu */
[NSApp setWindowsMenu:windowMenu];
/* Finally give up our references to the objects */
[windowMenu release];
[windowMenuItem release];
}
/* Replacement for NSApplicationMain */
static void CustomApplicationMain (int argc, char **argv)
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
SDLMain *sdlMain;
/* Ensure the application object is initialised */
[SDLApplication sharedApplication];
#ifdef SDL_USE_CPS
{
CPSProcessSerNum PSN;
/* Tell the dock about us */
if (!CPSGetCurrentProcess(&PSN))
if (!CPSEnableForegroundOperation(&PSN,0x03,0x3C,0x2C,0x1103))
if (!CPSSetFrontProcess(&PSN))
[SDLApplication sharedApplication];
}
#endif /* SDL_USE_CPS */
/* Set up the menubar */
[NSApp setMainMenu:[[NSMenu alloc] init]];
setApplicationMenu();
setupWindowMenu();
/* Create SDLMain and make it the app delegate */
sdlMain = [[SDLMain alloc] init];
[NSApp setDelegate:sdlMain];
/* Start the main event loop */
[NSApp run];
[sdlMain release];
[pool release];
}
#endif
/*
* Catch document open requests...this lets us notice files when the app
* was launched by double-clicking a document, or when a document was
* dragged/dropped on the app's icon. You need to have a
* CFBundleDocumentsType section in your Info.plist to get this message,
* apparently.
*
* Files are added to gArgv, so to the app, they'll look like command line
* arguments. Previously, apps launched from the finder had nothing but
* an argv[0].
*
* This message may be received multiple times to open several docs on launch.
*
* This message is ignored once the app's mainline has been called.
*/
- (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename
{
const char *temparg;
size_t arglen;
char *arg;
char **newargv;
if (!gFinderLaunch) /* MacOS is passing command line args. */
return FALSE;
if (gCalledAppMainline) /* app has started, ignore this document. */
return FALSE;
temparg = [filename UTF8String];
arglen = SDL_strlen(temparg) + 1;
arg = (char *) SDL_malloc(arglen);
if (arg == NULL)
return FALSE;
newargv = (char **) realloc(gArgv, sizeof (char *) * (gArgc + 2));
if (newargv == NULL)
{
SDL_free(arg);
return FALSE;
}
gArgv = newargv;
SDL_strlcpy(arg, temparg, arglen);
gArgv[gArgc++] = arg;
gArgv[gArgc] = NULL;
return TRUE;
}
/* Called when the internal event loop has just started running */
- (void) applicationDidFinishLaunching: (NSNotification *) note
{
int status;
/* Set the working directory to the .app's parent directory */
[self setupWorkingDirectory:gFinderLaunch];
#if SDL_USE_NIB_FILE
/* Set the main menu to contain the real app name instead of "SDL App" */
[self fixMenu:[NSApp mainMenu] withAppName:getApplicationName()];
#endif
/* Hand off to main application code */
gCalledAppMainline = TRUE;
status = SDL_main (gArgc, gArgv);
/* We're done, thank you for playing */
exit(status);
}
@end
@implementation NSString (ReplaceSubString)
- (NSString *)stringByReplacingRange:(NSRange)aRange with:(NSString *)aString
{
unsigned int bufferSize;
unsigned int selfLen = [self length];
unsigned int aStringLen = [aString length];
unichar *buffer;
NSRange localRange;
NSString *result;
bufferSize = selfLen + aStringLen - aRange.length;
buffer = NSAllocateMemoryPages(bufferSize*sizeof(unichar));
/* Get first part into buffer */
localRange.location = 0;
localRange.length = aRange.location;
[self getCharacters:buffer range:localRange];
/* Get middle part into buffer */
localRange.location = 0;
localRange.length = aStringLen;
[aString getCharacters:(buffer+aRange.location) range:localRange];
/* Get last part into buffer */
localRange.location = aRange.location + aRange.length;
localRange.length = selfLen - localRange.location;
[self getCharacters:(buffer+aRange.location+aStringLen) range:localRange];
/* Build output string */
result = [NSString stringWithCharacters:buffer length:bufferSize];
NSDeallocateMemoryPages(buffer, bufferSize);
return result;
}
@end
#ifdef main
# undef main
#endif
/* Main entry point to executable - should *not* be SDL_main! */
int main (int argc, char **argv)
{
/* Copy the arguments into a global variable */
/* This is passed if we are launched by double-clicking */
if ( argc >= 2 && strncmp (argv[1], "-psn", 4) == 0 ) {
gArgv = (char **) SDL_malloc(sizeof (char *) * 2);
gArgv[0] = argv[0];
gArgv[1] = NULL;
gArgc = 1;
gFinderLaunch = YES;
} else {
int i;
gArgc = argc;
gArgv = (char **) SDL_malloc(sizeof (char *) * (argc+1));
for (i = 0; i <= argc; i++)
gArgv[i] = argv[i];
gFinderLaunch = NO;
}
#if SDL_USE_NIB_FILE
[SDLApplication poseAsClass:[NSApplication class]];
NSApplicationMain (argc, argv);
#else
CustomApplicationMain (argc, argv);
#endif
return 0;
}

View File

@ -1,12 +0,0 @@
{
IBClasses = (
{CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
{
ACTIONS = {makeFullscreen = id; quit = id; };
CLASS = SDLMain;
LANGUAGE = ObjC;
SUPERCLASS = NSObject;
}
);
IBVersion = 1;
}

View File

@ -1,12 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist SYSTEM "file://localhost/System/Library/DTDs/PropertyList.dtd">
<plist version="0.9">
<dict>
<key>IBDocumentLocation</key>
<string>49 97 356 240 0 0 987 746 </string>
<key>IBMainMenuLocation</key>
<string>20 515 195 44 0 46 800 532 </string>
<key>IBUserGuides</key>
<dict/>
</dict>
</plist>

Binary file not shown.

View File

@ -1 +0,0 @@
// This is just a stub file to force automake to create the install directory

View File

@ -296,8 +296,8 @@ typedef struct VideoBootStrap
SDL_VideoDevice *(*create) (int devindex);
} VideoBootStrap;
#if SDL_VIDEO_DRIVER_QUARTZ
extern VideoBootStrap QZ_bootstrap;
#if SDL_VIDEO_DRIVER_COCOA
extern VideoBootStrap COCOA_bootstrap;
#endif
#if SDL_VIDEO_DRIVER_X11
extern VideoBootStrap X11_bootstrap;

View File

@ -43,8 +43,8 @@
/* Available video drivers */
static VideoBootStrap *bootstrap[] = {
#if SDL_VIDEO_DRIVER_QUARTZ
&QZ_bootstrap,
#if SDL_VIDEO_DRIVER_COCOA
&COCOA_bootstrap,
#endif
#if SDL_VIDEO_DRIVER_X11
&X11_bootstrap,

View File

@ -0,0 +1,32 @@
/*
SDL - Simple DirectMedia Layer
Copyright (C) 1997-2006 Sam Lantinga
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Sam Lantinga
slouken@libsdl.org
*/
#include "SDL_config.h"
#ifndef _SDL_cocoaevents_h
#define _SDL_cocoaevents_h
extern void Cocoa_RegisterApp(void);
extern void Cocoa_PumpEvents(_THIS);
#endif /* _SDL_cocoaevents_h */
/* vi: set ts=4 sw=4 expandtab: */

View File

@ -0,0 +1,170 @@
/*
SDL - Simple DirectMedia Layer
Copyright (C) 1997-2006 Sam Lantinga
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Sam Lantinga
slouken@libsdl.org
*/
#include "SDL_config.h"
#include "SDL_cocoavideo.h"
/* setAppleMenu disappeared from the headers in 10.4 */
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
@interface NSApplication(NSAppleMenu)
- (void)setAppleMenu:(NSMenu *)menu;
@end
#endif
@interface SDLApplication : NSApplication
{
}
- (void)finishLaunching;
@end
@implementation SDLApplication
- (void)finishLaunching
{
[super finishLaunching];
_running = 1;
}
@end
static NSString *
GetApplicationName(void)
{
NSDictionary *dict;
NSString *appName = 0;
/* Determine the application name */
dict = (NSDictionary *)CFBundleGetInfoDictionary(CFBundleGetMainBundle());
if (dict)
appName = [dict objectForKey: @"CFBundleName"];
if (![appName length])
appName = [[NSProcessInfo processInfo] processName];
return appName;
}
static void
CreateApplicationMenus(void)
{
NSString *appName;
NSString *title;
NSMenu *appleMenu;
NSMenu *windowMenu;
NSMenuItem *menuItem;
/* Create the main menu bar */
[NSApp setMainMenu:[[NSMenu alloc] init]];
/* Create the application menu */
appName = GetApplicationName();
appleMenu = [[NSMenu alloc] initWithTitle:@""];
/* Add menu items */
title = [@"About " stringByAppendingString:appName];
[appleMenu addItemWithTitle:title action:@selector(orderFrontStandardAboutPanel:) keyEquivalent:@""];
[appleMenu addItem:[NSMenuItem separatorItem]];
title = [@"Hide " stringByAppendingString:appName];
[appleMenu addItemWithTitle:title action:@selector(hide:) keyEquivalent:@"h"];
menuItem = (NSMenuItem *)[appleMenu addItemWithTitle:@"Hide Others" action:@selector(hideOtherApplications:) keyEquivalent:@"h"];
[menuItem setKeyEquivalentModifierMask:(NSAlternateKeyMask|NSCommandKeyMask)];
[appleMenu addItemWithTitle:@"Show All" action:@selector(unhideAllApplications:) keyEquivalent:@""];
[appleMenu addItem:[NSMenuItem separatorItem]];
title = [@"Quit " stringByAppendingString:appName];
[appleMenu addItemWithTitle:title action:@selector(terminate:) keyEquivalent:@"q"];
/* Put menu into the menubar */
menuItem = [[NSMenuItem alloc] initWithTitle:@"" action:nil keyEquivalent:@""];
[menuItem setSubmenu:appleMenu];
[[NSApp mainMenu] addItem:menuItem];
[menuItem release];
/* Tell the application object that this is now the application menu */
[NSApp setAppleMenu:appleMenu];
[appleMenu release];
/* Create the window menu */
windowMenu = [[NSMenu alloc] initWithTitle:@"Window"];
/* "Minimize" item */
menuItem = [[NSMenuItem alloc] initWithTitle:@"Minimize" action:@selector(performMiniaturize:) keyEquivalent:@"m"];
[windowMenu addItem:menuItem];
[menuItem release];
/* Put menu into the menubar */
menuItem = [[NSMenuItem alloc] initWithTitle:@"Window" action:nil keyEquivalent:@""];
[menuItem setSubmenu:windowMenu];
[[NSApp mainMenu] addItem:menuItem];
[menuItem release];
/* Tell the application object that this is now the window menu */
[NSApp setWindowsMenu:windowMenu];
[windowMenu release];
}
void
Cocoa_RegisterApp(void)
{
ProcessSerialNumber psn;
NSAutoreleasePool *pool;
if (!GetCurrentProcess(&psn)) {
TransformProcessType(&psn, kProcessTransformToForegroundApplication);
SetFrontProcess(&psn);
}
pool = [[NSAutoreleasePool alloc] init];
if (NSApp == nil) {
[SDLApplication sharedApplication];
if ([NSApp mainMenu] == nil) {
CreateApplicationMenus();
}
[NSApp finishLaunching];
}
[pool release];
}
void
Cocoa_PumpEvents(_THIS)
{
NSAutoreleasePool *pool;
pool = [[NSAutoreleasePool alloc] init];
for ( ; [NSApp isRunning]; ) {
NSEvent *event = [NSApp nextEventMatchingMask:NSAnyEventMask untilDate:[NSDate distantPast] inMode:NSDefaultRunLoopMode dequeue:YES ];
if ( event == nil ) {
break;
}
[NSApp sendEvent:event];
}
[pool release];
}
/* vi: set ts=4 sw=4 expandtab: */

View File

@ -0,0 +1,32 @@
/*
SDL - Simple DirectMedia Layer
Copyright (C) 1997-2006 Sam Lantinga
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Sam Lantinga
slouken@libsdl.org
*/
#include "SDL_config.h"
#ifndef _SDL_cocoakeyboard_h
#define _SDL_cocoakeyboard_h
extern void Cocoa_InitKeyboard(_THIS);
extern void Cocoa_QuitKeyboard(_THIS);
#endif /* _SDL_cocoakeyboard_h */
/* vi: set ts=4 sw=4 expandtab: */

View File

@ -0,0 +1,46 @@
/*
SDL - Simple DirectMedia Layer
Copyright (C) 1997-2006 Sam Lantinga
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Sam Lantinga
slouken@libsdl.org
*/
#include "SDL_config.h"
#include "SDL_cocoavideo.h"
#include "../../events/SDL_keyboard_c.h"
void
Cocoa_InitKeyboard(_THIS)
{
SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
SDL_Keyboard keyboard;
SDL_zero(keyboard);
data->keyboard = SDL_AddKeyboard(&keyboard, -1);
}
void
Cocoa_QuitKeyboard(_THIS)
{
SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
SDL_DelKeyboard(data->keyboard);
}
/* vi: set ts=4 sw=4 expandtab: */

View File

@ -0,0 +1,34 @@
/*
SDL - Simple DirectMedia Layer
Copyright (C) 1997-2006 Sam Lantinga
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Sam Lantinga
slouken@libsdl.org
*/
#include "SDL_config.h"
#ifndef _SDL_cocoamodes_h
#define _SDL_cocoamodes_h
extern void Cocoa_InitModes(_THIS);
extern void Cocoa_GetDisplayModes(_THIS);
extern int Cocoa_SetDisplayMode(_THIS, SDL_DisplayMode * mode);
extern void Cocoa_QuitModes(_THIS);
#endif /* _SDL_cocoamodes_h */
/* vi: set ts=4 sw=4 expandtab: */

View File

@ -0,0 +1,56 @@
/*
SDL - Simple DirectMedia Layer
Copyright (C) 1997-2006 Sam Lantinga
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Sam Lantinga
slouken@libsdl.org
*/
#include "SDL_config.h"
#include "SDL_cocoavideo.h"
void
Cocoa_InitModes(_THIS)
{
SDL_VideoDisplay display;
SDL_DisplayMode mode;
SDL_zero(display);
SDL_zero(mode);
display.desktop_mode = mode;
display.current_mode = mode;
SDL_AddVideoDisplay(&display);
}
void
Cocoa_GetDisplayModes(_THIS)
{
}
int
Cocoa_SetDisplayMode(_THIS, SDL_DisplayMode * mode)
{
return -1;
}
void
Cocoa_QuitModes(_THIS)
{
}
/* vi: set ts=4 sw=4 expandtab: */

View File

@ -0,0 +1,32 @@
/*
SDL - Simple DirectMedia Layer
Copyright (C) 1997-2006 Sam Lantinga
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Sam Lantinga
slouken@libsdl.org
*/
#include "SDL_config.h"
#ifndef _SDL_cocoamouse_h
#define _SDL_cocoamouse_h
extern void Cocoa_InitMouse(_THIS);
extern void Cocoa_QuitMouse(_THIS);
#endif /* _SDL_cocoamouse_h */
/* vi: set ts=4 sw=4 expandtab: */

View File

@ -0,0 +1,46 @@
/*
SDL - Simple DirectMedia Layer
Copyright (C) 1997-2006 Sam Lantinga
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Sam Lantinga
slouken@libsdl.org
*/
#include "SDL_config.h"
#include "SDL_cocoavideo.h"
#include "../../events/SDL_mouse_c.h"
void
Cocoa_InitMouse(_THIS)
{
SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
SDL_Mouse mouse;
SDL_zero(mouse);
data->mouse = SDL_AddMouse(&mouse, -1);
}
void
Cocoa_QuitMouse(_THIS)
{
SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
SDL_DelMouse(data->mouse);
}
/* vi: set ts=4 sw=4 expandtab: */

View File

@ -0,0 +1,50 @@
/*
SDL - Simple DirectMedia Layer
Copyright (C) 1997-2006 Sam Lantinga
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Sam Lantinga
slouken@libsdl.org
*/
#include "SDL_config.h"
#ifndef _SDL_cocoavideo_h
#define _SDL_cocoavideo_h
#include <Cocoa/Cocoa.h>
#include "../SDL_sysvideo.h"
#include "SDL_cocoaevents.h"
#include "SDL_cocoakeyboard.h"
#include "SDL_cocoamodes.h"
#include "SDL_cocoamouse.h"
/*
#include "SDL_cocoaopengl.h"
#include "SDL_cocoawindow.h"
*/
/* Private display data */
typedef struct SDL_VideoData
{
int mouse;
int keyboard;
} SDL_VideoData;
#endif /* _SDL_cocoavideo_h */
/* vi: set ts=4 sw=4 expandtab: */

View File

@ -0,0 +1,132 @@
/*
SDL - Simple DirectMedia Layer
Copyright (C) 1997-2006 Sam Lantinga
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Sam Lantinga
slouken@libsdl.org
*/
#include "SDL_config.h"
#include "SDL_cocoavideo.h"
/* Initialization/Query functions */
static int Cocoa_VideoInit(_THIS);
static void Cocoa_VideoQuit(_THIS);
/* Cocoa driver bootstrap functions */
static int
Cocoa_Available(void)
{
return (1);
}
static void
Cocoa_DeleteDevice(SDL_VideoDevice * device)
{
SDL_VideoData *data = (SDL_VideoData *) device->driverdata;
SDL_free(device->driverdata);
SDL_free(device);
}
static SDL_VideoDevice *
Cocoa_CreateDevice(int devindex)
{
SDL_VideoDevice *device;
SDL_VideoData *data;
Cocoa_RegisterApp();
/* Initialize all variables that we clean on shutdown */
device = (SDL_VideoDevice *) SDL_calloc(1, sizeof(SDL_VideoDevice));
if (device) {
data = (struct SDL_VideoData *) SDL_calloc(1, sizeof(SDL_VideoData));
}
if (!device || !data) {
SDL_OutOfMemory();
if (device) {
SDL_free(device);
}
return NULL;
}
device->driverdata = data;
/* Set the function pointers */
device->VideoInit = Cocoa_VideoInit;
device->VideoQuit = Cocoa_VideoQuit;
device->GetDisplayModes = Cocoa_GetDisplayModes;
device->SetDisplayMode = Cocoa_SetDisplayMode;
device->PumpEvents = Cocoa_PumpEvents;
/*
device->CreateWindow = Cocoa_CreateWindow;
device->CreateWindowFrom = Cocoa_CreateWindowFrom;
device->SetWindowTitle = Cocoa_SetWindowTitle;
device->SetWindowPosition = Cocoa_SetWindowPosition;
device->SetWindowSize = Cocoa_SetWindowSize;
device->ShowWindow = Cocoa_ShowWindow;
device->HideWindow = Cocoa_HideWindow;
device->RaiseWindow = Cocoa_RaiseWindow;
device->MaximizeWindow = Cocoa_MaximizeWindow;
device->MinimizeWindow = Cocoa_MinimizeWindow;
device->RestoreWindow = Cocoa_RestoreWindow;
device->SetWindowGrab = Cocoa_SetWindowGrab;
device->DestroyWindow = Cocoa_DestroyWindow;
device->GetWindowWMInfo = Cocoa_GetWindowWMInfo;
#ifdef SDL_VIDEO_OPENGL
device->GL_LoadLibrary = Cocoa_GL_LoadLibrary;
device->GL_GetProcAddress = Cocoa_GL_GetProcAddress;
device->GL_GetWindowAttribute = Cocoa_GL_GetWindowAttribute;
device->GL_CreateContext = Cocoa_GL_CreateContext;
device->GL_MakeCurrent = Cocoa_GL_MakeCurrent;
device->GL_SetSwapInterval = Cocoa_GL_SetSwapInterval;
device->GL_GetSwapInterval = Cocoa_GL_GetSwapInterval;
device->GL_SwapWindow = Cocoa_GL_SwapWindow;
device->GL_DeleteContext = Cocoa_GL_DeleteContext;
#endif
*/
device->free = Cocoa_DeleteDevice;
return device;
}
VideoBootStrap COCOA_bootstrap = {
"cocoa", "SDL Cocoa video driver",
Cocoa_Available, Cocoa_CreateDevice
};
int
Cocoa_VideoInit(_THIS)
{
Cocoa_InitModes(_this);
Cocoa_InitKeyboard(_this);
Cocoa_InitMouse(_this);
return 0;
}
void
Cocoa_VideoQuit(_THIS)
{
Cocoa_QuitModes(_this);
Cocoa_QuitKeyboard(_this);
Cocoa_QuitMouse(_this);
}
/* vim: set ts=4 sw=4 expandtab: */

View File

@ -1,85 +0,0 @@
/*
SDL - Simple DirectMedia Layer
Copyright (C) 1997-2003 Sam Lantinga
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Sam Lantinga
slouken@libsdl.org
*/
#include "SDL_config.h"
/*
Obscuring code: maximum number of windows above ours (inclusive)
Note: this doesn't work too well in practice and should be
phased out when we add OpenGL 2D acceleration. It was never
enabled in the first place, so this shouldn't be a problem ;-)
*/
#define kMaxWindows 256
/* Some of the Core Graphics Server API for obscuring code */
#define kCGSWindowLevelTop 2147483632
#define kCGSWindowLevelDockIconDrag 500
#define kCGSWindowLevelDockMenu 101
#define kCGSWindowLevelMenuIgnore 21
#define kCGSWindowLevelMenu 20
#define kCGSWindowLevelDockLabel 12
#define kCGSWindowLevelDockIcon 11
#define kCGSWindowLevelDock 10
#define kCGSWindowLevelUtility 3
#define kCGSWindowLevelNormal 0
/*
For completeness; We never use these window levels, they are always below us
#define kCGSWindowLevelMBarShadow -20
#define kCGSWindowLevelDesktopPicture -2147483647
#define kCGSWindowLevelDesktop -2147483648
*/
typedef CGError CGSError;
typedef long CGSWindowCount;
typedef void *CGSConnectionID;
typedef int CGSWindowID;
typedef CGSWindowID *CGSWindowIDList;
typedef CGWindowLevel CGSWindowLevel;
typedef NSRect CGSRect;
extern CGSConnectionID _CGSDefaultConnection();
extern CGSError CGSGetOnScreenWindowList(CGSConnectionID cid,
CGSConnectionID owner,
CGSWindowCount listCapacity,
CGSWindowIDList list,
CGSWindowCount * listCount);
extern CGSError CGSGetScreenRectForWindow(CGSConnectionID cid,
CGSWindowID wid, CGSRect * rect);
extern CGWindowLevel CGSGetWindowLevel(CGSConnectionID cid,
CGSWindowID wid,
CGSWindowLevel * level);
extern CGSError CGSDisplayHWFill(CGDirectDisplayID id, unsigned int x,
unsigned int y, unsigned int w,
unsigned int h, unsigned int color);
extern CGSError CGSDisplayCanHWFill(CGDirectDisplayID id);
extern CGSError CGSGetMouseEnabledFlags(CGSConnectionID cid, CGSWindowID wid,
int *flags);
int CGSDisplayHWSync(CGDirectDisplayID id);
/* vi: set ts=4 sw=4 expandtab: */

File diff suppressed because it is too large Load Diff

View File

@ -1,329 +0,0 @@
/*
SDL - Simple DirectMedia Layer
Copyright (C) 1997-2003 Sam Lantinga
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Sam Lantinga
slouken@libsdl.org
*/
#include "SDL_config.h"
#include "SDL_QuartzVideo.h"
/*
* GL_ARB_Multisample is supposed to be available in 10.1, according to Apple:
*
* http://developer.apple.com/opengl/extensions.html#GL_ARB_multisample
*
* ...but it isn't in the system headers, according to Sam:
*
* http://www.libsdl.org/pipermail/sdl/2003-December/058335.html
*
* These are normally enums and not #defines in the system headers.
*
* --ryan.
*/
#if (MAC_OS_X_VERSION_MAX_ALLOWED < 1020)
#define NSOpenGLPFASampleBuffers ((NSOpenGLPixelFormatAttribute) 55)
#define NSOpenGLPFASamples ((NSOpenGLPixelFormatAttribute) 56)
#endif
@ implementation NSOpenGLContext (CGLContextAccess)
- (CGLContextObj) cglContext;
{
return _contextAuxiliary;
}
@end
/* OpenGL helper functions (used internally) */
int
QZ_SetupOpenGL (_THIS, int bpp, Uint32 flags)
{
NSOpenGLPixelFormatAttribute attr[32];
NSOpenGLPixelFormat *fmt;
int i = 0;
int colorBits = bpp;
/* if a GL library hasn't been loaded at this point, load the default. */
if (!this->gl_config.driver_loaded) {
if (QZ_GL_LoadLibrary (this, NULL) == -1)
return 0;
}
if (flags & SDL_FULLSCREEN) {
attr[i++] = NSOpenGLPFAFullScreen;
}
/* In windowed mode, the OpenGL pixel depth must match device pixel depth */
else if (colorBits != device_bpp) {
colorBits = device_bpp;
}
attr[i++] = NSOpenGLPFAColorSize;
attr[i++] = colorBits;
attr[i++] = NSOpenGLPFADepthSize;
attr[i++] = this->gl_config.depth_size;
if (this->gl_config.double_buffer) {
attr[i++] = NSOpenGLPFADoubleBuffer;
}
if (this->gl_config.stereo) {
attr[i++] = NSOpenGLPFAStereo;
}
if (this->gl_config.stencil_size != 0) {
attr[i++] = NSOpenGLPFAStencilSize;
attr[i++] = this->gl_config.stencil_size;
}
if ((this->gl_config.accum_red_size +
this->gl_config.accum_green_size +
this->gl_config.accum_blue_size +
this->gl_config.accum_alpha_size) > 0) {
attr[i++] = NSOpenGLPFAAccumSize;
attr[i++] =
this->gl_config.accum_red_size +
this->gl_config.accum_green_size +
this->gl_config.accum_blue_size +
this->gl_config.accum_alpha_size;
}
if (this->gl_config.multisamplebuffers != 0) {
attr[i++] = NSOpenGLPFASampleBuffers;
attr[i++] = this->gl_config.multisamplebuffers;
}
if (this->gl_config.multisamplesamples != 0) {
attr[i++] = NSOpenGLPFASamples;
attr[i++] = this->gl_config.multisamplesamples;
attr[i++] = NSOpenGLPFANoRecovery;
}
if (this->gl_config.accelerated > 0) {
attr[i++] = NSOpenGLPFAAccelerated;
}
attr[i++] = NSOpenGLPFAScreenMask;
attr[i++] = CGDisplayIDToOpenGLDisplayMask (display_id);
attr[i] = 0;
fmt =[[NSOpenGLPixelFormat alloc] initWithAttributes:attr];
if (fmt == nil) {
SDL_SetError ("Failed creating OpenGL pixel format");
return 0;
}
gl_context =[[NSOpenGLContext alloc] initWithFormat: fmt shareContext:nil];
[fmt release];
if (gl_context == nil) {
SDL_SetError ("Failed creating OpenGL context");
return 0;
}
/* Synchronize QZ_GL_SwapBuffers() to vertical retrace.
* (Apple's documentation is not completely clear about what this setting
* exactly does, IMHO - for a detailed explanation see
* http://lists.apple.com/archives/mac-opengl/2006/Jan/msg00080.html )
*/
if (this->gl_config.swap_control >= 0) {
long value;
value = this->gl_config.swap_control;
[gl_context setValues: &value forParameter:NSOpenGLCPSwapInterval];
}
/*
* Wisdom from Apple engineer in reference to UT2003's OpenGL performance:
* "You are blowing a couple of the internal OpenGL function caches. This
* appears to be happening in the VAO case. You can tell OpenGL to up
* the cache size by issuing the following calls right after you create
* the OpenGL context. The default cache size is 16." --ryan.
*/
#ifndef GLI_ARRAY_FUNC_CACHE_MAX
#define GLI_ARRAY_FUNC_CACHE_MAX 284
#endif
#ifndef GLI_SUBMIT_FUNC_CACHE_MAX
#define GLI_SUBMIT_FUNC_CACHE_MAX 280
#endif
{
long cache_max = 64;
CGLContextObj ctx =[gl_context cglContext];
CGLSetParameter (ctx, GLI_SUBMIT_FUNC_CACHE_MAX, &cache_max);
CGLSetParameter (ctx, GLI_ARRAY_FUNC_CACHE_MAX, &cache_max);
}
/* End Wisdom from Apple Engineer section. --ryan. */
return 1;
}
void
QZ_TearDownOpenGL (_THIS)
{
[NSOpenGLContext clearCurrentContext];
[gl_context clearDrawable];
[gl_context release];
}
/* SDL OpenGL functions */
static const char *DEFAULT_OPENGL_LIB_NAME =
"/System/Library/Frameworks/OpenGL.framework/Libraries/libGL.dylib";
int
QZ_GL_LoadLibrary (_THIS, const char *location)
{
if (gl_context != NULL) {
SDL_SetError ("OpenGL context already created");
return -1;
}
if (opengl_library != NULL)
SDL_UnloadObject (opengl_library);
if (location == NULL)
location = DEFAULT_OPENGL_LIB_NAME;
opengl_library = SDL_LoadObject (location);
if (opengl_library != NULL) {
this->gl_config.driver_loaded = 1;
return 0;
}
this->gl_config.driver_loaded = 0;
return -1;
}
void *
QZ_GL_GetProcAddress (_THIS, const char *proc)
{
return SDL_LoadFunction (opengl_library, proc);
}
int
QZ_GL_GetAttribute (_THIS, SDL_GLattr attrib, int *value)
{
GLenum attr = 0;
QZ_GL_MakeCurrent (this);
switch (attrib) {
case SDL_GL_RED_SIZE:
attr = GL_RED_BITS;
break;
case SDL_GL_BLUE_SIZE:
attr = GL_BLUE_BITS;
break;
case SDL_GL_GREEN_SIZE:
attr = GL_GREEN_BITS;
break;
case SDL_GL_ALPHA_SIZE:
attr = GL_ALPHA_BITS;
break;
case SDL_GL_DOUBLEBUFFER:
attr = GL_DOUBLEBUFFER;
break;
case SDL_GL_DEPTH_SIZE:
attr = GL_DEPTH_BITS;
break;
case SDL_GL_STENCIL_SIZE:
attr = GL_STENCIL_BITS;
break;
case SDL_GL_ACCUM_RED_SIZE:
attr = GL_ACCUM_RED_BITS;
break;
case SDL_GL_ACCUM_GREEN_SIZE:
attr = GL_ACCUM_GREEN_BITS;
break;
case SDL_GL_ACCUM_BLUE_SIZE:
attr = GL_ACCUM_BLUE_BITS;
break;
case SDL_GL_ACCUM_ALPHA_SIZE:
attr = GL_ACCUM_ALPHA_BITS;
break;
case SDL_GL_STEREO:
attr = GL_STEREO;
break;
case SDL_GL_MULTISAMPLEBUFFERS:
attr = GL_SAMPLE_BUFFERS_ARB;
break;
case SDL_GL_MULTISAMPLESAMPLES:
attr = GL_SAMPLES_ARB;
break;
case SDL_GL_BUFFER_SIZE:
{
GLint bits = 0;
GLint component;
/* there doesn't seem to be a single flag in OpenGL for this! */
glGetIntegerv (GL_RED_BITS, &component);
bits += component;
glGetIntegerv (GL_GREEN_BITS, &component);
bits += component;
glGetIntegerv (GL_BLUE_BITS, &component);
bits += component;
glGetIntegerv (GL_ALPHA_BITS, &component);
bits += component;
*value = bits;
return 0;
}
case SDL_GL_ACCELERATED_VISUAL:
{
long val;
/* FIXME: How do we get this information here?
[fmt getValues: &val forAttribute: NSOpenGLPFAAccelerated attr forVirtualScreen: 0];
*/
val = (this->gl_config.accelerated != 0);;
*value = val;
return 0;
}
case SDL_GL_SWAP_CONTROL:
{
long val;
[gl_context getValues: &val forParameter:NSOpenGLCPSwapInterval];
*value = val;
return 0;
}
}
glGetIntegerv (attr, (GLint *) value);
return 0;
}
int
QZ_GL_MakeCurrent (_THIS)
{
[gl_context makeCurrentContext];
return 0;
}
void
QZ_GL_SwapBuffers (_THIS)
{
[gl_context flushBuffer];
}

View File

@ -1,142 +0,0 @@
/*
SDL - Simple DirectMedia Layer
Copyright (C) 1997-2003 Sam Lantinga
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Sam Lantinga
slouken@libsdl.org
*/
#include "SDL_config.h"
/* These are the Macintosh key scancode constants -- from Inside Macintosh */
#define QZ_ESCAPE 0x35
#define QZ_F1 0x7A
#define QZ_F2 0x78
#define QZ_F3 0x63
#define QZ_F4 0x76
#define QZ_F5 0x60
#define QZ_F6 0x61
#define QZ_F7 0x62
#define QZ_F8 0x64
#define QZ_F9 0x65
#define QZ_F10 0x6D
#define QZ_F11 0x67
#define QZ_F12 0x6F
#define QZ_PRINT 0x69
#define QZ_SCROLLOCK 0x6B
#define QZ_PAUSE 0x71
#define QZ_POWER 0x7F
#define QZ_BACKQUOTE 0x32
#define QZ_1 0x12
#define QZ_2 0x13
#define QZ_3 0x14
#define QZ_4 0x15
#define QZ_5 0x17
#define QZ_6 0x16
#define QZ_7 0x1A
#define QZ_8 0x1C
#define QZ_9 0x19
#define QZ_0 0x1D
#define QZ_MINUS 0x1B
#define QZ_EQUALS 0x18
#define QZ_BACKSPACE 0x33
#define QZ_INSERT 0x72
#define QZ_HOME 0x73
#define QZ_PAGEUP 0x74
#define QZ_NUMLOCK 0x47
#define QZ_KP_EQUALS 0x51
#define QZ_KP_DIVIDE 0x4B
#define QZ_KP_MULTIPLY 0x43
#define QZ_TAB 0x30
#define QZ_q 0x0C
#define QZ_w 0x0D
#define QZ_e 0x0E
#define QZ_r 0x0F
#define QZ_t 0x11
#define QZ_y 0x10
#define QZ_u 0x20
#define QZ_i 0x22
#define QZ_o 0x1F
#define QZ_p 0x23
#define QZ_LEFTBRACKET 0x21
#define QZ_RIGHTBRACKET 0x1E
#define QZ_BACKSLASH 0x2A
#define QZ_DELETE 0x75
#define QZ_END 0x77
#define QZ_PAGEDOWN 0x79
#define QZ_KP7 0x59
#define QZ_KP8 0x5B
#define QZ_KP9 0x5C
#define QZ_KP_MINUS 0x4E
#define QZ_CAPSLOCK 0x39
#define QZ_a 0x00
#define QZ_s 0x01
#define QZ_d 0x02
#define QZ_f 0x03
#define QZ_g 0x05
#define QZ_h 0x04
#define QZ_j 0x26
#define QZ_k 0x28
#define QZ_l 0x25
#define QZ_SEMICOLON 0x29
#define QZ_QUOTE 0x27
#define QZ_RETURN 0x24
#define QZ_KP4 0x56
#define QZ_KP5 0x57
#define QZ_KP6 0x58
#define QZ_KP_PLUS 0x45
#define QZ_LSHIFT 0x38
#define QZ_z 0x06
#define QZ_x 0x07
#define QZ_c 0x08
#define QZ_v 0x09
#define QZ_b 0x0B
#define QZ_n 0x2D
#define QZ_m 0x2E
#define QZ_COMMA 0x2B
#define QZ_PERIOD 0x2F
#define QZ_SLASH 0x2C
#if 1 /* Panther now defines right side keys */
#define QZ_RSHIFT 0x3C
#endif
#define QZ_UP 0x7E
#define QZ_KP1 0x53
#define QZ_KP2 0x54
#define QZ_KP3 0x55
#define QZ_KP_ENTER 0x4C
#define QZ_LCTRL 0x3B
#define QZ_LALT 0x3A
#define QZ_LMETA 0x37
#define QZ_SPACE 0x31
#if 1 /* Panther now defines right side keys */
#define QZ_RMETA 0x36
#define QZ_RALT 0x3D
#define QZ_RCTRL 0x3E
#endif
#define QZ_LEFT 0x7B
#define QZ_DOWN 0x7D
#define QZ_RIGHT 0x7C
#define QZ_KP0 0x52
#define QZ_KP_PERIOD 0x41
/* Wierd, these keys are on my iBook under Mac OS X */
#define QZ_IBOOK_ENTER 0x34
#define QZ_IBOOK_LEFT 0x3B
#define QZ_IBOOK_RIGHT 0x3C
#define QZ_IBOOK_DOWN 0x3D
#define QZ_IBOOK_UP 0x3E
/* vi: set ts=4 sw=4 expandtab: */

View File

@ -1,298 +0,0 @@
/*
SDL - Simple DirectMedia Layer
Copyright (C) 1997-2003 Sam Lantinga
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Sam Lantinga
slouken@libsdl.org
*/
#include "SDL_config.h"
/*
@file SDL_QuartzVideo.h
@author Darrell Walisser, Max Horn, et al.
@abstract SDL video driver for Mac OS X.
@discussion
TODO
- Hardware Cursor support with NSCursor instead of Carbon
- Keyboard repeat/mouse speed adjust (if needed)
- Multiple monitor support (currently only main display)
- Accelerated blitting support
- Fix white OpenGL window on minimize (fixed) (update: broken again on 10.2)
- Find out what events should be sent/ignored if window is minimized
- Find a way to deal with external resolution/depth switch while app is running
- Check accuracy of QZ_SetGamma()
Problems:
- OGL not working in full screen with software renderer
- SetColors sets palette correctly but clears framebuffer
- Crash in CG after several mode switches (I think this has been fixed)
- Retained windows don't draw their title bar quite right (OS Bug) (not using retained windows)
- Cursor in 8 bit modes is screwy (might just be Radeon PCI bug) (update: not just Radeon)
- Warping cursor delays mouse events for a fraction of a second,
there is a hack around this that helps a bit
*/
/* Needs to be first, so QuickTime.h doesn't include glext.h (10.4) */
#include "SDL_opengl.h"
#include <Cocoa/Cocoa.h>
#include <Carbon/Carbon.h>
#include <QuickTime/QuickTime.h>
#include <OpenGL/CGLTypes.h> /* For CGLContextObj */
#include <IOKit/IOKitLib.h> /* For powersave handling */
#include <pthread.h>
#include "SDL_thread.h"
#include "SDL_video.h"
#include "SDL_error.h"
#include "SDL_timer.h"
#include "SDL_loadso.h"
#include "SDL_syswm.h"
#include "../SDL_sysvideo.h"
#include "../SDL_pixels_c.h"
#include "../../events/SDL_events_c.h"
/*
This is a workaround to directly access NSOpenGLContext's CGL context
We need this to check for errors NSOpenGLContext doesn't support
*/
@ interface NSOpenGLContext(CGLContextAccess) - (CGLContextObj) cglContext;
@end
/* Main driver structure to store required state information */
typedef struct SDL_PrivateVideoData
{
CGDirectDisplayID
display; /* 0 == main display (only support single display) */
CFDictionaryRef
mode; /* current mode of the display */
CFDictionaryRef
save_mode; /* original mode of the display */
CFArrayRef
mode_list; /* list of available fullscreen modes */
CGDirectPaletteRef
palette; /* palette of an 8-bit display */
NSOpenGLContext *
gl_context; /* OpenGL rendering context */
Uint32
width,
height,
bpp; /* frequently used data about the display */
Uint32
flags; /* flags for current mode, for teardown purposes */
Uint32
video_set; /* boolean; indicates if video was set correctly */
Uint32
warp_flag; /* boolean; notify to event loop that a warp just occured */
Uint32
warp_ticks; /* timestamp when the warp occured */
NSWindow *
window; /* Cocoa window to implement the SDL window */
NSQuickDrawView *
view; /* the window's view; draw 2D and OpenGL into this view */
SDL_Surface *
resize_icon; /* icon for the resize badge, we have to draw it by hand */
SDL_GrabMode
current_grab_mode; /* default value is SDL_GRAB_OFF */
SDL_Rect **
client_mode_list; /* resolution list to pass back to client */
SDLKey
keymap[256]; /* Mac OS X to SDL key mapping */
Uint32
current_mods; /* current keyboard modifiers, to track modifier state */
Uint32
last_virtual_button; /* last virtual mouse button pressed */
io_connect_t
power_connection; /* used with IOKit to detect wake from sleep */
Uint8
expect_mouse_up; /* used to determine when to send mouse up events */
Uint8
grab_state; /* used to manage grab behavior */
NSPoint
cursor_loc; /* saved cursor coords, for activate/deactivate when grabbed */
BOOL
cursor_should_be_visible; /* tells if cursor is supposed to be visible (SDL_ShowCursor) */
BOOL
cursor_visible; /* tells if cursor is *actually* visible or not */
Uint8 *
sw_buffers[2]; /* pointers to the two software buffers for double-buffer emulation */
SDL_Thread *
thread; /* thread for async updates to the screen */
SDL_sem *
sem1, *
sem2; /* synchronization for async screen updates */
Uint8 *
current_buffer; /* the buffer being copied to the screen */
BOOL
quit_thread; /* used to quit the async blitting thread */
SInt32
system_version; /* used to dis-/enable workarounds depending on the system version */
ImageDescriptionHandle
yuv_idh;
MatrixRecordPtr
yuv_matrix;
DecompressorComponent
yuv_codec;
ImageSequence
yuv_seq;
PlanarPixmapInfoYUV420 *
yuv_pixmap;
Sint16
yuv_width,
yuv_height;
CGrafPtr
yuv_port;
void *
opengl_library; /* dynamically loaded OpenGL library. */
} SDL_PrivateVideoData;
#define _THIS SDL_VideoDevice *this
#define display_id (this->hidden->display)
#define mode (this->hidden->mode)
#define save_mode (this->hidden->save_mode)
#define mode_list (this->hidden->mode_list)
#define palette (this->hidden->palette)
#define gl_context (this->hidden->gl_context)
#define device_width (this->hidden->width)
#define device_height (this->hidden->height)
#define device_bpp (this->hidden->bpp)
#define mode_flags (this->hidden->flags)
#define qz_window (this->hidden->window)
#define window_view (this->hidden->view)
#define video_set (this->hidden->video_set)
#define warp_ticks (this->hidden->warp_ticks)
#define warp_flag (this->hidden->warp_flag)
#define resize_icon (this->hidden->resize_icon)
#define current_grab_mode (this->hidden->current_grab_mode)
#define client_mode_list (this->hidden->client_mode_list)
#define keymap (this->hidden->keymap)
#define current_mods (this->hidden->current_mods)
#define last_virtual_button (this->hidden->last_virtual_button)
#define power_connection (this->hidden->power_connection)
#define expect_mouse_up (this->hidden->expect_mouse_up)
#define grab_state (this->hidden->grab_state)
#define cursor_loc (this->hidden->cursor_loc)
#define cursor_should_be_visible (this->hidden->cursor_should_be_visible)
#define cursor_visible (this->hidden->cursor_visible)
#define sw_buffers (this->hidden->sw_buffers)
#define thread (this->hidden->thread)
#define sem1 (this->hidden->sem1)
#define sem2 (this->hidden->sem2)
#define current_buffer (this->hidden->current_buffer)
#define quit_thread (this->hidden->quit_thread)
#define system_version (this->hidden->system_version)
#define opengl_library (this->hidden->opengl_library)
/* grab states - the input is in one of these states */
enum
{
QZ_UNGRABBED = 0,
QZ_VISIBLE_GRAB,
QZ_INVISIBLE_GRAB
};
/* grab actions - these can change the grabbed state */
enum
{
QZ_ENABLE_GRAB = 0,
QZ_DISABLE_GRAB,
QZ_HIDECURSOR,
QZ_SHOWCURSOR
};
/* Gamma Functions */
int
QZ_SetGamma(_THIS, float red, float green, float blue);
int
QZ_GetGamma(_THIS, float *red, float *green, float *blue);
int
QZ_SetGammaRamp(_THIS, Uint16 * ramp);
int
QZ_GetGammaRamp(_THIS, Uint16 * ramp);
/* OpenGL functions */
int
QZ_SetupOpenGL(_THIS, int bpp, Uint32 flags);
void
QZ_TearDownOpenGL(_THIS);
void *
QZ_GL_GetProcAddress(_THIS, const char *proc);
int
QZ_GL_GetAttribute(_THIS, SDL_GLattr attrib, int *value);
int
QZ_GL_MakeCurrent(_THIS);
void
QZ_GL_SwapBuffers(_THIS);
int
QZ_GL_LoadLibrary(_THIS, const char *location);
/* Cursor and Mouse functions */
void
QZ_FreeWMCursor(_THIS, WMcursor * cursor);
WMcursor *
QZ_CreateWMCursor(_THIS, Uint8 * data, Uint8 * mask,
int w, int h, int hot_x, int hot_y);
int
QZ_ShowWMCursor(_THIS, WMcursor * cursor);
void
QZ_WarpWMCursor(_THIS, Uint16 x, Uint16 y);
void
QZ_MoveWMCursor(_THIS, int x, int y);
void
QZ_CheckMouseMode(_THIS);
void
QZ_UpdateMouse(_THIS);
/* Event functions */
void
QZ_InitOSKeymap(_THIS);
void
QZ_PumpEvents(_THIS);
/* Window Manager functions */
void
QZ_SetCaption(_THIS, const char *title, const char *icon);
void
QZ_SetIcon(_THIS, SDL_Surface * icon, Uint8 * mask);
int
QZ_IconifyWindow(_THIS);
SDL_GrabMode
QZ_GrabInput(_THIS, SDL_GrabMode grab_mode);
/*int QZ_GetWMInfo (_THIS, SDL_SysWMinfo *info);*/
/* YUV functions */
SDL_Overlay *QZ_CreateYUVOverlay(_THIS, int width, int height,
Uint32 format, SDL_Surface * display);
/* Private functions (used internally) */
void QZ_PrivateWarpCursor(_THIS, int x, int y);
void QZ_ChangeGrabState(_THIS, int action);
void QZ_RegisterForSleepNotifications(_THIS);
void QZ_ShowMouse(_THIS);
void QZ_HideMouse(_THIS);
void QZ_PrivateGlobalToLocal(_THIS, NSPoint * p);
void QZ_PrivateCocoaToSDL(_THIS, NSPoint * p);
BOOL
QZ_IsMouseInWindow(_THIS);
void QZ_DoActivate(_THIS);
void QZ_DoDeactivate(_THIS);
/* vi: set ts=4 sw=4 expandtab: */

File diff suppressed because it is too large Load Diff

View File

@ -1,492 +0,0 @@
/*
SDL - Simple DirectMedia Layer
Copyright (C) 1997-2003 Sam Lantinga
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Sam Lantinga
slouken@libsdl.org
*/
#include "SDL_config.h"
#include "SDL_QuartzVideo.h"
struct WMcursor
{
NSCursor *nscursor;
};
void
QZ_FreeWMCursor(_THIS, WMcursor * cursor)
{
if (cursor != NULL) {
[cursor->nscursor release];
free(cursor);
}
}
WMcursor *
QZ_CreateWMCursor(_THIS, Uint8 * data, Uint8 * mask,
int w, int h, int hot_x, int hot_y)
{
WMcursor *cursor;
NSBitmapImageRep *imgrep;
NSImage *img;
unsigned char *planes[5];
int i;
NSAutoreleasePool *pool;
pool =[[NSAutoreleasePool alloc] init];
/* Allocate the cursor memory */
cursor = (WMcursor *) SDL_malloc(sizeof(WMcursor));
if (cursor == NULL)
goto outOfMemory;
/* create the image representation and get the pointers to its storage */
imgrep =[[[NSBitmapImageRep alloc] initWithBitmapDataPlanes: NULL pixelsWide: w pixelsHigh: h bitsPerSample: 1 samplesPerPixel: 2 hasAlpha: YES isPlanar: YES colorSpaceName: NSDeviceBlackColorSpace bytesPerRow: (w + 7) / 8 bitsPerPixel:0] autorelease];
if (imgrep == nil)
goto outOfMemory;
[imgrep getBitmapDataPlanes:planes];
/* copy data and mask, extending the mask to all black pixels because the inversion effect doesn't work with Cocoa's alpha-blended cursors */
for (i = 0; i < (w + 7) / 8 * h; i++) {
planes[0][i] = data[i];
planes[1][i] = mask[i] | data[i];
}
/* create image and cursor */
img =[[[NSImage alloc] initWithSize:NSMakeSize(w, h)] autorelease];
if (img == nil)
goto outOfMemory;
[img addRepresentation:imgrep];
if (system_version < 0x1030) { /* on 10.2, cursors must be 16*16 */
if (w > 16 || h > 16) { /* too big: scale it down */
[img setScalesWhenResized:YES];
hot_x = hot_x * 16 / w;
hot_y = hot_y * 16 / h;
} else { /* too small (or just right): extend it (from the bottom left corner, so hot_y must be adjusted) */
hot_y += 16 - h;
}
[img setSize:NSMakeSize(16, 16)];
}
cursor->nscursor =[[NSCursor alloc] initWithImage: img hotSpot:NSMakePoint(hot_x,
hot_y)];
if (cursor->nscursor == nil)
goto outOfMemory;
[pool release];
return (cursor);
outOfMemory:
[pool release];
if (cursor != NULL)
SDL_free(cursor);
SDL_OutOfMemory();
return (NULL);
}
void
QZ_ShowMouse(_THIS)
{
if (!cursor_visible) {
[NSCursor unhide];
cursor_visible = YES;
}
}
void
QZ_HideMouse(_THIS)
{
if ((SDL_GetAppState() & SDL_APPMOUSEFOCUS) && cursor_visible) {
[NSCursor hide];
cursor_visible = NO;
}
}
BOOL
QZ_IsMouseInWindow(_THIS)
{
if (qz_window == nil)
return YES; /*fullscreen */
else {
NSPoint p =[qz_window mouseLocationOutsideOfEventStream];
p.y -= 1.0f; /* Apparently y goes from 1 to h, not from 0 to h-1 (i.e. the "location of the mouse" seems to be defined as "the location of the top left corner of the mouse pointer's hot pixel" */
return NSPointInRect(p,[window_view frame]);
}
}
int
QZ_ShowWMCursor(_THIS, WMcursor * cursor)
{
if (cursor == NULL) {
if (cursor_should_be_visible) {
QZ_HideMouse(this);
cursor_should_be_visible = NO;
QZ_ChangeGrabState(this, QZ_HIDECURSOR);
}
} else {
[cursor->nscursor set];
if (!cursor_should_be_visible) {
QZ_ShowMouse(this);
cursor_should_be_visible = YES;
QZ_ChangeGrabState(this, QZ_SHOWCURSOR);
}
}
return 1;
}
/*
Coordinate conversion functions, for convenience
Cocoa sets the origin at the lower left corner of the window/screen
SDL, CoreGraphics/WindowServer, and QuickDraw use the origin at the upper left corner
The routines were written so they could be called before SetVideoMode() has finished;
this might have limited usefulness at the moment, but the extra cost is trivial.
*/
/* Convert Cocoa screen coordinate to Cocoa window coordinate */
void
QZ_PrivateGlobalToLocal(_THIS, NSPoint * p)
{
*p =[qz_window convertScreenToBase:*p];
}
/* Convert Cocoa window coordinate to Cocoa screen coordinate */
void
QZ_PrivateLocalToGlobal(_THIS, NSPoint * p)
{
*p =[qz_window convertBaseToScreen:*p];
}
/* Convert SDL coordinate to Cocoa coordinate */
void
QZ_PrivateSDLToCocoa(_THIS, NSPoint * p)
{
if (CGDisplayIsCaptured(display_id)) { /* capture signals fullscreen */
p->y = CGDisplayPixelsHigh(display_id) - p->y;
} else {
*p =[window_view convertPoint: *p toView:nil];
/* We need a workaround in OpenGL mode */
if (SDL_VideoSurface->flags & SDL_OPENGL) {
p->y =[window_view frame].size.height - p->y;
}
}
}
/* Convert Cocoa coordinate to SDL coordinate */
void
QZ_PrivateCocoaToSDL(_THIS, NSPoint * p)
{
if (CGDisplayIsCaptured(display_id)) { /* capture signals fullscreen */
p->y = CGDisplayPixelsHigh(display_id) - p->y;
} else {
*p =[window_view convertPoint: *p fromView:nil];
/* We need a workaround in OpenGL mode */
if (SDL_VideoSurface != NULL
&& (SDL_VideoSurface->flags & SDL_OPENGL)) {
p->y =[window_view frame].size.height - p->y;
}
}
}
/* Convert SDL coordinate to window server (CoreGraphics) coordinate */
CGPoint
QZ_PrivateSDLToCG(_THIS, NSPoint * p)
{
CGPoint cgp;
if (!CGDisplayIsCaptured(display_id)) { /* not captured => not fullscreen => local coord */
int height;
QZ_PrivateSDLToCocoa(this, p);
QZ_PrivateLocalToGlobal(this, p);
height = CGDisplayPixelsHigh(display_id);
p->y = height - p->y;
}
cgp.x = p->x;
cgp.y = p->y;
return cgp;
}
#if 0 /* Dead code */
/* Convert window server (CoreGraphics) coordinate to SDL coordinate */
void
QZ_PrivateCGToSDL(_THIS, NSPoint * p)
{
if (!CGDisplayIsCaptured(display_id)) { /* not captured => not fullscreen => local coord */
int height;
/* Convert CG Global to Cocoa Global */
height = CGDisplayPixelsHigh(display_id);
p->y = height - p->y;
QZ_PrivateGlobalToLocal(this, p);
QZ_PrivateCocoaToSDL(this, p);
}
}
#endif /* Dead code */
void
QZ_PrivateWarpCursor(_THIS, int x, int y)
{
NSPoint p;
CGPoint cgp;
p = NSMakePoint(x, y);
cgp = QZ_PrivateSDLToCG(this, &p);
/* this is the magic call that fixes cursor "freezing" after warp */
CGSetLocalEventsSuppressionInterval(0.0);
CGWarpMouseCursorPosition(cgp);
}
void
QZ_WarpWMCursor(_THIS, Uint16 x, Uint16 y)
{
/* Only allow warping when in foreground */
if (![NSApp isActive])
return;
/* Do the actual warp */
if (grab_state != QZ_INVISIBLE_GRAB)
QZ_PrivateWarpCursor(this, x, y);
/* Generate the mouse moved event */
SDL_PrivateMouseMotion(0, 0, x, y);
}
void
QZ_MoveWMCursor(_THIS, int x, int y)
{
}
void
QZ_CheckMouseMode(_THIS)
{
}
void
QZ_SetCaption(_THIS, const char *title, const char *icon)
{
if (qz_window != nil) {
NSString *string;
if (title != NULL) {
string =[[NSString alloc] initWithUTF8String:title];
[qz_window setTitle:string];
[string release];
}
if (icon != NULL) {
string =[[NSString alloc] initWithUTF8String:icon];
[qz_window setMiniwindowTitle:string];
[string release];
}
}
}
void
QZ_SetIcon(_THIS, SDL_Surface * icon, Uint8 * mask)
{
NSBitmapImageRep *imgrep;
NSImage *img;
SDL_Surface *mergedSurface;
NSAutoreleasePool *pool;
Uint8 *pixels;
SDL_bool iconSrcAlpha;
Uint8 iconAlphaValue;
int i, j, maskPitch, index;
pool =[[NSAutoreleasePool alloc] init];
imgrep =[[[NSBitmapImageRep alloc] initWithBitmapDataPlanes: NULL pixelsWide: icon->w pixelsHigh: icon->h bitsPerSample: 8 samplesPerPixel: 4 hasAlpha: YES isPlanar: NO colorSpaceName: NSDeviceRGBColorSpace bytesPerRow: 4 * icon->w bitsPerPixel:32] autorelease];
if (imgrep == nil)
goto freePool;
pixels =[imgrep bitmapData];
SDL_memset(pixels, 0, 4 * icon->w * icon->h); /* make the background, which will survive in colorkeyed areas, completely transparent */
#if SDL_BYTEORDER == SDL_BIG_ENDIAN
#define BYTEORDER_DEPENDENT_RGBA_MASKS 0xFF000000, 0x00FF0000, 0x0000FF00, 0x000000FF
#else
#define BYTEORDER_DEPENDENT_RGBA_MASKS 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000
#endif
mergedSurface =
SDL_CreateRGBSurfaceFrom(pixels, icon->w, icon->h, 32, 4 * icon->w,
BYTEORDER_DEPENDENT_RGBA_MASKS);
if (mergedSurface == NULL)
goto freePool;
/* blit, with temporarily cleared SRCALPHA flag because we want to copy, not alpha-blend */
iconSrcAlpha = ((icon->flags & SDL_SRCALPHA) != 0);
iconAlphaValue = icon->format->alpha;
SDL_SetAlpha(icon, 0, 255);
SDL_BlitSurface(icon, NULL, mergedSurface, NULL);
if (iconSrcAlpha)
SDL_SetAlpha(icon, SDL_SRCALPHA, iconAlphaValue);
SDL_FreeSurface(mergedSurface);
/* apply mask, source alpha, and premultiply color values by alpha */
maskPitch = (icon->w + 7) / 8;
for (i = 0; i < icon->h; i++) {
for (j = 0; j < icon->w; j++) {
index = i * 4 * icon->w + j * 4;
if (!(mask[i * maskPitch + j / 8] & (128 >> j % 8))) {
pixels[index + 3] = 0;
} else {
if (iconSrcAlpha) {
if (icon->format->Amask == 0)
pixels[index + 3] = icon->format->alpha;
} else {
pixels[index + 3] = 255;
}
}
if (pixels[index + 3] < 255) {
pixels[index + 0] =
(Uint16) pixels[index + 0] * pixels[index + 3] / 255;
pixels[index + 1] =
(Uint16) pixels[index + 1] * pixels[index + 3] / 255;
pixels[index + 2] =
(Uint16) pixels[index + 2] * pixels[index + 3] / 255;
}
}
}
img =[[[NSImage alloc] initWithSize:NSMakeSize(icon->w,
icon->h)] autorelease];
if (img == nil)
goto freePool;
[img addRepresentation:imgrep];
[NSApp setApplicationIconImage:img];
freePool:
[pool release];
}
int
QZ_IconifyWindow(_THIS)
{
if (![qz_window isMiniaturized]) {
[qz_window miniaturize:nil];
return 1;
} else {
SDL_SetError("window already iconified");
return 0;
}
}
/*
int QZ_GetWMInfo (_THIS, SDL_SysWMinfo *info) {
info->nsWindowPtr = qz_window;
return 0;
}*/
void
QZ_ChangeGrabState(_THIS, int action)
{
/*
Figure out what the next state should be based on the action.
Ignore actions that can't change the current state.
*/
if (grab_state == QZ_UNGRABBED) {
if (action == QZ_ENABLE_GRAB) {
if (cursor_should_be_visible)
grab_state = QZ_VISIBLE_GRAB;
else
grab_state = QZ_INVISIBLE_GRAB;
}
} else if (grab_state == QZ_VISIBLE_GRAB) {
if (action == QZ_DISABLE_GRAB)
grab_state = QZ_UNGRABBED;
else if (action == QZ_HIDECURSOR)
grab_state = QZ_INVISIBLE_GRAB;
} else {
assert(grab_state == QZ_INVISIBLE_GRAB);
if (action == QZ_DISABLE_GRAB)
grab_state = QZ_UNGRABBED;
else if (action == QZ_SHOWCURSOR)
grab_state = QZ_VISIBLE_GRAB;
}
/* now apply the new state */
if (grab_state == QZ_UNGRABBED) {
CGAssociateMouseAndMouseCursorPosition(1);
} else if (grab_state == QZ_VISIBLE_GRAB) {
CGAssociateMouseAndMouseCursorPosition(1);
} else {
assert(grab_state == QZ_INVISIBLE_GRAB);
QZ_PrivateWarpCursor(this, SDL_VideoSurface->w / 2,
SDL_VideoSurface->h / 2);
CGAssociateMouseAndMouseCursorPosition(0);
}
}
SDL_GrabMode
QZ_GrabInput(_THIS, SDL_GrabMode grab_mode)
{
int doGrab = grab_mode & SDL_GRAB_ON;
/*int fullscreen = grab_mode & SDL_GRAB_FULLSCREEN; */
if (this->screen == NULL) {
SDL_SetError("QZ_GrabInput: screen is NULL");
return SDL_GRAB_OFF;
}
if (!video_set) {
/*SDL_SetError ("QZ_GrabInput: video is not set, grab will take effect on mode switch"); */
current_grab_mode = grab_mode;
return grab_mode; /* Will be set later on mode switch */
}
if (grab_mode != SDL_GRAB_QUERY) {
if (doGrab)
QZ_ChangeGrabState(this, QZ_ENABLE_GRAB);
else
QZ_ChangeGrabState(this, QZ_DISABLE_GRAB);
current_grab_mode = doGrab ? SDL_GRAB_ON : SDL_GRAB_OFF;
}
return current_grab_mode;
}

View File

@ -1,41 +0,0 @@
/*
SDL - Simple DirectMedia Layer
Copyright (C) 1997-2003 Sam Lantinga
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Sam Lantinga
slouken@libsdl.org
*/
#include "SDL_config.h"
/* Subclass of NSWindow to fix genie effect and support resize events */
@ interface SDL_QuartzWindow: NSWindow - (void) miniaturize:(id) sender;
-(void) display;
-(void) setFrame:(NSRect)
frameRect display:(BOOL) flag;
-(void) appDidHide:(NSNotification *) note;
-(void) appWillUnhide:(NSNotification *) note;
-(void) appDidUnhide:(NSNotification *) note;
-(id) initWithContentRect:(NSRect)
contentRect styleMask:(unsigned int)
styleMask backing:(NSBackingStoreType)
backingType defer:(BOOL) flag;
@end
/* Delegate for our NSWindow to send SDLQuit() on close */
@ interface SDL_QuartzWindowDelegate: NSObject - (BOOL) windowShouldClose:(id)
sender;
@end
/* vi: set ts=4 sw=4 expandtab: */

View File

@ -1,214 +0,0 @@
/*
SDL - Simple DirectMedia Layer
Copyright (C) 1997-2003 Sam Lantinga
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Sam Lantinga
slouken@libsdl.org
*/
#include "SDL_config.h"
#include "SDL_QuartzVideo.h"
#include "SDL_QuartzWindow.h"
/*
This function makes the *SDL region* of the window 100% opaque.
The genie effect uses the alpha component. Otherwise,
it doesn't seem to matter what value it has.
*/
static void
QZ_SetPortAlphaOpaque ()
{
SDL_Surface *surface = current_video->screen;
int bpp;
bpp = surface->format->BitsPerPixel;
if (bpp == 32) {
Uint32 *pixels = (Uint32 *) surface->pixels;
Uint32 rowPixels = surface->pitch / 4;
Uint32 i, j;
for (i = 0; i < surface->h; i++)
for (j = 0; j < surface->w; j++) {
pixels[(i * rowPixels) + j] |= 0xFF000000;
}
}
}
@implementation SDL_QuartzWindow
/* we override these methods to fix the miniaturize animation/dock icon bug */
- (void) miniaturize:(id) sender {
if (SDL_VideoSurface->flags & SDL_INTERNALOPENGL) {
/*
Future: Grab framebuffer and put into NSImage
[ qz_window setMiniwindowImage:image ];
*/
} else {
/* make the alpha channel opaque so anim won't have holes in it */
QZ_SetPortAlphaOpaque ();
}
/* window is hidden now */
SDL_PrivateAppActive (0, SDL_APPACTIVE);
[super miniaturize:sender];
}
-(void) display {
/*
This method fires just before the window deminaturizes from the Dock.
We'll save the current visible surface, let the window manager redraw any
UI elements, and restore the SDL surface. This way, no expose event
is required, and the deminiaturize works perfectly.
*/
SDL_VideoDevice *this = (SDL_VideoDevice *) current_video;
/* make sure pixels are fully opaque */
if (!(SDL_VideoSurface->flags & SDL_INTERNALOPENGL))
QZ_SetPortAlphaOpaque ();
/* save current visible SDL surface */
[self cacheImageInRect:[window_view frame]];
/* let the window manager redraw controls, border, etc */
[super display];
/* restore visible SDL surface */
[self restoreCachedImage];
/* window is visible again */
SDL_PrivateAppActive (1, SDL_APPACTIVE);
}
-(void) setFrame:(NSRect)
frameRect display:(BOOL) flag
{
/*
If the video surface is NULL, this originated from QZ_SetVideoMode,
so don't send the resize event.
*/
SDL_VideoDevice *this = (SDL_VideoDevice *) current_video;
if (this && SDL_VideoSurface == NULL) {
[super setFrame: frameRect display:flag];
} else if (this && qz_window) {
NSRect newViewFrame;
[super setFrame: frameRect display:flag];
newViewFrame =[window_view frame];
SDL_PrivateResize (newViewFrame.size.width, newViewFrame.size.height);
/* If not OpenGL, we have to update the pixels and pitch */
if (!(SDL_VideoSurface->flags & SDL_INTERNALOPENGL)) {
CGrafPtr thePort =[window_view qdPort];
LockPortBits (thePort);
SDL_VideoSurface->pixels =
GetPixBaseAddr (GetPortPixMap (thePort));
SDL_VideoSurface->pitch =
GetPixRowBytes (GetPortPixMap (thePort));
/*
SDL_VideoSurface->pixels now points to the window's pixels
We want it to point to the *view's* pixels
*/
{
int vOffset =[qz_window frame].size.height -
newViewFrame.size.height - newViewFrame.origin.y;
int hOffset = newViewFrame.origin.x;
SDL_VideoSurface->pixels =
(Uint8 *) SDL_VideoSurface->pixels +
(vOffset * SDL_VideoSurface->pitch) +
hOffset * (device_bpp / 8);
}
UnlockPortBits (thePort);
}
}
}
-(void) appDidHide:(NSNotification *) note {
SDL_PrivateAppActive (0, SDL_APPACTIVE);
}
-(void) appWillUnhide:(NSNotification *) note {
SDL_VideoDevice *this = (SDL_VideoDevice *) current_video;
if (this) {
/* make sure pixels are fully opaque */
if (!(SDL_VideoSurface->flags & SDL_INTERNALOPENGL))
QZ_SetPortAlphaOpaque ();
/* save current visible SDL surface */
[self cacheImageInRect:[window_view frame]];
}
}
-(void) appDidUnhide:(NSNotification *) note {
/* restore cached image, since it may not be current, post expose event too */
[self restoreCachedImage];
/*SDL_PrivateExpose (); */
SDL_PrivateAppActive (1, SDL_APPACTIVE);
}
-(id) initWithContentRect:(NSRect)
contentRect styleMask:(unsigned int)
styleMask backing:(NSBackingStoreType)
backingType defer:(BOOL) flag
{
/* Make our window subclass receive these application notifications */
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector (appDidHide: )name: NSApplicationDidHideNotification object:NSApp];
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector (appDidUnhide: )name: NSApplicationDidUnhideNotification object:NSApp];
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector (appWillUnhide: )name: NSApplicationWillUnhideNotification object:NSApp];
return[super initWithContentRect: contentRect styleMask: styleMask backing: backingType defer:flag];
}
@end @ implementation SDL_QuartzWindowDelegate - (BOOL) windowShouldClose:(id) sender
{
SDL_PrivateQuit ();
return NO;
}
-(void) windowDidBecomeKey:(NSNotification *) aNotification {
QZ_DoActivate (current_video);
}
-(void) windowDidResignKey:(NSNotification *) aNotification {
QZ_DoDeactivate (current_video);
}
@end

View File

@ -1,330 +0,0 @@
/*
SDL - Simple DirectMedia Layer
Copyright (C) 1997-2003 Sam Lantinga
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Sam Lantinga
slouken@libsdl.org
*/
#include "SDL_config.h"
#include "SDL_QuartzVideo.h"
#include "SDL_QuartzWindow.h"
#include "../SDL_yuvfuncs.h"
#define yuv_idh (this->hidden->yuv_idh)
#define yuv_matrix (this->hidden->yuv_matrix)
#define yuv_codec (this->hidden->yuv_codec)
#define yuv_seq (this->hidden->yuv_seq)
#define yuv_pixmap (this->hidden->yuv_pixmap)
#define yuv_data (this->hidden->yuv_data)
#define yuv_width (this->hidden->yuv_width)
#define yuv_height (this->hidden->yuv_height)
#define yuv_port (this->hidden->yuv_port)
static int
QZ_LockYUV (_THIS, SDL_Overlay * overlay)
{
return 0;
}
static void
QZ_UnlockYUV (_THIS, SDL_Overlay * overlay)
{
;
}
static int
QZ_DisplayYUV (_THIS, SDL_Overlay * overlay, SDL_Rect * src, SDL_Rect * dst)
{
OSErr err;
CodecFlags flags;
if (dst->x != 0 || dst->y != 0) {
SDL_SetError ("Need a dst at (0,0)");
return -1;
}
if (dst->w != yuv_width || dst->h != yuv_height) {
Fixed scale_x, scale_y;
scale_x = FixDiv (Long2Fix (dst->w), Long2Fix (overlay->w));
scale_y = FixDiv (Long2Fix (dst->h), Long2Fix (overlay->h));
SetIdentityMatrix (yuv_matrix);
ScaleMatrix (yuv_matrix, scale_x, scale_y, Long2Fix (0),
Long2Fix (0));
SetDSequenceMatrix (yuv_seq, yuv_matrix);
yuv_width = dst->w;
yuv_height = dst->h;
}
if ((err = DecompressSequenceFrameS (yuv_seq,
(void *) yuv_pixmap,
sizeof (PlanarPixmapInfoYUV420),
codecFlagUseImageBuffer, &flags,
nil) != noErr)) {
SDL_SetError ("DecompressSequenceFrameS failed");
}
return err != noErr;
}
static void
QZ_FreeHWYUV (_THIS, SDL_Overlay * overlay)
{
CDSequenceEnd (yuv_seq);
ExitMovies ();
SDL_free (overlay->hwfuncs);
SDL_free (overlay->pitches);
SDL_free (overlay->pixels);
if (SDL_VideoSurface->flags & SDL_FULLSCREEN) {
[qz_window close];
qz_window = nil;
}
SDL_free (yuv_matrix);
DisposeHandle ((Handle) yuv_idh);
}
/* check for 16 byte alignment, bail otherwise */
#define CHECK_ALIGN(x) do { if ((Uint32)x & 15) { SDL_SetError("Alignment error"); return NULL; } } while(0)
/* align a byte offset, return how much to add to make it a multiple of 16 */
#define ALIGN(x) ((16 - (x & 15)) & 15)
SDL_Overlay *
QZ_CreateYUVOverlay (_THIS, int width, int height,
Uint32 format, SDL_Surface * display)
{
Uint32 codec;
OSStatus err;
CGrafPtr port;
SDL_Overlay *overlay;
if (format == SDL_YV12_OVERLAY || format == SDL_IYUV_OVERLAY) {
codec = kYUV420CodecType;
} else {
SDL_SetError ("Hardware: unsupported video format");
return NULL;
}
yuv_idh =
(ImageDescriptionHandle) NewHandleClear (sizeof (ImageDescription));
if (yuv_idh == NULL) {
SDL_OutOfMemory ();
return NULL;
}
yuv_matrix = (MatrixRecordPtr) SDL_malloc (sizeof (MatrixRecord));
if (yuv_matrix == NULL) {
SDL_OutOfMemory ();
return NULL;
}
if (EnterMovies () != noErr) {
SDL_SetError ("Could not init QuickTime for YUV playback");
return NULL;
}
err = FindCodec (codec, bestSpeedCodec, nil, &yuv_codec);
if (err != noErr) {
SDL_SetError ("Could not find QuickTime codec for format");
return NULL;
}
if (SDL_VideoSurface->flags & SDL_FULLSCREEN) {
/*
Acceleration requires a window to be present.
A CGrafPtr that points to the screen isn't good enough
*/
NSRect content =
NSMakeRect (0, 0, SDL_VideoSurface->w, SDL_VideoSurface->h);
qz_window =[[SDL_QuartzWindow alloc] initWithContentRect: content styleMask: NSBorderlessWindowMask backing: NSBackingStoreBuffered defer:NO];
if (qz_window == nil) {
SDL_SetError ("Could not create the Cocoa window");
return NULL;
}
[qz_window setContentView:[[NSQuickDrawView alloc] init]];
[qz_window setReleasedWhenClosed:YES];
[qz_window center];
[qz_window setAcceptsMouseMovedEvents:YES];
[qz_window setLevel:CGShieldingWindowLevel ()];
[qz_window makeKeyAndOrderFront:nil];
port =[[qz_window contentView] qdPort];
SetPort (port);
/*
BUG: would like to remove white flash when window kicks in
{
Rect r;
SetRect (&r, 0, 0, SDL_VideoSurface->w, SDL_VideoSurface->h);
PaintRect (&r);
QDFlushPortBuffer (port, nil);
}
*/
} else {
port =[window_view qdPort];
SetPort (port);
}
SetIdentityMatrix (yuv_matrix);
HLock ((Handle) yuv_idh);
(**yuv_idh).idSize = sizeof (ImageDescription);
(**yuv_idh).cType = codec;
(**yuv_idh).version = 1;
(**yuv_idh).revisionLevel = 0;
(**yuv_idh).width = width;
(**yuv_idh).height = height;
(**yuv_idh).hRes = Long2Fix (72);
(**yuv_idh).vRes = Long2Fix (72);
(**yuv_idh).spatialQuality = codecLosslessQuality;
(**yuv_idh).frameCount = 1;
(**yuv_idh).clutID = -1;
(**yuv_idh).dataSize = 0;
(**yuv_idh).depth = 24;
HUnlock ((Handle) yuv_idh);
err = DecompressSequenceBeginS (&yuv_seq,
yuv_idh,
NULL,
0,
port,
NULL,
NULL,
yuv_matrix,
0,
NULL,
codecFlagUseImageBuffer,
codecLosslessQuality, yuv_codec);
if (err != noErr) {
SDL_SetError ("Error trying to start YUV codec.");
return NULL;
}
overlay = (SDL_Overlay *) SDL_malloc (sizeof (*overlay));
if (overlay == NULL) {
SDL_OutOfMemory ();
return NULL;
}
overlay->format = format;
overlay->w = width;
overlay->h = height;
overlay->planes = 3;
overlay->hw_overlay = 1;
{
int offset;
Uint8 **pixels;
Uint16 *pitches;
int plane2, plane3;
if (format == SDL_IYUV_OVERLAY) {
plane2 = 1; /* Native codec format */
plane3 = 2;
} else if (format == SDL_YV12_OVERLAY) {
/* switch the U and V planes */
plane2 = 2; /* U plane maps to plane 3 */
plane3 = 1; /* V plane maps to plane 2 */
} else {
SDL_SetError ("Unsupported YUV format");
return NULL;
}
pixels = (Uint8 **) SDL_malloc (sizeof (*pixels) * 3);
pitches = (Uint16 *) SDL_malloc (sizeof (*pitches) * 3);
if (pixels == NULL || pitches == NULL) {
SDL_OutOfMemory ();
return NULL;
}
yuv_pixmap = (PlanarPixmapInfoYUV420 *)
SDL_malloc (sizeof (PlanarPixmapInfoYUV420) +
(width * height * 2));
if (yuv_pixmap == NULL) {
SDL_OutOfMemory ();
return NULL;
}
/* CHECK_ALIGN(yuv_pixmap); */
offset = sizeof (PlanarPixmapInfoYUV420);
/* offset += ALIGN(offset); */
/* CHECK_ALIGN(offset); */
pixels[0] = (Uint8 *) yuv_pixmap + offset;
/* CHECK_ALIGN(pixels[0]); */
pitches[0] = width;
yuv_pixmap->componentInfoY.offset = offset;
yuv_pixmap->componentInfoY.rowBytes = width;
offset += width * height;
pixels[plane2] = (Uint8 *) yuv_pixmap + offset;
pitches[plane2] = width / 2;
yuv_pixmap->componentInfoCb.offset = offset;
yuv_pixmap->componentInfoCb.rowBytes = width / 2;
offset += (width * height / 4);
pixels[plane3] = (Uint8 *) yuv_pixmap + offset;
pitches[plane3] = width / 2;
yuv_pixmap->componentInfoCr.offset = offset;
yuv_pixmap->componentInfoCr.rowBytes = width / 2;
overlay->pixels = pixels;
overlay->pitches = pitches;
}
overlay->hwfuncs = SDL_malloc (sizeof (*overlay->hwfuncs));
if (overlay->hwfuncs == NULL) {
SDL_OutOfMemory ();
return NULL;
}
overlay->hwfuncs->Lock = QZ_LockYUV;
overlay->hwfuncs->Unlock = QZ_UnlockYUV;
overlay->hwfuncs->Display = QZ_DisplayYUV;
overlay->hwfuncs->FreeHW = QZ_FreeHWYUV;
yuv_width = overlay->w;
yuv_height = overlay->h;
return overlay;
}

View File

@ -3,6 +3,7 @@
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <math.h>
#include "SDL.h"