src/video/SDL_sysvideo.h
author Sam Lantinga <slouken@libsdl.org>
Thu, 16 Feb 2006 10:11:48 +0000
changeset 1361 19418e4422cb
parent 1330 450721ad5436
child 1402 d910939febfa
permissions -rw-r--r--
New configure-based build system. Still work in progress, but much improved
     1 /*
     2     SDL - Simple DirectMedia Layer
     3     Copyright (C) 1997-2006 Sam Lantinga
     4 
     5     This library is free software; you can redistribute it and/or
     6     modify it under the terms of the GNU Lesser General Public
     7     License as published by the Free Software Foundation; either
     8     version 2.1 of the License, or (at your option) any later version.
     9 
    10     This library is distributed in the hope that it will be useful,
    11     but WITHOUT ANY WARRANTY; without even the implied warranty of
    12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    13     Lesser General Public License for more details.
    14 
    15     You should have received a copy of the GNU Lesser General Public
    16     License along with this library; if not, write to the Free Software
    17     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
    18 
    19     Sam Lantinga
    20     slouken@libsdl.org
    21 */
    22 
    23 #ifndef _SDL_sysvideo_h
    24 #define _SDL_sysvideo_h
    25 
    26 #include "SDL_mouse.h"
    27 #define SDL_PROTOTYPES_ONLY
    28 #include "SDL_syswm.h"
    29 #undef SDL_PROTOTYPES_ONLY
    30 
    31 /* This file prototypes the video driver implementation.
    32    This is designed to be easily converted to C++ in the future.
    33  */
    34 
    35 /* OpenGL is pretty much available on all Windows systems */
    36 #ifdef WIN32
    37 #include "SDL_windows.h"
    38 #endif
    39 
    40 #if SDL_VIDEO_OPENGL
    41 #ifdef MACOSX
    42 #include <OpenGL/gl.h>  /* OpenGL.framework */
    43 #else
    44 #include <GL/gl.h>
    45 #endif /* MACOSX */
    46 #endif /* SDL_VIDEO_OPENGL */
    47 
    48 /* The SDL video driver */
    49 typedef struct SDL_VideoDevice SDL_VideoDevice;
    50 
    51 /* Define the SDL video driver structure */
    52 #define _THIS	SDL_VideoDevice *_this
    53 #ifndef _STATUS
    54 #define _STATUS	SDL_status *status
    55 #endif
    56 struct SDL_VideoDevice {
    57 	/* * * */
    58 	/* The name of this video driver */
    59 	const char *name;
    60 
    61 	/* * * */
    62 	/* Initialization/Query functions */
    63 
    64 	/* Initialize the native video subsystem, filling 'vformat' with the 
    65 	   "best" display pixel format, returning 0 or -1 if there's an error.
    66 	 */
    67 	int (*VideoInit)(_THIS, SDL_PixelFormat *vformat);
    68 
    69 	/* List the available video modes for the given pixel format, sorted
    70 	   from largest to smallest.
    71 	 */
    72 	SDL_Rect **(*ListModes)(_THIS, SDL_PixelFormat *format, Uint32 flags);
    73 
    74 	/* Set the requested video mode, returning a surface which will be
    75 	   set to the SDL_VideoSurface.  The width and height will already
    76 	   be verified by ListModes(), and the video subsystem is free to
    77 	   set the mode to a supported bit depth different from the one
    78 	   specified -- the desired bpp will be emulated with a shadow
    79 	   surface if necessary.  If a new mode is returned, this function
    80 	   should take care of cleaning up the current mode.
    81 	 */
    82 	SDL_Surface *(*SetVideoMode)(_THIS, SDL_Surface *current,
    83 				int width, int height, int bpp, Uint32 flags);
    84 
    85 	/* Toggle the fullscreen mode */
    86 	int (*ToggleFullScreen)(_THIS, int on);
    87 
    88 	/* This is called after the video mode has been set, to get the
    89 	   initial mouse state.  It should queue events as necessary to
    90 	   properly represent the current mouse focus and position.
    91 	 */
    92 	void (*UpdateMouse)(_THIS);
    93 
    94 	/* Create a YUV video surface (possibly overlay) of the given
    95 	   format.  The hardware should be able to perform at least 2x
    96 	   scaling on display.
    97 	 */
    98 	SDL_Overlay *(*CreateYUVOverlay)(_THIS, int width, int height,
    99 	                                 Uint32 format, SDL_Surface *display);
   100 
   101         /* Sets the color entries { firstcolor .. (firstcolor+ncolors-1) }
   102 	   of the physical palette to those in 'colors'. If the device is
   103 	   using a software palette (SDL_HWPALETTE not set), then the
   104 	   changes are reflected in the logical palette of the screen
   105 	   as well.
   106 	   The return value is 1 if all entries could be set properly
   107 	   or 0 otherwise.
   108 	*/
   109 	int (*SetColors)(_THIS, int firstcolor, int ncolors,
   110 			 SDL_Color *colors);
   111 
   112 	/* This pointer should exist in the native video subsystem and should
   113 	   point to an appropriate update function for the current video mode
   114 	 */
   115 	void (*UpdateRects)(_THIS, int numrects, SDL_Rect *rects);
   116 
   117 	/* Reverse the effects VideoInit() -- called if VideoInit() fails
   118 	   or if the application is shutting down the video subsystem.
   119 	*/
   120 	void (*VideoQuit)(_THIS);
   121 
   122 	/* * * */
   123 	/* Hardware acceleration functions */
   124 
   125 	/* Information about the video hardware */
   126 	SDL_VideoInfo info;
   127 
   128 	/* The pixel format used when SDL_CreateRGBSurface creates SDL_HWSURFACEs with alpha */
   129 	SDL_PixelFormat* displayformatalphapixel;
   130 	
   131 	/* Allocates a surface in video memory */
   132 	int (*AllocHWSurface)(_THIS, SDL_Surface *surface);
   133 
   134 	/* Sets the hardware accelerated blit function, if any, based
   135 	   on the current flags of the surface (colorkey, alpha, etc.)
   136 	 */
   137 	int (*CheckHWBlit)(_THIS, SDL_Surface *src, SDL_Surface *dst);
   138 
   139 	/* Fills a surface rectangle with the given color */
   140 	int (*FillHWRect)(_THIS, SDL_Surface *dst, SDL_Rect *rect, Uint32 color);
   141 
   142 	/* Sets video mem colorkey and accelerated blit function */
   143 	int (*SetHWColorKey)(_THIS, SDL_Surface *surface, Uint32 key);
   144 
   145 	/* Sets per surface hardware alpha value */
   146 	int (*SetHWAlpha)(_THIS, SDL_Surface *surface, Uint8 value);
   147 
   148 	/* Returns a readable/writable surface */
   149 	int (*LockHWSurface)(_THIS, SDL_Surface *surface);
   150 	void (*UnlockHWSurface)(_THIS, SDL_Surface *surface);
   151 
   152 	/* Performs hardware flipping */
   153 	int (*FlipHWSurface)(_THIS, SDL_Surface *surface);
   154 
   155 	/* Frees a previously allocated video surface */
   156 	void (*FreeHWSurface)(_THIS, SDL_Surface *surface);
   157 
   158 	/* * * */
   159 	/* Gamma support */
   160 
   161 	Uint16 *gamma;
   162 
   163 	/* Set the gamma correction directly (emulated with gamma ramps) */
   164 	int (*SetGamma)(_THIS, float red, float green, float blue);
   165 
   166 	/* Get the gamma correction directly (emulated with gamma ramps) */
   167 	int (*GetGamma)(_THIS, float *red, float *green, float *blue);
   168 
   169 	/* Set the gamma ramp */
   170 	int (*SetGammaRamp)(_THIS, Uint16 *ramp);
   171 
   172 	/* Get the gamma ramp */
   173 	int (*GetGammaRamp)(_THIS, Uint16 *ramp);
   174 
   175 	/* * * */
   176 	/* OpenGL support */
   177 
   178 	/* Sets the dll to use for OpenGL and loads it */
   179 	int (*GL_LoadLibrary)(_THIS, const char *path);
   180 
   181 	/* Retrieves the address of a function in the gl library */
   182 	void* (*GL_GetProcAddress)(_THIS, const char *proc);
   183 
   184         /* Get attribute information from the windowing system. */
   185         int (*GL_GetAttribute)(_THIS, SDL_GLattr attrib, int* value);
   186 
   187         /* Make the context associated with this driver current */
   188         int (*GL_MakeCurrent)(_THIS);
   189 
   190 	/* Swap the current buffers in double buffer mode. */
   191 	void (*GL_SwapBuffers)(_THIS);
   192 
   193   	/* OpenGL functions for SDL_OPENGLBLIT */
   194 #if SDL_VIDEO_OPENGL
   195 #ifndef WIN32
   196 #define WINAPI
   197 #endif
   198 #define SDL_PROC(ret,func,params) ret (WINAPI *func) params;
   199 #include "SDL_glfuncs.h"
   200 #undef SDL_PROC
   201 
   202 	/* Texture id */
   203 	GLuint texture;
   204 #endif
   205 	int is_32bit;
   206  
   207 	/* * * */
   208 	/* Window manager functions */
   209 
   210 	/* Set the title and icon text */
   211 	void (*SetCaption)(_THIS, const char *title, const char *icon);
   212 
   213 	/* Set the window icon image */
   214 	void (*SetIcon)(_THIS, SDL_Surface *icon, Uint8 *mask);
   215 
   216 	/* Iconify the window.
   217 	   This function returns 1 if there is a window manager and the
   218 	   window was actually iconified, it returns 0 otherwise.
   219 	*/
   220 	int (*IconifyWindow)(_THIS);
   221 
   222 	/* Grab or ungrab keyboard and mouse input */
   223 	SDL_GrabMode (*GrabInput)(_THIS, SDL_GrabMode mode);
   224 
   225 	/* Get some platform dependent window information */
   226 	int (*GetWMInfo)(_THIS, SDL_SysWMinfo *info);
   227 
   228 	/* * * */
   229 	/* Cursor manager functions */
   230 
   231 	/* Free a window manager cursor
   232 	   This function can be NULL if CreateWMCursor is also NULL.
   233 	 */
   234 	void (*FreeWMCursor)(_THIS, WMcursor *cursor);
   235 
   236 	/* If not NULL, create a black/white window manager cursor */
   237 	WMcursor *(*CreateWMCursor)(_THIS,
   238 		Uint8 *data, Uint8 *mask, int w, int h, int hot_x, int hot_y);
   239 
   240 	/* Show the specified cursor, or hide if cursor is NULL */
   241 	int (*ShowWMCursor)(_THIS, WMcursor *cursor);
   242 
   243 	/* Warp the window manager cursor to (x,y)
   244 	   If NULL, a mouse motion event is posted internally.
   245 	 */
   246 	void (*WarpWMCursor)(_THIS, Uint16 x, Uint16 y);
   247 
   248 	/* If not NULL, this is called when a mouse motion event occurs */
   249 	void (*MoveWMCursor)(_THIS, int x, int y);
   250 
   251 	/* Determine whether the mouse should be in relative mode or not.
   252 	   This function is called when the input grab state or cursor
   253 	   visibility state changes.
   254 	   If the cursor is not visible, and the input is grabbed, the
   255 	   driver can place the mouse in relative mode, which may result
   256 	   in higher accuracy sampling of the pointer motion.
   257 	*/
   258 	void (*CheckMouseMode)(_THIS);
   259 
   260 	/* * * */
   261 	/* Event manager functions */
   262 
   263 	/* Initialize keyboard mapping for this driver */
   264 	void (*InitOSKeymap)(_THIS);
   265 
   266 	/* Handle any queued OS events */
   267 	void (*PumpEvents)(_THIS);
   268 
   269 	/* * * */
   270 	/* Data common to all drivers */
   271 	SDL_Surface *screen;
   272 	SDL_Surface *shadow;
   273 	SDL_Surface *visible;
   274         SDL_Palette *physpal;	/* physical palette, if != logical palette */
   275         SDL_Color *gammacols;	/* gamma-corrected colours, or NULL */
   276 	char *wm_title;
   277 	char *wm_icon;
   278 	int offset_x;
   279 	int offset_y;
   280 	SDL_GrabMode input_grab;
   281 
   282 	/* Driver information flags */
   283 	int handles_any_size;	/* Driver handles any size video mode */
   284 
   285 	/* * * */
   286 	/* Data used by the GL drivers */
   287 	struct {
   288 		int red_size;
   289 		int green_size;
   290 		int blue_size;
   291 		int alpha_size;
   292 		int depth_size;
   293 		int buffer_size;
   294 		int stencil_size;
   295 		int double_buffer;
   296 		int accum_red_size;
   297 		int accum_green_size;
   298 		int accum_blue_size;
   299 		int accum_alpha_size;
   300 		int stereo;
   301 		int multisamplebuffers;
   302 		int multisamplesamples;
   303 		int driver_loaded;
   304 		char driver_path[256];
   305 		void* dll_handle;
   306 	} gl_config;
   307 
   308 	/* * * */
   309 	/* Data private to this driver */
   310 	struct SDL_PrivateVideoData *hidden;
   311 	struct SDL_PrivateGLData *gl_data;
   312 
   313 	/* * * */
   314 	/* The function used to dispose of this structure */
   315 	void (*free)(_THIS);
   316 };
   317 #undef _THIS
   318 
   319 typedef struct VideoBootStrap {
   320 	const char *name;
   321 	const char *desc;
   322 	int (*available)(void);
   323 	SDL_VideoDevice *(*create)(int devindex);
   324 } VideoBootStrap;
   325 
   326 #if SDL_VIDEO_DRIVER_QUARTZ
   327 extern VideoBootStrap QZ_bootstrap;
   328 #endif
   329 #if SDL_VIDEO_DRIVER_X11
   330 extern VideoBootStrap X11_bootstrap;
   331 #endif
   332 #if SDL_VIDEO_DRIVER_DGA
   333 extern VideoBootStrap DGA_bootstrap;
   334 #endif
   335 #if SDL_VIDEO_DRIVER_NANOX
   336 extern VideoBootStrap NX_bootstrap;
   337 #endif
   338 #if SDL_VIDEO_DRIVER_IPOD
   339 extern VideoBootStrap iPod_bootstrap;
   340 #endif
   341 #if SDL_VIDEO_DRIVER_QTOPIA
   342 extern VideoBootStrap Qtopia_bootstrap;
   343 #endif
   344 #if SDL_VIDEO_DRIVER_WSCONS
   345 extern VideoBootStrap WSCONS_bootstrap;
   346 #endif
   347 #if SDL_VIDEO_DRIVER_FBCON
   348 extern VideoBootStrap FBCON_bootstrap;
   349 #endif
   350 #if SDL_VIDEO_DRIVER_DIRECTFB
   351 extern VideoBootStrap DirectFB_bootstrap;
   352 #endif
   353 #if SDL_VIDEO_DRIVER_PS2GS
   354 extern VideoBootStrap PS2GS_bootstrap;
   355 #endif
   356 #if SDL_VIDEO_DRIVER_GGI
   357 extern VideoBootStrap GGI_bootstrap;
   358 #endif
   359 #if SDL_VIDEO_DRIVER_VGL
   360 extern VideoBootStrap VGL_bootstrap;
   361 #endif
   362 #if SDL_VIDEO_DRIVER_SVGALIB
   363 extern VideoBootStrap SVGALIB_bootstrap;
   364 #endif
   365 #if SDL_VIDEO_DRIVER_GAPI
   366 extern VideoBootStrap GAPI_bootstrap;
   367 #endif
   368 #if SDL_VIDEO_DRIVER_WINDIB
   369 extern VideoBootStrap WINDIB_bootstrap;
   370 #endif
   371 #if SDL_VIDEO_DRIVER_DDRAW
   372 extern VideoBootStrap DIRECTX_bootstrap;
   373 #endif
   374 #if SDL_VIDEO_DRIVER_BWINDOW
   375 extern VideoBootStrap BWINDOW_bootstrap;
   376 #endif
   377 #if SDL_VIDEO_DRIVER_TOOLBOX
   378 extern VideoBootStrap TOOLBOX_bootstrap;
   379 #endif
   380 #if SDL_VIDEO_DRIVER_DRAWSPROCKET
   381 extern VideoBootStrap DSp_bootstrap;
   382 #endif
   383 #if SDL_VIDEO_DRIVER_CYBERGRAPHICS
   384 extern VideoBootStrap CGX_bootstrap;
   385 #endif
   386 #if SDL_VIDEO_DRIVER_PHOTON
   387 extern VideoBootStrap ph_bootstrap;
   388 #endif
   389 #if SDL_VIDEO_DRIVER_EPOC
   390 extern VideoBootStrap EPOC_bootstrap;
   391 #endif
   392 #if SDL_VIDEO_DRIVER_XBIOS
   393 extern VideoBootStrap XBIOS_bootstrap;
   394 #endif
   395 #if SDL_VIDEO_DRIVER_GEM
   396 extern VideoBootStrap GEM_bootstrap;
   397 #endif
   398 #if SDL_VIDEO_DRIVER_PICOGUI
   399 extern VideoBootStrap PG_bootstrap;
   400 #endif
   401 #if SDL_VIDEO_DRIVER_DC
   402 extern VideoBootStrap DC_bootstrap;
   403 #endif
   404 #if SDL_VIDEO_DRIVER_RISCOS
   405 extern VideoBootStrap RISCOS_bootstrap;
   406 #endif
   407 #if SDL_VIDEO_DRIVER_OS2FS
   408 extern VideoBootStrap OS2FSLib_bootstrap;
   409 #endif
   410 #if SDL_VIDEO_DRIVER_AALIB
   411 extern VideoBootStrap AALIB_bootstrap;
   412 #endif
   413 #if SDL_VIDEO_DRIVER_DUMMY
   414 extern VideoBootStrap DUMMY_bootstrap;
   415 #endif
   416 
   417 /* This is the current video device */
   418 extern SDL_VideoDevice *current_video;
   419 
   420 #define SDL_VideoSurface	(current_video->screen)
   421 #define SDL_ShadowSurface	(current_video->shadow)
   422 #define SDL_PublicSurface	(current_video->visible)
   423 
   424 #endif /* _SDL_sysvideo_h */