Changeset - r443:d725253d3289
[Not reviewed]
master
0 1 0
tron - 20 years ago 2004-11-17 07:57:28
tron@openttd.org
(svn r652) Factorise special case for MorphOS regarding signal() handling
1 file changed with 5 insertions and 5 deletions:
sdl.c
5
5
0 comments (0 inline, 0 general)
sdl.c
Show inline comments
 
#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
 
#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.
 

	
 
#endif
 

	
 

	
 
#ifdef UNIX
 
static void SdlAbort(int sig)
 
{
 
	/* Own hand-made parachute for the cases of failed assertions. */
 
	SDL_CALL SDL_Quit();
 
}
 
#endif
 

	
 

	
 
static char *SdlOpen(uint32 x)
 
{
 
#if defined(DYNAMICALLY_LOADED_SDL) && defined(WIN32)
 
	{
 
		char *s = LoadSdlDLL();
 
		if (s != NULL) return s;
 
	}
 
#endif
 
	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)
 
			return SDL_CALL SDL_GetError();
 
	}
 

	
 
#ifdef UNIX
 
	signal(SIGABRT, SdlAbort);
 
#endif
 

	
 
	return NULL;
 
}
 

	
 
static void SdlClose(uint32 x)
 
{
 
	if (x != 0)
 
		SDL_CALL SDL_QuitSubSystem(x);
 
	if (--_sdl_usage == 0) {
 
		SDL_CALL SDL_Quit();
 
		#ifdef UNIX
 
			#ifndef __MORPHOS__
 
				signal(SIGABRT, SIG_DFL);
 
			#else
 
				signal(SIGABRT, (void (*)(int))0);
 
			#endif
 
		signal(SIGABRT, SIG_DFL);
 
		#endif
 
	}
 
}
 

	
 
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)
0 comments (0 inline, 0 general)