fixed redraw/fade bugs when redefining the playfield size or position
authorHolger Schemel <info@artsoft.org>
Sun, 2 Nov 2014 00:48:09 +0000 (01:48 +0100)
committerHolger Schemel <info@artsoft.org>
Sun, 2 Nov 2014 00:48:09 +0000 (01:48 +0100)
ChangeLog
src/conftime.h
src/editor.c
src/game.c
src/libgame/system.c
src/libgame/system.h
src/screens.c
src/tools.c

index cd522a5d7a1a635f7c81273c371d1eb33ad203bc..96408bca0b424dea0487687d4bd78deccc664a2a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,6 @@
 2014-11-02
        * fixed bug with not updating default bitmap pointer for scaled images
+       * fixed redraw/fade bugs when redefining the playfield size or position
 
 2014-10-27
        * fixed some smaller issues with loading custom artwork
index 545fff3a04a28ebd1ae288bf50cc5a8713b32802..eabe26b16a19ef53def94e7c0ab4765ff95f6684 100644 (file)
@@ -1 +1 @@
-#define COMPILE_DATE_STRING "2014-10-27 21:31"
+#define COMPILE_DATE_STRING "2014-11-02 01:32"
index 781a3efd8a9b09327f70b4430fec6afaaeff335d..728ff1d71319fa680751f165b45d7545fa7daed6 100644 (file)
@@ -7368,11 +7368,6 @@ static boolean playfield_area_changed = FALSE;
 
 void DrawLevelEd()
 {
-  int old_sx = SX;
-  int old_sy = SY;
-  int old_sxsize = SXSIZE;
-  int old_sysize = SYSIZE;
-
   StopAnimation();
 
   CloseDoor(DOOR_CLOSE_ALL);
@@ -7385,13 +7380,7 @@ void DrawLevelEd()
   /* needed if different viewport properties defined for editor */
   ChangeViewportPropertiesIfNeeded();
 
-  if (old_sx != SX ||
-      old_sy != SY ||
-      old_sxsize != SXSIZE ||
-      old_sysize != SYSIZE)
-    playfield_area_changed = TRUE;
-  else
-    playfield_area_changed = FALSE;
+  playfield_area_changed = DrawingAreaChanged();
 
   OpenDoor(DOOR_OPEN_1 | DOOR_OPEN_2 | DOOR_NO_DELAY);
 
@@ -7431,7 +7420,7 @@ void DrawLevelEd()
   BlitBitmap(graphic_info[IMG_GLOBAL_DOOR].bitmap, drawto,
             DOOR_GFX_PAGEX8, 236, EXSIZE, EYSIZE, EX, EY);
 
-  redraw_mask |= REDRAW_ALL;
+  // redraw_mask |= REDRAW_ALL;
 
   FreeLevelEditorGadgets();
   CreateLevelEditorGadgets();
@@ -11389,7 +11378,7 @@ static void HandleControlButtons(struct GadgetInfo *gi)
       /* needed before playing if editor playfield area has different size */
       ClearRectangle(drawto, REAL_SX, REAL_SY, FULL_SXSIZE, FULL_SYSIZE);
 
-      redraw_mask = REDRAW_ALL;
+      // redraw_mask = REDRAW_ALL;
 
       level_editor_test_game = TRUE;
 
index 0fa3035d4fce292bfa48d717d8e0a2ae697397da..7b63ee751bfc090fbb93364d9f12612a937d254c 100644 (file)
@@ -3909,6 +3909,14 @@ void InitGame()
 
   FadeIn(REDRAW_FIELD);
 
+#if 1
+  // full screen redraw is required at this point in the following cases:
+  // - special editor door undrawn when game was started from level editor
+  // - drawing area (playfield) was changed and has to be removed completely
+  redraw_mask = REDRAW_ALL;
+  BackToFront();
+#endif
+
   if (!game.restart_level)
   {
     /* copy default game door content to main double buffer */
index 25edb0effd65a959df172d43fa84f9c03d77ddcb..eec5d192960ac9e784d5232ad8e47ef5ccb90dc1 100644 (file)
@@ -170,6 +170,8 @@ void InitGfxFieldInfo(int sx, int sy, int sxsize, int sysize,
 
   gfx.field_save_buffer = field_save_buffer;
 
+  gfx.drawing_area_changed = FALSE;
+
   SetDrawDeactivationMask(REDRAW_NONE);                /* do not deactivate drawing */
   SetDrawBackgroundMask(REDRAW_NONE);          /* deactivate masked drawing */
 }
@@ -463,6 +465,16 @@ boolean DrawingOnBackground(int x, int y)
          CheckDrawingArea(x, y, 1, 1, gfx.draw_background_mask));
 }
 
+boolean DrawingAreaChanged()
+{
+  int drawing_area_changed = gfx.drawing_area_changed;
+
+  // reset flag for change of drawing area after querying it
+  gfx.drawing_area_changed = FALSE;
+
+  return drawing_area_changed;
+}
+
 static boolean InClippedRectangle(Bitmap *bitmap, int *x, int *y,
                                  int *width, int *height, boolean is_dest)
 {
index 04d97974f907963090f2e482b949c5b4bf49be4c..f7259356ee8eb5932f8d76d43605975a4eccaf59 100644 (file)
@@ -788,6 +788,8 @@ struct GfxInfo
   int draw_deactivation_mask;
   int draw_background_mask;
 
+  boolean drawing_area_changed;
+
   Bitmap *field_save_buffer;
 
   Bitmap *background_bitmap;
@@ -1303,6 +1305,7 @@ void ClearRectangle(Bitmap *, int, int, int, int);
 void ClearRectangleOnBackground(Bitmap *, int, int, int, int);
 void BlitBitmapMasked(Bitmap *, Bitmap *, int, int, int, int, int, int);
 boolean DrawingOnBackground(int, int);
+boolean DrawingAreaChanged();
 void BlitBitmapOnBackground(Bitmap *, Bitmap *, int, int, int, int, int, int);
 void DrawSimpleBlackLine(Bitmap *, int, int, int, int);
 void DrawSimpleWhiteLine(Bitmap *, int, int, int, int);
index 469239d18b48fc4b779cc9f0f9823d94718ed1e4..ca4e669ac05707cb747a48ee70fbec41b331d5a8 100644 (file)
@@ -1309,9 +1309,6 @@ void DrawMainMenuExt(int fade_mask, boolean do_fading)
   KeyboardAutoRepeatOn();
   ActivateJoystick();
 
-  SetDrawDeactivationMask(REDRAW_NONE);
-  SetDrawBackgroundMask(REDRAW_FIELD);
-
   audio.sound_deactivated = FALSE;
 
   GetPlayerConfig();
@@ -1373,6 +1370,10 @@ void DrawMainMenuExt(int fade_mask, boolean do_fading)
   LoadLevel(level_nr);
   LoadScore(level_nr);
 
+  // set this after "ChangeViewportPropertiesIfNeeded()" (which may reset it)
+  SetDrawDeactivationMask(REDRAW_NONE);
+  SetDrawBackgroundMask(REDRAW_FIELD);
+
   SetMainBackgroundImage(IMG_BACKGROUND_MAIN);
 
   if (fade_mask == REDRAW_ALL)
@@ -3228,6 +3229,8 @@ void HandleTypeName(int newxpos, Key key)
 
 static void DrawChooseTree(TreeInfo **ti_ptr)
 {
+  int fade_mask = (DrawingAreaChanged() ? REDRAW_ALL : REDRAW_FIELD);
+
   UnmapAllGadgets();
 
   FreeScreenGadgets();
@@ -3235,14 +3238,14 @@ static void DrawChooseTree(TreeInfo **ti_ptr)
 
   CloseDoor(DOOR_CLOSE_2);
 
-  FadeOut(REDRAW_FIELD);
+  FadeOut(fade_mask);
 
   ClearField();
 
   HandleChooseTree(0, 0, 0, 0, MB_MENU_INITIALIZE, ti_ptr);
   MapScreenTreeGadgets(*ti_ptr);
 
-  FadeIn(REDRAW_FIELD);
+  FadeIn(fade_mask);
 
   InitAnimation();
 }
@@ -3744,6 +3747,8 @@ void HandleChooseLevelNr(int mx, int my, int dx, int dy, int button)
 
 void DrawHallOfFame(int highlight_position)
 {
+  int fade_mask = (DrawingAreaChanged() ? REDRAW_ALL : REDRAW_FIELD);
+
   UnmapAllGadgets();
   FadeSoundsAndMusic();
 
@@ -3762,7 +3767,7 @@ void DrawHallOfFame(int highlight_position)
 
   FadeSetEnterScreen();
 
-  FadeOut(REDRAW_FIELD);
+  FadeOut(fade_mask);
 
   InitAnimation();
 
@@ -3771,7 +3776,7 @@ void DrawHallOfFame(int highlight_position)
 
   HandleHallOfFame(highlight_position, 0, 0, 0, MB_MENU_INITIALIZE);
 
-  FadeIn(REDRAW_FIELD);
+  FadeIn(fade_mask);
 }
 
 static void drawHallOfFameList(int first_entry, int highlight_position)
@@ -5289,6 +5294,7 @@ static void drawSetupInfoList(struct TokenInfo *setup_info,
 
 static void DrawSetupScreen_Generic()
 {
+  int fade_mask = (DrawingAreaChanged() ? REDRAW_ALL : REDRAW_FIELD);
   boolean redraw_all = FALSE;
   char *title_string = NULL;
   int i;
@@ -5303,7 +5309,7 @@ static void DrawSetupScreen_Generic()
   if (redraw_mask & REDRAW_ALL)
     redraw_all = TRUE;
 
-  FadeOut(REDRAW_FIELD);
+  FadeOut(fade_mask);
 
   ClearField();
 
@@ -5390,9 +5396,9 @@ static void DrawSetupScreen_Generic()
   MapScreenGadgets(max_setup_info);
 
   if (redraw_all)
-    redraw_mask = REDRAW_ALL;
+    redraw_mask = fade_mask = REDRAW_ALL;
 
-  FadeIn(redraw_mask);
+  FadeIn(fade_mask);
 
   InitAnimation();
 }
index 861d6b7afa83f3637a6e11ba2050a7c083f11008..ad2b3b32619ad586e3118f4e279974f3f40ec23a 100644 (file)
@@ -4365,8 +4365,6 @@ void DrawSpecialEditorDoor()
   int vy = VY - outer_border;
   int exsize = EXSIZE + 2 * outer_border;
 
-  CloseDoor(DOOR_CLOSE_2);
-
   /* draw bigger level editor toolbox window */
   BlitBitmap(gfx1->bitmap, drawto, gfx1->src_x, gfx1->src_y,
             top_border_width, top_border_height, ex, ey - top_border_height);
@@ -8000,6 +7998,7 @@ void ChangeViewportPropertiesIfNeeded()
   boolean init_video_buffer = FALSE;
   boolean init_gadgets_and_toons = FALSE;
   boolean init_em_graphics = FALSE;
+  boolean drawing_area_changed = FALSE;
 
   if (viewport.window.width  != WIN_XSIZE ||
       viewport.window.height != WIN_YSIZE)
@@ -8058,6 +8057,19 @@ void ChangeViewportPropertiesIfNeeded()
       init_em_graphics = TRUE;
     }
 
+    if (new_sx != SX ||
+       new_sy != SY ||
+       new_sxsize != SXSIZE ||
+       new_sysize != SYSIZE ||
+       new_real_sx != REAL_SX ||
+       new_real_sy != REAL_SY ||
+       new_full_sxsize != FULL_SXSIZE ||
+       new_full_sysize != FULL_SYSIZE)
+    {
+      if (!init_video_buffer)
+       drawing_area_changed = TRUE;
+    }
+
     SX = new_sx;
     SY = new_sy;
     DX = new_dx;
@@ -8098,6 +8110,11 @@ void ChangeViewportPropertiesIfNeeded()
 
     SCR_FIELDX = new_scr_fieldx;
     SCR_FIELDY = new_scr_fieldy;
+
+    gfx.drawing_area_changed = drawing_area_changed;
+
+    SetDrawDeactivationMask(REDRAW_NONE);
+    SetDrawBackgroundMask(REDRAW_FIELD);
   }
 
   if (init_video_buffer)
@@ -8105,9 +8122,6 @@ void ChangeViewportPropertiesIfNeeded()
     // printf("::: init_video_buffer\n");
 
     InitVideoBuffer(WIN_XSIZE, WIN_YSIZE, DEFAULT_DEPTH, setup.fullscreen);
-
-    SetDrawDeactivationMask(REDRAW_NONE);
-    SetDrawBackgroundMask(REDRAW_FIELD);
   }
 
   if (init_gadgets_and_toons)