Mercurial > sdl-ios-xcode
diff src/SDL_compat.c @ 1667:1fddae038bc8 SDL-1.3
Implemented many compatibility functions
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Mon, 29 May 2006 03:53:21 +0000 |
parents | |
children | 4da1ee79c9af |
line wrap: on
line diff
--- /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: */