rnd-20091124-1-src
[rocksndiamonds.git] / src / game_sp / DDSpriteBuffer.c
index 1384a38fa78949e15deed57355b9699b6dc7c80f..00e49d7ac02f62aaaac59c05e3445c853382f57a 100644 (file)
@@ -15,11 +15,11 @@ static void Blt(int pX, int pY, int SpriteX, int SpriteY);
 // ---   MTSTransactionMode  = 0  'NotAnMTSObject  // NotAnMTSObject
 // --- END
 
-static char *VB_Name = "DDSpriteBuffer";
-static boolean VB_GlobalNameSpace = False;
-static boolean VB_Creatable = True;
-static boolean VB_PredeclaredId = False;
-static boolean VB_Exposed = False;
+// static char *VB_Name = "DDSpriteBuffer";
+// static boolean VB_GlobalNameSpace = False;
+// static boolean VB_Creatable = True;
+// static boolean VB_PredeclaredId = False;
+// static boolean VB_Exposed = False;
 // --- Option Explicit
 
 // needs reference to: DirectX7 for Visual Basic Type Library
@@ -106,18 +106,27 @@ boolean DDSpriteBuffer_CreateFromFile(char *Path, long xSprites, long ySprites)
   }
 
   // --- On Error GoTo CreateFromFileEH
+#if 1
+  SD.LWidth  = 16 * TILEX;
+  SD.LHeight = 16 * TILEY;
+#else
   Buffer = DDraw.CreateSurfaceFromFile(Path, SD);
+#endif
   // --- On Error GoTo 0
 
+#if 0
   Buffer.GetSurfaceDesc(SD);
+#endif
+
   mSpriteWidth = SD.LWidth / xSprites;
   mSpriteHeight = SD.LHeight / ySprites;
   mXSpriteCount = xSprites;
   mYSpriteCount = ySprites;
+
   CreateFromFile = True;
   return CreateFromFile;
 
-CreateFromFileEH:
+  // CreateFromFileEH:
   CreateFromFile = False;
 
   return CreateFromFile;
@@ -148,7 +157,7 @@ boolean DDSpriteBuffer_CreateAtSize(long Width, long Height, long xSprites, long
   CreateAtSize = True;
   return CreateAtSize;
 
-CreateAtSizeEH:
+  // CreateAtSizeEH:
   CreateAtSize = False;
 
   return CreateAtSize;
@@ -164,11 +173,68 @@ void DDSpriteBuffer_Cls(int BackColor)
 static void Blt(int pX, int pY, int SpriteX, int SpriteY)
 {
   RECT DR, SR;
+#if 0
   long Tmp;
+#endif
+
+#if 1
+
+  int sx1 = mScrollX_last - 2 * TILEX;
+  int sy1 = mScrollY_last - 2 * TILEY;
+  int sx2 = mScrollX_last + SXSIZE + 1 * TILEX;
+  int sy2 = mScrollY_last + SYSIZE + 1 * TILEY;
+
+  int sx = pX - sx1;
+  int sy = pY - sy1;
+
+#else
+
+  int sx1 = mScrollX - TILEX;
+  int sy1 = mScrollY - TILEY;
+  int sx2 = mScrollX + SXSIZE + TILEX;
+  int sy2 = mScrollY + SYSIZE + TILEY;
+  int x1 = sx1 / TILEX;
+  int y1 = sy1 / TILEY;
+
+#if 0
+  int x2 = sx2 / TILEX;
+  int y2 = sy2 / TILEY;
+#endif
+
+  int sx = pX - x1 * TILEX;
+  int sy = pY - y1 * TILEY;
+
+#endif
+
+#if 0
+  printf(":1: DDSpriteBuffer.c: Blt(): %d, %d [%ld, %ld]\n",
+        pX, pY, mScrollX, mScrollY);
+#endif
 
   if (NoDisplayFlag)
     return;
 
+#if 0
+  if (TEST_flag)
+  {
+    if (pX < sx1 || pX > sx2 || pY < sy1 || pY > sy2)
+      printf("::: DDSpriteBuffer.c: Blt(): %d, %d [%d..%d, %d..%d] (%ld, %ld) (%ld, %ld) [SKIPPED]\n",
+            pX, pY, sx1, sx2, sy1, sy2, mScrollX, mScrollY, mScrollX_last, mScrollY_last);
+    else
+      printf("::: DDSpriteBuffer.c: Blt(): %d, %d [%d..%d, %d..%d] (%ld, %ld) (%ld, %ld)\n",
+            pX, pY, sx1, sx2, sy1, sy2, mScrollX, mScrollY, mScrollX_last, mScrollY_last);
+  }
+#endif
+
+  /* do not draw fields that are outside the visible screen area */
+  if (pX < sx1 || pX > sx2 || pY < sy1 || pY > sy2)
+    return;
+
+#if 0
+  printf(":2: DDSpriteBuffer.c: Blt(): %d, %d [%ld, %ld]\n",
+        pX, pY, mScrollX, mScrollY);
+#endif
+
   {
     DR.left = pX + mDestXOff;
     DR.top = pY + mDestYOff;
@@ -181,9 +247,115 @@ static void Blt(int pX, int pY, int SpriteX, int SpriteY)
     SR.right = SR.left + mSpriteWidth;
     SR.bottom = SR.top + mSpriteHeight;
   }
-  Tmp = mDest_Blt(DR, Buffer, SR, DDBLT_WAIT);
+
+#if 0
+  printf("::: DDSpriteBuffer.c: Blt(): %d, %d\n", DR.left, DR.top);
+#endif
+
+#if 0
+  if (pX == 0 * StretchWidth && pY == 0 * StretchWidth)
+    printf("::: TEST: drawing topleft corner ...\n");
+  if (pX == 59 * StretchWidth && pY == 23 * StretchWidth)
+    printf("::: TEST: drawing bottomright corner ...\n");
+#endif
+
+#if 1
+
+#if 1
+  BlitBitmap(sp_objects, screenBitmap,
+            SR.left, SR.top,
+            mSpriteWidth, mSpriteHeight,
+            sx, sy);
+#else
+  BlitBitmap(sp_objects, screenBitmap,
+            SR.left, SR.top,
+            mSpriteWidth, mSpriteHeight,
+            DR.left, DR.top);
+#endif
+
+#else
+  Tmp = mDest.Blt(DR, &Buffer, SR, DDBLT_WAIT);
+#endif
 }
 
+#if 0
+
+static void OLD_Blt(int pX, int pY, int SpriteX, int SpriteY)
+{
+  RECT DR, SR;
+#if 0
+  long Tmp;
+#endif
+
+#if 1
+  int left = mScrollX;
+  int top  = mScrollY;
+#else
+  int left = mScrollX / TILEX;
+  int top  = mScrollY / TILEY;
+#endif
+
+  int sx = pX % (MAX_BUF_XSIZE * TILEX);
+  int sy = pY % (MAX_BUF_YSIZE * TILEY);
+
+#if 0
+  printf("::: DDSpriteBuffer.c: Blt(): %d, %d [%ld, %ld] [%d, %d]\n",
+        pX, pY, mScrollX, mScrollY, left, top);
+#endif
+
+  if (NoDisplayFlag)
+    return;
+
+  /* do not draw fields that are outside the visible screen area */
+  if (pX < left || pX >= left + MAX_BUF_XSIZE * TILEX ||
+      pY < top  || pY >= top  + MAX_BUF_YSIZE * TILEY)
+    return;
+
+  {
+    DR.left = pX + mDestXOff;
+    DR.top = pY + mDestYOff;
+    DR.right = pX + mSpriteWidth + mDestXOff;
+    DR.bottom = pY + mSpriteHeight + mDestYOff;
+  }
+  {
+    SR.left = mSpriteWidth * (SpriteX - 1);
+    SR.top = mSpriteHeight * (SpriteY - 1);
+    SR.right = SR.left + mSpriteWidth;
+    SR.bottom = SR.top + mSpriteHeight;
+  }
+
+#if 0
+  printf("::: DDSpriteBuffer.c: Blt(): %d, %d\n", DR.left, DR.top);
+#endif
+
+#if 0
+  if (pX == 0 * StretchWidth && pY == 0 * StretchWidth)
+    printf("::: TEST: drawing topleft corner ...\n");
+  if (pX == 59 * StretchWidth && pY == 23 * StretchWidth)
+    printf("::: TEST: drawing bottomright corner ...\n");
+#endif
+
+#if 1
+
+#if 1
+  BlitBitmap(sp_objects, screenBitmap,
+            SR.left, SR.top,
+            mSpriteWidth, mSpriteHeight,
+            sx, sy);
+#else
+  BlitBitmap(sp_objects, screenBitmap,
+            SR.left, SR.top,
+            mSpriteWidth, mSpriteHeight,
+            DR.left, DR.top);
+#endif
+
+#else
+  Tmp = mDest.Blt(DR, &Buffer, SR, DDBLT_WAIT);
+#endif
+}
+
+#endif
+
 void DDSpriteBuffer_BltEx(int pX, int pY, int SpritePos)
 {
   int XPos, YPos;
@@ -193,6 +365,13 @@ void DDSpriteBuffer_BltEx(int pX, int pY, int SpritePos)
 
   XPos = (SpritePos % mXSpriteCount) + 1;
   YPos = (SpritePos / mXSpriteCount) + 1;
+
+#if 0
+  if (TEST_flag)
+    printf("::: DDSpriteBuffer_BltEx(): %d, %d [%d]\n",
+          pX, pY, SpritePos);
+#endif
+
   Blt(pX, pY, XPos, YPos);
 }
 
@@ -225,8 +404,12 @@ void DDSpriteBuffer_BltEx(int pX, int pY, int SpritePos)
 //  End If
 // End Function
 
+#if 0
+
 static void Class_Initialize()
 {
   mDestXOff = 0;
   mDestYOff = 0;
 }
+
+#endif