changed BD style color template support to cover all images sizes
authorHolger Schemel <holger.schemel@virtion.de>
Thu, 3 Oct 2024 14:20:32 +0000 (16:20 +0200)
committerHolger Schemel <holger.schemel@virtion.de>
Thu, 3 Oct 2024 14:20:32 +0000 (16:20 +0200)
The new method uses the newly added ".color_template" parameter in the
"graphicsinfo.conf" config file to mark an image as "color template".
In the level editor, all color changes are immediately applied to the
game elements selection list.

src/editor.c
src/files.c
src/game_bd/bd_graphics.c
src/game_bd/bd_graphics.h
src/game_bd/export_bd.h
src/game_bd/main_bd.c
src/init.c
src/init.h
src/libgame/image.c
src/libgame/image.h

index 88fdbccc183e016b24204f8f4fb95fc7d697405a..a09fd29cbf5dde222af54c20619150f6d7c2e33b 100644 (file)
@@ -10087,6 +10087,7 @@ static void DrawEditModeWindowExt(boolean remap_toolbox_gadgets)
   if (remap_toolbox_gadgets)
   {
     SetCurrentLevelColors_BD();
+    InitColorTemplateImagesIfNeeded();
 
     ModifyEditorElementList();
     RedrawDrawingElements();
@@ -11830,7 +11831,7 @@ static void DrawEngineConfigColors(void)
 {
   int i;
 
-  if (!hasColorTemplate_BD())
+  if (!hasColorTemplate())
   {
     int font_nr = FONT_TEXT_1;
     int font_height = getFontHeight(font_nr);
index e999cb6c35836a7c320e67eadc111d1f1a91d6b1..74fc442eac0a45fcc848943b602f81171da6bc18 100644 (file)
@@ -8133,6 +8133,8 @@ static void LoadLevel_LoadAndInit(struct NetworkLevelInfo *network_level)
   LoadLevel_InitSettings(&level);
 
   LoadLevel_InitNativeEngines(&level);
+
+  InitColorTemplateImagesIfNeeded();
 }
 
 void LoadLevel(int nr)
index 5f1c01d8536a873f7f227bf9af00fa3286c1cef4..873efad89c30bcfce1216014e523110da91345e3 100644 (file)
@@ -542,6 +542,14 @@ Bitmap *gd_get_tile_bitmap(Bitmap *bitmap)
   return bitmap;
 }
 
+Bitmap *gd_get_colored_bitmap_from_template(Bitmap *template_bitmap)
+{
+  SDL_Surface *template_surface = get_tile_surface_c64(template_bitmap->surface, 1);
+  Bitmap *colored_bitmap = get_tile_bitmap_c64(native_bd_level.cave, template_surface);
+
+  return colored_bitmap;
+}
+
 // returns true if the element has a certain property
 static inline boolean has_property(const int element, const int property)
 {
index e52048adadf1f4891fb249189535286e85b1345c..0799b6c7ca311de3dbee81eff91d622f29bc0a03 100644 (file)
@@ -37,6 +37,7 @@ boolean gd_bitmap_has_c64_colors(Bitmap *bitmap);
 void gd_prepare_tile_bitmap(GdCave *cave, Bitmap *bitmap, int scale_down_factor);
 void gd_set_tile_bitmap_reference(Bitmap *bitmap);
 Bitmap *gd_get_tile_bitmap(Bitmap *bitmap);
+Bitmap *gd_get_colored_bitmap_from_template(Bitmap *template_bitmap);
 
 int gd_drawcave(Bitmap *dest, GdGame *gameplay, boolean);
 boolean gd_scroll(GdGame *gameplay, boolean exact_scroll, boolean immediate);
index 0e6cb94818e7b8aa742adfd52cdfa4ce3ea071bd..65a06c957ca5c0b5a9bd6e6e60c966cf605aad70 100644 (file)
@@ -133,6 +133,7 @@ void DumpLevelset_BD(void);
 void PreparePreviewTileBitmap_BD(Bitmap *, int);
 void SetPreviewTileBitmapReference_BD(Bitmap *);
 Bitmap *GetPreviewTileBitmap_BD(Bitmap *);
+Bitmap *GetColoredBitmapFromTemplate_BD(Bitmap *);
 
 unsigned int InitEngineRandom_BD(int);
 void InitGameEngine_BD(void);
index ab122bfb34c683975485fcc3613eb86b40d9d6d1..0912b417721a32f9800e940dd3b130de1d814098 100644 (file)
@@ -314,6 +314,11 @@ Bitmap *GetPreviewTileBitmap_BD(Bitmap *bitmap)
   return gd_get_tile_bitmap(bitmap);
 }
 
+Bitmap *GetColoredBitmapFromTemplate_BD(Bitmap *bitmap)
+{
+  return gd_get_colored_bitmap_from_template(bitmap);
+}
+
 unsigned int InitEngineRandom_BD(int seed)
 {
   if (seed == NEW_RANDOMIZE)
index 0cfe53b3cecc12617a3d192dbce5a688db82ef78..d93486c64336ba8281871efbba3252cc8bed4e17 100644 (file)
@@ -344,6 +344,42 @@ static void InitBitmapPointers(void)
       graphic_info[i].bitmap = graphic_info[i].bitmaps[IMG_BITMAP_STANDARD];
 }
 
+boolean hasColorTemplate(void)
+{
+  int num_images = getImageListSize();
+  int i;
+
+  for (i = 0; i < num_images; i++)
+    if (graphic_info[i].color_template)
+      return TRUE;
+
+  return FALSE;
+}
+
+void InitColorTemplateImages(void)
+{
+  int num_images = getImageListSize();
+  int i;
+
+  // if graphic is marked as "color template", reset using colored bitmaps
+  for (i = 0; i < num_images; i++)
+    if (graphic_info[i].color_template)
+      ResetColorTemplateImage(i);
+
+  // if graphic is marked as "color template", re-color all scaled bitmaps
+  for (i = 0; i < num_images; i++)
+    if (graphic_info[i].color_template)
+      CreateImgesFromColorTemplate(i, GetColoredBitmapFromTemplate_BD);
+
+  InitImageTextures();
+}
+
+void InitColorTemplateImagesIfNeeded(void)
+{
+  if (hasColorTemplate())
+    InitColorTemplateImages();
+}
+
 void InitImageTextures(void)
 {
   static int texture_graphics[] =
index 8c068587f497d6200d8e213a9c976856c372c3d7..65f21ddfd9d8fb24108ed0b16c60720d7298d09e 100644 (file)
@@ -40,6 +40,10 @@ void InitGfxBuffers(void);
 void InitGadgets(void);
 void InitImageTextures(void);
 
+boolean hasColorTemplate(void);
+void InitColorTemplateImages(void);
+void InitColorTemplateImagesIfNeeded(void);
+
 void InitNetworkServer(void);
 
 void DisplayExitMessage(char *, va_list);
index 30859c3b94bf01cafbc1445d8add39c28cfafbcf..ad9dfde845a3bddd3adc87b49b347baf6551d2d8 100644 (file)
@@ -407,6 +407,61 @@ void ScaleImage(int pos, int zoom_factor)
   }
 }
 
+void ResetColorTemplateImage(int pos)
+{
+  ImageInfo *img_info = getImageInfoEntryFromImageID(pos);
+
+  if (img_info->template == NULL)
+  {
+    // image color template not yet defined -- copy from original bitmap
+    Bitmap *orig_bitmap = img_info->bitmaps[IMG_BITMAP_PTR_ORIGINAL];
+
+    img_info->template = ZoomBitmap(orig_bitmap, orig_bitmap->width, orig_bitmap->height);
+  }
+
+  img_info->contains_color_images = FALSE;
+}
+
+void CreateImgesFromColorTemplate(int pos, Bitmap * (*color_bitmap_function)(Bitmap *))
+{
+  ImageInfo *img_info = getImageInfoEntryFromImageID(pos);
+  int i;
+
+  if (img_info->contains_color_images)
+    return;
+
+  Bitmap *colored_bitmap = color_bitmap_function(img_info->template);
+
+  if (colored_bitmap != NULL)
+  {
+    // (re-)create all bitmaps from color template bitmap
+    for (i = 0; i < NUM_IMG_BITMAPS; i++)
+    {
+      Bitmap *old_bitmap = img_info->bitmaps[i];
+
+      if (old_bitmap == NULL)
+        continue;
+
+      // create new surfaces (with previous size) (this does not create textures)
+      Bitmap *new_bitmap = ZoomBitmap(colored_bitmap, old_bitmap->width, old_bitmap->height);
+
+      // free old surfaces
+      SDL_FreeSurface(old_bitmap->surface);
+      SDL_FreeSurface(old_bitmap->surface_masked);
+
+      // copy newly created surfaces from new bitmap
+      old_bitmap->surface        = new_bitmap->surface;
+      old_bitmap->surface_masked = new_bitmap->surface_masked;
+
+      // free empty new bitmap structure
+      checked_free(new_bitmap);
+    }
+  }
+
+  // (also set if coloring failed, to prevent repeating for all graphics using this image)
+  img_info->contains_color_images = TRUE;
+}
+
 void FreeAllImages(void)
 {
   FreeCustomArtworkLists(image_info);
index 04952e74882e0535b766c4a6a687dd4311f53379..8e559315ba4a87f97a34e4d85ed324f718141a6e 100644 (file)
@@ -89,6 +89,9 @@ void CreateImageTextures(int);
 void FreeAllImageTextures(void);
 void ScaleImage(int, int);
 
+void ResetColorTemplateImage(int);
+void CreateImgesFromColorTemplate(int, Bitmap * (*color_bitmap_function)(Bitmap *));
+
 void FreeAllImages(void);
 
 #endif // IMAGE_H