rnd-20091101-3-src
[rocksndiamonds.git] / src / game_sp / DDScrollBuffer.c
index 66b12072caa2a6751d0b1c402c1a3decd4d65bcd..23ce4ce9af381573ff42c585aefa7f7cc3867ea5 100644 (file)
@@ -131,20 +131,27 @@ void DDScrollBuffer_Cls(int BackColor)
   Buffer.BltColorFill(EmptyRect, BackColor);
 }
 
-void DDScrollBuffer_Blt()
+void DDScrollBuffer_Blt_Ext(Bitmap *target_bitmap)
 {
   RECT DR, SR;
   long tX, tY, L;
+  int sX, sY;
   // RECT ERect;
   // long Restore;
 
   if (NoDisplayFlag)
     return;
 
-
+#if 1
+  DR.left = 0;
+  DR.top = 0;
+  DR.right = SCR_FIELDX * TILEX;
+  DR.bottom = SCR_FIELDY * TILEY;
+#else
   // --- On Error GoTo BltEH
   DirectX.GetWindowRect(mhWnd, DR);
   // --- On Error GoTo 0
+#endif
 
   {
     tX = (DR.right - DR.left) / Stretch;
@@ -172,6 +179,70 @@ void DDScrollBuffer_Blt()
     //      DR.top = DR.top - Stretch * (mScrollY + mDestYOff)
     //    End If
   }
+
+#if 1
+  SR.left = (SR.left < 0 ? 0 : SR.left);
+  SR.top  = (SR.top  < 0 ? 0 : SR.top);
+#endif
+
+#if 1
+  {
+    int full_xsize = (FieldWidth  - (menBorder.Checked ? 0 : 1)) * TILEX;
+    int full_ysize = (FieldHeight - (menBorder.Checked ? 0 : 1)) * TILEY;
+    int sxsize = SCR_FIELDX * TILEX;
+    int sysize = SCR_FIELDY * TILEY;
+
+    tX = (full_xsize < sxsize ? full_xsize : tX);
+    tY = (full_ysize < sysize ? full_ysize : tY);
+    sX = SX + (full_xsize < sxsize ? (sxsize - full_xsize) / 2 : 0);
+    sY = SY + (full_ysize < sysize ? (sysize - full_ysize) / 2 : 0);
+  }
+#endif
+
+#if 1
+  if (!menBorder.Checked)
+  {
+    SR.left += 16;
+    SR.top  += 16;
+  }
+#endif
+
+#if 1
+
+#if 1
+  printf("::: DDScrollBuffer.c: DDScrollBuffer_Blt(): blit from %d, %d [%ld, %ld] [%ld, %ld] [%ld, %ld]\n",
+        SR.left, SR.top, mScrollX, mScrollY, mDestXOff, mDestYOff, tX, tY);
+#endif
+
+#if 0
+  /* !!! quick and dirty -- FIX THIS !!! */
+  if (tape.playing && tape.fast_forward &&
+      target_bitmap == window &&
+      (FrameCounter % 2) != 0)
+    printf("::: FrameCounter == %d\n", FrameCounter);
+#endif
+
+#if 1
+  SyncDisplay();
+#endif
+
+#if 1
+  BlitBitmap(screenBitmap, target_bitmap,
+            SR.left, SR.top, tX, tY, sX, sY);
+#else
+  BlitBitmap(screenBitmap, target_bitmap,
+            SR.left, SR.top,
+             SCR_FIELDX * TILEX, SCR_FIELDY * TILEY, SX, SY);
+#endif
+
+#if 1
+  FlushDisplay();
+#endif
+
+  return;
+
+#endif
+
   // DDraw.WaitForVerticalBlank DDWAITVB_BLOCKBEGIN, 0
   if (IS_NOTHING(&Buffer, sizeof(Buffer)))
     return;
@@ -184,6 +255,7 @@ void DDScrollBuffer_Blt()
   {
     switch (L)
     {
+#if 0
       case DDERR_GENERIC:
         Debug.Assert(False);
         break;
@@ -243,6 +315,7 @@ void DDScrollBuffer_Blt()
       case DDERR_SURFACEBUSY:
         Debug.Assert(False);
         break;
+#endif
 
       case DDERR_SURFACELOST:
         DDraw.RestoreAllSurfaces();
@@ -256,6 +329,7 @@ void DDScrollBuffer_Blt()
         // ClipToWindow 0
         break;
 
+#if 0
       case DDERR_UNSUPPORTED:
         Debug.Assert(False);
         break;
@@ -267,6 +341,7 @@ void DDScrollBuffer_Blt()
       default:
         Debug.Assert(False);
         break;
+#endif
     }
   }
 
@@ -279,6 +354,11 @@ void DDScrollBuffer_Blt()
   // BltEH:
 }
 
+void DDScrollBuffer_Blt()
+{
+  DDScrollBuffer_Blt_Ext(window);
+}
+
 void DDScrollBuffer_ScrollTo(int X, int Y)
 {
   if (NoDisplayFlag)
@@ -290,6 +370,11 @@ void DDScrollBuffer_ScrollTo(int X, int Y)
   mScrollY = Y;
   ScrollX = mScrollX;
   ScrollY = mScrollY;
+
+#if 0
+  printf("::: DDScrollBuffer.c: DDScrollBuffer_ScrollTo():  mScroll: %ld, %ld [%d, %d]\n",
+        mScrollX, mScrollY, X, Y);
+#endif
 }
 
 void DDScrollBuffer_ScrollTowards(int X, int Y, double Step)
@@ -299,6 +384,11 @@ void DDScrollBuffer_ScrollTowards(int X, int Y, double Step)
   if (NoDisplayFlag)
     return;
 
+#if 0
+  printf("::: DDScrollBuffer.c: DDScrollBuffer_ScrollTowards(): (1) mScroll: %ld, %ld [%d, %d, %f]\n",
+        mScrollX, mScrollY, X, Y, Step);
+#endif
+
   X = X / Stretch;
   Y = Y / Stretch;
   dx = X - mScrollX;
@@ -316,16 +406,23 @@ void DDScrollBuffer_ScrollTowards(int X, int Y, double Step)
   mScrollY = mScrollY + dY * r;
   ScrollX = mScrollX;
   ScrollY = mScrollY;
+
+#if 0
+  printf("::: DDScrollBuffer.c: DDScrollBuffer_ScrollTowards(): (2) mScroll: %ld, %ld [%d, %d, %f]\n",
+        mScrollX, mScrollY, X, Y, Step);
+#endif
 }
 
 void DDScrollBuffer_SoftScrollTo(int X, int Y, long TimeMS, int FPS)
 {
   double dx, dY;
+#if 0
   TickCountObject Tick;
+#endif
   long dT, StepCount;
   double T, tStep;
   long oldX, oldY, maxD;
-  boolean AlreadyRunning;
+  static boolean AlreadyRunning = False;
 
   if (NoDisplayFlag)
     return;
@@ -340,7 +437,7 @@ void DDScrollBuffer_SoftScrollTo(int X, int Y, long TimeMS, int FPS)
   Y = Y / Stretch;
   dx = X - mScrollX;
   dY = Y - mScrollY;
-  maxD = (Abs(dx) < Abs(dY) ?  Abs(dY) :  Abs(dY));
+  maxD = (Abs(dx) < Abs(dY) ? Abs(dY) : Abs(dx));
   StepCount = FPS * (TimeMS / (double)1000);
   if (StepCount > maxD)
     StepCount = maxD;
@@ -360,7 +457,11 @@ void DDScrollBuffer_SoftScrollTo(int X, int Y, long TimeMS, int FPS)
       goto SoftScrollEH;
 
     // If Claim Then Exit For
+
+#if 0
     Tick.DelayMS(dT, False);
+#endif
+
     mScrollX = oldX + T * dx;
     mScrollY = oldY + T * dY;
     ScrollX = mScrollX;
@@ -371,7 +472,10 @@ void DDScrollBuffer_SoftScrollTo(int X, int Y, long TimeMS, int FPS)
   if (UserDragFlag)
     goto SoftScrollEH;
 
+#if 0
   Tick.DelayMS(dT, False);
+#endif
+
   mScrollX = X;
   mScrollY = Y;
   ScrollX = mScrollX;
@@ -380,4 +484,9 @@ void DDScrollBuffer_SoftScrollTo(int X, int Y, long TimeMS, int FPS)
 
 SoftScrollEH:
   AlreadyRunning = False;
+
+#if 0
+  printf("::: DDScrollBuffer.c: DDScrollBuffer_SoftScrollTo(): mScroll: %ld, %ld\n",
+        mScrollX, mScrollY);
+#endif
 }