X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ftools.c;h=4080f2d2e2621b0c1efbad149a389ab9be829450;hb=d50a07318c72c9c03fde89ba36422706e20aff12;hp=76fa6c484a282c8a2170ac80b5a997b7d66d6e46;hpb=33cabd20cdb4e7aa84dfd30975f1364e7b776121;p=rocksndiamonds.git diff --git a/src/tools.c b/src/tools.c index 76fa6c48..4080f2d2 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; @@ -712,6 +739,9 @@ static void SetScreenStates_AfterFadingIn() static void SetScreenStates_BeforeFadingOut() { + // required if "fade_mask != redraw_mask" (fading only affects fade area) + BackToFront(); + // store new target screen (to use correct masked border for fading) gfx.fade_border_target_status = game_status;