rnd-20030105-1-src
[rocksndiamonds.git] / src / libgame / system.c
index 5c0b4fbe9aeb81e1602c6bf6bed9efa6ced49d6f..c071fee890f37242231dc8c7bbcaaadfe2da8dc7 100644 (file)
@@ -36,6 +36,7 @@ struct OptionInfo     options;
 struct VideoSystemInfo video;
 struct AudioSystemInfo audio;
 struct GfxInfo         gfx;
+struct FontInfo                font;
 struct ArtworkInfo     artwork;
 struct JoystickInfo    joystick;
 struct SetupInfo       setup;
@@ -185,6 +186,11 @@ void SetDrawDeactivationMask(int draw_deactivation_mask)
   gfx.draw_deactivation_mask = draw_deactivation_mask;
 }
 
+void SetBackgroundBitmap(Bitmap *background_bitmap)
+{
+  gfx.background_bitmap = background_bitmap;
+}
+
 
 /* ========================================================================= */
 /* video functions                                                           */
@@ -357,8 +363,10 @@ inline boolean DrawingDeactivated(int x, int y, int width, int height)
 {
   if (gfx.draw_deactivation_mask != REDRAW_NONE)
   {
-    if ((gfx.draw_deactivation_mask & REDRAW_FIELD) &&
-       x < gfx.sx + gfx.sxsize)
+    if (gfx.draw_deactivation_mask & REDRAW_ALL)
+      return TRUE;
+    else if ((gfx.draw_deactivation_mask & REDRAW_FIELD) &&
+            x < gfx.sx + gfx.sxsize)
       return TRUE;
     else if ((gfx.draw_deactivation_mask & REDRAW_DOORS) &&
             x > gfx.dx)
@@ -375,6 +383,11 @@ inline boolean DrawingDeactivated(int x, int y, int width, int height)
   return FALSE;
 }
 
+inline boolean DrawingOnBackground(int x, int y)
+{
+  return (gfx.background_bitmap != NULL && x < gfx.sx + gfx.sxsize);
+}
+
 inline void BlitBitmap(Bitmap *src_bitmap, Bitmap *dst_bitmap,
                       int src_x, int src_y,
                       int width, int height,
@@ -404,6 +417,16 @@ inline void ClearRectangle(Bitmap *bitmap, int x, int y, int width, int height)
 #endif
 }
 
+inline void ClearRectangleOnBackground(Bitmap *bitmap, int x, int y,
+                                      int width, int height)
+{
+  if (!DrawingOnBackground(x, y))
+    ClearRectangle(bitmap, x, y, width, height);
+  else
+    BlitBitmap(gfx.background_bitmap, bitmap,
+              x - gfx.real_sx, y - gfx.real_sy, width, height, x, y);
+}
+
 #if 0
 #ifndef TARGET_SDL
 static GC last_clip_gc = 0;    /* needed for XCopyArea() through clip mask */
@@ -455,6 +478,29 @@ inline void BlitBitmapMasked(Bitmap *src_bitmap, Bitmap *dst_bitmap,
 #endif
 }
 
+inline void BlitBitmapOnBackground(Bitmap *src_bitmap, Bitmap *dst_bitmap,
+                                  int src_x, int src_y,
+                                  int width, int height,
+                                  int dst_x, int dst_y)
+{
+  if (!DrawingOnBackground(src_x, src_y))
+    BlitBitmap(src_bitmap, dst_bitmap, src_x, src_y, width, height,
+              dst_x, dst_y);
+  else
+  {
+    /* draw background */
+    BlitBitmap(gfx.background_bitmap, dst_bitmap,
+              dst_x - gfx.real_sx, dst_y - gfx.real_sy, width, height,
+              dst_x, dst_y);
+
+    /* draw foreground */
+    SetClipOrigin(src_bitmap, src_bitmap->stored_clip_gc,
+                 dst_x - src_x, dst_y - src_y);
+    BlitBitmapMasked(src_bitmap, dst_bitmap, src_x, src_y, width, height,
+                    dst_x, dst_y);
+  }
+}
+
 inline void DrawSimpleWhiteLine(Bitmap *bitmap, int from_x, int from_y,
                                int to_x, int to_y)
 {
@@ -721,7 +767,8 @@ void ReloadCustomImage(Bitmap *bitmap, char *basename)
   if (bitmap->width != new_bitmap->width ||
       bitmap->height != new_bitmap->height)
   {
-    Error(ERR_WARN, "ReloadCustomImage: new image has wrong dimensions");
+    Error(ERR_WARN, "ReloadCustomImage: new image '%s' has wrong dimensions",
+         filename);
     FreeBitmap(new_bitmap);
     return;
   }