X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Ftools.c;h=30e9cd5660b5de185b254e3600845d92d49b29e3;hp=9d7e5c7482906558affecfadbd1dce7d5e838f39;hb=3d9cd9e6ca46ea73f75a31cdc38785b4e4ae0abc;hpb=0b35d42d7e09d2f9ac90b57f20ac77df07841e19 diff --git a/src/tools.c b/src/tools.c index 9d7e5c74..30e9cd56 100644 --- a/src/tools.c +++ b/src/tools.c @@ -550,6 +550,10 @@ void BackToFront() if (redraw_mask & REDRAW_FPS) DrawFramesPerSecond(); + // remove playfield redraw before potentially merging with doors redraw + if (DrawingDeactivated(REAL_SX, REAL_SY, FULL_SXSIZE, FULL_SYSIZE)) + redraw_mask &= ~REDRAW_FIELD; + // redraw complete window if both playfield and (some) doors need redraw if (redraw_mask & REDRAW_FIELD && redraw_mask & REDRAW_DOORS) redraw_mask = REDRAW_ALL; @@ -570,14 +574,37 @@ void BackToFront() } else if (redraw_mask & REDRAW_DOORS) { + // merge door areas to prevent calling screen redraw more than once + int x1 = WIN_XSIZE; + int y1 = WIN_YSIZE; + int x2 = 0; + int y2 = 0; + if (redraw_mask & REDRAW_DOOR_1) - BlitBitmap(backbuffer, window, DX, DY, DXSIZE, DYSIZE, DX, DY); + { + x1 = MIN(x1, DX); + y1 = MIN(y1, DY); + x2 = MAX(x2, DX + DXSIZE); + y2 = MAX(y2, DY + DYSIZE); + } if (redraw_mask & REDRAW_DOOR_2) - BlitBitmap(backbuffer, window, VX, VY, VXSIZE, VYSIZE, VX, VY); + { + x1 = MIN(x1, VX); + y1 = MIN(y1, VY); + x2 = MAX(x2, VX + VXSIZE); + y2 = MAX(y2, VY + VYSIZE); + } if (redraw_mask & REDRAW_DOOR_3) - BlitBitmap(backbuffer, window, EX, EY, EXSIZE, EYSIZE, EX, EY); + { + x1 = MIN(x1, EX); + y1 = MIN(y1, EY); + x2 = MAX(x2, EX + EXSIZE); + y2 = MAX(y2, EY + EYSIZE); + } + + BlitBitmap(backbuffer, window, x1, y1, x2 - x1, y2 - y1, x1, y1); } redraw_mask = REDRAW_NONE; @@ -598,26 +625,10 @@ void BackToFront_WithFrameDelay(unsigned int frame_delay_value) SetVideoFrameDelay(frame_delay_value_old); } -static void FadeCrossSaveBackbuffer() -{ - BlitBitmap(backbuffer, bitmap_db_cross, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0); -} - -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) { static int fade_type_skip = FADE_TYPE_NONE; void (*draw_border_function)(void) = NULL; - Bitmap *bitmap = (fade_mode & FADE_TYPE_TRANSFORM ? bitmap_db_cross : NULL); int x, y, width, height; int fade_delay, post_delay; @@ -632,18 +643,8 @@ static void FadeExt(int fade_mask, int fade_mode, int fade_type) return; } -#if 1 - FadeCrossSaveBackbuffer(); -#endif - if (fading.fade_mode & FADE_TYPE_TRANSFORM) - { -#if 0 - FadeCrossSaveBackbuffer(); -#endif - return; - } } redraw_mask |= fade_mask; @@ -706,17 +707,22 @@ static void FadeExt(int fade_mask, int fade_mode, int fade_type) return; } - FadeRectangle(bitmap, x, y, width, height, fade_mode, fade_delay, post_delay, + FadeRectangle(x, y, width, height, fade_mode, fade_delay, post_delay, draw_border_function); - if (fade_type == FADE_TYPE_FADE_OUT) - FadeCrossRestoreBackbuffer(); - redraw_mask &= ~fade_mask; } static void SetScreenStates_BeforeFadingIn() { + // temporarily set screen mode for animations to screen after fading in + global.anim_status = global.anim_status_next; + + // store backbuffer with all animations that will be started after fading in + PrepareFadeBitmap(DRAW_TO_FADE_TARGET); + + // set screen mode for animations back to fading + global.anim_status = GAME_MODE_PSEUDO_FADING; } static void SetScreenStates_AfterFadingIn() @@ -736,7 +742,11 @@ static void SetScreenStates_BeforeFadingOut() // store new target screen (to use correct masked border for fading) gfx.fade_border_target_status = game_status; + // set screen mode for animations to fading global.anim_status = GAME_MODE_PSEUDO_FADING; + + // store backbuffer with all animations that will be stopped for fading out + PrepareFadeBitmap(DRAW_TO_FADE_SOURCE); } static void SetScreenStates_AfterFadingOut() @@ -1041,7 +1051,7 @@ static void RedrawGlobalBorderIfNeeded() // copy current draw buffer to later copy back areas that have not changed if (game_status_last != GAME_MODE_TITLE) - BlitBitmap(backbuffer, bitmap_db_store, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0); + BlitBitmap(backbuffer, bitmap_db_store_1, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0); if (CheckIfGlobalBorderRedrawIsNeeded()) { @@ -1054,20 +1064,20 @@ static void RedrawGlobalBorderIfNeeded() if (real_sx_last != -1 && real_sy_last != -1 && REAL_SX != -1 && REAL_SY != -1 && full_sxsize_last == FULL_SXSIZE && full_sysize_last == FULL_SYSIZE) - BlitBitmap(bitmap_db_store, backbuffer, + BlitBitmap(bitmap_db_store_1, backbuffer, real_sx_last, real_sy_last, FULL_SXSIZE, FULL_SYSIZE, REAL_SX, REAL_SY); if (dx_last != -1 && dy_last != -1 && DX != -1 && DY != -1 && dxsize_last == DXSIZE && dysize_last == DYSIZE) - BlitBitmap(bitmap_db_store, backbuffer, + BlitBitmap(bitmap_db_store_1, backbuffer, dx_last, dy_last, DXSIZE, DYSIZE, DX, DY); if (vx_last != -1 && vy_last != -1 && VX != -1 && VY != -1 && vxsize_last == VXSIZE && vysize_last == VYSIZE) - BlitBitmap(bitmap_db_store, backbuffer, + BlitBitmap(bitmap_db_store_1, backbuffer, vx_last, vy_last, VXSIZE, VYSIZE, VX, VY); redraw_mask = REDRAW_ALL; @@ -2515,7 +2525,7 @@ void DrawEnvelopeRequest(char *text) RedrawGadget(tool_gadget[i]); // store readily prepared envelope request for later use when animating - BlitBitmap(backbuffer, bitmap_db_cross, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0); + BlitBitmap(backbuffer, bitmap_db_store_2, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0); if (text_door_style) free(text_door_style); @@ -2576,7 +2586,7 @@ void AnimateEnvelopeRequest(int anim_mode, int action) setRequestPosition(&src_x, &src_y, FALSE); setRequestPositionExt(&dst_x, &dst_y, width, height, FALSE); - BlitBitmap(bitmap_db_store, backbuffer, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0); + BlitBitmap(bitmap_db_store_1, backbuffer, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0); for (yy = 0; yy < 2; yy++) { @@ -2590,10 +2600,10 @@ void AnimateEnvelopeRequest(int anim_mode, int action) int yy_size = (yy ? tile_size : ysize_size_top); if (draw_masked) - BlitBitmapMasked(bitmap_db_cross, backbuffer, + BlitBitmapMasked(bitmap_db_store_2, backbuffer, src_xx, src_yy, xx_size, yy_size, dst_xx, dst_yy); else - BlitBitmap(bitmap_db_cross, backbuffer, + BlitBitmap(bitmap_db_store_2, backbuffer, src_xx, src_yy, xx_size, yy_size, dst_xx, dst_yy); } } @@ -2626,7 +2636,7 @@ void ShowEnvelopeRequest(char *text, unsigned int req_state, int action) if (action == ACTION_OPENING) { - BlitBitmap(backbuffer, bitmap_db_store, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0); + BlitBitmap(backbuffer, bitmap_db_store_1, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0); if (req_state & REQ_ASK) { @@ -2673,7 +2683,7 @@ void ShowEnvelopeRequest(char *text, unsigned int req_state, int action) game.envelope_active = FALSE; if (action == ACTION_CLOSING) - BlitBitmap(bitmap_db_store, backbuffer, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0); + BlitBitmap(bitmap_db_store_1, backbuffer, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0); // SetDrawBackgroundMask(last_draw_background_mask); @@ -3578,7 +3588,7 @@ static int RequestHandleEvents(unsigned int req_state) if (global.use_envelope_request) { /* copy current state of request area to middle of playfield area */ - BlitBitmap(bitmap_db_cross, drawto, sx, sy, width, height, sx, sy); + BlitBitmap(bitmap_db_store_2, drawto, sx, sy, width, height, sx, sy); } } @@ -3706,7 +3716,7 @@ static int RequestHandleEvents(unsigned int req_state) if (global.use_envelope_request) { /* copy back current state of pressed buttons inside request area */ - BlitBitmap(drawto, bitmap_db_cross, sx, sy, width, height, sx, sy); + BlitBitmap(drawto, bitmap_db_store_2, sx, sy, width, height, sx, sy); } }