SDL_QuartzVideo.h
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:10k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.     SDL - Simple DirectMedia Layer
  3.     Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002  Sam Lantinga
  4.     This library is free software; you can redistribute it and/or
  5.     modify it under the terms of the GNU Library General Public
  6.     License as published by the Free Software Foundation; either
  7.     version 2 of the License, or (at your option) any later version.
  8.     This library is distributed in the hope that it will be useful,
  9.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11.     Library General Public License for more details.
  12.     You should have received a copy of the GNU Library General Public
  13.     License along with this library; if not, write to the Free
  14.     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  15.     Sam Lantinga
  16.     slouken@libsdl.org
  17. */
  18. /*
  19.     @file   SDL_QuartzVideo.h
  20.     @author Darrell Walisser
  21.     
  22.     @abstract SDL video driver for MacOS X.
  23.     
  24.     @discussion
  25.     
  26.     TODO
  27.         - Hardware Cursor support with NSCursor instead of Carbon
  28.         - Keyboard repeat/mouse speed adjust (if needed)
  29.         - Multiple monitor support (currently only main display)
  30.         - Accelerated blitting support
  31.         - Set the window icon (dock icon when API is available)
  32.         - Fix white OpenGL window on minimize
  33.         - Find out what events should be sent/ignored if window is mimimized
  34.         - Find a better way to deal with resolution/depth switch while app is running
  35.         - Resizeable windows
  36.         - Check accuracy of QZ_SetGamma()
  37.     Problems:
  38.         - OGL not working in full screen with software renderer
  39.         - SetColors sets palette correctly but clears framebuffer
  40.         - Crash in CG after several mode switches
  41.         - Retained windows don't draw their title bar quite right (OS Bug) (not using retained windows)
  42.         - Cursor in 8 bit modes is screwy (might just be Radeon PCI bug)
  43.         - Warping cursor delays mouse events for a fraction of a second,
  44.           there is a hack around this that helps a bit
  45. */
  46. #include <Cocoa/Cocoa.h>
  47. #include <OpenGL/OpenGL.h>
  48. #include <Carbon/Carbon.h>
  49. #include "SDL_video.h"
  50. #include "SDL_error.h"
  51. #include "SDL_timer.h"
  52. #include "SDL_syswm.h"
  53. #include "SDL_sysvideo.h"
  54. #include "SDL_pixels_c.h"
  55. #include "SDL_events_c.h"
  56. /* This is a workaround to directly access NSOpenGLContext's CGL context */
  57. /* We need to do this in order to check for errors */
  58. @interface NSOpenGLContext (CGLContextAccess)
  59. - (CGLContextObj) cglContext;
  60. @end
  61. @implementation NSOpenGLContext (CGLContextAccess)
  62. - (CGLContextObj) cglContext;
  63. {
  64.     return _contextAuxiliary;
  65. }
  66. @end
  67. /* Structure for rez switch gamma fades */
  68. /* We can hide the monitor flicker by setting the gamma tables to 0 */
  69. #define QZ_GAMMA_TABLE_SIZE 256
  70. typedef struct {
  71.     CGGammaValue red[QZ_GAMMA_TABLE_SIZE];
  72.     CGGammaValue green[QZ_GAMMA_TABLE_SIZE];
  73.     CGGammaValue blue[QZ_GAMMA_TABLE_SIZE];
  74. } SDL_QuartzGammaTable;
  75. /* Main driver structure to store required state information */
  76. typedef struct SDL_PrivateVideoData {
  77.     CGDirectDisplayID  display;            /* 0 == main display (only support single display) */
  78.     CFDictionaryRef    mode;               /* current mode of the display */
  79.     CFDictionaryRef    save_mode;          /* original mode of the display */
  80.     CFArrayRef         mode_list;          /* list of available fullscreen modes */
  81.     CGDirectPaletteRef palette;            /* palette of an 8-bit display */
  82.     NSOpenGLContext    *gl_context;        /* object that represents an OpenGL rendering context */
  83.     Uint32             width, height, bpp; /* frequently used data about the display */
  84.     Uint32             flags;              /* flags for mode, for teardown purposes */
  85.     Uint32             video_set;          /* boolean; indicates if video was set correctly */
  86.     Uint32             warp_flag;          /* boolean; notify to event loop that a warp just occured */
  87.     Uint32             warp_ticks;         /* timestamp when the warp occured */
  88.     NSWindow           *window;            /* Cocoa window to implement the SDL window */
  89.     NSQuickDrawView    *view;              /* the window's view; draw 2D into this view */
  90.     
  91. } SDL_PrivateVideoData ;
  92. #define _THIS SDL_VideoDevice *this
  93. #define display_id (this->hidden->display)
  94. #define mode (this->hidden->mode)
  95. #define save_mode (this->hidden->save_mode)
  96. #define mode_list (this->hidden->mode_list)
  97. #define palette (this->hidden->palette)
  98. #define gl_context (this->hidden->gl_context)
  99. #define device_width (this->hidden->width)
  100. #define device_height (this->hidden->height)
  101. #define device_bpp (this->hidden->bpp)
  102. #define mode_flags (this->hidden->flags)
  103. #define qz_window (this->hidden->window)
  104. #define window_view (this->hidden->view)
  105. #define video_set (this->hidden->video_set)
  106. #define warp_ticks (this->hidden->warp_ticks)
  107. #define warp_flag (this->hidden->warp_flag)
  108. /* Obscuring code: maximum number of windows above ours (inclusive) */
  109. #define kMaxWindows 256
  110. /* Some of the Core Graphics Server API for obscuring code */
  111. #define kCGSWindowLevelTop          2147483632
  112. #define kCGSWindowLevelDockIconDrag 500
  113. #define kCGSWindowLevelDockMenu     101
  114. #define kCGSWindowLevelMenuIgnore    21
  115. #define kCGSWindowLevelMenu          20
  116. #define kCGSWindowLevelDockLabel     12
  117. #define kCGSWindowLevelDockIcon      11
  118. #define kCGSWindowLevelDock          10
  119. #define kCGSWindowLevelUtility        3
  120. #define kCGSWindowLevelNormal         0
  121. /* For completeness; We never use these window levels, they are always below us
  122. #define kCGSWindowLevelMBarShadow -20
  123. #define kCGSWindowLevelDesktopPicture -2147483647
  124. #define kCGSWindowLevelDesktop        -2147483648
  125. */
  126. typedef CGError       CGSError;
  127. typedef long       CGSWindowCount;
  128. typedef void *       CGSConnectionID;
  129. typedef int       CGSWindowID;
  130. typedef CGSWindowID*  CGSWindowIDList;
  131. typedef CGWindowLevel CGSWindowLevel;
  132. typedef NSRect        CGSRect;
  133. extern CGSConnectionID _CGSDefaultConnection ();
  134. extern CGSError CGSGetOnScreenWindowList (CGSConnectionID cid, 
  135.                                           CGSConnectionID owner,
  136.                                           CGSWindowCount listCapacity,
  137.                                           CGSWindowIDList list,
  138.                                           CGSWindowCount *listCount);
  139. extern CGSError CGSGetScreenRectForWindow (CGSConnectionID cid,
  140.                                            CGSWindowID wid,
  141.                                            CGSRect *rect);
  142. extern CGWindowLevel CGSGetWindowLevel (CGSConnectionID cid,
  143.                                         CGSWindowID wid,
  144.                                         CGSWindowLevel *level);
  145.                                         
  146. extern CGSError CGSDisplayHWFill (CGDirectDisplayID id, unsigned int x, unsigned int y, 
  147.                       unsigned int w, unsigned int h, unsigned int color);
  148. extern CGSError CGSDisplayCanHWFill (CGDirectDisplayID id);
  149. extern CGSError CGSGetMouseEnabledFlags (CGSConnectionID cid, CGSWindowID wid, int *flags);
  150. /* Bootstrap functions */
  151. static int              QZ_Available ();
  152. static SDL_VideoDevice* QZ_CreateDevice (int device_index);
  153. static void             QZ_DeleteDevice (SDL_VideoDevice *device);
  154. /* Initialization, Query, Setup, and Redrawing functions */
  155. static int          QZ_VideoInit        (_THIS, SDL_PixelFormat *video_format);
  156. static SDL_Rect**   QZ_ListModes        (_THIS, SDL_PixelFormat *format, 
  157.  Uint32 flags);
  158. static void         QZ_UnsetVideoMode   (_THIS);
  159. static SDL_Surface* QZ_SetVideoMode     (_THIS, SDL_Surface *current, 
  160.  int width, int height, int bpp, 
  161.  Uint32 flags);
  162. static int          QZ_ToggleFullScreen (_THIS, int on);
  163. static int          QZ_SetColors        (_THIS, int first_color, 
  164.  int num_colors, SDL_Color *colors);
  165. static void         QZ_DirectUpdate     (_THIS, int num_rects, SDL_Rect *rects);
  166. static void         QZ_UpdateRects      (_THIS, int num_rects, SDL_Rect *rects);
  167. static void         QZ_VideoQuit        (_THIS);
  168. /* Hardware surface functions (for fullscreen mode only) */
  169. static int  QZ_FillHWRect (_THIS, SDL_Surface *dst, SDL_Rect *rect, Uint32 color);
  170. static int  QZ_LockHWSurface(_THIS, SDL_Surface *surface);
  171. static void QZ_UnlockHWSurface(_THIS, SDL_Surface *surface);
  172. static void QZ_FreeHWSurface (_THIS, SDL_Surface *surface);
  173. /* static int  QZ_FlipHWSurface (_THIS, SDL_Surface *surface); */
  174. /* Gamma Functions */
  175. static int QZ_SetGamma     (_THIS, float red, float green, float blue);
  176. static int QZ_GetGamma     (_THIS, float *red, float *green, float *blue);
  177. static int QZ_SetGammaRamp (_THIS, Uint16 *ramp);
  178. static int QZ_GetGammaRamp (_THIS, Uint16 *ramp);
  179. /* OpenGL functions */
  180. static int    QZ_SetupOpenGL (_THIS, int bpp, Uint32 flags);
  181. static void   QZ_TearDownOpenGL (_THIS);
  182. static void*  QZ_GL_GetProcAddress (_THIS, const char *proc);
  183. static int    QZ_GL_GetAttribute   (_THIS, SDL_GLattr attrib, int* value);
  184. static int    QZ_GL_MakeCurrent    (_THIS);
  185. static void   QZ_GL_SwapBuffers    (_THIS);
  186. static int    QZ_GL_LoadLibrary    (_THIS, const char *location);
  187. /* Private function to warp the cursor (used internally) */
  188. static void  QZ_PrivateWarpCursor (_THIS, int x, int y);
  189. /* Cursor and Mouse functions */
  190. static void         QZ_FreeWMCursor     (_THIS, WMcursor *cursor);
  191. static WMcursor*    QZ_CreateWMCursor   (_THIS, Uint8 *data, Uint8 *mask, 
  192.                                           int w, int h, int hot_x, int hot_y);
  193. static int          QZ_ShowWMCursor     (_THIS, WMcursor *cursor);
  194. static void         QZ_WarpWMCursor     (_THIS, Uint16 x, Uint16 y);
  195. static void         QZ_MoveWMCursor     (_THIS, int x, int y);
  196. static void         QZ_CheckMouseMode   (_THIS);
  197. /* Event functions */
  198. static void         QZ_InitOSKeymap     (_THIS);
  199. static void         QZ_PumpEvents       (_THIS);
  200. /* Window Manager functions */
  201. static void QZ_SetCaption    (_THIS, const char *title, const char *icon);
  202. static void QZ_SetIcon       (_THIS, SDL_Surface *icon, Uint8 *mask);
  203. static int  QZ_IconifyWindow (_THIS);
  204. static SDL_GrabMode QZ_GrabInput (_THIS, SDL_GrabMode grab_mode);
  205. /*static int  QZ_GetWMInfo     (_THIS, SDL_SysWMinfo *info);*/