fixed and enhanced screen fading and global border handling (continued)
authorHolger Schemel <info@artsoft.org>
Sun, 14 Jun 2015 22:18:18 +0000 (00:18 +0200)
committerHolger Schemel <info@artsoft.org>
Sun, 14 Jun 2015 22:18:18 +0000 (00:18 +0200)
src/editor.c
src/game.c
src/init.c
src/main.c
src/main.h
src/screens.c
src/tools.c
src/tools.h

index 257325a34b837dbccc03509a81eb5875f6ebec00..c7e23051c642435bead4f946d350b136a3255f99 100644 (file)
@@ -7623,7 +7623,7 @@ void DrawLevelEd()
   /* needed if different viewport properties defined for editor */
   ChangeViewportPropertiesIfNeeded();
 
-  if (CheckIfRedrawGlobalBorderIsNeeded())
+  if (CheckIfGlobalBorderHasChanged())
     fade_mask = REDRAW_ALL;
 
   FadeOut(fade_mask);
index ae9346768b163531732e0fe2b5feca802ba7d630..e3e25f23505a59dcd502aca4cd8fd77bc8f78d50 100644 (file)
@@ -3106,7 +3106,7 @@ void InitGame()
   else
     FadeSetEnterScreen();
 
-  if (CheckIfRedrawGlobalBorderIsNeeded())
+  if (CheckIfGlobalBorderHasChanged())
     fade_mask = REDRAW_ALL;
 
   FadeOut(fade_mask);
index 58ebc1a3bb21d909979afd893191ba5a54dfcd8d..c30548161e2408565ff3ef6155217c6582c5f345 100644 (file)
@@ -5204,16 +5204,19 @@ void InitGfx()
 
 void RedrawGlobalBorder()
 {
-  int global_border_graphic;
-
-  global_border_graphic =
+  int global_border_graphic =
     (game_status == GAME_MODE_MAIN ? IMG_GLOBAL_BORDER_MAIN :
      game_status == GAME_MODE_SCORES ? IMG_GLOBAL_BORDER_SCORES :
      game_status == GAME_MODE_EDITOR ? IMG_GLOBAL_BORDER_EDITOR :
      game_status == GAME_MODE_PLAYING ? IMG_GLOBAL_BORDER_PLAYING :
      IMG_GLOBAL_BORDER);
 
-  BlitBitmap(graphic_info[global_border_graphic].bitmap, backbuffer,
+  Bitmap *global_border_bitmap =
+    (graphic_info[global_border_graphic].bitmap ?
+     graphic_info[global_border_graphic].bitmap :
+     graphic_info[IMG_GLOBAL_BORDER].bitmap);
+
+  BlitBitmap(global_border_bitmap, backbuffer,
             0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0);
 
   redraw_mask = REDRAW_ALL;
index 81a35d87bb1e516bd7ff5453899a3abd3bc99fad..aa45c472d7e1f2909e0e405fc69c1e811bc915ad 100644 (file)
@@ -101,6 +101,10 @@ int                        FULL_SYSIZE = 2 + SYSIZE_DEFAULT + 2;
 int                    SXSIZE = SXSIZE_DEFAULT;
 int                    SYSIZE = SYSIZE_DEFAULT;
 
+int                    FADE_SX = 6, FADE_SY = 6;
+int                    FADE_SXSIZE = 2 + SXSIZE_DEFAULT + 2;
+int                    FADE_SYSIZE = 2 + SXSIZE_DEFAULT + 2;
+
 int                    DXSIZE = 100;
 int                    DYSIZE = 280;
 int                    VXSIZE = 100;
index c0dbcd794864e41c5cbbec3150061cc0db539893..faf24a99a057b426d5411c8f517246d260bfabfa 100644 (file)
@@ -2943,6 +2943,9 @@ extern int                        VXSIZE, VYSIZE;
 extern int                     EXSIZE, EYSIZE;
 extern int                     TILESIZE_VAR;
 
+extern int                     FADE_SX, FADE_SY;
+extern int                     FADE_SXSIZE, FADE_SYSIZE;
+
 extern int                     FX, FY;
 extern int                     ScrollStepSize;
 extern int                     ScreenMovDir, ScreenMovPos, ScreenGfxPos;
index aa8813c74d0655be21ae3d5b5b857147c4b47dd5..264617545eca10292faeeebe26e54864e5dcefcb 100644 (file)
@@ -1422,7 +1422,7 @@ void DrawMainMenu()
   if (redraw_mask & REDRAW_ALL)
     fade_mask = REDRAW_ALL;
 
-  if (CheckIfRedrawGlobalBorderIsNeeded())
+  if (CheckIfGlobalBorderHasChanged())
     fade_mask = REDRAW_ALL;
 
   FadeOut(fade_mask);
@@ -2117,7 +2117,7 @@ static void DrawInfoScreen_Main()
   if (redraw_mask & REDRAW_ALL)
     fade_mask = REDRAW_ALL;
 
-  if (CheckIfRedrawGlobalBorderIsNeeded())
+  if (CheckIfGlobalBorderHasChanged())
     fade_mask = REDRAW_ALL;
 
   UnmapAllGadgets();
@@ -3614,7 +3614,7 @@ static void DrawChooseTree(TreeInfo **ti_ptr)
 {
   int fade_mask = REDRAW_FIELD;
 
-  if (CheckIfRedrawGlobalBorderIsNeeded())
+  if (CheckIfGlobalBorderHasChanged())
     fade_mask = REDRAW_ALL;
 
   if (strEqual((*ti_ptr)->subdir, STRING_TOP_DIRECTORY))
@@ -4119,7 +4119,7 @@ void DrawHallOfFame(int highlight_position)
   /* needed if different viewport properties defined for scores */
   ChangeViewportPropertiesIfNeeded();
 
-  if (CheckIfRedrawGlobalBorderIsNeeded())
+  if (CheckIfGlobalBorderHasChanged())
     fade_mask = REDRAW_ALL;
 
   UnmapAllGadgets();
@@ -5729,7 +5729,7 @@ static void DrawSetupScreen_Generic()
   char *title_string = NULL;
   int i;
 
-  if (CheckIfRedrawGlobalBorderIsNeeded())
+  if (CheckIfGlobalBorderHasChanged())
     fade_mask = REDRAW_ALL;
 
   UnmapAllGadgets();
index da879fa684a8fdc6db2179cc52523c596d86d5f3..1cf7f74305e25fbbc1c382382cff971e76765711 100644 (file)
@@ -483,7 +483,12 @@ static void FadeCrossSaveBackbuffer()
 
 static void FadeCrossRestoreBackbuffer()
 {
+  int redraw_mask_last = redraw_mask;
+
   BlitBitmap(bitmap_db_cross, backbuffer, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0);
+
+  // do not change redraw mask when restoring backbuffer after cross-fading
+  redraw_mask = redraw_mask_last;
 }
 
 static void FadeExt(int fade_mask, int fade_mode, int fade_type)
@@ -547,10 +552,10 @@ static void FadeExt(int fade_mask, int fade_mode, int fade_type)
 
   if (fade_mask == REDRAW_FIELD)
   {
-    x = REAL_SX;
-    y = REAL_SY;
-    width  = FULL_SXSIZE;
-    height = FULL_SYSIZE;
+    x = FADE_SX;
+    y = FADE_SY;
+    width  = FADE_SXSIZE;
+    height = FADE_SYSIZE;
 
     if (border.draw_masked_when_fading)
       draw_border_function = DrawMaskedBorder_FIELD;   /* update when fading */
@@ -594,6 +599,11 @@ void FadeIn(int fade_mask)
     FadeExt(fade_mask, fading.fade_mode, FADE_TYPE_FADE_IN);
   else
     FadeExt(fade_mask, FADE_MODE_FADE_IN, FADE_TYPE_FADE_IN);
+
+  FADE_SX = REAL_SX;
+  FADE_SY = REAL_SY;
+  FADE_SXSIZE = FULL_SXSIZE;
+  FADE_SYSIZE = FULL_SYSIZE;
 }
 
 void FadeOut(int fade_mask)
@@ -774,10 +784,11 @@ static int dxsize_last = -1, dysize_last = -1;
 static int vx_last = -1, vy_last = -1;
 static int vxsize_last = -1, vysize_last = -1;
 
-boolean CheckIfRedrawGlobalBorderIsNeeded()
+boolean CheckIfGlobalBorderHasChanged()
 {
   int global_border_graphic;
 
+  // if game status has not changed, global border has not changed either
   if (game_status == game_status_last)
     return FALSE;
 
@@ -793,8 +804,17 @@ boolean CheckIfRedrawGlobalBorderIsNeeded()
      graphic_info[global_border_graphic].bitmap :
      graphic_info[IMG_GLOBAL_BORDER].bitmap);
 
+  return (global_border_bitmap_last != global_border_bitmap);
+}
+
+boolean CheckIfGlobalBorderRedrawIsNeeded()
+{
+  // if game status has not changed, nothing has to be redrawn
+  if (game_status == game_status_last)
+    return FALSE;
+
   // redraw if global screen border has changed
-  if (global_border_bitmap_last != global_border_bitmap)
+  if (CheckIfGlobalBorderHasChanged())
     return TRUE;
 
   // redraw if position or size of playfield area has changed
@@ -823,7 +843,7 @@ static void RedrawGlobalBorderIfNeeded()
   // copy current draw buffer to later copy back areas that have not changed
   BlitBitmap(backbuffer, bitmap_db_store, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0);
 
-  if (CheckIfRedrawGlobalBorderIsNeeded())
+  if (CheckIfGlobalBorderRedrawIsNeeded())
   {
     // redraw global screen border (or clear, if defined to be empty)
 
@@ -4305,6 +4325,9 @@ unsigned int MoveDoor(unsigned int door_state)
 
          width = g->width - src_xx;
 
+         if (width > door_rect->width)
+           width = door_rect->width;
+
          // printf("::: k == %d [%d] \n", k, start_step);
        }
 
@@ -8042,6 +8065,19 @@ void ToggleFullscreenOrChangeWindowScalingIfNeeded()
   }
 }
 
+void JoinRectangles(int *x, int *y, int *width, int *height,
+                   int x2, int y2, int width2, int height2)
+{
+  // do not join with "off-screen" rectangle
+  if (x2 == -1 || y2 == -1)
+    return;
+
+  *x = MIN(*x, x2);
+  *y = MIN(*y, y2);
+  *width = MAX(*width, width2);
+  *height = MAX(*height, height2);
+}
+
 void ChangeViewportPropertiesIfNeeded()
 {
   int gfx_game_mode = game_status;
@@ -8132,6 +8168,48 @@ void ChangeViewportPropertiesIfNeeded()
       new_tilesize_var != TILESIZE_VAR
       )
   {
+    // ------------------------------------------------------------------------
+    // determine next fading area for changed viewport definitions
+    // ------------------------------------------------------------------------
+
+    // start with current playfield area (default fading area)
+    FADE_SX = REAL_SX;
+    FADE_SY = REAL_SY;
+    FADE_SXSIZE = FULL_SXSIZE;
+    FADE_SYSIZE = FULL_SYSIZE;
+
+    // add new playfield area if position or size has changed
+    if (new_real_sx != REAL_SX || new_real_sy != REAL_SY ||
+       new_full_sxsize != FULL_SXSIZE || new_full_sysize != FULL_SYSIZE)
+    {
+      JoinRectangles(&FADE_SX, &FADE_SY, &FADE_SXSIZE, &FADE_SYSIZE,
+                    new_real_sx, new_real_sy, new_full_sxsize,new_full_sysize);
+    }
+
+    // add current and new door 1 area if position or size has changed
+    if (new_dx != DX || new_dy != DY ||
+       new_dxsize != DXSIZE || new_dysize != DYSIZE)
+    {
+      JoinRectangles(&FADE_SX, &FADE_SY, &FADE_SXSIZE, &FADE_SYSIZE,
+                    DX, DY, DXSIZE, DYSIZE);
+      JoinRectangles(&FADE_SX, &FADE_SY, &FADE_SXSIZE, &FADE_SYSIZE,
+                    new_dx, new_dy, new_dxsize, new_dysize);
+    }
+
+    // add current and new door 2 area if position or size has changed
+    if (new_dx != VX || new_dy != VY ||
+       new_dxsize != VXSIZE || new_dysize != VYSIZE)
+    {
+      JoinRectangles(&FADE_SX, &FADE_SY, &FADE_SXSIZE, &FADE_SYSIZE,
+                    VX, VY, VXSIZE, VYSIZE);
+      JoinRectangles(&FADE_SX, &FADE_SY, &FADE_SXSIZE, &FADE_SYSIZE,
+                    new_vx, new_vy, new_vxsize, new_vysize);
+    }
+
+    // ------------------------------------------------------------------------
+    // handle changed tile size
+    // ------------------------------------------------------------------------
+
     if (new_tilesize_var != TILESIZE_VAR)
     {
       // printf("::: new_tilesize_var != TILESIZE_VAR\n");
index b8edb85e41d8ffa47edf74ab7d8e42bceca6c04c..71b4f01af7c8b85ab3480070ecaf683b2ad97413 100644 (file)
@@ -106,7 +106,7 @@ void SetPanelBackground();
 void DrawBackground(int, int, int, int);
 void DrawBackgroundForFont(int, int, int, int, int);
 void DrawBackgroundForGraphic(int, int, int, int, int);
-boolean CheckIfRedrawGlobalBorderIsNeeded();
+boolean CheckIfGlobalBorderHasChanged();
 
 void MarkTileDirty(int, int);
 void SetBorderElement();