effectiveGameStatus() == GAME_MODE_TITLE)
return;
- /* never draw masked screen borders when displaying request outside door */
- if (effectiveGameStatus() == GAME_MODE_PSEUDO_DOOR &&
- global.use_envelope_request)
- return;
-
if (redraw_mask & REDRAW_ALL)
DrawMaskedBorder_ALL();
else
void BlitScreenToBitmap_RND(Bitmap *target_bitmap)
{
- DrawBuffer *buffer = (drawto_field == window ? backbuffer : drawto_field);
int fx = FX, fy = FY;
int full_lev_fieldx = lev_fieldx + (BorderElement != EL_EMPTY ? 2 : 0);
int full_lev_fieldy = lev_fieldy + (BorderElement != EL_EMPTY ? 2 : 0);
fy = 2 * TILEY_VAR - (EVEN(lev_fieldy) ? TILEY_VAR / 2 : 0);
}
- BlitBitmap(buffer, target_bitmap, fx, fy, SXSIZE, SYSIZE, SX, SY);
+ BlitBitmap(drawto_field, target_bitmap, fx, fy, SXSIZE, SYSIZE, SX, SY);
}
void BlitScreenToBitmap(Bitmap *target_bitmap)
BlitScreenToBitmap_SP(target_bitmap);
else if (level.game_engine_type == GAME_ENGINE_TYPE_RND)
BlitScreenToBitmap_RND(target_bitmap);
+
+ redraw_mask |= REDRAW_FIELD;
}
-void BackToFront_OLD()
+void DrawFramesPerSecond()
{
- DrawBuffer *buffer = (drawto_field == window ? backbuffer : drawto_field);
+ char text[100];
+ int font_nr = FONT_TEXT_2;
+ int font_width = getFontWidth(font_nr);
-#if 0
- /* !!! TEST ONLY !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
- /* (force full redraw) */
- if (game_status == GAME_MODE_PLAYING)
- redraw_mask |= REDRAW_FIELD;
-#endif
+ sprintf(text, "%04.1f fps", global.frames_per_second);
+
+ DrawTextExt(backbuffer, WIN_XSIZE - font_width * strlen(text), 0, text,
+ font_nr, BLIT_OPAQUE);
+}
+void BackToFront()
+{
if (redraw_mask == REDRAW_NONE)
return;
-#if 0
- printf("::: ");
- if (redraw_mask & REDRAW_ALL)
- printf("[REDRAW_ALL]");
- if (redraw_mask & REDRAW_FIELD)
- printf("[REDRAW_FIELD]");
- if (redraw_mask & REDRAW_DOOR_1)
- printf("[REDRAW_DOOR_1]");
- if (redraw_mask & REDRAW_DOOR_2)
- printf("[REDRAW_DOOR_2]");
- if (redraw_mask & REDRAW_FROM_BACKBUFFER)
- printf("[REDRAW_FROM_BACKBUFFER]");
- printf(" [%d]\n", FrameCounter);
-#endif
-
- if (global.fps_slowdown && game_status == GAME_MODE_PLAYING)
- {
- static boolean last_frame_skipped = FALSE;
- boolean skip_even_when_not_scrolling = TRUE;
- boolean just_scrolling = (ScreenMovDir != 0);
- boolean verbose = FALSE;
-
- if (global.fps_slowdown_factor > 1 &&
- (FrameCounter % global.fps_slowdown_factor) &&
- (just_scrolling || skip_even_when_not_scrolling))
- {
- redraw_mask &= ~REDRAW_MAIN;
-
- last_frame_skipped = TRUE;
-
- if (verbose)
- printf("FRAME SKIPPED\n");
- }
- else
- {
- if (last_frame_skipped)
- redraw_mask |= REDRAW_FIELD;
-
- last_frame_skipped = FALSE;
+ // draw masked border to all viewports, if defined
+ DrawMaskedBorder(redraw_mask);
- if (verbose)
- printf("frame not skipped\n");
- }
- }
+ // draw frames per second (only if debug mode is enabled)
+ if (redraw_mask & REDRAW_FPS)
+ DrawFramesPerSecond();
- /* synchronize X11 graphics at this point; if we would synchronize the
- display immediately after the buffer switching (after the XFlush),
- this could mean that we have to wait for the graphics to complete,
- although we could go on doing calculations for the next frame */
+ // redraw complete window if both playfield and (some) doors need redraw
+ if (redraw_mask & REDRAW_FIELD && redraw_mask & REDRAW_DOORS)
+ redraw_mask = REDRAW_ALL;
- /* SyncDisplay(); */
-
- /* never draw masked border to backbuffer when using playfield buffer */
- if (game_status != GAME_MODE_PLAYING ||
- redraw_mask & REDRAW_FROM_BACKBUFFER ||
- buffer == backbuffer)
- DrawMaskedBorder(redraw_mask);
- else
- DrawMaskedBorder(redraw_mask & REDRAW_DOORS);
+ /* although redrawing the whole window would be fine for normal gameplay,
+ being able to only redraw the playfield is required for deactivating
+ certain drawing areas (mainly playfield) to work, which is needed for
+ warp-forward to be fast enough (by skipping redraw of most frames) */
if (redraw_mask & REDRAW_ALL)
{
BlitBitmap(backbuffer, window, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0);
-
- redraw_mask = REDRAW_NONE;
}
-
- if (redraw_mask & REDRAW_FIELD)
+ else if (redraw_mask & REDRAW_FIELD)
{
- if (game_status != GAME_MODE_PLAYING ||
- redraw_mask & REDRAW_FROM_BACKBUFFER)
- {
- BlitBitmap(backbuffer, window,
- REAL_SX, REAL_SY, FULL_SXSIZE, FULL_SYSIZE, REAL_SX, REAL_SY);
- }
- else
- {
- BlitScreenToBitmap_RND(window);
- }
-
- redraw_mask &= ~REDRAW_MAIN;
+ BlitBitmap(backbuffer, window,
+ REAL_SX, REAL_SY, FULL_SXSIZE, FULL_SYSIZE, REAL_SX, REAL_SY);
}
-
- if (redraw_mask & REDRAW_DOORS)
+ else if (redraw_mask & REDRAW_DOORS)
{
if (redraw_mask & REDRAW_DOOR_1)
BlitBitmap(backbuffer, window, DX, DY, DXSIZE, DYSIZE, DX, DY);
if (redraw_mask & REDRAW_DOOR_3)
BlitBitmap(backbuffer, window, EX, EY, EXSIZE, EYSIZE, EX, EY);
-
- redraw_mask &= ~REDRAW_DOORS;
- }
-
- if (redraw_mask & REDRAW_MICROLEVEL)
- {
- BlitBitmap(backbuffer, window, SX, SY + 10 * TILEY, SXSIZE, 7 * TILEY,
- SX, SY + 10 * TILEY);
-
- redraw_mask &= ~REDRAW_MICROLEVEL;
}
- if (redraw_mask & REDRAW_FPS) /* display frames per second */
- {
- char text[100];
- char info1[100];
-
- sprintf(info1, " (only every %d. frame)", global.fps_slowdown_factor);
- if (!global.fps_slowdown)
- info1[0] = '\0';
-
- sprintf(text, "%04.1f fps%s", global.frames_per_second, info1);
-
- DrawTextExt(window, SX + SXSIZE + SX, 0, text, FONT_TEXT_2, BLIT_OPAQUE);
- }
-
- redraw_mask = REDRAW_NONE;
-}
-
-void BackToFront()
-{
- if (redraw_mask == REDRAW_NONE)
- return;
-
- // draw masked border to all viewports, if defined
- DrawMaskedBorder(redraw_mask);
-
- // blit backbuffer to visible screen
- BlitBitmap(backbuffer, window, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0);
-
redraw_mask = REDRAW_NONE;
}
SetDrawtoField(DRAW_FIELDBUFFER);
}
else
+ {
SetDrawtoField(DRAW_BACKBUFFER);
+ }
}
void MarkTileDirty(int x, int y)
level.envelope[envelope_nr].autowrap,
level.envelope[envelope_nr].centered, FALSE);
- redraw_mask |= REDRAW_FIELD | REDRAW_FROM_BACKBUFFER;
+ redraw_mask |= REDRAW_FIELD;
BackToFront();
SkipUntilDelayReached(&anim_delay, anim_delay_value, &i, last_frame);
}
}
- redraw_mask |= REDRAW_FIELD | REDRAW_FROM_BACKBUFFER;
+ redraw_mask |= REDRAW_FIELD;
DoAnimation();
BackToFront();
}
}
-
void ShowEnvelopeRequest(char *text, unsigned int req_state, int action)
{
int last_game_status = game_status; /* save current game status */
}
}
- redraw_mask |= REDRAW_MICROLEVEL;
+ redraw_mask |= REDRAW_FIELD;
}
#define MICROLABEL_EMPTY 0
if (strlen(label_text) > 0)
DrawTextSAligned(pos->x, pos->y, label_text, font_nr, pos->align);
- redraw_mask |= REDRAW_MICROLEVEL;
+ redraw_mask |= REDRAW_FIELD;
}
static void DrawPreviewLevelExt(boolean restart)