fixed bug when changing between graphic sets with different tile size
[rocksndiamonds.git] / src / libgame / image.c
index 36fd184aea85bf46c777755c73c2132f5e193f6d..799b28bb926cd2e07960aba5a744a6c36e1b3195 100644 (file)
@@ -1,15 +1,13 @@
-/***********************************************************
-* Artsoft Retro-Game Library                               *
-*----------------------------------------------------------*
-* (c) 1994-2006 Artsoft Entertainment                      *
-*               Holger Schemel                             *
-*               Detmolder Strasse 189                      *
-*               33604 Bielefeld                            *
-*               Germany                                    *
-*               e-mail: info@artsoft.org                   *
-*----------------------------------------------------------*
-* image.c                                                  *
-***********************************************************/
+// ============================================================================
+// Artsoft Retro-Game Library
+// ----------------------------------------------------------------------------
+// (c) 1995-2014 by Artsoft Entertainment
+//                         Holger Schemel
+//                 info@artsoft.org
+//                 http://www.artsoft.org/
+// ----------------------------------------------------------------------------
+// image.c
+// ============================================================================
 
 #include "image.h"
 #include "misc.h"
@@ -21,60 +19,58 @@ struct ImageInfo
   char *source_filename;
   int num_references;
 
-  Bitmap *bitmap;
+  Bitmap *bitmaps[NUM_IMG_BITMAP_POINTERS];
 
   int original_width;                  /* original image file width */
   int original_height;                 /* original image file height */
 
   boolean contains_small_images;       /* set after adding small images */
   boolean scaled_up;                   /* set after scaling up */
+
+  int game_tile_size;                  /* size of in-game sized bitmap */
 };
 typedef struct ImageInfo ImageInfo;
 
 static struct ArtworkListInfo *image_info = NULL;
 
-#if 1
 static void *Load_Image(char *filename)
-#else
-static void *Load_PCX(char *filename)
-#endif
 {
-  ImageInfo *img_info;
-
-#if 0
-  printf("::: loading PCX file '%s'\n", filename);
-#endif
+  ImageInfo *img_info = checked_calloc(sizeof(ImageInfo));
 
-  img_info = checked_calloc(sizeof(ImageInfo));
-
-  if ((img_info->bitmap = LoadImage(filename)) == NULL)
+  if ((img_info->bitmaps[IMG_BITMAP_STANDARD] = LoadImage(filename)) == NULL)
   {
     Error(ERR_WARN, "cannot load image file '%s': LoadImage() failed: %s",
          filename, GetError());
+
     free(img_info);
+
     return NULL;
   }
 
   img_info->source_filename = getStringCopy(filename);
 
-  img_info->original_width  = img_info->bitmap->width;
-  img_info->original_height = img_info->bitmap->height;
+  img_info->original_width  = img_info->bitmaps[IMG_BITMAP_STANDARD]->width;
+  img_info->original_height = img_info->bitmaps[IMG_BITMAP_STANDARD]->height;
 
   img_info->contains_small_images = FALSE;
   img_info->scaled_up = FALSE;
 
+  img_info->game_tile_size = 0;                // will be set later
+
   return img_info;
 }
 
 static void FreeImage(void *ptr)
 {
   ImageInfo *image = (ImageInfo *)ptr;
+  int i;
 
   if (image == NULL)
     return;
 
-  if (image->bitmap)
-    FreeBitmap(image->bitmap);
+  for (i = 0; i < NUM_IMG_BITMAPS; i++)
+    if (image->bitmaps[i])
+      FreeBitmap(image->bitmaps[i]);
 
   if (image->source_filename)
     free(image->source_filename);
@@ -108,11 +104,11 @@ static ImageInfo *getImageInfoEntryFromImageID(int pos)
   return img_info[list_pos];
 }
 
-Bitmap *getBitmapFromImageID(int pos)
+Bitmap **getBitmapsFromImageID(int pos)
 {
   ImageInfo *img_info = getImageInfoEntryFromImageID(pos);
 
-  return (img_info != NULL ? img_info->bitmap : NULL);
+  return (img_info != NULL ? img_info->bitmaps : NULL);
 }
 
 int getOriginalImageWidthFromImageID(int pos)
@@ -235,20 +231,12 @@ void InitImageList(struct ConfigInfo *config_list, int num_file_list_entries,
 
   /* ---------- initialize artwork loading/freeing functions ---------- */
 
-#if 1
   image_info->load_artwork = Load_Image;
-#else
-  image_info->load_artwork = Load_PCX;
-#endif
   image_info->free_artwork = FreeImage;
 }
 
 void ReloadCustomImages()
 {
-#if 0
-  printf("::: reloading images '%s' ...\n", artwork.gfx_current_identifier);
-#endif
-
   print_timestamp_init("ReloadCustomImages");
 
   LoadArtworkConfig(image_info);
@@ -260,17 +248,29 @@ void ReloadCustomImages()
   print_timestamp_done("ReloadCustomImages");
 }
 
-void CreateImageWithSmallImages(int pos, int zoom_factor)
+void CreateImageWithSmallImages(int pos, int zoom_factor, int tile_size)
 {
   ImageInfo *img_info = getImageInfoEntryFromImageID(pos);
 
-  if (img_info == NULL || img_info->contains_small_images)
+  if (img_info == NULL)
     return;
 
-  CreateBitmapWithSmallBitmaps(img_info->bitmap, zoom_factor);
+  if (img_info->contains_small_images)
+  {
+    if (img_info->game_tile_size != gfx.game_tile_size)
+      ReCreateGameTileSizeBitmap(img_info->bitmaps);
+
+    img_info->game_tile_size = gfx.game_tile_size;
+
+    return;
+  }
+
+  CreateBitmapWithSmallBitmaps(img_info->bitmaps, zoom_factor, tile_size);
 
   img_info->contains_small_images = TRUE;
-  img_info->scaled_up = TRUE;
+  img_info->scaled_up = TRUE;                  // scaling was also done here
+
+  img_info->game_tile_size = gfx.game_tile_size;
 }
 
 void ScaleImage(int pos, int zoom_factor)
@@ -281,7 +281,7 @@ void ScaleImage(int pos, int zoom_factor)
     return;
 
   if (zoom_factor != 1)
-    ScaleBitmap(img_info->bitmap, zoom_factor);
+    ScaleBitmap(img_info->bitmaps, zoom_factor);
 
   img_info->scaled_up = TRUE;
 }