From 8d46c5298f0fcce7bdb52f3835b2fbbdc403dfe0 Mon Sep 17 00:00:00 2001 From: Holger Schemel Date: Tue, 18 Jul 2000 23:52:22 +0200 Subject: [PATCH] rnd-20000718-1-src --- INSTALL | 85 ----------------------- Makefile | 62 ----------------- src/Makefile | 17 +++-- src/init.c | 156 +++++++++++++++++++++++++++++++++++++++-- src/main.c | 192 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/main.h | 15 +++- src/sdl.c | 57 +++++++++++++++ src/sdl.h | 21 ++++++ src/tools.c | 17 +++++ 9 files changed, 461 insertions(+), 161 deletions(-) delete mode 100644 INSTALL delete mode 100644 Makefile create mode 100644 src/sdl.c create mode 100644 src/sdl.h diff --git a/INSTALL b/INSTALL deleted file mode 100644 index 697475a7..00000000 --- a/INSTALL +++ /dev/null @@ -1,85 +0,0 @@ - -Installation instructions for Rocks'n'Diamonds 1.2.0 -==================================================== - -Compilation ------------ - -If your system supports Linux/i386/ELF/libc5 executables (Linux package) -or if you run DOS/Windows (DOS package), you can directly use the included -precompiled binary. - -If you use a different system, just recompile the game: - -If you use Linux with gcc or DOS/Windows with djgpp, just try 'make' -which should work without problems. - -If you use SUN/Solaris with gcc and GNU make, try 'make solaris'. - -If the above doesn't work, edit the Makefile in the top level directory. -If it doesn't work either, edit the Makefile in the 'src' subdirectory. - -If you had to modify any Makefile to compile it, please drop me a note -about it to 'aeglos@valinor.owl.de'. Thanks! - - -Customization -------------- - -The following configuration options in the top level Makefile help -you to customize the game to your system and your environment: - -CC Choose your favorite ANSI C compiler. - Default is 'gcc'. - -PLATFORM Choose your platform, if auto detection fails. - Auto detection should work for Linux and DOS - (just type 'make'), on SUN/Solaris systems 'make solaris' - should work. Other systems may need additional editing - of 'src/Makefile' to set some additional compiler options. - -X11_PATH Specify the path to your X11 installation. Include files - and libraries are searched for at $(X11_PATH)/include and - $(X11_PATH)/lib, if you set this variables. If you don't - set this variable, your compiler must be able to find X11 - by itself, which works fine for Linux, for example. - -GAME_DIR Specify the directory where the program looks for all the - graphics, sounds, levels and high scores. If you leave this - commented out, the current directory ('.') is used, which - lets you use the game without installing it somewhere in - your system (although you have to 'cd' to the game directory - each time you want to play it). - -JOYSTICK Uncomment this line if your system does not support game - port hardware like joysticks (and has therefore no joystick - include file). Currently the game should work with joysticks - on Linux and FreeBSD. - -SOUNDS Uncomment this line if your system does not support audio - hardware. Currently the game should work with sound support - on Linux, FreeBSD, SUN/Solaris, HP-UX and most Unix system - that support '/dev/dsp' or '/dev/audio' devices. - -SCORE_ENTRIES Choose if you want to allow many entries in the high score - table for one player or exactly one entry. Systems with a - lot of users maybe want to limit high score entries to only - one entry for each player (and therefore set 'SCORE_ENTRIES' - to 'ONE_PER_NAME') where systems used by only one person - maybe want to use the default of 'MANY_PER_NAME' which is - automatically choosen if you leave everything commented out. - -Modifications of the Makefile in the directory 'src' are normally not needed. -If the game fails to compile out of the box, you may have to modify some -of the system variables there to get it to compile. - -SYSTEM May need to be set to some system dependend values. - -INCL, LIBS Maybe some more directories for include files and libraries - have to be added to this variables depending on your system. - - -If you have any comments, additions or modifications to the Makefile(s), -please send me mail: 'aeglos@valinor.owl.de'. Thanks! - -05-DEC-1998, Holger Schemel diff --git a/Makefile b/Makefile deleted file mode 100644 index d8c400de..00000000 --- a/Makefile +++ /dev/null @@ -1,62 +0,0 @@ -#=============================================================================# -# Makefile for Rocks'n'Diamonds 1.4.0 # -# (c) 1995-1999 Holger Schemel, aeglos@valinor.owl.de # -#=============================================================================# - -#-----------------------------------------------------------------------------# -# configuration section # -#-----------------------------------------------------------------------------# - -# specify your favorite ANSI C compiler -CC = gcc - -# explicitely choose your platform, if defaults doesn't work right -# needed for SUN/Solaris; Linux and DOS work fine with auto detection -# PLATFORM = solaris -# PLATFORM = unix -# PLATFORM = dos - -# specify path to X11 on your system -# if undefined, use system defaults (works with Linux/gcc/libc5) -X11_PATH = /usr/X11 - -# specify directory for read-only game data (like graphics, sounds, levels) -# default is '.', so you can play without installing game data somewhere -# RO_GAME_DIR = /usr/games - -# specify directory for writable game data (like highscore files) -# default is '.', so you can play without installing game data somewhere -# RW_GAME_DIR = /var/games - -# uncomment this if your system has no joystick include file -# JOYSTICK = -DNO_JOYSTICK - -# uncomment this if your system has no sound -# SOUNDS = -DNO_SOUNDS - -# choose if you want to allow many global score file entries for one player -# default is 'MANY_PER_NAME' -# when installing the game in a multi user environment, choose this -# SCORE_ENTRIES = ONE_PER_NAME -# when installing the game in a single user environment, choose this -# SCORE_ENTRIES = MANY_PER_NAME - -#-----------------------------------------------------------------------------# -# you should not need to change anything below # -#-----------------------------------------------------------------------------# - -.EXPORT_ALL_VARIABLES: - -MAKE = make - -SRC_DIR = src -MAKE_CMD = @$(MAKE) -C $(SRC_DIR) - -all: - $(MAKE_CMD) - -solaris: - $(MAKE_CMD) PLATFORM=solaris - -clean: - $(MAKE_CMD) clean diff --git a/src/Makefile b/src/Makefile index 2be4220a..044e136d 100644 --- a/src/Makefile +++ b/src/Makefile @@ -34,8 +34,11 @@ ifeq ($(PLATFORM),solaris) EXTRA_LIBS = -lnsl -lsocket -R$(XLIB_PATH) endif +SDL_CFLAGS := -DUSE_SDL_LIBRARY $(shell sdl-config --cflags) +SDL_LDFLAGS := -lIMG $(shell sdl-config --libs) + INCL = $(X11_INCL) -LIBS = $(X11_LIBS) -lX11 -lm $(EXTRA_LIBS) +LIBS = $(X11_LIBS) -lX11 -lm $(EXTRA_LIBS) $(SDL_LDFLAGS) endif @@ -58,14 +61,14 @@ CONFIG_GAME_DIR = $(CONFIG_RO_GAME_DIR) $(CONFIG_RW_GAME_DIR) CONFIG = $(CONFIG_GAME_DIR) $(CONFIG_SCORE_ENTRIES) $(SOUNDS) $(JOYSTICK) # OPTIONS = -DDEBUG -g -Wall -ansi -pedantic # only for debugging purposes -# OPTIONS = -DDEBUG -g -Wall # only for debugging purposes +OPTIONS = -DDEBUG -g -Wall # only for debugging purposes # OPTIONS = -O3 -Wall -ansi -pedantic # OPTIONS = -O3 -Wall -OPTIONS = -O3 +# OPTIONS = -O3 # SYSTEM = -DSYSV -Ae # may be needed for HP-UX -CFLAGS = $(OPTIONS) $(SYSTEM) $(INCL) $(CONFIG) +CFLAGS = $(OPTIONS) $(SDL_CFLAGS) $(SYSTEM) $(INCL) $(CONFIG) SRCS = main.c \ init.c \ @@ -86,7 +89,8 @@ SRCS = main.c \ image.c \ network.c \ netserv.c \ - msdos.c + msdos.c \ + sdl.c OBJS = main.o \ init.o \ @@ -107,7 +111,8 @@ OBJS = main.o \ image.o \ network.o \ netserv.o \ - msdos.o + msdos.o \ + sdl.o all: $(PROGNAME) diff --git a/src/init.c b/src/init.c index 78a587f5..f77bd79e 100644 --- a/src/init.c +++ b/src/init.c @@ -79,13 +79,16 @@ void OpenAll(int argc, char *argv[]) InitDisplay(); InitWindow(argc, argv); +#ifndef USE_SDL_LIBRARY XMapWindow(display, window); XFlush(display); +#endif InitGfx(); InitElementProperties(); /* initializes IS_CHAR() for el2gfx() */ InitLevelAndPlayerInfo(); + return; InitGadgets(); /* needs to know number of level series */ DrawMainMenu(); @@ -298,6 +301,16 @@ void InitJoysticks() void InitDisplay() { +#ifdef USE_SDL_LIBRARY + /* initialize SDL */ + if (SDL_Init(SDL_INIT_VIDEO) < 0) + Error(ERR_EXIT, "SDL_Init() failed: %s\n", SDL_GetError()); + + /* automatically cleanup SDL stuff after exit() */ + atexit(SDL_Quit); + +#else /* !USE_SDL_LIBRARY */ + #ifndef MSDOS XVisualInfo vinfo_template, *vinfo; int num_visuals; @@ -339,11 +352,27 @@ void InitDisplay() printf("Sorry, cannot get appropriate visual.\n"); exit(-1); } -#endif +#endif /* !MSDOS */ +#endif /* !USE_SDL_LIBRARY */ } void InitWindow(int argc, char *argv[]) { +#ifdef USE_SDL_LIBRARY + /* open SDL video output device (window or fullscreen mode) */ + if ((sdl_window = SDL_SetVideoMode(WIN_XSIZE, WIN_YSIZE, WIN_SDL_DEPTH, + SDL_HWSURFACE)) + == NULL) + Error(ERR_EXIT, "SDL_SetVideoMode() failed: %s\n", SDL_GetError()); + + /* set window and icon title */ + SDL_WM_SetCaption(WINDOW_TITLE_STRING, WINDOW_TITLE_STRING); + + /* select event types: initially no mouse motion events */ + SDL_EventState(SDL_MOUSEMOTION, SDL_IGNORE); + +#else /* !USE_SDL_LIBRARY */ + unsigned int border_width = 4; XGCValues gc_values; unsigned long gc_valuemask; @@ -458,14 +487,20 @@ void InitWindow(int argc, char *argv[]) gc_values.background = pen_bg; gc_valuemask = GCGraphicsExposures | GCForeground | GCBackground; gc = XCreateGC(display, window, gc_valuemask, &gc_values); +#endif /* !USE_SDL_LIBRARY */ } void InitGfx() { int i,j; + +#ifdef USE_SDL_LIBRARY + SDL_Surface *sdl_image_tmp; +#else GC copy_clipmask_gc; XGCValues clip_gc_values; unsigned long clip_gc_valuemask; +#endif #ifdef MSDOS static struct PictureFileInfo pic[NUM_PICTURES] = @@ -579,8 +614,6 @@ void InitGfx() #endif #endif - - LoadGfx(PIX_SMALLFONT,&pic[PIX_SMALLFONT]); DrawInitText(WINDOW_TITLE_STRING,20,FC_YELLOW); DrawInitText(COPYRIGHT_STRING,50,FC_RED); @@ -598,6 +631,85 @@ void InitGfx() debug_print_timestamp(0, "SUMMARY LOADING ALL GRAPHICS:"); #endif +#ifdef USE_SDL_LIBRARY + /* create some native image surfaces for double-buffer purposes */ + + /* create double-buffer surface for background image */ + if ((sdl_image_tmp = SDL_CreateRGBSurface(SDL_SWSURFACE, + WIN_XSIZE, WIN_YSIZE, + WIN_SDL_DEPTH, 0, 0, 0, 0)) + == NULL) + Error(ERR_EXIT, "SDL_CreateRGBSurface() failed: %s\n", SDL_GetError()); + + if ((sdl_pix[PIX_DB_BACK] = SDL_DisplayFormat(sdl_image_tmp)) == NULL) + Error(ERR_EXIT, "SDL_DisplayFormat() failed: %s\n", SDL_GetError()); + + SDL_FreeSurface(sdl_image_tmp); + + /* create double-buffer surface for door image */ + if ((sdl_image_tmp = SDL_CreateRGBSurface(SDL_SWSURFACE, + 3 * DXSIZE, DYSIZE + VYSIZE, + WIN_SDL_DEPTH, 0, 0, 0, 0)) + == NULL) + Error(ERR_EXIT, "SDL_CreateRGBSurface() failed: %s\n", SDL_GetError()); + + if ((sdl_pix[PIX_DB_DOOR] = SDL_DisplayFormat(sdl_image_tmp)) == NULL) + Error(ERR_EXIT, "SDL_DisplayFormat() failed: %s\n", SDL_GetError()); + + SDL_FreeSurface(sdl_image_tmp); + + /* create double-buffer surface for field image */ + if ((sdl_image_tmp = SDL_CreateRGBSurface(SDL_SWSURFACE, + FXSIZE, FYSIZE, + WIN_SDL_DEPTH, 0, 0, 0, 0)) + == NULL) + Error(ERR_EXIT, "SDL_CreateRGBSurface() failed: %s\n", SDL_GetError()); + + if ((sdl_pix[PIX_DB_FIELD] = SDL_DisplayFormat(sdl_image_tmp)) == NULL) + Error(ERR_EXIT, "SDL_DisplayFormat() failed: %s\n", SDL_GetError()); + + SDL_FreeSurface(sdl_image_tmp); + + /* initialize surface array to 'NULL' */ + for(i=0; i=0; i++) + { + for(j=0; jpicture_filename) @@ -708,6 +827,26 @@ void LoadGfx(int pos, struct PictureFileInfo *pic) debug_print_timestamp(1, NULL); /* initialize timestamp function */ #endif +#ifdef USE_SDL_LIBRARY + /* load image to temporary surface */ + if ((sdl_image_tmp = IMG_Load(filename)) == NULL) + Error(ERR_EXIT, "IMG_Load() failed: %s\n", SDL_GetError()); + + /* create native non-transparent surface for current image */ + if ((sdl_pix[pos] = SDL_DisplayFormat(sdl_image_tmp)) == NULL) + Error(ERR_EXIT, "SDL_DisplayFormat() failed: %s\n", 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 ((sdl_pix_masked[pos] = SDL_DisplayFormat(sdl_image_tmp)) == NULL) + Error(ERR_EXIT, "SDL_DisplayFormat() failed: %s\n", SDL_GetError()); + + /* free temporary surface */ + SDL_FreeSurface(sdl_image_tmp); + +#else /* !USE_SDL_LIBRARY */ + #ifdef USE_XPM_LIBRARY xpm_att[pos].valuemask = XpmCloseness; @@ -764,8 +903,10 @@ void LoadGfx(int pos, struct PictureFileInfo *pic) if (!pix[pos]) Error(ERR_EXIT, "cannot get graphics for '%s'", pic->picture_filename); +#endif /* !USE_SDL_LIBRARY */ } +#ifndef USE_SDL_LIBRARY /* zugehörige Maske laden (wenn vorhanden) */ if (pic->picture_with_mask) { @@ -807,6 +948,7 @@ void LoadGfx(int pos, struct PictureFileInfo *pic) if (!clipmask[pos]) Error(ERR_EXIT, "cannot get clipmask for '%s'", pic->picture_filename); } +#endif /* !USE_SDL_LIBRARY */ } void InitGadgets() diff --git a/src/main.c b/src/main.c index 94287fa0..2c0b95c3 100644 --- a/src/main.c +++ b/src/main.c @@ -38,6 +38,14 @@ XpmAttributes xpm_att[NUM_PICTURES]; Drawable drawto, drawto_field, backbuffer, fieldbuffer; Colormap cmap; +#ifdef USE_SDL_LIBRARY +SDL_Surface *sdl_window; +SDL_Surface *sdl_drawto, *sdl_drawto_field; +SDL_Surface *sdl_backbuffer, *sdl_fieldbuffer; +SDL_Surface *sdl_pix[NUM_PIXMAPS]; +SDL_Surface *sdl_pix_masked[NUM_PIXMAPS], *sdl_tile_masked[NUM_TILES]; +#endif + int sound_pipe[2]; int sound_device; char *sound_device_name = SOUND_DEVICE; @@ -563,6 +571,183 @@ char *element_info[] = */ }; + + +/* +-----------------------------------------------------------------------+ */ +/* | SDL TEST STUFF | */ +/* +-----------------------------------------------------------------------+ */ + +#ifdef USE_SDL_LIBRARY + +SDL_Surface *sdl_screen, *sdl_image_tmp, *sdl_image, *sdl_image_masked; +SDL_Surface *sdl_image2_tmp, *sdl_image2, *sdl_image2_masked; + +void TEST_SDL_BLIT_RECT(int x, int y) +{ + SDL_Rect rect_src, rect_dst; + + SDLCopyArea(sdl_pix_masked[PIX_HEROES], sdl_window, + 8 * TILEX, 8 * TILEY, TILEX, TILEY, x, y); + return; + + rect_src.x = 8 * TILEX; + rect_src.y = 8 * TILEY; + rect_src.w = TILEX; + rect_src.h = TILEY; + + rect_dst.x = x; + rect_dst.y = y; + rect_dst.w = TILEX; + rect_dst.h = TILEY; + + SDL_BlitSurface(sdl_image2_masked, &rect_src, sdl_screen, &rect_dst); + SDL_UpdateRect(sdl_screen, x, y, TILEX, TILEY); +} + +void TEST_SDL_INIT_DISPLAY() +{ + SDL_Rect rect_src, rect_dst; + + if (SDL_Init(SDL_INIT_VIDEO) < 0) + { + fprintf(stderr, "SDL_Init() failed: %s\n", SDL_GetError()); + exit(1); + } + + /* automatically cleanup SDL stuff after exit() */ + atexit(SDL_Quit); + + if ((sdl_screen = SDL_SetVideoMode(WIN_XSIZE, WIN_YSIZE, 16, SDL_HWSURFACE)) + == NULL) + { + fprintf(stderr, "SDL_SetVideoMode() failed: %s\n", SDL_GetError()); + exit(1); + } + + SDL_WM_SetCaption(WINDOW_TITLE_STRING, WINDOW_TITLE_STRING); + + if ((sdl_image_tmp = IMG_Load("graphics/RocksScreen.pcx")) == NULL) + { + fprintf(stderr, "IMG_Load() failed: %s\n", SDL_GetError()); + exit(1); + } + + sdl_image = SDL_DisplayFormat(sdl_image_tmp); + + SDL_SetColorKey(sdl_image_tmp, SDL_SRCCOLORKEY, + SDL_MapRGB(sdl_image_tmp->format, 0x00, 0x00, 0x00)); + sdl_image_masked = SDL_DisplayFormat(sdl_image_tmp); + + SDL_FreeSurface(sdl_image_tmp); + + if ((sdl_image2_tmp = IMG_Load("graphics/RocksHeroes.pcx")) == NULL) + { + fprintf(stderr, "IMG_Load() failed: %s\n", SDL_GetError()); + exit(1); + } + + sdl_image2 = SDL_DisplayFormat(sdl_image2_tmp); + SDL_FreeSurface(sdl_image2_tmp); + + sdl_image2_masked = SDL_DisplayFormat(sdl_image2); + SDL_SetColorKey(sdl_image2_masked, SDL_SRCCOLORKEY, + SDL_MapRGB(sdl_image2_masked->format, 0x00, 0x00, 0x00)); + + rect_src.x = 0; + rect_src.y = 0; + rect_src.w = sdl_image->w; + rect_src.h = sdl_image->h; + + rect_dst.x = 0; + rect_dst.y = 0; + rect_dst.w = sdl_image->w; + rect_dst.h = sdl_image->h; + + SDL_BlitSurface(sdl_image, &rect_src, sdl_screen, &rect_dst); + + /* + SDL_UpdateRect(sdl_screen, 0, 0, WIN_XSIZE, WIN_YSIZE); + */ + /* + SDL_UpdateRect(sdl_screen, 0, 0, 0, 0); + */ + SDL_Flip(sdl_screen); + + /* + SDL_Delay(5000); + */ +} + +void TEST_SDL_EVENT_LOOP() +{ + SDL_Event event; + int quit_loop = 0; + + SDL_EventState(SDL_MOUSEMOTION, SDL_IGNORE); + + while (!quit_loop && SDL_WaitEvent(&event) >=0) + { + /* hier werden die Ereignisse behandelt */ + switch(event.type) + { + case SDL_QUIT: + { + quit_loop = 1; + break; + } + + case SDL_MOUSEBUTTONDOWN: + { + int x = event.button.x; + int y = event.button.y; + + SDL_EventState(SDL_MOUSEMOTION, SDL_ENABLE); + + TEST_SDL_BLIT_RECT(x, y); + + printf("SDL_MOUSEBUTTONDOWN(%d, %d)\n", x, y); + break; + } + + case SDL_MOUSEBUTTONUP: + { + int x = event.button.x; + int y = event.button.y; + + SDL_EventState(SDL_MOUSEMOTION, SDL_IGNORE); + + printf("SDL_MOUSEBUTTONUP(%d, %d)\n", x, y); + break; + } + + case SDL_MOUSEMOTION: + { + int x = event.motion.x; + int y = event.motion.y; + + TEST_SDL_BLIT_RECT(x, y); + + printf("SDL_MOUSEMOTION(%d, %d)\n", x, y); + break; + } + + default: + break; + } + } + + SDL_FreeSurface(sdl_image); + SDL_Quit(); +} + +#endif /* USE_SDL_LIBRARY */ + +/* +-----------------------------------------------------------------------+ */ +/* | SDL TEST STUFF | */ +/* +-----------------------------------------------------------------------+ */ + + + int main(int argc, char *argv[]) { program_name = (strrchr(argv[0],'/') ? strrchr(argv[0],'/') + 1 : argv[0]); @@ -573,6 +758,13 @@ int main(int argc, char *argv[]) GetOptions(argv); OpenAll(argc,argv); + +#ifdef USE_SDL_LIBRARY + TEST_SDL_BLIT_RECT((WIN_XSIZE - TILEX)/2, (WIN_YSIZE - TILEY)/2); + TEST_SDL_EVENT_LOOP(); + exit(0); +#endif + EventLoop(); CloseAllAndExit(0); exit(0); /* to keep compilers happy */ diff --git a/src/main.h b/src/main.h index add49d76..4c1d57d5 100644 --- a/src/main.h +++ b/src/main.h @@ -40,6 +40,10 @@ #include "msdos.h" #endif /* MSDOS */ +#ifdef USE_SDL_LIBRARY +#include "sdl.h" +#endif + #ifdef DEBUG #define DEBUG_TIMING 0 #endif @@ -54,6 +58,7 @@ typedef unsigned char byte; #define WIN_XSIZE 672 #define WIN_YSIZE 560 +#define WIN_SDL_DEPTH 16 /* !!! change this !!! */ #ifndef MSDOS #define WIN_XPOS 0 #define WIN_YPOS 0 @@ -473,6 +478,14 @@ extern XpmAttributes xpm_att[]; extern Drawable drawto, drawto_field, backbuffer, fieldbuffer; extern Colormap cmap; +#ifdef USE_SDL_LIBRARY +extern SDL_Surface *sdl_window; +extern SDL_Surface *sdl_drawto, *sdl_drawto_field; +extern SDL_Surface *sdl_backbuffer, *sdl_fieldbuffer; +extern SDL_Surface *sdl_pix[]; +extern SDL_Surface *sdl_pix_masked[], *sdl_tile_masked[]; +#endif + extern int sound_pipe[2]; extern int sound_device; extern char *sound_device_name; @@ -1662,7 +1675,7 @@ extern char *element_info[]; #define TAPES_DIRECTORY "tapes" #define SCORES_DIRECTORY "scores" -#define PROGRAM_VERSION_STRING "1.4.0" +#define PROGRAM_VERSION_STRING "1.4.0 SDL" #define PROGRAM_TITLE_STRING "Rocks'n'Diamonds" #define PROGRAM_AUTHOR_STRING "Holger Schemel" #define WINDOW_TITLE_STRING PROGRAM_TITLE_STRING " " PROGRAM_VERSION_STRING diff --git a/src/sdl.c b/src/sdl.c new file mode 100644 index 00000000..d8100125 --- /dev/null +++ b/src/sdl.c @@ -0,0 +1,57 @@ +/*********************************************************** +* Rocks'n'Diamonds -- McDuffin Strikes Back! * +*----------------------------------------------------------* +* ©1995 Artsoft Development * +* Holger Schemel * +* 33659 Bielefeld-Senne * +* Telefon: (0521) 493245 * +* eMail: aeglos@valinor.owl.de * +* aeglos@uni-paderborn.de * +* q99492@pbhrzx.uni-paderborn.de * +*----------------------------------------------------------* +* sdl.c * +***********************************************************/ + +#ifdef USE_SDL_LIBRARY + +#include "main.h" + +inline void SDLCopyArea(SDL_Surface *src_surface, SDL_Surface *dst_surface, + int src_x, int src_y, + int width, int height, + int dst_x, int dst_y) +{ + SDL_Rect src_rect, dst_rect; + + src_rect.x = src_x; + src_rect.y = src_y; + src_rect.w = width; + src_rect.h = height; + + dst_rect.x = dst_x; + dst_rect.y = dst_y; + dst_rect.w = width; + dst_rect.h = height; + + SDL_BlitSurface(src_surface, &src_rect, dst_surface, &dst_rect); + SDL_UpdateRect(dst_surface, dst_x, dst_y, width, height); +} + +inline void SDLFillRectangle(SDL_Surface *surface, int x, int y, + int width, int height, unsigned int color) +{ + SDL_Rect rect; + unsigned int color_r = (color >> 2) && 0xff; + unsigned int color_g = (color >> 1) && 0xff; + unsigned int color_b = (color >> 0) && 0xff; + + rect.x = x; + rect.y = y; + rect.w = width; + rect.h = height; + + SDL_FillRect(surface, &rect, + SDL_MapRGB(surface->format, color_r, color_g, color_b)); +} + +#endif /* USE_SDL_LIBRARY */ diff --git a/src/sdl.h b/src/sdl.h new file mode 100644 index 00000000..9bfcff3b --- /dev/null +++ b/src/sdl.h @@ -0,0 +1,21 @@ +/*********************************************************** +* Rocks'n'Diamonds -- McDuffin Strikes Back! * +*----------------------------------------------------------* +* ©1995 Artsoft Development * +* Holger Schemel * +* 33659 Bielefeld-Senne * +* Telefon: (0521) 493245 * +* eMail: aeglos@valinor.owl.de * +* aeglos@uni-paderborn.de * +* q99492@pbhrzx.uni-paderborn.de * +*----------------------------------------------------------* +* sdl.h * +***********************************************************/ + +#include +#include + +inline void SDLCopyArea(SDL_Surface *, SDL_Surface *, + int, int, int, int, int, int); +inline void SDLFillRectangle(SDL_Surface *, int, int, + int, int, unsigned int); diff --git a/src/tools.c b/src/tools.c index 775bc0dc..0c9cd176 100644 --- a/src/tools.c +++ b/src/tools.c @@ -338,6 +338,15 @@ int getFontHeight(int font_size, int font_type) void DrawInitText(char *text, int ypos, int color) { +#ifdef USE_SDL_LIBRARY + if (sdl_window && sdl_pix[PIX_SMALLFONT]) + { + SDLFillRectangle(sdl_window, 0, ypos, WIN_XSIZE, FONT2_YSIZE, 0x000000); + DrawTextExt(window, gc, (WIN_XSIZE - strlen(text) * FONT2_XSIZE)/2, + ypos,text,FS_SMALL,color); + SDL_Flip(sdl_window); + } +#else if (display && window && pix[PIX_SMALLFONT]) { XFillRectangle(display, window, gc, 0, ypos, WIN_XSIZE, FONT2_YSIZE); @@ -345,6 +354,7 @@ void DrawInitText(char *text, int ypos, int color) ypos,text,FS_SMALL,color); XFlush(display); } +#endif } void DrawTextFCentered(int y, int font_type, char *format, ...) @@ -447,8 +457,15 @@ void DrawTextExt(Drawable d, GC gc, int x, int y, 0, 0, font_width, font_height, dest_x, dest_y); } else + { +#ifdef USE_SDL_LIBRARY + SDLCopyArea(sdl_pix[font_pixmap], sdl_window, + src_x, src_y, font_width, font_height, dest_x, dest_y); +#else XCopyArea(display, pix[font_pixmap], d, gc, src_x, src_y, font_width, font_height, dest_x, dest_y); +#endif + } } x += font_width; -- 2.34.1