#include "stdafx.h"
#if defined(WITH_SDL)
#include "ttd.h"
#include "gfx.h"
#include "sound.h"
#include "window.h"
#include <SDL.h>
#include "player.h"
#include "hal.h"
#ifdef UNIX
#include <signal.h>
#ifdef __MORPHOS__
#define SIG_DFL (void (*)(int))0
#endif
#define DYNAMICALLY_LOADED_SDL
static SDL_Surface *_sdl_screen;
static int _sdl_usage;
static bool _all_modes;
#define MAX_DIRTY_RECTS 100
static SDL_Rect _dirty_rects[MAX_DIRTY_RECTS];
static int _num_dirty_rects;
#define SDL_CALL
#if defined(DYNAMICALLY_LOADED_SDL) && defined(WIN32)
bool LoadLibraryList(void **proc, const char *dll);
typedef struct {
int (SDLCALL *SDL_Init)(Uint32);
int (SDLCALL *SDL_InitSubSystem)(Uint32);
char *(SDLCALL *SDL_GetError)();
void (SDLCALL *SDL_QuitSubSystem)(Uint32);
void (SDLCALL *SDL_UpdateRect)(SDL_Surface *, Sint32, Sint32, Uint32, Uint32);
void (SDLCALL *SDL_UpdateRects)(SDL_Surface *, int, SDL_Rect *);
int (SDLCALL *SDL_SetColors)(SDL_Surface *, SDL_Color *, int, int);
void (SDLCALL *SDL_WM_SetCaption)(const char *, const char *);
int (SDLCALL *SDL_ShowCursor)(int);
void (SDLCALL *SDL_FreeSurface)(SDL_Surface *);
int (SDLCALL *SDL_PollEvent)(SDL_Event *);
void (SDLCALL *SDL_WarpMouse)(Uint16, Uint16);
uint32 (SDLCALL *SDL_GetTicks)();
int (SDLCALL *SDL_OpenAudio)(SDL_AudioSpec *, SDL_AudioSpec*);
void (SDLCALL *SDL_PauseAudio)(int);
void (SDLCALL *SDL_CloseAudio)();
int (SDLCALL *SDL_LockSurface)(SDL_Surface*);
void (SDLCALL *SDL_UnlockSurface)(SDL_Surface*);
SDLMod (SDLCALL *SDL_GetModState)();
void (SDLCALL *SDL_Delay)(Uint32);
void (SDLCALL *SDL_Quit)();
SDL_Surface *(SDLCALL *SDL_SetVideoMode)(int, int, int, Uint32);
int (SDLCALL *SDL_EnableKeyRepeat)(int, int);
void (SDLCALL *SDL_EnableUNICODE)(int);
void (SDLCALL *SDL_VideoDriverName)(char *, int);
SDL_Rect **(SDLCALL *SDL_ListModes)(void *, int);
Uint8 *(SDLCALL *SDL_GetKeyState)(int *);
} SDLProcs;
@@ -104,101 +108,97 @@ static char *LoadSdlDLL(void)
return NULL;
}
#undef SDL_CALL
#define SDL_CALL _proc.
static void SdlAbort(int sig)
{
/* Own hand-made parachute for the cases of failed assertions. */
SDL_CALL SDL_Quit();
static char *SdlOpen(uint32 x)
char *s = LoadSdlDLL();
if (s != NULL) return s;
if (_sdl_usage++ == 0) {
if (SDL_CALL SDL_Init(x) == -1)
return SDL_CALL SDL_GetError();
} else if (x != 0) {
if (SDL_CALL SDL_InitSubSystem(x) == -1)
signal(SIGABRT, SdlAbort);
static void SdlClose(uint32 x)
if (x != 0)
SDL_CALL SDL_QuitSubSystem(x);
if (--_sdl_usage == 0) {
#ifndef __MORPHOS__
signal(SIGABRT, SIG_DFL);
#else
signal(SIGABRT, (void (*)(int))0);
static void SdlVideoMakeDirty(int left, int top, int width, int height)
// printf("(%d,%d)-(%d,%d)\n", left, top, width, height);
// _pixels_redrawn += width*height;
if (_num_dirty_rects < MAX_DIRTY_RECTS) {
_dirty_rects[_num_dirty_rects].x = left;
_dirty_rects[_num_dirty_rects].y = top;
_dirty_rects[_num_dirty_rects].w = width;
_dirty_rects[_num_dirty_rects].h = height;
_num_dirty_rects++;
static SDL_Color pal[256];
static void UpdatePalette(uint start, uint end)
uint i;
byte *b;
for (i = start, b = _cur_palette + start * 3; i != end; i++, b += 3) {
pal[i].r = b[0];
pal[i].g = b[1];
pal[i].b = b[2];
pal[i].unused = b[3];
SDL_CALL SDL_SetColors(_sdl_screen, pal, start, end);
static void InitPalette(void)
UpdatePalette(0, 256);
static void CheckPaletteAnim(void)
if(_pal_last_dirty != -1) {
UpdatePalette(_pal_first_dirty, _pal_last_dirty + 1);
_pal_last_dirty = -1;
static void DrawSurfaceToScreen(void)
Status change: