fixed drawing global animations when switching screens without fading
authorHolger Schemel <info@artsoft.org>
Mon, 13 Apr 2020 15:26:01 +0000 (17:26 +0200)
committerHolger Schemel <info@artsoft.org>
Tue, 19 May 2020 16:20:02 +0000 (18:20 +0200)
Before, when switching screens without fading (like leaving sub-menus
with default settings for screen fading, or screen changes after
pressing the "Escape" key), a single video frame was drawn without
global animations, which could cause flickering of animations.

With this fix, global animations will also be drawn for this video
frame.

src/libgame/sdl.c
src/tools.c

index 04cfc0e739fbafa9ca8df4b92d94609e601ec28c..d271951eb5dc84cdab120c47ce9d30510012f7c9 100644 (file)
@@ -1033,6 +1033,17 @@ void SDLFadeRectangle(int x, int y, int width, int height,
 
   time_current = SDL_GetTicks();
 
+  if (fade_delay <= 0)
+  {
+    // immediately draw final target frame without delay
+    fade_mode &= (FADE_MODE_FADE | FADE_MODE_TRANSFORM);
+    fade_delay = 1;
+    time_current -= 1;
+
+    // when fading without delay, also skip post delay
+    post_delay = 0;
+  }
+
   if (fade_mode == FADE_MODE_MELT)
   {
     boolean done = FALSE;
index 67bb1795a766b963738122a3bf1d9c96fe172b9d..52fbded05846a88125e503994a8f6439555851a4 100644 (file)
@@ -971,19 +971,13 @@ static void FadeExt(int fade_mask, int fade_mode, int fade_type)
     height = WIN_YSIZE;
   }
 
-  if (!setup.fade_screens ||
-      fade_delay == 0 ||
-      fading.fade_mode == FADE_MODE_NONE)
-  {
-    if (fade_mode == FADE_MODE_FADE_OUT)
-      return;
-
-    BlitBitmap(backbuffer, window, x, y, width, height, x, y);
-
-    redraw_mask &= ~fade_mask;
+  // when switching screens without fading, set fade delay to zero
+  if (!setup.fade_screens || fading.fade_mode == FADE_MODE_NONE)
+    fade_delay = 0;
 
+  // do not display black frame when fading out without fade delay
+  if (fade_mode == FADE_MODE_FADE_OUT && fade_delay == 0)
     return;
-  }
 
   FadeRectangle(x, y, width, height, fade_mode, fade_delay, post_delay,
                draw_border_function);