From c3fa9fcf03db2a48bbd8fa343b79a94c42d4cac3 Mon Sep 17 00:00:00 2001 From: Holger Schemel Date: Mon, 15 Jun 2015 00:18:18 +0200 Subject: [PATCH] fixed and enhanced screen fading and global border handling (continued) --- src/editor.c | 2 +- src/game.c | 2 +- src/init.c | 11 +++--- src/main.c | 4 +++ src/main.h | 3 ++ src/screens.c | 10 +++--- src/tools.c | 92 +++++++++++++++++++++++++++++++++++++++++++++++---- src/tools.h | 2 +- 8 files changed, 107 insertions(+), 19 deletions(-) diff --git a/src/editor.c b/src/editor.c index 257325a3..c7e23051 100644 --- a/src/editor.c +++ b/src/editor.c @@ -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); diff --git a/src/game.c b/src/game.c index ae934676..e3e25f23 100644 --- a/src/game.c +++ b/src/game.c @@ -3106,7 +3106,7 @@ void InitGame() else FadeSetEnterScreen(); - if (CheckIfRedrawGlobalBorderIsNeeded()) + if (CheckIfGlobalBorderHasChanged()) fade_mask = REDRAW_ALL; FadeOut(fade_mask); diff --git a/src/init.c b/src/init.c index 58ebc1a3..c3054816 100644 --- a/src/init.c +++ b/src/init.c @@ -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; diff --git a/src/main.c b/src/main.c index 81a35d87..aa45c472 100644 --- a/src/main.c +++ b/src/main.c @@ -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; diff --git a/src/main.h b/src/main.h index c0dbcd79..faf24a99 100644 --- a/src/main.h +++ b/src/main.h @@ -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; diff --git a/src/screens.c b/src/screens.c index aa8813c7..26461754 100644 --- a/src/screens.c +++ b/src/screens.c @@ -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(); diff --git a/src/tools.c b/src/tools.c index da879fa6..1cf7f743 100644 --- a/src/tools.c +++ b/src/tools.c @@ -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"); diff --git a/src/tools.h b/src/tools.h index b8edb85e..71b4f01a 100644 --- a/src/tools.h +++ b/src/tools.h @@ -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(); -- 2.34.1