- static int screen_x_last = -1, screen_y_last = -1;
- static boolean scrolling_last = FALSE;
- int left = screen_x / TILEX;
- int top = screen_y / TILEY;
-#if 1
- boolean scrolling = (screen_x != screen_x_last || screen_y != screen_y_last);
-#else
- boolean scrolling = (screen_x % TILEX != 0 || screen_y % TILEY != 0);
-#endif
- int x, y;
-
-#if 0
- printf("::: %d, %d\n", screen_x, screen_y);
-#endif
-
- SyncDisplay();
-
- if (redraw_tiles > REDRAWTILES_THRESHOLD || scrolling || scrolling_last)
- {
- /* blit all (up to four) parts of the scroll buffer to the backbuffer */
- BlitScreenToBitmap_EM(backbuffer);
-
- /* blit the completely updated backbuffer to the window (in one blit) */
- BlitBitmap(backbuffer, window, SX, SY, SXSIZE, SYSIZE, SX, SY);
- }
- else
- {
-#if 1
-#if 1
- boolean half_shifted_x = (screen_x % TILEX != 0);
- boolean half_shifted_y = (screen_y % TILEY != 0);
-#else
- boolean half_shifted_x = (EVEN(SCR_FIELDX) && screen_x % TILEX != 0);
- boolean half_shifted_y = (EVEN(SCR_FIELDY) && screen_y % TILEY != 0);
-#endif
-
-#if 0
-#if 1
- printf("::: %d, %d\n", EVEN(SCR_FIELDX), screen_x);
-#else
- half_shifted_x = TRUE;
- half_shifted_y = FALSE;
-#endif
-#endif
-
- int x1 = 0, x2 = SCR_FIELDX - (half_shifted_x ? 0 : 1);
- int y1 = 0, y2 = SCR_FIELDY - (half_shifted_y ? 0 : 1);
- int scroll_xoffset = (half_shifted_x ? TILEX / 2 : 0);
- int scroll_yoffset = (half_shifted_y ? TILEY / 2 : 0);
-
- InitGfxClipRegion(TRUE, SX, SY, SXSIZE, SYSIZE);
-
- for (x = x1; x <= x2; x++)
- {
- for (y = y1; y <= y2; y++)
- {
- int xx = (left + x) % MAX_BUF_XSIZE;
- int yy = (top + y) % MAX_BUF_YSIZE;
-
- if (redraw[xx][yy])
- BlitBitmap(screenBitmap, window,
- xx * TILEX, yy * TILEY, TILEX, TILEY,
- SX + x * TILEX - scroll_xoffset,
- SY + y * TILEY - scroll_yoffset);
- }
- }
-
- InitGfxClipRegion(FALSE, -1, -1, -1, -1);
-
-#else
-
- for (x = 0; x < SCR_FIELDX; x++)
- {
- for (y = 0; y < SCR_FIELDY; y++)
- {
- int xx = (left + x) % MAX_BUF_XSIZE;
- int yy = (top + y) % MAX_BUF_YSIZE;
-
- if (redraw[xx][yy])
- BlitBitmap(screenBitmap, window,
- xx * TILEX, yy * TILEY, TILEX, TILEY,
- SX + x * TILEX, SY + y * TILEY);
- }
- }
-#endif
- }
-
- FlushDisplay();
-
- for (x = 0; x < MAX_BUF_XSIZE; x++)
- for (y = 0; y < MAX_BUF_YSIZE; y++)
- redraw[x][y] = FALSE;
- redraw_tiles = 0;
-
- screen_x_last = screen_x;
- screen_y_last = screen_y;
- scrolling_last = scrolling;
-}
-
-void blitscreen(void)
-{
- BackToFront_EM();