rnd-20020407-2-src
[rocksndiamonds.git] / src / libgame / system.c
index 497f7e0b26741e90efd50e7b90996960a0804757..2ffce00752cf5c9348f839c7d3b8381a5e8be7e3 100644 (file)
@@ -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
 }