X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Flibgame%2Fsystem.c;h=2ffce00752cf5c9348f839c7d3b8381a5e8be7e3;hp=497f7e0b26741e90efd50e7b90996960a0804757;hb=066b410c0573fe64a1783116daf9d64883e9f03e;hpb=a1bc27d0855dc6fa72c4c361fc1671b2dcc6547b diff --git a/src/libgame/system.c b/src/libgame/system.c index 497f7e0b..2ffce007 100644 --- a/src/libgame/system.c +++ b/src/libgame/system.c @@ -40,8 +40,8 @@ struct ArtworkInfo artwork; struct JoystickInfo joystick; struct SetupInfo setup; -struct LevelDirInfo *leveldir_first = NULL; -struct LevelDirInfo *leveldir_current = NULL; +LevelDirTree *leveldir_first = NULL; +LevelDirTree *leveldir_current = NULL; int level_nr; Display *display = NULL; @@ -112,18 +112,11 @@ void ClosePlatformDependantStuff(void) void InitProgramInfo(char *unix_userdata_directory, char *program_title, char *window_title, char *icon_title, - char *x11_icon_basename, char *x11_iconmask_basename, - char *msdos_pointer_basename, + char *x11_icon_filename, char *x11_iconmask_filename, + char *msdos_pointer_filename, char *cookie_prefix, char *filename_prefix, int program_version) { - char *x11_icon_filename = - getPath2(options.graphics_directory, x11_icon_basename); - char *x11_iconmask_filename = - getPath2(options.graphics_directory, x11_iconmask_basename); - char *msdos_pointer_filename = - getPath2(options.graphics_directory, msdos_pointer_basename); - #if defined(PLATFORM_UNIX) program.userdata_directory = unix_userdata_directory; #else @@ -215,6 +208,7 @@ inline void CloseVideoDisplay(void) #if defined(TARGET_SDL) SDL_QuitSubSystem(SDL_INIT_VIDEO); #else + if (display) XCloseDisplay(display); #endif @@ -287,7 +281,7 @@ inline Bitmap *CreateBitmap(int width, int height, int depth) return new_bitmap; } -inline void FreeBitmap(Bitmap *bitmap) +inline static void FreeBitmapPointers(Bitmap *bitmap) { if (bitmap == NULL) return; @@ -304,10 +298,29 @@ inline void FreeBitmap(Bitmap *bitmap) XFreePixmap(display, bitmap->clip_mask); if (bitmap->stored_clip_gc) XFreeGC(display, bitmap->stored_clip_gc); + /* the other GCs are only pointers to GCs used elsewhere */ #endif if (bitmap->source_filename) free(bitmap->source_filename); +} + +inline void TransferBitmapPointers(Bitmap *src_bitmap, Bitmap *dst_bitmap) +{ + if (src_bitmap == NULL || dst_bitmap == NULL) + return; + + FreeBitmapPointers(dst_bitmap); + + *dst_bitmap = *src_bitmap; +} + +inline void FreeBitmap(Bitmap *bitmap) +{ + if (bitmap == NULL) + return; + + FreeBitmapPointers(bitmap); free(bitmap); } @@ -634,20 +647,76 @@ Bitmap *LoadImage(char *filename) new_bitmap = X11LoadImage(filename); #endif + new_bitmap->source_filename = getStringCopy(filename); + return new_bitmap; } Bitmap *LoadCustomImage(char *basename) { - char *filename = getStringCopy(getCustomImageFilename(basename)); + char *filename = getCustomImageFilename(basename); Bitmap *new_bitmap; + if (filename == NULL) + Error(ERR_EXIT, "LoadCustomImage(): cannot find file '%s'", basename); + if ((new_bitmap = LoadImage(filename)) == NULL) Error(ERR_EXIT, "LoadImage() failed: %s", GetError()); - new_bitmap->source_filename = filename; + return new_bitmap; +} + +Bitmap *ReloadCustomImage(Bitmap **bitmap, char *basename) +{ + char *filename = getCustomImageFilename(basename); + Bitmap *old_bitmap = *bitmap; + Bitmap *new_bitmap; + + if (filename == NULL) /* (should never happen) */ + { + Error(ERR_WARN, "ReloadCustomImage(): cannot find file '%s'", basename); + return NULL; + } + + if (strcmp(filename, old_bitmap->source_filename) == 0) + { + /* The old and new image are the same (have the same filename and path). + This usually means that this image does not exist in this graphic set + and a fallback to the existing image is done. */ + + return NULL; + } + + if ((new_bitmap = LoadImage(filename)) == NULL) + { + Error(ERR_WARN, "LoadImage() failed: %s", GetError()); + return NULL; + } + + if (old_bitmap->width != new_bitmap->width || + old_bitmap->height != new_bitmap->height) + { + Error(ERR_WARN, "ReloadCustomImage: new image has wrong dimensions"); + FreeBitmap(new_bitmap); + return NULL; + } + +#if 0 + /* copy filename for new image */ + free(old_bitmap->source_filename); + old_bitmap->source_filename = getStringCopy(filename); + /* copy bitmap data for new image */ + BlitBitmap(new_bitmap, old_bitmap, 0,0, + old_bitmap->width, old_bitmap->height, 0,0); + + FreeBitmap(new_bitmap); +#else + /* + *bitmap = new_bitmap; + */ return new_bitmap; +#endif }