src/video/SDL_sysvideo.h
author Sam Lantinga <slouken@libsdl.org>
Wed, 01 Feb 2006 06:32:25 +0000
changeset 1312 c9b51268668f
parent 1251 86d0d01290ea
child 1330 450721ad5436
permissions -rw-r--r--
Updated copyright information and removed rcs id lines (problematic in branch merges)
I batch edited these files, so please let me know if I've accidentally removed anybody's
credit here.
     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 #ifndef _WIN32_WCE
    38 #define HAVE_OPENGL
    39 #endif
    40 #define WIN32_LEAN_AND_MEAN
    41 #include <windows.h>
    42 #endif
    43 
    44 #ifdef HAVE_OPENGL
    45 #ifdef MACOSX
    46 #include <OpenGL/gl.h>  /* OpenGL.framework */
    47 #else
    48 #include <GL/gl.h>
    49 #endif /* MACOSX */
    50 #endif /* HAVE_OPENGL */
    51 
    52 /* The SDL video driver */
    53 typedef struct SDL_VideoDevice SDL_VideoDevice;
    54 
    55 /* Define the SDL video driver structure */
    56 #define _THIS	SDL_VideoDevice *_this
    57 #ifndef _STATUS
    58 #define _STATUS	SDL_status *status
    59 #endif
    60 struct SDL_VideoDevice {
    61 	/* * * */
    62 	/* The name of this video driver */
    63 	const char *name;
    64 
    65 	/* * * */
    66 	/* Initialization/Query functions */
    67 
    68 	/* Initialize the native video subsystem, filling 'vformat' with the 
    69 	   "best" display pixel format, returning 0 or -1 if there's an error.
    70 	 */
    71 	int (*VideoInit)(_THIS, SDL_PixelFormat *vformat);
    72 
    73 	/* List the available video modes for the given pixel format, sorted
    74 	   from largest to smallest.
    75 	 */
    76 	SDL_Rect **(*ListModes)(_THIS, SDL_PixelFormat *format, Uint32 flags);
    77 
    78 	/* Set the requested video mode, returning a surface which will be
    79 	   set to the SDL_VideoSurface.  The width and height will already
    80 	   be verified by ListModes(), and the video subsystem is free to
    81 	   set the mode to a supported bit depth different from the one
    82 	   specified -- the desired bpp will be emulated with a shadow
    83 	   surface if necessary.  If a new mode is returned, this function
    84 	   should take care of cleaning up the current mode.
    85 	 */
    86 	SDL_Surface *(*SetVideoMode)(_THIS, SDL_Surface *current,
    87 				int width, int height, int bpp, Uint32 flags);
    88 
    89 	/* Toggle the fullscreen mode */
    90 	int (*ToggleFullScreen)(_THIS, int on);
    91 
    92 	/* This is called after the video mode has been set, to get the
    93 	   initial mouse state.  It should queue events as necessary to
    94 	   properly represent the current mouse focus and position.
    95 	 */
    96 	void (*UpdateMouse)(_THIS);
    97 
    98 	/* Create a YUV video surface (possibly overlay) of the given
    99 	   format.  The hardware should be able to perform at least 2x
   100 	   scaling on display.
   101 	 */
   102 	SDL_Overlay *(*CreateYUVOverlay)(_THIS, int width, int height,
   103 	                                 Uint32 format, SDL_Surface *display);
   104 
   105         /* Sets the color entries { firstcolor .. (firstcolor+ncolors-1) }
   106 	   of the physical palette to those in 'colors'. If the device is
   107 	   using a software palette (SDL_HWPALETTE not set), then the
   108 	   changes are reflected in the logical palette of the screen
   109 	   as well.
   110 	   The return value is 1 if all entries could be set properly
   111 	   or 0 otherwise.
   112 	*/
   113 	int (*SetColors)(_THIS, int firstcolor, int ncolors,
   114 			 SDL_Color *colors);
   115 
   116 	/* This pointer should exist in the native video subsystem and should
   117 	   point to an appropriate update function for the current video mode
   118 	 */
   119 	void (*UpdateRects)(_THIS, int numrects, SDL_Rect *rects);
   120 
   121 	/* Reverse the effects VideoInit() -- called if VideoInit() fails
   122 	   or if the application is shutting down the video subsystem.
   123 	*/
   124 	void (*VideoQuit)(_THIS);
   125 
   126 	/* * * */
   127 	/* Hardware acceleration functions */
   128 
   129 	/* Information about the video hardware */
   130 	SDL_VideoInfo info;
   131 
   132 	/* The pixel format used when SDL_CreateRGBSurface creates SDL_HWSURFACEs with alpha */
   133 	SDL_PixelFormat* displayformatalphapixel;
   134 	
   135 	/* Allocates a surface in video memory */
   136 	int (*AllocHWSurface)(_THIS, SDL_Surface *surface);
   137 
   138 	/* Sets the hardware accelerated blit function, if any, based
   139 	   on the current flags of the surface (colorkey, alpha, etc.)
   140 	 */
   141 	int (*CheckHWBlit)(_THIS, SDL_Surface *src, SDL_Surface *dst);
   142 
   143 	/* Fills a surface rectangle with the given color */
   144 	int (*FillHWRect)(_THIS, SDL_Surface *dst, SDL_Rect *rect, Uint32 color);
   145 
   146 	/* Sets video mem colorkey and accelerated blit function */
   147 	int (*SetHWColorKey)(_THIS, SDL_Surface *surface, Uint32 key);
   148 
   149 	/* Sets per surface hardware alpha value */
   150 	int (*SetHWAlpha)(_THIS, SDL_Surface *surface, Uint8 value);
   151 
   152 	/* Returns a readable/writable surface */
   153 	int (*LockHWSurface)(_THIS, SDL_Surface *surface);
   154 	void (*UnlockHWSurface)(_THIS, SDL_Surface *surface);
   155 
   156 	/* Performs hardware flipping */
   157 	int (*FlipHWSurface)(_THIS, SDL_Surface *surface);
   158 
   159 	/* Frees a previously allocated video surface */
   160 	void (*FreeHWSurface)(_THIS, SDL_Surface *surface);
   161 
   162 	/* * * */
   163 	/* Gamma support */
   164 
   165 	Uint16 *gamma;
   166 
   167 	/* Set the gamma correction directly (emulated with gamma ramps) */
   168 	int (*SetGamma)(_THIS, float red, float green, float blue);
   169 
   170 	/* Get the gamma correction directly (emulated with gamma ramps) */
   171 	int (*GetGamma)(_THIS, float *red, float *green, float *blue);
   172 
   173 	/* Set the gamma ramp */
   174 	int (*SetGammaRamp)(_THIS, Uint16 *ramp);
   175 
   176 	/* Get the gamma ramp */
   177 	int (*GetGammaRamp)(_THIS, Uint16 *ramp);
   178 
   179 	/* * * */
   180 	/* OpenGL support */
   181 
   182 	/* Sets the dll to use for OpenGL and loads it */
   183 	int (*GL_LoadLibrary)(_THIS, const char *path);
   184 
   185 	/* Retrieves the address of a function in the gl library */
   186 	void* (*GL_GetProcAddress)(_THIS, const char *proc);
   187 
   188         /* Get attribute information from the windowing system. */
   189         int (*GL_GetAttribute)(_THIS, SDL_GLattr attrib, int* value);
   190 
   191         /* Make the context associated with this driver current */
   192         int (*GL_MakeCurrent)(_THIS);
   193 
   194 	/* Swap the current buffers in double buffer mode. */
   195 	void (*GL_SwapBuffers)(_THIS);
   196 
   197   	/* OpenGL functions for SDL_OPENGLBLIT */
   198 #ifdef HAVE_OPENGL
   199 #ifndef WIN32
   200 #define WINAPI
   201 #endif
   202 #define SDL_PROC(ret,func,params) ret (WINAPI *func) params;
   203 #include "SDL_glfuncs.h"
   204 #undef SDL_PROC
   205 
   206 	/* Texture id */
   207 	GLuint texture;
   208 #endif
   209 	int is_32bit;
   210  
   211 	/* * * */
   212 	/* Window manager functions */
   213 
   214 	/* Set the title and icon text */
   215 	void (*SetCaption)(_THIS, const char *title, const char *icon);
   216 
   217 	/* Set the window icon image */
   218 	void (*SetIcon)(_THIS, SDL_Surface *icon, Uint8 *mask);
   219 
   220 	/* Iconify the window.
   221 	   This function returns 1 if there is a window manager and the
   222 	   window was actually iconified, it returns 0 otherwise.
   223 	*/
   224 	int (*IconifyWindow)(_THIS);
   225 
   226 	/* Grab or ungrab keyboard and mouse input */
   227 	SDL_GrabMode (*GrabInput)(_THIS, SDL_GrabMode mode);
   228 
   229 	/* Get some platform dependent window information */
   230 	int (*GetWMInfo)(_THIS, SDL_SysWMinfo *info);
   231 
   232 	/* * * */
   233 	/* Cursor manager functions */
   234 
   235 	/* Free a window manager cursor
   236 	   This function can be NULL if CreateWMCursor is also NULL.
   237 	 */
   238 	void (*FreeWMCursor)(_THIS, WMcursor *cursor);
   239 
   240 	/* If not NULL, create a black/white window manager cursor */
   241 	WMcursor *(*CreateWMCursor)(_THIS,
   242 		Uint8 *data, Uint8 *mask, int w, int h, int hot_x, int hot_y);
   243 
   244 	/* Show the specified cursor, or hide if cursor is NULL */
   245 	int (*ShowWMCursor)(_THIS, WMcursor *cursor);
   246 
   247 	/* Warp the window manager cursor to (x,y)
   248 	   If NULL, a mouse motion event is posted internally.
   249 	 */
   250 	void (*WarpWMCursor)(_THIS, Uint16 x, Uint16 y);
   251 
   252 	/* If not NULL, this is called when a mouse motion event occurs */
   253 	void (*MoveWMCursor)(_THIS, int x, int y);
   254 
   255 	/* Determine whether the mouse should be in relative mode or not.
   256 	   This function is called when the input grab state or cursor
   257 	   visibility state changes.
   258 	   If the cursor is not visible, and the input is grabbed, the
   259 	   driver can place the mouse in relative mode, which may result
   260 	   in higher accuracy sampling of the pointer motion.
   261 	*/
   262 	void (*CheckMouseMode)(_THIS);
   263 
   264 	/* * * */
   265 	/* Event manager functions */
   266 
   267 	/* Initialize keyboard mapping for this driver */
   268 	void (*InitOSKeymap)(_THIS);
   269 
   270 	/* Handle any queued OS events */
   271 	void (*PumpEvents)(_THIS);
   272 
   273 	/* * * */
   274 	/* Data common to all drivers */
   275 	SDL_Surface *screen;
   276 	SDL_Surface *shadow;
   277 	SDL_Surface *visible;
   278         SDL_Palette *physpal;	/* physical palette, if != logical palette */
   279         SDL_Color *gammacols;	/* gamma-corrected colours, or NULL */
   280 	char *wm_title;
   281 	char *wm_icon;
   282 	int offset_x;
   283 	int offset_y;
   284 	SDL_GrabMode input_grab;
   285 
   286 	/* Driver information flags */
   287 	int handles_any_size;	/* Driver handles any size video mode */
   288 
   289 	/* * * */
   290 	/* Data used by the GL drivers */
   291 	struct {
   292 		int red_size;
   293 		int green_size;
   294 		int blue_size;
   295 		int alpha_size;
   296 		int depth_size;
   297 		int buffer_size;
   298 		int stencil_size;
   299 		int double_buffer;
   300 		int accum_red_size;
   301 		int accum_green_size;
   302 		int accum_blue_size;
   303 		int accum_alpha_size;
   304 		int stereo;
   305 		int multisamplebuffers;
   306 		int multisamplesamples;
   307 		int driver_loaded;
   308 		char driver_path[256];
   309 		void* dll_handle;
   310 	} gl_config;
   311 
   312 	/* * * */
   313 	/* Data private to this driver */
   314 	struct SDL_PrivateVideoData *hidden;
   315 	struct SDL_PrivateGLData *gl_data;
   316 
   317 	/* * * */
   318 	/* The function used to dispose of this structure */
   319 	void (*free)(_THIS);
   320 };
   321 #undef _THIS
   322 
   323 typedef struct VideoBootStrap {
   324 	const char *name;
   325 	const char *desc;
   326 	int (*available)(void);
   327 	SDL_VideoDevice *(*create)(int devindex);
   328 } VideoBootStrap;
   329 
   330 #ifdef ENABLE_X11
   331 extern VideoBootStrap X11_bootstrap;
   332 #endif
   333 #ifdef ENABLE_DGA
   334 extern VideoBootStrap DGA_bootstrap;
   335 #endif
   336 #ifdef ENABLE_NANOX
   337 extern VideoBootStrap NX_bootstrap;
   338 #endif
   339 #ifdef ENABLE_IPOD
   340 extern VideoBootStrap iPod_bootstrap;
   341 #endif
   342 #ifdef ENABLE_FBCON
   343 extern VideoBootStrap FBCON_bootstrap;
   344 #endif
   345 #ifdef ENABLE_DIRECTFB
   346 extern VideoBootStrap DirectFB_bootstrap;
   347 #endif
   348 #ifdef ENABLE_PS2GS
   349 extern VideoBootStrap PS2GS_bootstrap;
   350 #endif
   351 #ifdef ENABLE_GGI
   352 extern VideoBootStrap GGI_bootstrap;
   353 #endif
   354 #ifdef ENABLE_VGL
   355 extern VideoBootStrap VGL_bootstrap;
   356 #endif
   357 #ifdef ENABLE_SVGALIB
   358 extern VideoBootStrap SVGALIB_bootstrap;
   359 #endif
   360 #ifdef ENABLE_AALIB
   361 extern VideoBootStrap AALIB_bootstrap;
   362 #endif
   363 #ifdef ENABLE_GAPI
   364 extern VideoBootStrap GAPI_bootstrap;
   365 #endif
   366 #ifdef ENABLE_WINDIB
   367 extern VideoBootStrap WINDIB_bootstrap;
   368 #endif
   369 #ifdef ENABLE_DIRECTX
   370 extern VideoBootStrap DIRECTX_bootstrap;
   371 #endif
   372 #ifdef ENABLE_BWINDOW
   373 extern VideoBootStrap BWINDOW_bootstrap;
   374 #endif
   375 /* MacOS X gets the proper defines from configure */
   376 #if defined(macintosh) && !defined(MACOSX)
   377 #define ENABLE_TOOLBOX
   378 #if !TARGET_API_MAC_CARBON
   379 #define ENABLE_DRAWSPROCKET
   380 #endif
   381 #endif
   382 #ifdef ENABLE_TOOLBOX
   383 extern VideoBootStrap TOOLBOX_bootstrap;
   384 #endif
   385 #ifdef ENABLE_DRAWSPROCKET
   386 extern VideoBootStrap DSp_bootstrap;
   387 #endif
   388 #ifdef ENABLE_QUARTZ
   389 extern VideoBootStrap QZ_bootstrap;
   390 #endif
   391 #ifdef ENABLE_CYBERGRAPHICS
   392 extern VideoBootStrap CGX_bootstrap;
   393 #endif
   394 #ifdef ENABLE_PHOTON
   395 extern VideoBootStrap ph_bootstrap;
   396 #endif
   397 #ifdef ENABLE_EPOC
   398 extern VideoBootStrap EPOC_bootstrap;
   399 #endif
   400 #ifdef ENABLE_DUMMYVIDEO
   401 extern VideoBootStrap DUMMY_bootstrap;
   402 #endif
   403 #ifdef ENABLE_XBIOS
   404 extern VideoBootStrap XBIOS_bootstrap;
   405 #endif
   406 #ifdef ENABLE_GEM
   407 extern VideoBootStrap GEM_bootstrap;
   408 #endif
   409 #ifdef ENABLE_QTOPIA
   410 extern VideoBootStrap Qtopia_bootstrap;
   411 #endif
   412 #ifdef ENABLE_WSCONS
   413 extern VideoBootStrap WSCONS_bootstrap;
   414 #endif
   415 #ifdef ENABLE_PICOGUI
   416 extern VideoBootStrap PG_bootstrap;
   417 #endif
   418 #ifdef ENABLE_DC
   419 extern VideoBootStrap DC_bootstrap;
   420 #endif
   421 #ifdef ENABLE_RISCOS
   422 extern VideoBootStrap RISCOS_bootstrap;
   423 #endif
   424 #ifdef __OS2__
   425 extern VideoBootStrap OS2FSLib_bootstrap;
   426 #endif
   427 /* This is the current video device */
   428 extern SDL_VideoDevice *current_video;
   429 
   430 #define SDL_VideoSurface	(current_video->screen)
   431 #define SDL_ShadowSurface	(current_video->shadow)
   432 #define SDL_PublicSurface	(current_video->visible)
   433 
   434 #endif /* _SDL_sysvideo_h */