fixed bugs when drawing global borders when fading screens
[rocksndiamonds.git] / src / tools.c
index d72c99d09329fd1081e3ce962909089b4ca2fe85..a212e6ade9846a182bf796ab05865ab96781ce22 100644 (file)
@@ -305,7 +305,7 @@ static void DrawMaskedBorderExt_Rect(int x, int y, int width, int height,
 
 static void DrawMaskedBorderExt_FIELD(int draw_target)
 {
-  if (global.border_status >= GAME_MODE_TITLE &&
+  if (global.border_status >= GAME_MODE_MAIN &&
       global.border_status <= GAME_MODE_PLAYING &&
       border.draw_masked[global.border_status])
     DrawMaskedBorderExt_Rect(REAL_SX, REAL_SY, FULL_SXSIZE, FULL_SYSIZE,
@@ -353,8 +353,8 @@ static void DrawMaskedBorderExt_ALL(int draw_target)
 static void DrawMaskedBorderExt(int redraw_mask, int draw_target)
 {
   /* never draw masked screen borders on borderless screens */
-  if (game_status == GAME_MODE_LOADING ||
-      game_status == GAME_MODE_TITLE)
+  if (global.border_status == GAME_MODE_LOADING ||
+      global.border_status == GAME_MODE_TITLE)
     return;
 
   if (redraw_mask & REDRAW_ALL)
@@ -384,7 +384,30 @@ void DrawMaskedBorder(int redraw_mask)
 
 void DrawMaskedBorderToTarget(int draw_target)
 {
-  DrawMaskedBorderExt(REDRAW_ALL, draw_target);
+  if (draw_target == DRAW_BORDER_TO_SCREEN)
+  {
+    DrawMaskedBorderExt(REDRAW_ALL, draw_target);
+  }
+  else
+  {
+    int last_border_status = global.border_status;
+
+    if (draw_target == DRAW_BORDER_TO_FADE_SOURCE)
+    {
+      global.border_status = gfx.fade_border_source_status;
+      gfx.masked_border_bitmap_ptr = gfx.fade_bitmap_source;
+    }
+    else
+    {
+      global.border_status = gfx.fade_border_target_status;
+      gfx.masked_border_bitmap_ptr = gfx.fade_bitmap_target;
+    }
+
+    DrawMaskedBorderExt(REDRAW_ALL, draw_target);
+
+    global.border_status = last_border_status;
+    gfx.masked_border_bitmap_ptr = backbuffer;
+  }
 }
 
 void BlitScreenToBitmap_RND(Bitmap *target_bitmap)
@@ -689,6 +712,9 @@ static void SetScreenStates_BeforeFadingIn()
 
 static void SetScreenStates_AfterFadingIn()
 {
+  // store new source screen (to use correct masked border for fading)
+  gfx.fade_border_source_status = global.border_status;
+
   global.anim_status = global.anim_status_next;
 
   // force update of global animation status in case of rapid screen changes
@@ -698,6 +724,9 @@ static void SetScreenStates_AfterFadingIn()
 
 static void SetScreenStates_BeforeFadingOut()
 {
+  // store new target screen (to use correct masked border for fading)
+  gfx.fade_border_target_status = game_status;
+
   global.anim_status = GAME_MODE_PSEUDO_FADING;
 }