src/video/SDL_sysvideo.h
author Ryan C. Gordon <icculus@icculus.org>
Thu, 08 Sep 2005 07:33:22 +0000
changeset 1140 af8b0f9ac2f4
parent 1052 68f607298ca9
child 1187 19d8949b4584
permissions -rw-r--r--
iPod Linux framebuffer support.

--ryan.


Date: Sun, 19 Jun 2005 15:53:22 -0700
From: Joshua Oreman <oremanj@gmail.com>
To: sdl@libsdl.org
Subject: [SDL] [PATCH] iPod framebuffer video driver

Hi SDL-list,

I've been working on a port of SDL to iPodLinux
(http://www.ipodlinux.org). I've created a patch for both the
standard 2-bit iPod screen (using an unchangeable palette) and the
16-bit iPod photo. The patch is attached, against version 1.2.8.

I've created two pages on the iPodLinux wiki about this patch:
http://www.ipodlinux.org/Building_SDL and
http://www.ipodlinux.org/SDL_Programming. See those pages if you're
curious.

Comments? Questions? Is this something that might be able to get into SDL 1.2.9?

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