rnd-20091124-1-src
authorHolger Schemel <info@artsoft.org>
Tue, 24 Nov 2009 00:28:49 +0000 (01:28 +0100)
committerHolger Schemel <info@artsoft.org>
Sat, 30 Aug 2014 08:57:59 +0000 (10:57 +0200)
* changed internal playfield bitmap handling from playfield sized bitmap
  to screen sized bitmap (visible scrolling area), therefore speeding up
  graphics operations (by eliminating bitmap updates in invisible areas)
  and removing playfield size limitations due to increasing bitmap size
  for larger playfield sizes (while the new implementation always uses
  a fixed playfield bitmap size for arbitrary internal playfield sizes)

ChangeLog
src/conftime.h
src/game_sp/DDScrollBuffer.c
src/game_sp/DDScrollBuffer.h
src/game_sp/DDSpriteBuffer.c
src/game_sp/MainForm.c
src/game_sp/MainForm.h

index 8f62c76ee881c28e88df5f22461a6c43ff2d250b..dd42c76d6546b1903ba8bd167586b02a2e1935a9 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2009-11-24
+       * changed internal playfield bitmap handling from playfield sized bitmap
+         to screen sized bitmap (visible scrolling area), therefore speeding up
+         graphics operations (by eliminating bitmap updates in invisible areas)
+         and removing playfield size limitations due to increasing bitmap size
+         for larger playfield sizes (while the new implementation always uses
+         a fixed playfield bitmap size for arbitrary internal playfield sizes)
+
 2009-11-12
        * fixed bug with single step mode (there were some cases where the game
          did not automatically return to pause mode, e.g. when trying to push
index db5c8315105611d8c4073c7339b9d3b746f0e577..a8578e71f9df345cb6897011260041500f4766a6 100644 (file)
@@ -1 +1 @@
-#define COMPILE_DATE_STRING "2009-11-23 21:41"
+#define COMPILE_DATE_STRING "2009-11-24 01:16"
index e11c561c1688311680af260cd98d423265e99c12..859fb35d18e7cc83842101d17ae4790637e22be5 100644 (file)
@@ -40,30 +40,13 @@ boolean redraw[MAX_BUF_XSIZE][MAX_BUF_YSIZE];
 int TEST_flag = 0;
 
 
-static void ScrollPlayfield()
+static void ScrollPlayfield(int dx, int dy)
 {
-  int sx_last = mScrollX_last / TILEX;
-  int sy_last = mScrollY_last / TILEY;
-  int sx = mScrollX / TILEX;
-  int sy = mScrollY / TILEY;
-  int dx = (sx < sx_last ? +1 : sx > sx_last ? -1 : 0);
-  int dy = (sy < sy_last ? +1 : sy > sy_last ? -1 : 0);
+  int x1 = mScrollX_last / TILEX - 2;
+  int y1 = mScrollY_last / TILEY - 2;
+  int x2 = mScrollX_last / TILEX + (SCR_FIELDX - 1) + 2;
+  int y2 = mScrollY_last / TILEY + (SCR_FIELDY - 1) + 2;
   int x, y;
-  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;
-  int x2 = sx2 / TILEX;
-  int y2 = sy2 / TILEY;
-#if 1
-  int buf_xsize = SCR_FIELDX + 2;
-  int buf_ysize = SCR_FIELDY + 2;
-#else
-  int buf_xsize = MAX_BUF_XSIZE;
-  int buf_ysize = MAX_BUF_YSIZE;
-#endif
 
   BlitBitmap(screenBitmap, screenBitmap,
              TILEX * (dx == -1),
@@ -79,11 +62,15 @@ static void ScrollPlayfield()
       redraw[x][y] = FALSE;
   redraw_tiles = 0;
 
+#if 1
+  DrawFrameIfNeeded();
+#endif
+
   for (y = DisplayMinY; y <= DisplayMaxY; y++)
   {
     for (x = DisplayMinX; x <= DisplayMaxX; x++)
     {
-      if (x >= x1 && x < x2 && y >= y1 && y < y2)
+      if (x >= x1 && x <= x2 && y >= y1 && y <= y2)
       {
        int sx = x - x1;
        int sy = y - y1;
@@ -101,12 +88,14 @@ static void ScrollPlayfield()
 #endif
 #endif
 
-       if ((dx == -1 && sx == buf_xsize - 1) ||
-           (dx == +1 && sx == 0) ||
-           (dy == -1 && sy == buf_ysize - 1) ||
-           (dy == +1 && sy == 0))
+       if ((dx == -1 && x == x2) ||
+           (dx == +1 && x == x1) ||
+           (dy == -1 && y == y2) ||
+           (dy == +1 && y == y1))
        {
+#if 0
          printf("::: %d, %d\n", sx, sy);
+#endif
 
          TEST_flag = 1;
 
@@ -124,12 +113,6 @@ static void ScrollPlayfield()
 
 static void ScrollPlayfieldIfNeededExt(boolean reset)
 {
-  int sx_last = mScrollX_last / TILEX;
-  int sy_last = mScrollY_last / TILEY;
-  int sx = mScrollX / TILEX;
-  int sy = mScrollY / TILEY;
-  boolean initialized = (mScrollX_last != -1 && mScrollY_last != -1);
-
   if (reset)
   {
     mScrollX_last = -1;
@@ -138,7 +121,6 @@ static void ScrollPlayfieldIfNeededExt(boolean reset)
     return;
   }
 
-#if 0
   if (mScrollX_last == -1 || mScrollY_last == -1)
   {
     mScrollX_last = mScrollX;
@@ -146,13 +128,19 @@ static void ScrollPlayfieldIfNeededExt(boolean reset)
 
     return;
   }
-#endif
 
-  if (initialized && (sx != sx_last || sy != sy_last))
-    ScrollPlayfield();
+  /* check if scrolling the playfield reached the destination tile position */
+  if ((mScrollX != mScrollX_last || mScrollY != mScrollY_last) &&
+      mScrollX % TILEX == 0 && mScrollY % TILEY == 0)
+  {
+    int dx = (mScrollX < mScrollX_last ? 1 : mScrollX > mScrollX_last ? -1 : 0);
+    int dy = (mScrollY < mScrollY_last ? 1 : mScrollY > mScrollY_last ? -1 : 0);
+
+    mScrollX_last = mScrollX;
+    mScrollY_last = mScrollY;
 
-  mScrollX_last = mScrollX;
-  mScrollY_last = mScrollY;
+    ScrollPlayfield(dx, dy);
+  }
 }
 
 static void ScrollPlayfieldIfNeeded()
@@ -167,21 +155,17 @@ void InitScrollPlayfield()
 
 void UpdatePlayfield()
 {
+  int x1 = mScrollX_last / TILEX - 2;
+  int y1 = mScrollY_last / TILEY - 2;
+  int x2 = mScrollX_last / TILEX + (SCR_FIELDX - 1) + 2;
+  int y2 = mScrollY_last / TILEY + (SCR_FIELDY - 1) + 2;
   int x, y;
-  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;
-  int x2 = sx2 / TILEX;
-  int y2 = sy2 / TILEY;
 
   for (y = DisplayMinY; y <= DisplayMaxY; y++)
   {
     for (x = DisplayMinX; x <= DisplayMaxX; x++)
     {
-      if (x >= x1 && x < x2 && y >= y1 && y < y2)
+      if (x >= x1 && x <= x2 && y >= y1 && y <= y2)
       {
        int sx = x - x1;
        int sy = y - y1;
@@ -348,11 +332,31 @@ void DDScrollBuffer_Cls(int BackColor)
 
 void BlitScreenToBitmap_SP(Bitmap *target_bitmap)
 {
-  int sx = TILEX + mScrollX % TILEX;
-  int sy = TILEY + mScrollY % TILEY;
+  int px = 2 * TILEX + (mScrollX - mScrollX_last) % TILEX;
+  int py = 2 * TILEY + (mScrollY - mScrollY_last) % TILEY;
+  int sx, sy, sxsize, sysize;
+
+#if 1
+  int xsize = SXSIZE;
+  int ysize = SYSIZE;
+  int full_xsize = (FieldWidth  - (menBorder.Checked ? 0 : 1)) * TILEX;
+  int full_ysize = (FieldHeight - (menBorder.Checked ? 0 : 1)) * TILEY;
+
+  sxsize = (full_xsize < xsize ? full_xsize : xsize);
+  sysize = (full_ysize < ysize ? full_ysize : ysize);
+  sx = SX + (full_xsize < xsize ? (xsize - full_xsize) / 2 : 0);
+  sy = SY + (full_ysize < ysize ? (ysize - full_ysize) / 2 : 0);
+#endif
+
+#if 1
+  if (!menBorder.Checked)
+  {
+    px += TILEX / 2;
+    py += TILEY / 2;
+  }
+#endif
 
-  BlitBitmap(screenBitmap, target_bitmap, sx, sy,
-            SCR_FIELDX * TILEX, SCR_FIELDY * TILEY, SX, SY);
+  BlitBitmap(screenBitmap, target_bitmap, px, py, sxsize, sysize, sx, sy);
 }
 
 void OLD_BlitScreenToBitmap_SP(Bitmap *target_bitmap)
@@ -413,11 +417,15 @@ void BackToFront_SP(void)
   if (1 ||
       redraw_tiles > REDRAWTILES_THRESHOLD || scrolling || scrolling_last)
   {
+#if 1
+    BlitScreenToBitmap_SP(window);
+#else
     /* blit all (up to four) parts of the scroll buffer to the backbuffer */
     BlitScreenToBitmap_SP(backbuffer);
 
     /* blit the completely updated backbuffer to the window (in one blit) */
     BlitBitmap(backbuffer, window, SX, SY, SXSIZE, SYSIZE, SX, SY);
+#endif
   }
   else
   {
@@ -521,8 +529,8 @@ void DDScrollBuffer_Blt_Ext(Bitmap *target_bitmap)
 #if 1
   if (!menBorder.Checked)
   {
-    SR.left += 16;
-    SR.top  += 16;
+    SR.left += TILEX / 2;
+    SR.top  += TILEY / 2;
   }
 #endif
 
index d86338138ce6a7827dbb90b7018d307d995f2ec1..402cdcadf0e7206ddfa86ae40c4cdc9f4f7b23dd 100644 (file)
@@ -13,6 +13,7 @@
 #include "global.h"
 
 extern long mScrollX, mScrollY;
+extern long mScrollX_last, mScrollY_last;
 
 extern boolean redraw[MAX_BUF_XSIZE][MAX_BUF_YSIZE];
 
index 95ac25a3ad90f25882d2e3929e4d02f50e6ed665..00e49d7ac02f62aaaac59c05e3445c853382f57a 100644 (file)
@@ -177,12 +177,25 @@ static void Blt(int pX, int pY, int SpriteX, int SpriteY)
   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;
@@ -191,6 +204,8 @@ static void Blt(int pX, int pY, int SpriteX, int SpriteY)
   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);
@@ -199,20 +214,20 @@ static void Blt(int pX, int pY, int SpriteX, int SpriteY)
   if (NoDisplayFlag)
     return;
 
-#if 1
+#if 0
   if (TEST_flag)
   {
-    if (pX < sx1 || pX >= sx2 || pY < sy1 || pY >= sy2)
-      printf("::: DDSpriteBuffer.c: Blt(): %d, %d [%d..%d, %d..%d] (%d, %d) [SKIPPED]\n",
-            pX, pY, sx1, sx2, sy1, sy2, mScrollX, mScrollY);
+    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] (%d, %d)\n",
-            pX, pY, sx1, sx2, sy1, sy2, mScrollX, mScrollY);
+      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)
+  if (pX < sx1 || pX > sx2 || pY < sy1 || pY > sy2)
     return;
 
 #if 0
index 9897250e76dee6d39400481eb6886a617a608229..a2dfbbeb100c21ec95681f311343691101a0d6e3 100644 (file)
@@ -1003,6 +1003,17 @@ static boolean InstanceStillRunning(char *TmpFile)
 
 #endif
 
+void DrawFrameIfNeeded()
+{
+  DrawFrame(0);
+
+  /* !!! CHECK THIS !!! */
+#if 1
+  if (! menBorder.Checked)
+    DrawFrame(1);
+#endif
+}
+
 void DisplayLevel()
 {
   int X, Y;
index 9846ce2c594b1b8467b70ca572e0b49e7a1a5182..0dc8547d0120931459ca49b0b46b1177d53da083 100644 (file)
@@ -12,6 +12,8 @@
 
 #include "global.h"
 
+extern void DrawFrameIfNeeded();
+
 extern void DisplayLevel();
 extern void DrawField(int X, int Y);
 extern void DrawFieldAnimated(int X, int Y);