- SR.left = mScrollX + mDestXOff;
- SR.top = mScrollY + mDestYOff;
- SR.right = SR.left + tX;
- SR.bottom = SR.top + tY;
- // If mWidth < SR.right Then
- // SR.right = mWidth
- // DR.right = DR.left + Stretch * (SR.right - SR.left)
- // End If
- // If mHeight < SR.bottom Then
- // SR.bottom = mHeight
- // DR.bottom = DR.top + Stretch * (SR.bottom - SR.top)
- // End If
- // If (mScrollX + mDestXOff) < 0 Then
- // SR.left = 0
- // DR.left = DR.left - Stretch * (mScrollX + mDestXOff)
- // End If
- // If (mScrollY + mDestYOff) < 0 Then
- // SR.top = 0
- // DR.top = DR.top - Stretch * (mScrollY + mDestYOff)
- // End If
- }
-
-#if 1
-#if 0
- printf("::: DDScrollBuffer.c: DDScrollBuffer_Blt(): blit from %d, %d [%ld, %ld] [%ld, %ld]\n",
- SR.left, SR.top, mScrollX, mScrollY, mDestXOff, mDestYOff);
-#endif
-
-#if 0
- BlitBitmap(screenBitmap, window,
- 1600, 320,
- SCR_FIELDX * TILEX, SCR_FIELDY * TILEY, SX, SY);
-#else
- BlitBitmap(screenBitmap, window,
- SR.left, SR.top,
- SCR_FIELDX * TILEX, SCR_FIELDY * TILEY, SX, SY);
-#endif
-
- return;
-#endif
-
- // DDraw.WaitForVerticalBlank DDWAITVB_BLOCKBEGIN, 0
- if (IS_NOTHING(&Buffer, sizeof(Buffer)))
- return;
-
- if (IS_NOTHING(&PrimarySurface, sizeof(PrimarySurface)))
- return;
-
- L = PrimarySurface.Blt(DR, &Buffer, SR, DDBLT_WAIT);
- if (L != DD_OK)
- {
- switch (L)
+ int scroll_xoffset = mScrollX - mScrollX_last + game_sp.scroll_xoffset;
+ int scroll_yoffset = mScrollY - mScrollY_last + game_sp.scroll_yoffset;
+ int x1 = 0, x2 = SCR_FIELDX - (scroll_xoffset != 0 ? 0 : 1);
+ int y1 = 0, y2 = SCR_FIELDY - (scroll_yoffset != 0 ? 0 : 1);
+ int full_xsize = (FieldWidth - (menBorder ? 0 : 1)) * TILEX_VAR;
+ int full_ysize = (FieldHeight - (menBorder ? 0 : 1)) * TILEY_VAR;
+ int xsize = SXSIZE;
+ int ysize = SYSIZE;
+ int sxsize = (full_xsize < xsize ? full_xsize : xsize);
+ int sysize = (full_ysize < ysize ? full_ysize : ysize);
+ int sx = SX + (full_xsize < xsize ? (xsize - full_xsize) / 2 : 0);
+ int sy = SY + (full_ysize < ysize ? (ysize - full_ysize) / 2 : 0);
+
+ InitGfxClipRegion(TRUE, sx, sy, sxsize, sysize);
+
+ scroll_xoffset = scroll_xoffset * TILESIZE_VAR / TILESIZE;
+ scroll_yoffset = scroll_yoffset * TILESIZE_VAR / TILESIZE;
+
+ for (x = x1; x <= x2; x++)