BY1 = -2;
BX2 = SCR_FIELDX + 1;
BY2 = SCR_FIELDY + 1;
- redraw_x1 = 2;
- redraw_y1 = 2;
drawto_field = fieldbuffer;
}
BY1 = 0;
BX2 = SCR_FIELDX - 1;
BY2 = SCR_FIELDY - 1;
- redraw_x1 = 0;
- redraw_y1 = 0;
drawto_field = backbuffer;
}
}
}
-static void BlitScreenToBitmap_RND(Bitmap *target_bitmap)
+void BlitScreenToBitmap_RND(Bitmap *target_bitmap)
{
DrawBuffer *buffer = (drawto_field == window ? backbuffer : drawto_field);
int fx = FX, fy = FY;
fy = 2 * TILEY_VAR - (EVEN(lev_fieldy) ? TILEY_VAR / 2 : 0);
}
- if (border.draw_masked[GAME_MODE_PLAYING])
- {
- if (buffer != backbuffer)
- {
- /* copy playfield buffer to backbuffer to add masked border */
- BlitBitmap(buffer, backbuffer, fx, fy, SXSIZE, SYSIZE, SX, SY);
- DrawMaskedBorder(REDRAW_FIELD);
- }
-
- BlitBitmap(backbuffer, target_bitmap,
- REAL_SX, REAL_SY, FULL_SXSIZE, FULL_SYSIZE,
- REAL_SX, REAL_SY);
- }
- else
- {
- BlitBitmap(buffer, target_bitmap, fx, fy, SXSIZE, SYSIZE, SX, SY);
- }
+ BlitBitmap(buffer, target_bitmap, fx, fy, SXSIZE, SYSIZE, SX, SY);
}
void BlitScreenToBitmap(Bitmap *target_bitmap)
BlitScreenToBitmap_RND(target_bitmap);
}
-void BackToFront()
+void BackToFront_OLD()
{
- int x, y;
DrawBuffer *buffer = (drawto_field == window ? backbuffer : drawto_field);
- // never redraw single tiles, always redraw the whole field
- if (redraw_mask & REDRAW_TILES)
- redraw_mask |= REDRAW_FIELD;
-
#if 0
/* !!! TEST ONLY !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
/* (force full redraw) */
redraw_mask |= REDRAW_FIELD;
#endif
- if (redraw_mask & REDRAW_FIELD)
- redraw_mask &= ~REDRAW_TILES;
-
if (redraw_mask == REDRAW_NONE)
return;
printf("[REDRAW_ALL]");
if (redraw_mask & REDRAW_FIELD)
printf("[REDRAW_FIELD]");
- if (redraw_mask & REDRAW_TILES)
- printf("[REDRAW_TILES]");
if (redraw_mask & REDRAW_DOOR_1)
printf("[REDRAW_DOOR_1]");
if (redraw_mask & REDRAW_DOOR_2)
printf(" [%d]\n", FrameCounter);
#endif
- if (redraw_mask & REDRAW_TILES &&
- game_status == GAME_MODE_PLAYING &&
- border.draw_masked[GAME_MODE_PLAYING])
- redraw_mask |= REDRAW_FIELD;
-
if (global.fps_slowdown && game_status == GAME_MODE_PLAYING)
{
static boolean last_frame_skipped = FALSE;
DrawTextExt(window, SX + SXSIZE + SX, 0, text, FONT_TEXT_2, BLIT_OPAQUE);
}
- for (x = 0; x < MAX_BUF_XSIZE; x++)
- for (y = 0; y < MAX_BUF_YSIZE; y++)
- redraw[x][y] = 0;
- redraw_tiles = 0;
+ 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;
}
void MarkTileDirty(int x, int y)
{
- int xx = redraw_x1 + x;
- int yy = redraw_y1 + y;
-
- if (!redraw[xx][yy])
- redraw_tiles++;
-
- redraw[xx][yy] = TRUE;
- redraw_mask |= REDRAW_TILES;
+ redraw_mask |= REDRAW_FIELD;
}
void SetBorderElement()
BackToFront();
}
-static void setRequestPosition(int *x, int *y, boolean add_border_size)
+static void setRequestCenterPosition(int *x, int *y)
{
- int border_size = request.border_size;
int sx_center = (request.x != -1 ? request.x : SX + SXSIZE / 2);
int sy_center = (request.y != -1 ? request.y : SY + SYSIZE / 2);
- int sx = sx_center - request.width / 2;
- int sy = sy_center - request.height / 2;
+
+ *x = sx_center;
+ *y = sy_center;
+}
+
+static void setRequestPosition(int *x, int *y, boolean add_border_size)
+{
+ int border_size = request.border_size;
+ int sx_center, sy_center;
+ int sx, sy;
+
+ setRequestCenterPosition(&sx_center, &sy_center);
+
+ sx = sx_center - request.width / 2;
+ sy = sy_center - request.height / 2;
if (add_border_size)
{
int y = ystart + i * ystep;
int xsize = (action == ACTION_CLOSING ? xend - (x - xstart) : x) + 2;
int ysize = (action == ACTION_CLOSING ? yend - (y - ystart) : y) + 2;
- int sx_center = (request.x != -1 ? request.x : SX + SXSIZE / 2);
- int sy_center = (request.y != -1 ? request.y : SY + SYSIZE / 2);
- int src_x = sx_center - width / 2;
- int src_y = sy_center - height / 2;
- int dst_x = sx_center - xsize * tile_size / 2;
- int dst_y = sy_center - ysize * tile_size / 2;
int xsize_size_left = (xsize - 1) * tile_size;
int ysize_size_top = (ysize - 1) * tile_size;
int max_xsize_pos = (max_xsize - 1) * tile_size;
int max_ysize_pos = (max_ysize - 1) * tile_size;
+ int sx_center, sy_center;
+ int src_x, src_y;
+ int dst_x, dst_y;
int xx, yy;
+ setRequestCenterPosition(&sx_center, &sy_center);
+
+ src_x = sx_center - width / 2;
+ src_y = sy_center - height / 2;
+ dst_x = sx_center - xsize * tile_size / 2;
+ dst_y = sy_center - ysize * tile_size / 2;
+
BlitBitmap(bitmap_db_store, backbuffer, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0);
for (yy = 0; yy < 2; yy++)
{
if (event.type == EVENT_MOTIONNOTIFY)
{
- if (!PointerInWindow(window))
- continue; /* window and pointer on different screens */
-
if (!button_status)
continue;