Implemented many compatibility functions SDL-1.3
authorSam Lantinga <slouken@libsdl.org>
Mon, 29 May 2006 03:53:21 +0000
branchSDL-1.3
changeset 1667 1fddae038bc8
parent 1666 6e7ec5cb83c3
child 1668 4da1ee79c9af
Implemented many compatibility functions
.indent.pro
include/SDL_compat.h
src/SDL_compat.c
src/video/SDL_video.c
src/video/dummy/SDL_nullvideo.c
--- a/.indent.pro	Sun May 28 21:56:07 2006 +0000
+++ b/.indent.pro	Mon May 29 03:53:21 2006 +0000
@@ -1,1 +1,1 @@
--i4 -nut -nsc -br -ce
+-i4 -nut -nsc -br -ce -cdw -npcs
--- a/include/SDL_compat.h	Sun May 28 21:56:07 2006 +0000
+++ b/include/SDL_compat.h	Mon May 29 03:53:21 2006 +0000
@@ -30,54 +30,52 @@
 #include "begin_code.h"
 /* Set up for C function definitions, even when using C++ */
 #ifdef __cplusplus
-extern "C"
-{
+/* *INDENT-OFF* */
+extern "C" {
+/* *INDENT-ON* */
 #endif
 
-    extern DECLSPEC char *SDLCALL SDL_AudioDriverName (char *namebuf,
-                                                       int maxlen);
-    extern DECLSPEC char *SDLCALL SDL_VideoDriverName (char *namebuf,
-                                                       int maxlen);
-    extern DECLSPEC int SDLCALL SDL_VideoModeOK (int width, int height,
-                                                 int bpp, Uint32 flags);
-    extern DECLSPEC SDL_Rect **SDLCALL SDL_ListModes (SDL_PixelFormat *
-                                                      format, Uint32 flags);
-    extern DECLSPEC SDL_Surface *SDLCALL SDL_SetVideoMode (int width,
-                                                           int height,
-                                                           int bpp,
-                                                           Uint32 flags);
+#define SDL_SWSURFACE	0x00000000
+#define SDL_HWSURFACE	0x00000001
+#define SDL_ASYNCBLIT	0x00000004
+#define SDL_ANYFORMAT	0x10000000
+#define SDL_HWPALETTE	0x20000000
+#define SDL_DOUBLEBUF	0x40000000
+#define SDL_FULLSCREEN	0x80000000
+#define SDL_OPENGL      0x00000002
+#define SDL_INTERNALOPENGL 0x00000008
+#define SDL_RESIZABLE	0x00000010
+#define SDL_NOFRAME	0x00000020
+#define SDL_HWACCEL	0x00000100
+#define SDL_SRCCOLORKEY	0x00001000
+#define SDL_RLEACCELOK	0x00002000
+#define SDL_RLEACCEL	0x00004000
+#define SDL_SRCALPHA	0x00010000
 
-/* Ends C function definitions when using C++ */
-#ifdef __cplusplus
-}
-#endif
-#include "close_code.h"
+#define SDL_APPMOUSEFOCUS	0x01
+#define SDL_APPINPUTFOCUS	0x02
+#define SDL_APPACTIVE		0x04
+
+#define SDL_LOGPAL 0x01
+#define SDL_PHYSPAL 0x02
 
-#endif                          /* _SDL_compat_h */
+typedef enum
+{
+    SDL_GRAB_QUERY = -1,
+    SDL_GRAB_OFF = 0,
+    SDL_GRAB_ON = 1
+} SDL_GrabMode;
 
+extern DECLSPEC const SDL_version *SDLCALL SDL_Linked_Version (void);
+extern DECLSPEC char *SDLCALL SDL_AudioDriverName (char *namebuf, int maxlen);
+extern DECLSPEC char *SDLCALL SDL_VideoDriverName (char *namebuf, int maxlen);
+extern DECLSPEC int SDLCALL SDL_VideoModeOK (int width, int height, int bpp,
+                                             Uint32 flags);
+extern DECLSPEC SDL_Rect **SDLCALL SDL_ListModes (SDL_PixelFormat * format,
+                                                  Uint32 flags);
+extern DECLSPEC SDL_Surface *SDLCALL SDL_SetVideoMode (int width, int height,
+                                                       int bpp, Uint32 flags);
 extern DECLSPEC SDL_Surface *SDLCALL SDL_GetVideoSurface (void);
-
-/* These are the currently supported flags for the SDL_surface */
-/* Available for SDL_CreateRGBSurface() or SDL_SetVideoMode() */
-#define SDL_SWSURFACE	0x00000000      /* Surface is in system memory */
-#define SDL_HWSURFACE	0x00000001      /* Surface is in video memory */
-#define SDL_ASYNCBLIT	0x00000004      /* Use asynchronous blits if possible */
-/* Available for SDL_SetVideoMode() */
-#define SDL_ANYFORMAT	0x10000000      /* Allow any video depth/pixel-format */
-#define SDL_HWPALETTE	0x20000000      /* Surface has exclusive palette */
-#define SDL_DOUBLEBUF	0x40000000      /* Set up double-buffered video mode */
-#define SDL_FULLSCREEN	0x80000000      /* Surface is a full screen display */
-#define SDL_OPENGL      0x00000002      /* Create an OpenGL rendering context */
-#define SDL_INTERNALOPENGL 0x00000008   /* SDL uses OpenGL internally for this window */
-#define SDL_RESIZABLE	0x00000010      /* This video mode may be resized */
-#define SDL_NOFRAME	0x00000020      /* No window caption or edge frame */
-/* Used internally (read-only) */
-#define SDL_HWACCEL	0x00000100      /* Blit uses hardware acceleration */
-#define SDL_SRCCOLORKEY	0x00001000      /* Blit uses a source color key */
-#define SDL_RLEACCELOK	0x00002000      /* Private flag */
-#define SDL_RLEACCEL	0x00004000      /* Surface is RLE encoded */
-#define SDL_SRCALPHA	0x00010000      /* Blit uses source alpha blending */
-
 extern DECLSPEC void SDLCALL SDL_WM_SetCaption (const char *title,
                                                 const char *icon);
 extern DECLSPEC void SDLCALL SDL_WM_GetCaption (char **title, char **icon);
@@ -85,42 +83,19 @@
                                              Uint8 * mask);
 extern DECLSPEC int SDLCALL SDL_WM_IconifyWindow (void);
 extern DECLSPEC int SDLCALL SDL_WM_ToggleFullScreen (SDL_Surface * surface);
-typedef enum
-{
-    SDL_GRAB_QUERY = -1,
-    SDL_GRAB_OFF = 0,
-    SDL_GRAB_ON = 1
-} SDL_GrabMode;
 extern DECLSPEC SDL_GrabMode SDLCALL SDL_WM_GrabInput (SDL_GrabMode mode);
-
-/* The available application states */
-#define SDL_APPMOUSEFOCUS	0x01    /* The app has mouse coverage */
-#define SDL_APPINPUTFOCUS	0x02    /* The app has input focus */
-#define SDL_APPACTIVE		0x04    /* The application is active */
-
 extern DECLSPEC Uint8 SDLCALL SDL_GetAppState (void);
-extern DECLSPEC const SDL_version *SDLCALL SDL_Linked_Version (void);
-/* flags for SDL_SetPalette() */
-#define SDL_LOGPAL 0x01
-#define SDL_PHYSPAL 0x02
-
-/*
- * Sets a portion of the colormap for a given 8-bit surface.
- * 'flags' is one or both of:
- * SDL_LOGPAL  -- set logical palette, which controls how blits are mapped
- *                to/from the surface,
- * SDL_PHYSPAL -- set physical palette, which controls how pixels look on
- *                the screen
- * Only screens have physical palettes. Separate change of physical/logical
- * palettes is only possible if the screen has SDL_HWPALETTE set.
- *
- * The return value is 1 if all colours could be set as requested, and 0
- * otherwise.
- *
- * SDL_SetColors() is equivalent to calling this function with
- *     flags = (SDL_LOGPAL|SDL_PHYSPAL).
- */
 extern DECLSPEC int SDLCALL SDL_SetPalette (SDL_Surface * surface, int flags,
                                             SDL_Color * colors,
                                             int firstcolor, int ncolors);
 extern DECLSPEC int SDLCALL SDL_GetWMInfo (SDL_SysWMinfo * info);
+
+/* Ends C function definitions when using C++ */
+#ifdef __cplusplus
+/* *INDENT-OFF* */
+}
+/* *INDENT-ON* */
+#endif
+#include "close_code.h"
+
+#endif /* _SDL_compat_h */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/SDL_compat.c	Mon May 29 03:53:21 2006 +0000
@@ -0,0 +1,314 @@
+/*
+    SDL - Simple DirectMedia Layer
+    Copyright (C) 1997-2006 Sam Lantinga
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    Sam Lantinga
+    slouken@libsdl.org
+*/
+#include "SDL_config.h"
+
+/* This file contains functions for backwards compatibility with SDL 1.2 */
+
+#include "SDL.h"
+
+#include "video/SDL_sysvideo.h"
+
+
+static SDL_WindowID window;
+static char *wm_title;
+
+char *
+SDL_AudioDriverName (char *namebuf, int maxlen)
+{
+    const char *name = SDL_GetCurrentAudioDriver ();
+    if (name) {
+        SDL_strlcpy (namebuf, name, maxlen);
+        return namebuf;
+    }
+    return NULL;
+}
+
+char *
+SDL_VideoDriverName (char *namebuf, int maxlen)
+{
+    const char *name = SDL_GetCurrentVideoDriver ();
+    if (name) {
+        SDL_strlcpy (namebuf, name, maxlen);
+        return namebuf;
+    }
+    return NULL;
+}
+
+int
+SDL_VideoModeOK (int width, int height, int bpp, Uint32 flags)
+{
+    int i, actual_bpp = 0;
+
+    if (!SDL_GetVideoDevice ()) {
+        return 0;
+    }
+
+    if (!(flags & SDL_FULLSCREEN)) {
+        return SDL_BITSPERPIXEL (SDL_GetDesktopDisplayMode ()->format);
+    }
+
+    for (i = 0; i < SDL_GetNumDisplayModes (); ++i) {
+        const SDL_DisplayMode *mode = SDL_GetDisplayMode (i);
+        if (!mode->w || !mode->h || (width == mode->w && height == mode->h)) {
+            if (!mode->format) {
+                return bpp;
+            }
+            if (SDL_BITSPERPIXEL (mode->format) >= bpp) {
+                actual_bpp = SDL_BITSPERPIXEL (mode->format);
+            }
+        }
+    }
+    return actual_bpp;
+}
+
+SDL_Rect **
+SDL_ListModes (SDL_PixelFormat * format, Uint32 flags)
+{
+    int i, nmodes;
+    SDL_Rect **modes;
+
+    if (!SDL_GetVideoDevice ()) {
+        return NULL;
+    }
+
+    if (!(flags & SDL_FULLSCREEN)) {
+        return (SDL_Rect **) (-1);
+    }
+
+    /* Memory leak, but this is a compatibility function, who cares? */
+    nmodes = 0;
+    for (i = 0; i < SDL_GetNumDisplayModes (); ++i) {
+        const SDL_DisplayMode *mode = SDL_GetDisplayMode (i);
+        if (!mode->w || !mode->h) {
+            return (SDL_Rect **) (-1);
+        }
+        if (SDL_BITSPERPIXEL (mode->format) != format->BitsPerPixel) {
+            continue;
+        }
+        if (nmodes > 0 && modes[nmodes - 1]->w == mode->w
+            && modes[nmodes - 1]->h == mode->h) {
+            continue;
+        }
+
+        modes = SDL_realloc (modes, (nmodes + 2) * sizeof (*modes));
+        if (!modes) {
+            return NULL;
+        }
+        modes[nmodes] = (SDL_Rect *) SDL_malloc (sizeof (SDL_Rect));
+        if (!modes[nmodes]) {
+            return NULL;
+        }
+        modes[nmodes]->x = 0;
+        modes[nmodes]->y = 0;
+        modes[nmodes]->w = mode->w;
+        modes[nmodes]->h = mode->h;
+        ++nmodes;
+    }
+    if (modes) {
+        modes[nmodes] = NULL;
+    }
+    return modes;
+}
+
+SDL_Surface *
+SDL_SetVideoMode (int width, int height, int bpp, Uint32 flags)
+{
+    SDL_DisplayMode mode;
+    int i;
+    Uint32 window_flags;
+    Uint32 desktop_format;
+    Uint32 desired_format;
+
+    if (!SDL_GetVideoDevice ()) {
+        if (SDL_Init (SDL_INIT_VIDEO | SDL_INIT_NOPARACHUTE) < 0) {
+            return NULL;
+        }
+    }
+
+    /* Destroy existing window */
+    SDL_DestroyWindow (window);
+
+    /* Create a new window */
+    window_flags = SDL_WINDOW_SHOWN;
+    if (flags & SDL_FULLSCREEN) {
+        window_flags |= SDL_WINDOW_FULLSCREEN;
+    }
+    if (flags & SDL_OPENGL) {
+        window_flags |= SDL_WINDOW_OPENGL;
+    }
+    if (flags & SDL_RESIZABLE) {
+        window_flags |= SDL_WINDOW_RESIZABLE;
+    }
+    if (flags & SDL_NOFRAME) {
+        window_flags |= SDL_WINDOW_BORDERLESS;
+    }
+    window = SDL_CreateWindow (wm_title, 0, 0, width, height, window_flags);
+    if (!window) {
+        return NULL;
+    }
+
+    /* Set up the desired display mode */
+    desktop_format = SDL_GetDesktopDisplayMode ()->format;
+    if ((bpp == SDL_BITSPERPIXEL(desktop_format)) ||
+        (desktop_format && (flags & SDL_ANYFORMAT))) {
+        desired_format = desktop_format;
+    } else {
+        switch (bpp) {
+        case 8:
+            desired_format = SDL_PixelFormat_Index8;
+            break;
+        case 15:
+            desired_format = SDL_PixelFormat_RGB555;
+            break;
+        case 16:
+            desired_format = SDL_PixelFormat_RGB565;
+            break;
+        case 24:
+            desired_format = SDL_PixelFormat_RGB24;
+            break;
+        case 32:
+            desired_format = SDL_PixelFormat_RGB888;
+            break;
+        default:
+            SDL_SetError ("Unsupported bpp in SDL_SetVideoMode()");
+            return NULL;
+        }
+    }
+    mode.format = desired_format;
+    mode.w = width;
+    mode.h = height;
+    mode.refresh_rate = 0;
+
+    /* Set the desired display mode */
+    if (flags & SDL_FULLSCREEN) {
+        if (!SDL_GetClosestDisplayMode (&mode, &mode)) {
+            return NULL;
+        }
+    } else {
+        mode = *SDL_GetDesktopDisplayMode ();
+    }
+    if (SDL_SetDisplayMode (&mode) < 0) {
+        return NULL;
+    }
+
+    /* Create the display surface */
+    return SDL_CreateWindowSurface (window, desired_format, flags);
+}
+
+SDL_Surface *
+SDL_GetVideoSurface (void)
+{
+    SDL_VideoDevice *_this = SDL_GetVideoDevice ();
+
+    return SDL_VideoSurface;
+}
+
+void
+SDL_WM_SetCaption (const char *title, const char *icon)
+{
+    if (wm_title) {
+        SDL_free (wm_title);
+    } else {
+        wm_title = SDL_strdup (title);
+    }
+    SDL_SetWindowTitle (window, wm_title);
+}
+
+void
+SDL_WM_GetCaption (char **title, char **icon)
+{
+    if (title) {
+        *title = wm_title;
+    }
+    if (icon) {
+        *icon = "";
+    }
+}
+
+void
+SDL_WM_SetIcon (SDL_Surface * icon, Uint8 * mask)
+{
+    /* FIXME */
+}
+
+int
+SDL_WM_IconifyWindow (void)
+{
+    SDL_MinimizeWindow (window);
+}
+
+int
+SDL_WM_ToggleFullScreen (SDL_Surface * surface)
+{
+    return 0;
+}
+
+SDL_GrabMode
+SDL_WM_GrabInput (SDL_GrabMode mode)
+{
+    if (mode != SDL_GRAB_QUERY) {
+        SDL_SetWindowGrab (window, mode);
+    }
+    return (SDL_GrabMode) SDL_GetWindowGrab (window);
+}
+
+Uint8
+SDL_GetAppState (void)
+{
+    Uint8 state = 0;
+    Uint32 flags = 0;
+
+    flags = SDL_GetWindowFlags (window);
+    if ((flags & SDL_WINDOW_SHOWN) && !(flags & SDL_WINDOW_MINIMIZED)) {
+        state |= SDL_APPACTIVE;
+    }
+    if (flags & SDL_WINDOW_KEYBOARD_FOCUS) {
+        state |= SDL_APPINPUTFOCUS;
+    }
+    if (flags & SDL_WINDOW_MOUSE_FOCUS) {
+        state |= SDL_APPMOUSEFOCUS;
+    }
+    return state;
+}
+
+const SDL_version *
+SDL_Linked_Version (void)
+{
+    static SDL_version version;
+    SDL_VERSION (&version);
+    return &version;
+}
+
+int
+SDL_SetPalette (SDL_Surface * surface, int flags, SDL_Color * colors,
+                int firstcolor, int ncolors)
+{
+    SDL_SetColors (surface, colors, firstcolor, ncolors);
+}
+
+int
+SDL_GetWMInfo (SDL_SysWMinfo * info)
+{
+    return SDL_GetWindowWMInfo (window, info);
+}
+
+/* vi: set ts=4 sw=4 expandtab: */
--- a/src/video/SDL_video.c	Sun May 28 21:56:07 2006 +0000
+++ b/src/video/SDL_video.c	Mon May 29 03:53:21 2006 +0000
@@ -512,7 +512,9 @@
 int
 SDL_SetDisplayMode (const SDL_DisplayMode * mode)
 {
+    SDL_VideoDisplay *display;
     SDL_DisplayMode display_mode;
+    int i;
 
     if (!_this) {
         SDL_SetError ("Video subsystem has not been initialized");
@@ -524,21 +526,21 @@
         SDL_SetError ("No mode passed to SDL_SetDisplayMode");
         return -1;
     }
+    display = &SDL_CurrentDisplay;
     display_mode = *mode;
 
     /* Default to the current mode */
     if (!display_mode.format) {
-        display_mode.format = SDL_CurrentDisplay.current_mode.format;
+        display_mode.format = display->current_mode.format;
     }
     if (!display_mode.w) {
-        display_mode.w = SDL_CurrentDisplay.current_mode.w;
+        display_mode.w = display->current_mode.w;
     }
     if (!display_mode.h) {
-        display_mode.h = SDL_CurrentDisplay.current_mode.h;
+        display_mode.h = display->current_mode.h;
     }
     if (!display_mode.refresh_rate) {
-        display_mode.refresh_rate =
-            SDL_CurrentDisplay.current_mode.refresh_rate;
+        display_mode.refresh_rate = display->current_mode.refresh_rate;
     }
 
     /* Get a good video mode, the closest one possible */
@@ -555,6 +557,19 @@
         return 0;
     }
 
+    /* Free any previous window surfaces */
+    for (i = 0; i < display->num_windows; ++i) {
+        SDL_Window *window = &display->windows[i];
+        if (window->shadow) {
+            SDL_FreeSurface (window->shadow);
+            window->shadow = NULL;
+        }
+        if (window->surface) {
+            SDL_FreeSurface (window->surface);
+            window->surface = NULL;
+        }
+    }
+
     return _this->SetDisplayMode (_this, &display_mode);
 }
 
@@ -580,7 +595,7 @@
 
     SDL_zero (window);
     window.id = _this->next_window_id++;
-    window.title = SDL_strdup (title);
+    window.title = title ? SDL_strdup (title) : NULL;
     window.x = x;
     window.y = y;
     window.w = w;
@@ -588,7 +603,9 @@
     window.flags = (flags & allowed_flags);
 
     if (_this->CreateWindow && _this->CreateWindow (_this, &window) < 0) {
-        SDL_free (window.title);
+        if (window.title) {
+            SDL_free (window.title);
+        }
         return 0;
     }
 
@@ -600,7 +617,9 @@
         if (_this->DestroyWindow) {
             _this->DestroyWindow (_this, &window);
         }
-        SDL_free (window.title);
+        if (window.title) {
+            SDL_free (window.title);
+        }
         return 0;
     }
     windows[num_windows] = window;
@@ -638,7 +657,9 @@
         if (_this->DestroyWindow) {
             _this->DestroyWindow (_this, &window);
         }
-        SDL_free (window.title);
+        if (window.title) {
+            SDL_free (window.title);
+        }
         return 0;
     }
     windows[num_windows] = window;
@@ -674,7 +695,7 @@
 {
     int i, j;
 
-    if (!_this) {
+    if (!_this || !surface) {
         return NULL;
     }
 
--- a/src/video/dummy/SDL_nullvideo.c	Sun May 28 21:56:07 2006 +0000
+++ b/src/video/dummy/SDL_nullvideo.c	Mon May 29 03:53:21 2006 +0000
@@ -118,8 +118,13 @@
 int
 DUMMY_VideoInit (_THIS)
 {
+    SDL_DisplayMode mode;
+
     SDL_AddBasicVideoDisplay (NULL);
 
+    SDL_zero(mode);
+    SDL_AddDisplayMode(0, &mode);
+
     /* We're done! */
     return 0;
 }