***********************************************************/
#include "system.h"
+#include "sound.h"
#include "misc.h"
inline void SDLInitVideoDisplay(void)
{
/* initialize SDL video */
- if (SDL_Init(SDL_INIT_VIDEO) < 0)
- Error(ERR_EXIT, "SDL_Init() failed: %s", SDL_GetError());
+ if (SDL_InitSubSystem(SDL_INIT_VIDEO) < 0)
+ Error(ERR_EXIT, "SDL_InitSubSystem() failed: %s", SDL_GetError());
/* set default SDL depth */
video.default_depth = SDL_GetVideoInfo()->vfmt->BitsPerPixel;
-
- /* set exit function to automatically cleanup SDL stuff after exit() */
- atexit(SDL_Quit);
}
-inline void SDLInitVideoBuffer(DrawBuffer *backbuffer, DrawWindow *window,
+inline void SDLInitVideoBuffer(DrawBuffer **backbuffer, DrawWindow **window,
boolean fullscreen)
{
/* open SDL video output device (window or fullscreen mode) */
*window = CreateBitmap(video.width, video.height, video.depth);
}
-inline boolean SDLSetVideoMode(DrawBuffer *backbuffer, boolean fullscreen)
+inline boolean SDLSetVideoMode(DrawBuffer **backbuffer, boolean fullscreen)
{
boolean success = TRUE;
- int surface_flags = SDL_HWSURFACE | (fullscreen ? SDL_FULLSCREEN : 0);
+ int surface_flags_fullscreen = SURFACE_FLAGS | SDL_FULLSCREEN;
+ int surface_flags_window = SURFACE_FLAGS;
+ SDL_Surface *new_surface = NULL;
+
+ if (*backbuffer == NULL)
+ *backbuffer = CreateBitmapStruct();
if (fullscreen && !video.fullscreen_enabled && video.fullscreen_available)
{
/* switch display to fullscreen mode, if available */
- DrawWindow window_old = *backbuffer;
- DrawWindow window_new = CreateBitmapStruct();
-
- if ((window_new->surface = SDL_SetVideoMode(video.width, video.height,
- video.depth, surface_flags))
+ if ((new_surface = SDL_SetVideoMode(video.width, video.height,
+ video.depth, surface_flags_fullscreen))
== NULL)
{
/* switching display to fullscreen mode failed */
}
else
{
- if (window_old)
- FreeBitmap(window_old);
- *backbuffer = window_new;
+ (*backbuffer)->surface = new_surface;
video.fullscreen_enabled = TRUE;
success = TRUE;
}
}
- if ((!fullscreen && video.fullscreen_enabled) || !*backbuffer)
+ if ((!fullscreen && video.fullscreen_enabled) || new_surface == NULL)
{
/* switch display to window mode */
- DrawWindow window_old = *backbuffer;
- DrawWindow window_new = CreateBitmapStruct();
-
- if ((window_new->surface = SDL_SetVideoMode(video.width, video.height,
- video.depth, surface_flags))
+ if ((new_surface = SDL_SetVideoMode(video.width, video.height,
+ video.depth, surface_flags_window))
== NULL)
{
/* switching display to window mode failed -- should not happen */
}
else
{
- if (window_old)
- FreeBitmap(window_old);
- *backbuffer = window_new;
+ (*backbuffer)->surface = new_surface;
video.fullscreen_enabled = FALSE;
success = TRUE;
return success;
}
-inline void SDLCopyArea(Bitmap src_bitmap, Bitmap dst_bitmap,
+inline void SDLCopyArea(Bitmap *src_bitmap, Bitmap *dst_bitmap,
int src_x, int src_y,
int width, int height,
int dst_x, int dst_y, int copy_mode)
{
- Bitmap real_dst_bitmap = (dst_bitmap == window ? backbuffer : dst_bitmap);
+ Bitmap *real_dst_bitmap = (dst_bitmap == window ? backbuffer : dst_bitmap);
SDL_Rect src_rect, dst_rect;
src_rect.x = src_x;
SDL_UpdateRect(backbuffer->surface, dst_x, dst_y, width, height);
}
-inline void SDLFillRectangle(Bitmap dst_bitmap, int x, int y,
+inline void SDLFillRectangle(Bitmap *dst_bitmap, int x, int y,
int width, int height, unsigned int color)
{
- Bitmap real_dst_bitmap = (dst_bitmap == window ? backbuffer : dst_bitmap);
+ Bitmap *real_dst_bitmap = (dst_bitmap == window ? backbuffer : dst_bitmap);
SDL_Rect rect;
unsigned int color_r = (color >> 16) && 0xff;
unsigned int color_g = (color >> 8) && 0xff;
sge_Line(Surface, x1, y1, x2, y2, SDL_MapRGB(Surface->format, R, G, B));
}
+Bitmap *SDLLoadImage(char *filename)
+{
+ Bitmap *new_bitmap = CreateBitmapStruct();
+ SDL_Surface *sdl_image_tmp;
+
+ /* load image to temporary surface */
+ if ((sdl_image_tmp = IMG_Load(filename)) == NULL)
+ Error(ERR_EXIT, "IMG_Load() failed: %s", SDL_GetError());
+
+ /* create native non-transparent surface for current image */
+ if ((new_bitmap->surface = SDL_DisplayFormat(sdl_image_tmp)) == NULL)
+ Error(ERR_EXIT, "SDL_DisplayFormat() failed: %s", SDL_GetError());
+
+ /* create native transparent surface for current image */
+ SDL_SetColorKey(sdl_image_tmp, SDL_SRCCOLORKEY,
+ SDL_MapRGB(sdl_image_tmp->format, 0x00, 0x00, 0x00));
+ if ((new_bitmap->surface_masked = SDL_DisplayFormat(sdl_image_tmp)) == NULL)
+ Error(ERR_EXIT, "SDL_DisplayFormat() failed: %s", SDL_GetError());
+
+ /* free temporary surface */
+ SDL_FreeSurface(sdl_image_tmp);
+
+ return new_bitmap;
+}
+
/* ========================================================================= */
/* audio functions */
/* ========================================================================= */
-inline boolean SDLOpenAudio(void)
+inline void SDLOpenAudio(void)
{
- if (SDL_Init(SDL_INIT_AUDIO) < 0)
+ if (SDL_InitSubSystem(SDL_INIT_AUDIO) < 0)
{
- Error(ERR_WARN, "SDL_Init() failed: %s", SDL_GetError());
- return FALSE;
+ Error(ERR_WARN, "SDL_InitSubSystem() failed: %s", SDL_GetError());
+ return;
}
- if (Mix_OpenAudio(22050, AUDIO_S16, 2, 512) < 0)
+ if (Mix_OpenAudio(DEFAULT_AUDIO_SAMPLE_RATE, AUDIO_S16,
+ AUDIO_STEREO_CHANNELS,
+ DEFAULT_AUDIO_FRAGMENT_SIZE) < 0)
{
Error(ERR_WARN, "Mix_OpenAudio() failed: %s", SDL_GetError());
- return FALSE;
+ return;
}
- Mix_Volume(-1, SDL_MIX_MAXVOLUME / 4);
- Mix_VolumeMusic(SDL_MIX_MAXVOLUME / 4);
+ audio.sound_available = TRUE;
+ audio.music_available = TRUE;
+ audio.loops_available = TRUE;
+ audio.sound_enabled = TRUE;
+
+ /* determine number of available channels */
+ audio.channels = Mix_AllocateChannels(MIX_CHANNELS);
+
+ if (!audio.mods_available) /* reserve first channel for music loops */
+ {
+ if (Mix_ReserveChannels(1) == 1)
+ audio.music_channel = 0;
+ else
+ audio.music_available = FALSE;
+ }
- return TRUE;
+ Mix_Volume(-1, SOUND_MAX_VOLUME);
+ Mix_VolumeMusic(SOUND_MAX_VOLUME);
}
inline void SDLCloseAudio(void)