Date: Wed, 31 Dec 2003 21:55:30 +0100
From: Max Horn
Subject: SDL: video/quartz cleanup
while doing some experimental changes in the quartz code, I was annoyed
by having to recompile that one big .o file over and over again. So I
decided to finally realize one TODO: properly splitting the code over
multiple files :-).
With two exceptions, I didn't make code changes, only rearranged files
and added new headers. Since there are several new files, making a
patch didn't work out so well, so I decided to just send you all the
new & modified files.
The one source change I made is related to showing/hiding the mouse. I
renamed cursor_visible to cursor_should_be_visible and cursor_hidden to
cursor_visible; I think that makes reading the code easier.
Then I added two new functions: QZ_ShowMouse and QZ_HideMouse. They
help manage cursor_visible (the former 'cursor_hidden'). Finally I
replaced the Carbon ShowCursor/HiderCuror calls by [NSCursor hide] and
[NSCursor unhide]. The API docs are not conclusive, but it might be
that with those the "cursor_visible" (former 'cursor_hidden') hack may
not be necessary anymore; however so far I didn't test this hypothesis,
so I left that in.
The other change was to remove in_foreground and use [NSApp isActive]
instead: Manually keeping track of whether we are in the foreground is
error prone. This should work better in some corner cases.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/video/quartz/CGS.h Sun Jan 04 14:55:35 2004 +0000
@@ -0,0 +1,83 @@
+/*
+ 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
+*/
+
+/*
+ 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);
+
--- a/src/video/quartz/Makefile.am Wed Dec 31 04:48:38 2003 +0000
+++ b/src/video/quartz/Makefile.am Sun Jan 04 14:55:35 2004 +0000
@@ -6,12 +6,13 @@
# The SDL MacOS X Quartz video driver sources
QUARTZ_SRCS = \
+ CGS.h \
+ SDL_QuartzEvents.m \
+ SDL_QuartzGL.m \
SDL_QuartzKeys.h \
SDL_QuartzVideo.h \
- SDL_QuartzVideo.m
-
-# These files are included by SDL_QuartzVideo.m (is that right??)
-noinst_HEADERS = \
- SDL_QuartzEvents.m \
+ SDL_QuartzVideo.m \
+ SDL_QuartzWindow.h \
+ SDL_QuartzWindow.m \
SDL_QuartzWM.m \
- SDL_QuartzWindow.m
+ SDL_QuartzYUV.m
--- a/src/video/quartz/SDL_QuartzEvents.m Wed Dec 31 04:48:38 2003 +0000
+++ b/src/video/quartz/SDL_QuartzEvents.m Sun Jan 04 14:55:35 2004 +0000
@@ -1,6 +1,6 @@
/*
SDL - Simple DirectMedia Layer
- Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
+ 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
@@ -19,12 +19,15 @@
Sam Lantinga
slouken@libsdl.org
*/
-#include <stdlib.h> // For getenv()
+
+#include "SDL_QuartzVideo.h"
+
+#include <stdlib.h> // For getenv()
#include <IOKit/IOMessage.h> // For wake from sleep detection
#include <IOKit/pwr_mgt/IOPMLib.h> // For wake from sleep detection
#include "SDL_QuartzKeys.h"
-static void QZ_InitOSKeymap (_THIS) {
+void QZ_InitOSKeymap (_THIS) {
const void *KCHRPtr;
UInt32 state;
UInt32 value;
@@ -283,7 +286,7 @@
key.sym = mapping[i];
/* If this was Caps Lock, we need some additional voodoo to make SDL happy */
if (bit == NSAlphaShiftKeyMask)
- SDL_PrivateKeyboard (SDL_PRESSED, &key);
+ SDL_PrivateKeyboard (SDL_PRESSED, &key);
SDL_PrivateKeyboard (SDL_RELEASED, &key);
}
else if ( newMask &&
@@ -302,13 +305,9 @@
static void QZ_DoActivate (_THIS)
{
- in_foreground = YES;
-
/* Hide the cursor if it was hidden by SDL_ShowCursor() */
- if (!cursor_visible && !cursor_hidden) {
- HideCursor ();
- cursor_hidden = YES;
- }
+ if (!cursor_should_be_visible)
+ QZ_HideMouse (this);
/* Regrab input, only if it was previously grabbed */
if ( current_grab_mode == SDL_GRAB_ON ) {
@@ -323,8 +322,6 @@
static void QZ_DoDeactivate (_THIS) {
- in_foreground = NO;
-
/* Get the current cursor location, for restore on activate */
cursor_loc = [ NSEvent mouseLocation ]; /* global coordinates */
if (qz_window)
@@ -335,10 +332,8 @@
CGAssociateMouseAndMouseCursorPosition (1);
/* Show the cursor if it was hidden by SDL_ShowCursor() */
- if (!cursor_visible && cursor_hidden) {
- ShowCursor ();
- cursor_hidden = NO;
- }
+ if (!cursor_should_be_visible)
+ QZ_ShowMouse (this);
SDL_PrivateAppActive (0, SDL_APPINPUTFOCUS);
}
@@ -359,13 +354,13 @@
IOAllowPowerChange(power_connection, (long) messageArgument);
break;
case kIOMessageSystemHasPoweredOn:
- /* awake */
+ /* awake */
SDL_PrivateExpose();
break;
}
}
-static void QZ_RegisterForSleepNotifications (_THIS)
+void QZ_RegisterForSleepNotifications (_THIS)
{
CFRunLoopSourceRef rls;
IONotificationPortRef thePortRef;
@@ -400,7 +395,7 @@
}
-static void QZ_PumpEvents (_THIS)
+void QZ_PumpEvents (_THIS)
{
int firstMouseEvent;
CGMouseDelta dx, dy;
@@ -445,7 +440,7 @@
BOOL isInGameWin;
#define DO_MOUSE_DOWN(button) do { \
- if ( in_foreground ) { \
+ if ( [ NSApp isActive ] ) { \
if ( isInGameWin ) { \
SDL_PrivateMouseButton (SDL_PRESSED, button, 0, 0); \
expect_mouse_up |= 1<<button; \
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/video/quartz/SDL_QuartzGL.m Sun Jan 04 14:55:35 2004 +0000
@@ -0,0 +1,228 @@
+/*
+ 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_QuartzVideo.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
+
+@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 ( 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 NSOPENGL_CURRENT_VERSION > 1 /* What version should this be? */
+ 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;
+ }
+#endif
+
+ 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];
+
+ if (gl_context == nil) {
+ SDL_SetError ("Failed creating OpenGL context");
+ return 0;
+ }
+
+ /*
+ * 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. */
+
+ /* Convince SDL that the GL "driver" is loaded */
+ this->gl_config.driver_loaded = 1;
+
+ [ fmt release ];
+
+ return 1;
+}
+
+void QZ_TearDownOpenGL (_THIS) {
+
+ [ NSOpenGLContext clearCurrentContext ];
+ [ gl_context clearDrawable ];
+ [ gl_context release ];
+}
+
+
+/* SDL OpenGL functions */
+
+int QZ_GL_LoadLibrary (_THIS, const char *location) {
+ this->gl_config.driver_loaded = 1;
+ return 1;
+}
+
+void* QZ_GL_GetProcAddress (_THIS, const char *proc) {
+
+ /* We may want to cache the bundleRef at some point */
+ CFBundleRef bundle;
+ CFURLRef bundleURL = CFURLCreateWithFileSystemPath (kCFAllocatorDefault,
+ CFSTR("/System/Library/Frameworks/OpenGL.framework"), kCFURLPOSIXPathStyle, true);
+
+ CFStringRef functionName = CFStringCreateWithCString
+ (kCFAllocatorDefault, proc, kCFStringEncodingASCII);
+
+ void *function;
+
+ bundle = CFBundleCreate (kCFAllocatorDefault, bundleURL);
+ assert (bundle != NULL);
+
+ function = CFBundleGetFunctionPointerForName (bundle, functionName);
+
+ CFRelease ( bundleURL );
+ CFRelease ( functionName );
+ CFRelease ( bundle );
+
+ return function;
+}
+
+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;
+ }
+
+ glGetIntegerv (attr, (GLint *)value);
+ return 0;
+}
+
+int QZ_GL_MakeCurrent (_THIS) {
+ [ gl_context makeCurrentContext ];
+ return 0;
+}
+
+void QZ_GL_SwapBuffers (_THIS) {
+ [ gl_context flushBuffer ];
+}
--- a/src/video/quartz/SDL_QuartzKeys.h Wed Dec 31 04:48:38 2003 +0000
+++ b/src/video/quartz/SDL_QuartzKeys.h Sun Jan 04 14:55:35 2004 +0000
@@ -1,24 +1,24 @@
/*
SDL - Simple DirectMedia Layer
- Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
-
+ 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
- */
+*/
/* These are the Macintosh key scancode constants -- from Inside Macintosh */
--- a/src/video/quartz/SDL_QuartzVideo.h Wed Dec 31 04:48:38 2003 +0000
+++ b/src/video/quartz/SDL_QuartzVideo.h Sun Jan 04 14:55:35 2004 +0000
@@ -1,6 +1,6 @@
/*
SDL - Simple DirectMedia Layer
- Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
+ 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
@@ -54,7 +54,7 @@
#include <OpenGL/glext.h>
#include <Carbon/Carbon.h>
#include <QuickTime/QuickTime.h>
-#include <IOKit/IOKitLib.h> /* For powersave handling */
+#include <IOKit/IOKitLib.h> /* For powersave handling */
#include <pthread.h>
#include "SDL_thread.h"
@@ -66,53 +66,6 @@
#include "SDL_pixels_c.h"
#include "SDL_events_c.h"
-/*
- Add methods to get at private members of NSScreen.
- Since there is a bug in Apple's screen switching code
- that does not update this variable when switching
- to fullscreen, we'll set it manually (but only for the
- main screen).
-*/
-@interface NSScreen (NSScreenAccess)
-- (void) setFrame:(NSRect)frame;
-@end
-
-@implementation NSScreen (NSScreenAccess)
-- (void) setFrame:(NSRect)frame;
-{
- _frame = frame;
-}
-@end
-
-/*
- 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
-
-@implementation NSOpenGLContext (CGLContextAccess)
-- (CGLContextObj) cglContext;
-{
- return _contextAuxiliary;
-}
-@end
-
-/*
- Structure for rez switch gamma fades
- We can hide the monitor flicker by setting the gamma tables to 0
-*/
-#define QZ_GAMMA_TABLE_SIZE 256
-
-typedef struct {
-
- CGGammaValue red[QZ_GAMMA_TABLE_SIZE];
- CGGammaValue green[QZ_GAMMA_TABLE_SIZE];
- CGGammaValue blue[QZ_GAMMA_TABLE_SIZE];
-
-} SDL_QuartzGammaTable;
-
/* Main driver structure to store required state information */
typedef struct SDL_PrivateVideoData {
@@ -131,7 +84,6 @@
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 */
- BOOL in_foreground; /* boolean; indicate if app is in foreground or not */
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 */
@@ -140,8 +92,8 @@
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_visible; /* tells if cursor was instructed to be hidden or not (SDL_ShowCursor) */
- BOOL cursor_hidden; /* tells if cursor is *actually* hidden or not */
+ 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 */
@@ -156,7 +108,7 @@
Sint16 yuv_width, yuv_height;
CGrafPtr yuv_port;
-} SDL_PrivateVideoData ;
+} SDL_PrivateVideoData;
#define _THIS SDL_VideoDevice *this
#define display_id (this->hidden->display)
@@ -176,7 +128,6 @@
#define warp_flag (this->hidden->warp_flag)
#define resize_icon (this->hidden->resize_icon)
#define current_grab_mode (this->hidden->current_grab_mode)
-#define in_foreground (this->hidden->in_foreground)
#define client_mode_list (this->hidden->client_mode_list)
#define keymap (this->hidden->keymap)
#define current_mods (this->hidden->current_mods)
@@ -185,8 +136,8 @@
#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 cursor_hidden (this->hidden->cursor_hidden)
#define sw_buffers (this->hidden->sw_buffers)
#define thread (this->hidden->thread)
#define sem1 (this->hidden->sem1)
@@ -194,17 +145,6 @@
#define current_buffer (this->hidden->current_buffer)
#define quit_thread (this->hidden->quit_thread)
-#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)
-
-
/* grab states - the input is in one of these states */
enum {
QZ_UNGRABBED = 0,
@@ -220,145 +160,52 @@
QZ_SHOWCURSOR
};
-/*
- 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);
-
-/* Bootstrap functions */
-static int QZ_Available ();
-static SDL_VideoDevice* QZ_CreateDevice (int device_index);
-static void QZ_DeleteDevice (SDL_VideoDevice *device);
-
-/* Initialization, Query, Setup, and Redrawing functions */
-static int QZ_VideoInit (_THIS, SDL_PixelFormat *video_format);
-
-static SDL_Rect** QZ_ListModes (_THIS, SDL_PixelFormat *format,
- Uint32 flags);
-static void QZ_UnsetVideoMode (_THIS);
-
-static SDL_Surface* QZ_SetVideoMode (_THIS, SDL_Surface *current,
- int width, int height, int bpp,
- Uint32 flags);
-static int QZ_ToggleFullScreen (_THIS, int on);
-static int QZ_SetColors (_THIS, int first_color,
- int num_colors, SDL_Color *colors);
-
-static int QZ_LockDoubleBuffer (_THIS, SDL_Surface *surface);
-static void QZ_UnlockDoubleBuffer (_THIS, SDL_Surface *surface);
-static int QZ_ThreadFlip (_THIS);
-static int QZ_FlipDoubleBuffer (_THIS, SDL_Surface *surface);
-static void QZ_DoubleBufferUpdate (_THIS, int num_rects, SDL_Rect *rects);
-
-static void QZ_DirectUpdate (_THIS, int num_rects, SDL_Rect *rects);
-static int QZ_LockWindow (_THIS, SDL_Surface *surface);
-static void QZ_UnlockWindow (_THIS, SDL_Surface *surface);
-static void QZ_UpdateRects (_THIS, int num_rects, SDL_Rect *rects);
-static void QZ_VideoQuit (_THIS);
-
-/* Hardware surface functions (for fullscreen mode only) */
-#if 0 /* Not used (apparently, it's really slow) */
-static int QZ_FillHWRect (_THIS, SDL_Surface *dst, SDL_Rect *rect, Uint32 color);
-#endif
-static int QZ_LockHWSurface(_THIS, SDL_Surface *surface);
-static void QZ_UnlockHWSurface(_THIS, SDL_Surface *surface);
-static void QZ_FreeHWSurface (_THIS, SDL_Surface *surface);
-/* static int QZ_FlipHWSurface (_THIS, SDL_Surface *surface); */
-
/* Gamma Functions */
-static int QZ_SetGamma (_THIS, float red, float green, float blue);
-static int QZ_GetGamma (_THIS, float *red, float *green, float *blue);
-static int QZ_SetGammaRamp (_THIS, Uint16 *ramp);
-static int QZ_GetGammaRamp (_THIS, Uint16 *ramp);
+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 */
-static int QZ_SetupOpenGL (_THIS, int bpp, Uint32 flags);
-static void QZ_TearDownOpenGL (_THIS);
-static void* QZ_GL_GetProcAddress (_THIS, const char *proc);
-static int QZ_GL_GetAttribute (_THIS, SDL_GLattr attrib, int* value);
-static int QZ_GL_MakeCurrent (_THIS);
-static void QZ_GL_SwapBuffers (_THIS);
-static int QZ_GL_LoadLibrary (_THIS, const char *location);
-
-/* Private function to warp the cursor (used internally) */
-static void QZ_PrivateWarpCursor (_THIS, int x, int y);
+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 */
-static void QZ_FreeWMCursor (_THIS, WMcursor *cursor);
-static WMcursor* QZ_CreateWMCursor (_THIS, Uint8 *data, Uint8 *mask,
- int w, int h, int hot_x, int hot_y);
-static int QZ_ShowWMCursor (_THIS, WMcursor *cursor);
-static void QZ_WarpWMCursor (_THIS, Uint16 x, Uint16 y);
-static void QZ_MoveWMCursor (_THIS, int x, int y);
-static void QZ_CheckMouseMode (_THIS);
+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);
/* Event functions */
-static void QZ_InitOSKeymap (_THIS);
-static void QZ_PumpEvents (_THIS);
+void QZ_InitOSKeymap (_THIS);
+void QZ_PumpEvents (_THIS);
/* Window Manager functions */
-static void QZ_SetCaption (_THIS, const char *title, const char *icon);
-static void QZ_SetIcon (_THIS, SDL_Surface *icon, Uint8 *mask);
-static int QZ_IconifyWindow (_THIS);
-static SDL_GrabMode QZ_GrabInput (_THIS, SDL_GrabMode grab_mode);
-/*static int QZ_GetWMInfo (_THIS, SDL_SysWMinfo *info);*/
+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 */
-static SDL_Overlay* QZ_CreateYUVOverlay (_THIS, int width, int height,
+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);
+
--- a/src/video/quartz/SDL_QuartzVideo.m Wed Dec 31 04:48:38 2003 +0000
+++ b/src/video/quartz/SDL_QuartzVideo.m Sun Jan 04 14:55:35 2004 +0000
@@ -1,6 +1,6 @@
/*
SDL - Simple DirectMedia Layer
- Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
+ 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
@@ -21,11 +21,82 @@
*/
#include "SDL_QuartzVideo.h"
+#include "SDL_QuartzWindow.h"
-/* Include files into one compile unit...break apart eventually */
-#include "SDL_QuartzWM.m"
-#include "SDL_QuartzEvents.m"
-#include "SDL_QuartzWindow.m"
+
+/*
+ Add methods to get at private members of NSScreen.
+ Since there is a bug in Apple's screen switching code
+ that does not update this variable when switching
+ to fullscreen, we'll set it manually (but only for the
+ main screen).
+*/
+@interface NSScreen (NSScreenAccess)
+- (void) setFrame:(NSRect)frame;
+@end
+
+@implementation NSScreen (NSScreenAccess)
+- (void) setFrame:(NSRect)frame;
+{
+ _frame = frame;
+}
+@end
+
+
+/*
+ Structure for rez switch gamma fades
+ We can hide the monitor flicker by setting the gamma tables to 0
+*/
+#define QZ_GAMMA_TABLE_SIZE 256
+
+typedef struct {
+
+ CGGammaValue red[QZ_GAMMA_TABLE_SIZE];
+ CGGammaValue green[QZ_GAMMA_TABLE_SIZE];
+ CGGammaValue blue[QZ_GAMMA_TABLE_SIZE];
+
+} SDL_QuartzGammaTable;
+
+
+/* Bootstrap functions */
+static int QZ_Available ();
+static SDL_VideoDevice* QZ_CreateDevice (int device_index);
+static void QZ_DeleteDevice (SDL_VideoDevice *device);
+
+/* Initialization, Query, Setup, and Redrawing functions */
+static int QZ_VideoInit (_THIS, SDL_PixelFormat *video_format);
+
+static SDL_Rect** QZ_ListModes (_THIS, SDL_PixelFormat *format,
+ Uint32 flags);
+static void QZ_UnsetVideoMode (_THIS);
+
+static SDL_Surface* QZ_SetVideoMode (_THIS, SDL_Surface *current,
+ int width, int height, int bpp,
+ Uint32 flags);
+static int QZ_ToggleFullScreen (_THIS, int on);
+static int QZ_SetColors (_THIS, int first_color,
+ int num_colors, SDL_Color *colors);
+
+static int QZ_LockDoubleBuffer (_THIS, SDL_Surface *surface);
+static void QZ_UnlockDoubleBuffer (_THIS, SDL_Surface *surface);
+static int QZ_ThreadFlip (_THIS);
+static int QZ_FlipDoubleBuffer (_THIS, SDL_Surface *surface);
+static void QZ_DoubleBufferUpdate (_THIS, int num_rects, SDL_Rect *rects);
+
+static void QZ_DirectUpdate (_THIS, int num_rects, SDL_Rect *rects);
+static int QZ_LockWindow (_THIS, SDL_Surface *surface);
+static void QZ_UnlockWindow (_THIS, SDL_Surface *surface);
+static void QZ_UpdateRects (_THIS, int num_rects, SDL_Rect *rects);
+static void QZ_VideoQuit (_THIS);
+
+/* Hardware surface functions (for fullscreen mode only) */
+#if 0 /* Not used (apparently, it's really slow) */
+static int QZ_FillHWRect (_THIS, SDL_Surface *dst, SDL_Rect *rect, Uint32 color);
+#endif
+static int QZ_LockHWSurface(_THIS, SDL_Surface *surface);
+static void QZ_UnlockHWSurface(_THIS, SDL_Surface *surface);
+static void QZ_FreeHWSurface (_THIS, SDL_Surface *surface);
+/* static int QZ_FlipHWSurface (_THIS, SDL_Surface *surface); */
/* Bootstrap binding, enables entry point into the driver */
VideoBootStrap QZ_bootstrap = {
@@ -130,8 +201,7 @@
/* Set misc globals */
current_grab_mode = SDL_GRAB_OFF;
- in_foreground = YES;
- cursor_visible = YES;
+ cursor_should_be_visible = YES;
/* register for sleep notifications so wake from sleep generates SDL_VIDEOEXPOSE */
QZ_RegisterForSleepNotifications (this);
@@ -712,7 +782,7 @@
/* Only recreate the view if it doesn't already exist */
if (window_view == nil) {
- window_view = [ [ SDL_QuartzWindowView alloc ] initWithFrame:contentRect ];
+ window_view = [ [ NSQuickDrawView alloc ] initWithFrame:contentRect ];
[ window_view setAutoresizingMask: NSViewMinYMargin ];
[ [ qz_window contentView ] addSubview:window_view ];
[ window_view release ];
@@ -851,7 +921,7 @@
union
{
- UInt64 i;
+ UInt64 i;
Nanoseconds ns;
} temp;
@@ -990,9 +1060,15 @@
The obscured code is based on work by Matt Slot fprefect@ambrosiasw.com,
who supplied sample code for Carbon.
*/
+
+//#define TEST_OBSCURED 1
+
+#if TEST_OBSCURED
+#include "CGS.h"
+#endif
+
static int QZ_IsWindowObscured (NSWindow *window) {
- //#define TEST_OBSCURED 1
#if TEST_OBSCURED
@@ -1230,6 +1306,84 @@
UnlockPortBits ( [ window_view qdPort ] );
}
+/* Resize icon, BMP format */
+static const unsigned char QZ_ResizeIcon[] = {
+ 0x42,0x4d,0x31,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x28,0x00,
+ 0x00,0x00,0x0d,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x01,0x00,0x18,0x00,0x00,0x00,
+ 0x00,0x00,0xfb,0x01,0x00,0x00,0x13,0x0b,0x00,0x00,0x13,0x0b,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0b,0xff,0xff,
+ 0xff,0xda,0xda,0xda,0x87,0x87,0x87,0xe8,0xe8,0xe8,0xff,0xff,0xff,0xda,0xda,0xda,
+ 0x87,0x87,0x87,0xe8,0xe8,0xe8,0xff,0xff,0xff,0xda,0xda,0xda,0x87,0x87,0x87,0xe8,
+ 0xe8,0xe8,0xff,0xff,0xff,0x0b,0xff,0xff,0xff,0xff,0xff,0xff,0xda,0xda,0xda,0x87,
+ 0x87,0x87,0xe8,0xe8,0xe8,0xff,0xff,0xff,0xda,0xda,0xda,0x87,0x87,0x87,0xe8,0xe8,
+ 0xe8,0xff,0xff,0xff,0xda,0xda,0xda,0x87,0x87,0x87,0xff,0xff,0xff,0x0b,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xd5,0xd5,0xd5,0x87,0x87,0x87,0xe8,0xe8,0xe8,
+ 0xff,0xff,0xff,0xda,0xda,0xda,0x87,0x87,0x87,0xe8,0xe8,0xe8,0xff,0xff,0xff,0xda,
+ 0xda,0xda,0xff,0xff,0xff,0x0b,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xd7,0xd7,0xd7,0x87,0x87,0x87,0xe8,0xe8,0xe8,0xff,0xff,0xff,0xda,0xda,
+ 0xda,0x87,0x87,0x87,0xe8,0xe8,0xe8,0xff,0xff,0xff,0xff,0xff,0xff,0x0b,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xd7,0xd7,0xd7,
+ 0x87,0x87,0x87,0xe8,0xe8,0xe8,0xff,0xff,0xff,0xda,0xda,0xda,0x87,0x87,0x87,0xe8,
+ 0xe8,0xe8,0xff,0xff,0xff,0x0b,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xd7,0xd7,0xd7,0x87,0x87,0x87,0xe8,0xe8,
+ 0xe8,0xff,0xff,0xff,0xdc,0xdc,0xdc,0x87,0x87,0x87,0xff,0xff,0xff,0x0b,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xd9,0xd9,0xd9,0x87,0x87,0x87,0xe8,0xe8,0xe8,0xff,0xff,0xff,0xdc,
+ 0xdc,0xdc,0xff,0xff,0xff,0x0b,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdb,0xdb,
+ 0xdb,0x87,0x87,0x87,0xe8,0xe8,0xe8,0xff,0xff,0xff,0xff,0xff,0xff,0x0b,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdb,0xdb,0xdb,0x87,0x87,0x87,0xe8,
+ 0xe8,0xe8,0xff,0xff,0xff,0x0b,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0x87,0x87,0x87,0xff,0xff,0xff,0x0b,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdc,
+ 0xdc,0xdc,0xff,0xff,0xff,0x0b,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0b
+};
+
+static void QZ_DrawResizeIcon (_THIS, RgnHandle dirtyRegion) {
+
+ /* Check if we should draw the resize icon */
+ if (SDL_VideoSurface->flags & SDL_RESIZABLE) {
+
+ Rect icon;
+ SetRect (&icon, SDL_VideoSurface->w - 13, SDL_VideoSurface->h - 13,
+ SDL_VideoSurface->w, SDL_VideoSurface->h);
+
+ if (RectInRgn (&icon, dirtyRegion)) {
+
+ SDL_Rect icon_rect;
+
+ /* Create the icon image */
+ if (resize_icon == NULL) {
+
+ SDL_RWops *rw;
+ SDL_Surface *tmp;
+
+ rw = SDL_RWFromMem (QZ_ResizeIcon, sizeof(QZ_ResizeIcon));
+ tmp = SDL_LoadBMP_RW (rw, SDL_TRUE);
+
+ resize_icon = SDL_ConvertSurface (tmp, SDL_VideoSurface->format, SDL_SRCCOLORKEY);
+ SDL_SetColorKey (resize_icon, SDL_SRCCOLORKEY, 0xFFFFFF);
+
+ SDL_FreeSurface (tmp);
+ }
+
+ icon_rect.x = SDL_VideoSurface->w - 13;
+ icon_rect.y = SDL_VideoSurface->h - 13;
+ icon_rect.w = 13;
+ icon_rect.h = 13;
+
+ SDL_BlitSurface (resize_icon, NULL, SDL_VideoSurface, &icon_rect);
+ }
+ }
+}
+
static void QZ_UpdateRects (_THIS, int numRects, SDL_Rect *rects) {
if (SDL_VideoSurface->flags & SDL_OPENGLBLIT) {
@@ -1353,7 +1507,7 @@
*/
/* Gamma functions */
-static int QZ_SetGamma (_THIS, float red, float green, float blue) {
+int QZ_SetGamma (_THIS, float red, float green, float blue) {
const CGGammaValue min = 0.0, max = 1.0;
@@ -1383,7 +1537,7 @@
}
}
-static int QZ_GetGamma (_THIS, float *red, float *green, float *blue) {
+int QZ_GetGamma (_THIS, float *red, float *green, float *blue) {
CGGammaValue dummy;
if ( CGDisplayNoErr == CGGetDisplayTransferByFormula
@@ -1395,7 +1549,7 @@
return -1;
}
-static int QZ_SetGammaRamp (_THIS, Uint16 *ramp) {
+int QZ_SetGammaRamp (_THIS, Uint16 *ramp) {
const CGTableCount tableSize = 255;
CGGammaValue redTable[tableSize];
@@ -1421,7 +1575,7 @@
return -1;
}
-static int QZ_GetGammaRamp (_THIS, Uint16 *ramp) {
+int QZ_GetGammaRamp (_THIS, Uint16 *ramp) {
const CGTableCount tableSize = 255;
CGGammaValue redTable[tableSize];
@@ -1449,484 +1603,3 @@
return 0;
}
-/* OpenGL helper functions (used internally) */
-
-static int QZ_SetupOpenGL (_THIS, int bpp, Uint32 flags) {
-
- NSOpenGLPixelFormatAttribute attr[32];
- NSOpenGLPixelFormat *fmt;
- int i = 0;
- int colorBits = bpp;
-
- 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 NSOPENGL_CURRENT_VERSION > 1 /* What version should this be? */
- 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;
- }
-#endif
-
- 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];
-
- if (gl_context == nil) {
- SDL_SetError ("Failed creating OpenGL context");
- return 0;
- }
-
- /*
- * 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. */
-
- /* Convince SDL that the GL "driver" is loaded */
- this->gl_config.driver_loaded = 1;
-
- [ fmt release ];
-
- return 1;
-}
-
-static void QZ_TearDownOpenGL (_THIS) {
-
- [ NSOpenGLContext clearCurrentContext ];
- [ gl_context clearDrawable ];
- [ gl_context release ];
-}
-
-
-/* SDL OpenGL functions */
-
-static int QZ_GL_LoadLibrary (_THIS, const char *location) {
- this->gl_config.driver_loaded = 1;
- return 1;
-}
-
-static void* QZ_GL_GetProcAddress (_THIS, const char *proc) {
-
- /* We may want to cache the bundleRef at some point */
- CFBundleRef bundle;
- CFURLRef bundleURL = CFURLCreateWithFileSystemPath (kCFAllocatorDefault,
- CFSTR("/System/Library/Frameworks/OpenGL.framework"), kCFURLPOSIXPathStyle, true);
-
- CFStringRef functionName = CFStringCreateWithCString
- (kCFAllocatorDefault, proc, kCFStringEncodingASCII);
-
- void *function;
-
- bundle = CFBundleCreate (kCFAllocatorDefault, bundleURL);
- assert (bundle != NULL);
-
- function = CFBundleGetFunctionPointerForName (bundle, functionName);
-
- CFRelease ( bundleURL );
- CFRelease ( functionName );
- CFRelease ( bundle );
-
- return function;
-}
-
-static 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;
- }
-
- glGetIntegerv (attr, (GLint *)value);
- return 0;
-}
-
-static int QZ_GL_MakeCurrent (_THIS) {
- [ gl_context makeCurrentContext ];
- return 0;
-}
-
-static void QZ_GL_SwapBuffers (_THIS) {
- [ gl_context flushBuffer ];
-}
-
-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 *dstrect) {
-
- OSErr err;
- CodecFlags flags;
-
- if (dstrect->x != 0 || dstrect->y != 0) {
-
- SDL_SetError ("Need a dstrect at (0,0)");
- return -1;
- }
-
- if (dstrect->w != yuv_width || dstrect->h != yuv_height) {
-
- Fixed scale_x, scale_y;
-
- scale_x = FixDiv ( Long2Fix (dstrect->w), Long2Fix (overlay->w) );
- scale_y = FixDiv ( Long2Fix (dstrect->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 = dstrect->w;
- yuv_height = dstrect->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();
-
- free (overlay->hwfuncs);
- free (overlay->pitches);
- free (overlay->pixels);
-
- if (SDL_VideoSurface->flags & SDL_FULLSCREEN) {
- [ qz_window close ];
- qz_window = nil;
- }
-
- free (yuv_matrix);
- DisposeHandle ((Handle)yuv_idh);
-}
-
-#include "SDL_yuvfuncs.h"
-
-/* 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)
-
-static 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) 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:[ [ SDL_QuartzWindowView 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*) 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**) malloc (sizeof(*pixels) * 3);
- pitches = (Uint16*) malloc (sizeof(*pitches) * 3);
- if (pixels == NULL || pitches == NULL) {
- SDL_OutOfMemory();
- return NULL;
- }
-
- yuv_pixmap = (PlanarPixmapInfoYUV420*)
- 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 = 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;
-}
--- a/src/video/quartz/SDL_QuartzWM.m Wed Dec 31 04:48:38 2003 +0000
+++ b/src/video/quartz/SDL_QuartzWM.m Sun Jan 04 14:55:35 2004 +0000
@@ -1,6 +1,6 @@
/*
SDL - Simple DirectMedia Layer
- Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
+ 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
@@ -20,20 +20,21 @@
slouken@libsdl.org
*/
-static void QZ_ChangeGrabState (_THIS, int action);
+#include "SDL_QuartzVideo.h"
+
struct WMcursor {
Cursor curs;
};
-static void QZ_FreeWMCursor (_THIS, WMcursor *cursor) {
+void QZ_FreeWMCursor (_THIS, WMcursor *cursor) {
if ( cursor != NULL )
free (cursor);
}
/* Use the Carbon cursor routines for now */
-static WMcursor* QZ_CreateWMCursor (_THIS, Uint8 *data, Uint8 *mask,
+WMcursor* QZ_CreateWMCursor (_THIS, Uint8 *data, Uint8 *mask,
int w, int h, int hot_x, int hot_y) {
WMcursor *cursor;
int row, bytes;
@@ -68,26 +69,34 @@
return(cursor);
}
-static int QZ_ShowWMCursor (_THIS, WMcursor *cursor) {
+void QZ_ShowMouse (_THIS) {
+ if (!cursor_visible) {
+ [ NSCursor unhide ];
+ cursor_visible = YES;
+ }
+}
+
+void QZ_HideMouse (_THIS) {
+ if (cursor_visible) {
+ [ NSCursor hide ];
+ cursor_visible = NO;
+ }
+}
+
+int QZ_ShowWMCursor (_THIS, WMcursor *cursor) {
if ( cursor == NULL) {
- if ( cursor_visible ) {
- if (!cursor_hidden) {
- HideCursor ();
- cursor_hidden = YES;
- }
- cursor_visible = NO;
+ if ( cursor_should_be_visible ) {
+ QZ_HideMouse (this);
+ cursor_should_be_visible = NO;
QZ_ChangeGrabState (this, QZ_HIDECURSOR);
}
}
else {
SetCursor(&cursor->curs);
- if ( ! cursor_visible ) {
- if (cursor_hidden) {
- ShowCursor ();
- cursor_hidden = NO;
- }
- cursor_visible = YES;
+ if ( ! cursor_should_be_visible ) {
+ QZ_ShowMouse (this);
+ cursor_should_be_visible = YES;
QZ_ChangeGrabState (this, QZ_SHOWCURSOR);
}
}
@@ -104,20 +113,20 @@
*/
/* Convert Cocoa screen coordinate to Cocoa window coordinate */
-static void QZ_PrivateGlobalToLocal (_THIS, NSPoint *p) {
+void QZ_PrivateGlobalToLocal (_THIS, NSPoint *p) {
*p = [ qz_window convertScreenToBase:*p ];
}
/* Convert Cocoa window coordinate to Cocoa screen coordinate */
-static void QZ_PrivateLocalToGlobal (_THIS, NSPoint *p) {
+void QZ_PrivateLocalToGlobal (_THIS, NSPoint *p) {
*p = [ qz_window convertBaseToScreen:*p ];
}
/* Convert SDL coordinate to Cocoa coordinate */
-static void QZ_PrivateSDLToCocoa (_THIS, NSPoint *p) {
+void QZ_PrivateSDLToCocoa (_THIS, NSPoint *p) {
if ( CGDisplayIsCaptured (display_id) ) { /* capture signals fullscreen */
@@ -134,7 +143,7 @@
}
/* Convert Cocoa coordinate to SDL coordinate */
-static void QZ_PrivateCocoaToSDL (_THIS, NSPoint *p) {
+void QZ_PrivateCocoaToSDL (_THIS, NSPoint *p) {
if ( CGDisplayIsCaptured (display_id) ) { /* capture signals fullscreen */
@@ -151,7 +160,7 @@
}
/* Convert SDL coordinate to window server (CoreGraphics) coordinate */
-static CGPoint QZ_PrivateSDLToCG (_THIS, NSPoint *p) {
+CGPoint QZ_PrivateSDLToCG (_THIS, NSPoint *p) {
CGPoint cgp;
@@ -174,7 +183,7 @@
#if 0 /* Dead code */
/* Convert window server (CoreGraphics) coordinate to SDL coordinate */
-static void QZ_PrivateCGToSDL (_THIS, NSPoint *p) {
+void QZ_PrivateCGToSDL (_THIS, NSPoint *p) {
if ( ! CGDisplayIsCaptured (display_id) ) { /* not captured => not fullscreen => local coord */
@@ -190,7 +199,7 @@
}
#endif /* Dead code */
-static void QZ_PrivateWarpCursor (_THIS, int x, int y) {
+void QZ_PrivateWarpCursor (_THIS, int x, int y) {
NSPoint p;
CGPoint cgp;
@@ -203,10 +212,10 @@
CGWarpMouseCursorPosition (cgp);
}
-static void QZ_WarpWMCursor (_THIS, Uint16 x, Uint16 y) {
+void QZ_WarpWMCursor (_THIS, Uint16 x, Uint16 y) {
/* Only allow warping when in foreground */
- if ( ! in_foreground )
+ if ( ! [ NSApp isActive ] )
return;
/* Do the actual warp */
@@ -216,10 +225,10 @@
SDL_PrivateMouseMotion (0, 0, x, y);
}
-static void QZ_MoveWMCursor (_THIS, int x, int y) { }
-static void QZ_CheckMouseMode (_THIS) { }
+void QZ_MoveWMCursor (_THIS, int x, int y) { }
+void QZ_CheckMouseMode (_THIS) { }
-static void QZ_SetCaption (_THIS, const char *title, const char *icon) {
+void QZ_SetCaption (_THIS, const char *title, const char *icon) {
if ( qz_window != nil ) {
NSString *string;
@@ -236,7 +245,7 @@
}
}
-static void QZ_SetIcon (_THIS, SDL_Surface *icon, Uint8 *mask)
+void QZ_SetIcon (_THIS, SDL_Surface *icon, Uint8 *mask)
{
NSBitmapImageRep *imgrep;
NSImage *img;
@@ -305,7 +314,7 @@
[pool release];
}
-static int QZ_IconifyWindow (_THIS) {
+int QZ_IconifyWindow (_THIS) {
if ( ! [ qz_window isMiniaturized ] ) {
[ qz_window miniaturize:nil ];
@@ -318,12 +327,12 @@
}
/*
-static int QZ_GetWMInfo (_THIS, SDL_SysWMinfo *info) {
+int QZ_GetWMInfo (_THIS, SDL_SysWMinfo *info) {
info->nsWindowPtr = qz_window;
return 0;
}*/
-static void QZ_ChangeGrabState (_THIS, int action) {
+void QZ_ChangeGrabState (_THIS, int action) {
/*
Figure out what the next state should be based on the action.
@@ -331,7 +340,7 @@
*/
if ( grab_state == QZ_UNGRABBED ) {
if ( action == QZ_ENABLE_GRAB ) {
- if ( cursor_visible )
+ if ( cursor_should_be_visible )
grab_state = QZ_VISIBLE_GRAB;
else
grab_state = QZ_INVISIBLE_GRAB;
@@ -369,7 +378,7 @@
}
}
-static SDL_GrabMode QZ_GrabInput (_THIS, SDL_GrabMode grab_mode) {
+SDL_GrabMode QZ_GrabInput (_THIS, SDL_GrabMode grab_mode) {
int doGrab = grab_mode & SDL_GRAB_ON;
/*int fullscreen = grab_mode & SDL_GRAB_FULLSCREEN;*/
@@ -396,81 +405,3 @@
return current_grab_mode;
}
-
-/* Resize icon, BMP format */
-static unsigned char QZ_ResizeIcon[] = {
- 0x42,0x4d,0x31,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x28,0x00,
- 0x00,0x00,0x0d,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x01,0x00,0x18,0x00,0x00,0x00,
- 0x00,0x00,0xfb,0x01,0x00,0x00,0x13,0x0b,0x00,0x00,0x13,0x0b,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
- 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
- 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0b,0xff,0xff,
- 0xff,0xda,0xda,0xda,0x87,0x87,0x87,0xe8,0xe8,0xe8,0xff,0xff,0xff,0xda,0xda,0xda,
- 0x87,0x87,0x87,0xe8,0xe8,0xe8,0xff,0xff,0xff,0xda,0xda,0xda,0x87,0x87,0x87,0xe8,
- 0xe8,0xe8,0xff,0xff,0xff,0x0b,0xff,0xff,0xff,0xff,0xff,0xff,0xda,0xda,0xda,0x87,
- 0x87,0x87,0xe8,0xe8,0xe8,0xff,0xff,0xff,0xda,0xda,0xda,0x87,0x87,0x87,0xe8,0xe8,
- 0xe8,0xff,0xff,0xff,0xda,0xda,0xda,0x87,0x87,0x87,0xff,0xff,0xff,0x0b,0xff,0xff,
- 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xd5,0xd5,0xd5,0x87,0x87,0x87,0xe8,0xe8,0xe8,
- 0xff,0xff,0xff,0xda,0xda,0xda,0x87,0x87,0x87,0xe8,0xe8,0xe8,0xff,0xff,0xff,0xda,
- 0xda,0xda,0xff,0xff,0xff,0x0b,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
- 0xff,0xff,0xd7,0xd7,0xd7,0x87,0x87,0x87,0xe8,0xe8,0xe8,0xff,0xff,0xff,0xda,0xda,
- 0xda,0x87,0x87,0x87,0xe8,0xe8,0xe8,0xff,0xff,0xff,0xff,0xff,0xff,0x0b,0xff,0xff,
- 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xd7,0xd7,0xd7,
- 0x87,0x87,0x87,0xe8,0xe8,0xe8,0xff,0xff,0xff,0xda,0xda,0xda,0x87,0x87,0x87,0xe8,
- 0xe8,0xe8,0xff,0xff,0xff,0x0b,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
- 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xd7,0xd7,0xd7,0x87,0x87,0x87,0xe8,0xe8,
- 0xe8,0xff,0xff,0xff,0xdc,0xdc,0xdc,0x87,0x87,0x87,0xff,0xff,0xff,0x0b,0xff,0xff,
- 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
- 0xff,0xff,0xff,0xd9,0xd9,0xd9,0x87,0x87,0x87,0xe8,0xe8,0xe8,0xff,0xff,0xff,0xdc,
- 0xdc,0xdc,0xff,0xff,0xff,0x0b,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
- 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdb,0xdb,
- 0xdb,0x87,0x87,0x87,0xe8,0xe8,0xe8,0xff,0xff,0xff,0xff,0xff,0xff,0x0b,0xff,0xff,
- 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
- 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdb,0xdb,0xdb,0x87,0x87,0x87,0xe8,
- 0xe8,0xe8,0xff,0xff,0xff,0x0b,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
- 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
- 0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0x87,0x87,0x87,0xff,0xff,0xff,0x0b,0xff,0xff,
- 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
- 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdc,
- 0xdc,0xdc,0xff,0xff,0xff,0x0b,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
- 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
- 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0b
-};
-
-static void QZ_DrawResizeIcon (_THIS, RgnHandle dirtyRegion) {
-
- /* Check if we should draw the resize icon */
- if (SDL_VideoSurface->flags & SDL_RESIZABLE) {
-
- Rect icon;
- SetRect (&icon, SDL_VideoSurface->w - 13, SDL_VideoSurface->h - 13,
- SDL_VideoSurface->w, SDL_VideoSurface->h);
-
- if (RectInRgn (&icon, dirtyRegion)) {
-
- SDL_Rect icon_rect;
-
- /* Create the icon image */
- if (resize_icon == NULL) {
-
- SDL_RWops *rw;
- SDL_Surface *tmp;
-
- rw = SDL_RWFromMem (QZ_ResizeIcon, sizeof(QZ_ResizeIcon));
- tmp = SDL_LoadBMP_RW (rw, SDL_TRUE);
-
- resize_icon = SDL_ConvertSurface (tmp, SDL_VideoSurface->format, SDL_SRCCOLORKEY);
- SDL_SetColorKey (resize_icon, SDL_SRCCOLORKEY, 0xFFFFFF);
-
- SDL_FreeSurface (tmp);
- }
-
- icon_rect.x = SDL_VideoSurface->w - 13;
- icon_rect.y = SDL_VideoSurface->h - 13;
- icon_rect.w = 13;
- icon_rect.h = 13;
-
- SDL_BlitSurface (resize_icon, NULL, SDL_VideoSurface, &icon_rect);
- }
- }
-}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/video/quartz/SDL_QuartzWindow.h Sun Jan 04 14:55:35 2004 +0000
@@ -0,0 +1,38 @@
+/*
+ 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
+*/
+
+/* 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
+
--- a/src/video/quartz/SDL_QuartzWindow.m Wed Dec 31 04:48:38 2003 +0000
+++ b/src/video/quartz/SDL_QuartzWindow.m Sun Jan 04 14:55:35 2004 +0000
@@ -1,3 +1,27 @@
+/*
+ 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_QuartzVideo.h"
+#include "SDL_QuartzWindow.h"
/*
This function makes the *SDL region* of the window 100% opaque.
@@ -25,18 +49,6 @@
}
}
-/* 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
-
@implementation SDL_QuartzWindow
/* we override these methods to fix the miniaturize animation/dock icon bug */
@@ -186,12 +198,6 @@
@end
-/* Delegate for our NSWindow to send SDLQuit() on close */
-@interface SDL_QuartzWindowDelegate : NSObject
-{}
-- (BOOL)windowShouldClose:(id)sender;
-@end
-
@implementation SDL_QuartzWindowDelegate
- (BOOL)windowShouldClose:(id)sender
{
@@ -199,11 +205,3 @@
return NO;
}
@end
-
-/* Subclass of NSQuickDrawView for the window's subview */
-@interface SDL_QuartzWindowView : NSQuickDrawView
-{}
-@end
-
-@implementation SDL_QuartzWindowView
-@end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/video/quartz/SDL_QuartzYUV.m Sun Jan 04 14:55:35 2004 +0000
@@ -0,0 +1,327 @@
+/*
+ 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_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 *dstrect) {
+
+ OSErr err;
+ CodecFlags flags;
+
+ if (dstrect->x != 0 || dstrect->y != 0) {
+
+ SDL_SetError ("Need a dstrect at (0,0)");
+ return -1;
+ }
+
+ if (dstrect->w != yuv_width || dstrect->h != yuv_height) {
+
+ Fixed scale_x, scale_y;
+
+ scale_x = FixDiv ( Long2Fix (dstrect->w), Long2Fix (overlay->w) );
+ scale_y = FixDiv ( Long2Fix (dstrect->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 = dstrect->w;
+ yuv_height = dstrect->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();
+
+ free (overlay->hwfuncs);
+ free (overlay->pitches);
+ free (overlay->pixels);
+
+ if (SDL_VideoSurface->flags & SDL_FULLSCREEN) {
+ [ qz_window close ];
+ qz_window = nil;
+ }
+
+ 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) 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*) 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**) malloc (sizeof(*pixels) * 3);
+ pitches = (Uint16*) malloc (sizeof(*pitches) * 3);
+ if (pixels == NULL || pitches == NULL) {
+ SDL_OutOfMemory();
+ return NULL;
+ }
+
+ yuv_pixmap = (PlanarPixmapInfoYUV420*)
+ 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 = 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;
+}