X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ftools.c;h=b563b9318c16a897fd2700442b0e1c5bfa034285;hb=eb51a78900b95e3f7c9c3fbc9e4cf9360b374188;hp=30e9cd5660b5de185b254e3600845d92d49b29e3;hpb=3d9cd9e6ca46ea73f75a31cdc38785b4e4ae0abc;p=rocksndiamonds.git diff --git a/src/tools.c b/src/tools.c index 30e9cd56..b563b931 100644 --- a/src/tools.c +++ b/src/tools.c @@ -528,6 +528,22 @@ static void PrintFrameTimeDebugging() } #endif +static int unifiedRedrawMask(int mask) +{ + if (mask & REDRAW_ALL) + return REDRAW_ALL; + + if (mask & REDRAW_FIELD && mask & REDRAW_DOORS) + return REDRAW_ALL; + + return mask; +} + +static boolean equalRedrawMasks(int mask_1, int mask_2) +{ + return unifiedRedrawMask(mask_1) == unifiedRedrawMask(mask_2); +} + void BackToFront() { static int last_redraw_mask = REDRAW_NONE; @@ -625,9 +641,10 @@ void BackToFront_WithFrameDelay(unsigned int frame_delay_value) SetVideoFrameDelay(frame_delay_value_old); } +static int fade_type_skip = FADE_TYPE_NONE; + static void FadeExt(int fade_mask, int fade_mode, int fade_type) { - static int fade_type_skip = FADE_TYPE_NONE; void (*draw_border_function)(void) = NULL; int x, y, width, height; int fade_delay, post_delay; @@ -719,7 +736,8 @@ static void SetScreenStates_BeforeFadingIn() global.anim_status = global.anim_status_next; // store backbuffer with all animations that will be started after fading in - PrepareFadeBitmap(DRAW_TO_FADE_TARGET); + if (fade_type_skip != FADE_MODE_SKIP_FADE_IN) + PrepareFadeBitmap(DRAW_TO_FADE_TARGET); // set screen mode for animations back to fading global.anim_status = GAME_MODE_PSEUDO_FADING; @@ -731,10 +749,6 @@ static void SetScreenStates_AfterFadingIn() 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 - redraw_mask = REDRAW_ALL; - BackToFront(); } static void SetScreenStates_BeforeFadingOut() @@ -746,7 +760,8 @@ static void SetScreenStates_BeforeFadingOut() global.anim_status = GAME_MODE_PSEUDO_FADING; // store backbuffer with all animations that will be stopped for fading out - PrepareFadeBitmap(DRAW_TO_FADE_SOURCE); + if (fade_type_skip != FADE_MODE_SKIP_FADE_OUT) + PrepareFadeBitmap(DRAW_TO_FADE_SOURCE); } static void SetScreenStates_AfterFadingOut() @@ -773,10 +788,18 @@ void FadeIn(int fade_mask) FADE_SYSIZE = FULL_SYSIZE; SetScreenStates_AfterFadingIn(); + + // force update of global animation status in case of rapid screen changes + redraw_mask = REDRAW_ALL; + BackToFront(); } void FadeOut(int fade_mask) { + // update screen if areas covered by "fade_mask" and "redraw_mask" differ + if (!equalRedrawMasks(fade_mask, redraw_mask)) + BackToFront(); + SetScreenStates_BeforeFadingOut(); #if 0