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;
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
#if defined(TARGET_SDL)
SDL_QuitSubSystem(SDL_INIT_VIDEO);
#else
+
if (display)
XCloseDisplay(display);
#endif
return new_bitmap;
}
-inline void FreeBitmap(Bitmap *bitmap)
+inline static void FreeBitmapPointers(Bitmap *bitmap)
{
if (bitmap == NULL)
return;
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);
}
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
}