src/video/SDL_sysvideo.h
author Sam Lantinga <slouken@libsdl.org>
Mon, 10 Jul 2006 21:04:37 +0000
changeset 1895 c121d94672cb
parent 1737 eacc5bc01d1c
child 1907 06c27a737b7a
permissions -rw-r--r--
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
     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 #include "SDL_config.h"
    23 
    24 #ifndef _SDL_sysvideo_h
    25 #define _SDL_sysvideo_h
    26 
    27 #include "SDL_mouse.h"
    28 
    29 /* The SDL video driver */
    30 
    31 typedef struct SDL_Window SDL_Window;
    32 typedef struct SDL_Texture SDL_Texture;
    33 typedef struct SDL_Renderer SDL_Renderer;
    34 typedef struct SDL_RenderDriver SDL_RenderDriver;
    35 typedef struct SDL_VideoDisplay SDL_VideoDisplay;
    36 typedef struct SDL_VideoDevice SDL_VideoDevice;
    37 
    38 /* Define the SDL texture structure */
    39 struct SDL_Texture
    40 {
    41     Uint32 id;
    42 
    43     Uint32 format;      /**< The pixel format of the texture */
    44     int access;         /**< SDL_TextureAccess */
    45     int w;              /**< The width of the texture */
    46     int h;              /**< The height of the texture */
    47 
    48     SDL_Renderer *renderer;
    49 
    50     void *driverdata;   /**< Driver specific texture representation */
    51 
    52     SDL_Texture *next;
    53 };
    54 
    55 /* Define the SDL renderer structure */
    56 struct SDL_Renderer
    57 {
    58     int (*CreateTexture) (SDL_Renderer * renderer, SDL_Texture * texture);
    59     int (*QueryTexturePixels) (SDL_Renderer * renderer, SDL_Texture * texture,
    60                                void **pixels, int *pitch);
    61     int (*SetTexturePalette) (SDL_Renderer * renderer, SDL_Texture * texture,
    62                               const SDL_Color * colors, int firstcolor,
    63                               int ncolors);
    64     int (*GetTexturePalette) (SDL_Renderer * renderer, SDL_Texture * texture,
    65                               SDL_Color * colors, int firstcolor,
    66                               int ncolors);
    67     int (*UpdateTexture) (SDL_Renderer * renderer, SDL_Texture * texture,
    68                           const SDL_Rect * rect, const void *pixels,
    69                           int pitch);
    70     int (*LockTexture) (SDL_Renderer * renderer, SDL_Texture * texture,
    71                         const SDL_Rect * rect, int markDirty, void **pixels,
    72                         int *pitch);
    73     void (*UnlockTexture) (SDL_Renderer * renderer, SDL_Texture * texture);
    74     void (*DirtyTexture) (SDL_Renderer * renderer, SDL_Texture * texture,
    75                           int numrects, const SDL_Rect * rects);
    76     void (*SelectRenderTexture) (SDL_Renderer * renderer,
    77                                  SDL_Texture * texture);
    78     int (*RenderFill) (SDL_Renderer * renderer, const SDL_Rect * rect,
    79                        Uint32 color);
    80     int (*RenderCopy) (SDL_Renderer * renderer, SDL_Texture * texture,
    81                        const SDL_Rect * srcrect, const SDL_Rect * dstrect,
    82                        int blendMode, int scaleMode);
    83     int (*RenderReadPixels) (SDL_Renderer * renderer, const SDL_Rect * rect,
    84                              void *pixels, int pitch);
    85     int (*RenderWritePixels) (SDL_Renderer * renderer, const SDL_Rect * rect,
    86                               const void *pixels, int pitch);
    87     void (*RenderPresent) (SDL_Renderer * renderer);
    88     void (*DestroyTexture) (SDL_Renderer * renderer, SDL_Texture * texture);
    89 
    90     void (*DestroyRenderer) (SDL_Renderer * renderer);
    91 
    92     /* The current renderer info */
    93     SDL_RendererInfo info;
    94 
    95     /* The window associated with the renderer */
    96     SDL_WindowID window;
    97 
    98     void *driverdata;
    99 };
   100 
   101 /* Define the SDL render driver structure */
   102 struct SDL_RenderDriver
   103 {
   104     SDL_Renderer *(*CreateRenderer) (SDL_Window * window, Uint32 flags);
   105 
   106     /* Info about the renderer capabilities */
   107     SDL_RendererInfo info;
   108 };
   109 
   110 /* Define the SDL window structure, corresponding to toplevel windows */
   111 struct SDL_Window
   112 {
   113     Uint32 id;
   114 
   115     char *title;
   116     int x, y;
   117     int w, h;
   118     Uint32 flags;
   119 
   120     int display;
   121     SDL_Renderer *renderer;
   122 
   123     void *userdata;
   124     void *driverdata;
   125 };
   126 #define FULLSCREEN_VISIBLE(W) \
   127     (((W)->flags & SDL_WINDOW_FULLSCREEN) && \
   128      ((W)->flags & SDL_WINDOW_SHOWN) && \
   129      !((W)->flags & SDL_WINDOW_MINIMIZED))
   130 
   131 /* Define the SDL display structure
   132    This corresponds to physical monitors attached to the system.
   133  */
   134 struct SDL_VideoDisplay
   135 {
   136     int max_display_modes;
   137     int num_display_modes;
   138     SDL_DisplayMode *display_modes;
   139     SDL_DisplayMode desktop_mode;
   140     SDL_DisplayMode current_mode;
   141     SDL_DisplayMode desired_mode;
   142     SDL_DisplayMode *fullscreen_mode;
   143     SDL_Palette *palette;
   144 
   145     Uint16 *gamma;
   146     Uint16 *saved_gamma;        /* (just offset into gamma) */
   147 
   148     int num_render_drivers;
   149     SDL_RenderDriver *render_drivers;
   150 
   151     int num_windows;
   152     SDL_Window *windows;
   153 
   154     SDL_Renderer *current_renderer;
   155 
   156     /* The hash list of textures */
   157     SDL_Texture *textures[64];
   158 
   159     SDL_VideoDevice *device;
   160 
   161     void *driverdata;
   162 };
   163 
   164 /* Define the SDL video driver structure */
   165 #define _THIS	SDL_VideoDevice *_this
   166 
   167 struct SDL_VideoDevice
   168 {
   169     /* * * */
   170     /* The name of this video driver */
   171     const char *name;
   172 
   173     /* * * */
   174     /* Initialization/Query functions */
   175 
   176     /* Initialize the native video subsystem, filling in the list
   177        of displays for this driver, returning 0 or -1 if there's an error.
   178      */
   179     int (*VideoInit) (_THIS);
   180 
   181     /* * * */
   182     /* Display functions
   183      */
   184 
   185     /* Get a list of the available display modes.
   186      * e.g.  SDL_AddDisplayMode(_this->current_display, mode)
   187      */
   188     void (*GetDisplayModes) (_THIS);
   189 
   190     /* Setting the display mode is independent of creating windows,
   191      * so when the display mode is changed, all existing windows
   192      * should have their data updated accordingly, including the
   193      * display surfaces associated with them.
   194      */
   195     int (*SetDisplayMode) (_THIS, SDL_DisplayMode * mode);
   196 
   197     /* Set the color entries of the display palette */
   198     int (*SetDisplayPalette) (_THIS, SDL_Palette * palette);
   199 
   200     /* Get the color entries of the display palette */
   201     int (*GetDisplayPalette) (_THIS, SDL_Palette * palette);
   202 
   203     /* Set the gamma ramp */
   204     int (*SetDisplayGammaRamp) (_THIS, Uint16 * ramp);
   205 
   206     /* Get the gamma ramp */
   207     int (*GetDisplayGammaRamp) (_THIS, Uint16 * ramp);
   208 
   209     /* * * */
   210     /* Window functions
   211      */
   212     int (*CreateWindow) (_THIS, SDL_Window * window);
   213     int (*CreateWindowFrom) (_THIS, SDL_Window * window, const void *data);
   214     void (*SetWindowTitle) (_THIS, SDL_Window * window);
   215     void (*SetWindowPosition) (_THIS, SDL_Window * window);
   216     void (*SetWindowSize) (_THIS, SDL_Window * window);
   217     void (*ShowWindow) (_THIS, SDL_Window * window);
   218     void (*HideWindow) (_THIS, SDL_Window * window);
   219     void (*RaiseWindow) (_THIS, SDL_Window * window);
   220     void (*MaximizeWindow) (_THIS, SDL_Window * window);
   221     void (*MinimizeWindow) (_THIS, SDL_Window * window);
   222     void (*RestoreWindow) (_THIS, SDL_Window * window);
   223     void (*SetWindowGrab) (_THIS, SDL_Window * window);
   224     void (*DestroyWindow) (_THIS, SDL_Window * window);
   225 
   226     /* Get some platform dependent window information */
   227       SDL_bool(*GetWindowWMInfo) (_THIS, SDL_Window * window,
   228                                   struct SDL_SysWMinfo * info);
   229 
   230     /* Reverse the effects VideoInit() -- called if VideoInit() fails
   231        or if the application is shutting down the video subsystem.
   232      */
   233     void (*VideoQuit) (_THIS);
   234 
   235     /* * * */
   236     /* OpenGL support */
   237 
   238     /* Sets the dll to use for OpenGL and loads it */
   239     int (*GL_LoadLibrary) (_THIS, const char *path);
   240 
   241     /* Retrieves the address of a function in the gl library */
   242     void *(*GL_GetProcAddress) (_THIS, const char *proc);
   243 
   244     /* Get attribute information from the windowing system. */
   245     int (*GL_GetAttribute) (_THIS, SDL_GLattr attrib, int *value);
   246 
   247     /* Make the context associated with this driver current */
   248     int (*GL_MakeCurrent) (_THIS);
   249 
   250     /* Swap the current buffers in double buffer mode. */
   251     void (*GL_SwapBuffers) (_THIS);
   252 
   253     /* Determine whether the mouse should be in relative mode or not.
   254        This function is called when the input grab state or cursor
   255        visibility state changes.
   256        If the cursor is not visible, and the input is grabbed, the
   257        driver can place the mouse in relative mode, which may result
   258        in higher accuracy sampling of the pointer motion.
   259      */
   260     void (*CheckMouseMode) (_THIS);
   261 
   262     /* * * */
   263     /* Event manager functions */
   264 
   265     /* Handle any queued OS events */
   266     void (*PumpEvents) (_THIS);
   267 
   268     /* * * */
   269     /* Data common to all drivers */
   270     int num_displays;
   271     SDL_VideoDisplay *displays;
   272     int current_display;
   273     Uint32 next_object_id;
   274 
   275     /* Driver information flags */
   276 
   277     /* * * */
   278     /* Data used by the GL drivers */
   279     struct
   280     {
   281         int red_size;
   282         int green_size;
   283         int blue_size;
   284         int alpha_size;
   285         int depth_size;
   286         int buffer_size;
   287         int stencil_size;
   288         int double_buffer;
   289         int accum_red_size;
   290         int accum_green_size;
   291         int accum_blue_size;
   292         int accum_alpha_size;
   293         int stereo;
   294         int multisamplebuffers;
   295         int multisamplesamples;
   296         int accelerated;
   297         int driver_loaded;
   298         char driver_path[256];
   299         void *dll_handle;
   300     } gl_config;
   301 
   302     /* * * */
   303     /* Data private to this driver */
   304     void *driverdata;
   305     struct SDL_PrivateGLData *gl_data;
   306 
   307     /* * * */
   308     /* The function used to dispose of this structure */
   309     void (*free) (_THIS);
   310 };
   311 
   312 typedef struct VideoBootStrap
   313 {
   314     const char *name;
   315     const char *desc;
   316     int (*available) (void);
   317     SDL_VideoDevice *(*create) (int devindex);
   318 } VideoBootStrap;
   319 
   320 #if SDL_VIDEO_DRIVER_QUARTZ
   321 extern VideoBootStrap QZ_bootstrap;
   322 #endif
   323 #if SDL_VIDEO_DRIVER_X11
   324 extern VideoBootStrap X11_bootstrap;
   325 #endif
   326 #if SDL_VIDEO_DRIVER_DGA
   327 extern VideoBootStrap DGA_bootstrap;
   328 #endif
   329 #if SDL_VIDEO_DRIVER_NANOX
   330 extern VideoBootStrap NX_bootstrap;
   331 #endif
   332 #if SDL_VIDEO_DRIVER_IPOD
   333 extern VideoBootStrap iPod_bootstrap;
   334 #endif
   335 #if SDL_VIDEO_DRIVER_QTOPIA
   336 extern VideoBootStrap Qtopia_bootstrap;
   337 #endif
   338 #if SDL_VIDEO_DRIVER_WSCONS
   339 extern VideoBootStrap WSCONS_bootstrap;
   340 #endif
   341 #if SDL_VIDEO_DRIVER_FBCON
   342 extern VideoBootStrap FBCON_bootstrap;
   343 #endif
   344 #if SDL_VIDEO_DRIVER_DIRECTFB
   345 extern VideoBootStrap DirectFB_bootstrap;
   346 #endif
   347 #if SDL_VIDEO_DRIVER_PS2GS
   348 extern VideoBootStrap PS2GS_bootstrap;
   349 #endif
   350 #if SDL_VIDEO_DRIVER_GGI
   351 extern VideoBootStrap GGI_bootstrap;
   352 #endif
   353 #if SDL_VIDEO_DRIVER_VGL
   354 extern VideoBootStrap VGL_bootstrap;
   355 #endif
   356 #if SDL_VIDEO_DRIVER_SVGALIB
   357 extern VideoBootStrap SVGALIB_bootstrap;
   358 #endif
   359 #if SDL_VIDEO_DRIVER_GAPI
   360 extern VideoBootStrap GAPI_bootstrap;
   361 #endif
   362 #if SDL_VIDEO_DRIVER_WIN32
   363 extern VideoBootStrap WIN32_bootstrap;
   364 #endif
   365 #if SDL_VIDEO_DRIVER_BWINDOW
   366 extern VideoBootStrap BWINDOW_bootstrap;
   367 #endif
   368 #if SDL_VIDEO_DRIVER_TOOLBOX
   369 extern VideoBootStrap TOOLBOX_bootstrap;
   370 #endif
   371 #if SDL_VIDEO_DRIVER_DRAWSPROCKET
   372 extern VideoBootStrap DSp_bootstrap;
   373 #endif
   374 #if SDL_VIDEO_DRIVER_CYBERGRAPHICS
   375 extern VideoBootStrap CGX_bootstrap;
   376 #endif
   377 #if SDL_VIDEO_DRIVER_PHOTON
   378 extern VideoBootStrap ph_bootstrap;
   379 #endif
   380 #if SDL_VIDEO_DRIVER_EPOC
   381 extern VideoBootStrap EPOC_bootstrap;
   382 #endif
   383 #if SDL_VIDEO_DRIVER_XBIOS
   384 extern VideoBootStrap XBIOS_bootstrap;
   385 #endif
   386 #if SDL_VIDEO_DRIVER_GEM
   387 extern VideoBootStrap GEM_bootstrap;
   388 #endif
   389 #if SDL_VIDEO_DRIVER_PICOGUI
   390 extern VideoBootStrap PG_bootstrap;
   391 #endif
   392 #if SDL_VIDEO_DRIVER_DC
   393 extern VideoBootStrap DC_bootstrap;
   394 #endif
   395 #if SDL_VIDEO_DRIVER_RISCOS
   396 extern VideoBootStrap RISCOS_bootstrap;
   397 #endif
   398 #if SDL_VIDEO_DRIVER_OS2FS
   399 extern VideoBootStrap OS2FSLib_bootstrap;
   400 #endif
   401 #if SDL_VIDEO_DRIVER_AALIB
   402 extern VideoBootStrap AALIB_bootstrap;
   403 #endif
   404 #if SDL_VIDEO_DRIVER_DUMMY
   405 extern VideoBootStrap DUMMY_bootstrap;
   406 #endif
   407 #if SDL_VIDEO_DRIVER_GLSDL
   408 extern VideoBootStrap glSDL_bootstrap;
   409 #endif
   410 
   411 #define SDL_CurrentDisplay	(_this->displays[_this->current_display])
   412 
   413 extern SDL_VideoDevice *SDL_GetVideoDevice();
   414 extern int SDL_AddBasicVideoDisplay(const SDL_DisplayMode * desktop_mode);
   415 extern int SDL_AddVideoDisplay(const SDL_VideoDisplay * display);
   416 extern SDL_bool SDL_AddDisplayMode(int displayIndex,
   417                                    const SDL_DisplayMode * mode);
   418 extern void SDL_AddRenderDriver(int displayIndex,
   419                                 const SDL_RenderDriver * driver);
   420 
   421 extern SDL_Window *SDL_GetWindowFromID(SDL_WindowID windowID);
   422 extern SDL_VideoDisplay *SDL_GetDisplayFromWindow(SDL_Window * window);
   423 
   424 extern void SDL_OnWindowShown(SDL_Window * window);
   425 extern void SDL_OnWindowHidden(SDL_Window * window);
   426 extern void SDL_OnWindowFocusGained(SDL_Window * window);
   427 extern void SDL_OnWindowFocusLost(SDL_Window * window);
   428 extern SDL_WindowID SDL_GetFocusWindow(void);
   429 
   430 #endif /* _SDL_sysvideo_h */
   431 
   432 /* vi: set ts=4 sw=4 expandtab: */