fix shrink feature
authorLaurent Mazet <mazet@softndesign.org>
Thu, 27 Jun 2024 21:02:40 +0000 (23:02 +0200)
committerLaurent Mazet <mazet@softndesign.org>
Thu, 27 Jun 2024 21:02:40 +0000 (23:02 +0200)
function.c
function.h
gameoflife.c

index 8c3bb5b5d9736c7bab38e0bec060e3d68f6be80e..1618b22ba373a372206d7cbe341b745f3692c25d 100644 (file)
@@ -53,9 +53,10 @@ board_t *resizeboard (board_t *board, int xsize, int ysize, int xoffset, int yof
 
     board_t *newboard = initboard (xsize, ysize);
 
-    for (i = 0; (i + xoffset < board->xsize) && (i < xsize); i++) {
-        for (j = 0; (j + yoffset < board->ysize) && (j < ysize); j++) {
-            *getcell (newboard, i, j) = *getcell (board, i + xoffset, j + yoffset);
+    for (i = 0; (i + max (0, xoffset) < board->xsize) && (i - min (0, xoffset) < xsize); i++) {
+        for (j = 0; (j + max (0, yoffset) < board->ysize) && (j - min (0, yoffset) < ysize); j++) {
+            *getcell (newboard, i - min(0, xoffset), j - min (0, yoffset)) =
+                *getcell (board, i + max (0, xoffset), j + max (0, yoffset));
         }
     }
 
@@ -122,7 +123,9 @@ board_t *shrinkboard (board_t *board)
         }
     }
 
-   return resizeboard (board, imax - imin + 1, jmax - jmin + 1, imin, jmin);
+    board_t *newboard = initboard (0, 0);
+    copyboard (newboard, board);
+    return resizeboard (newboard, imax - imin + 1, jmax - jmin + 1, imin, jmin);
 }
 
 void freeboard (board_t *board)
index 1c94d7fc04aa1992a527017d30309d03e2352a9b..2be51dd496993b54057b9a3d2e50d277d24c09df 100644 (file)
         } \
     } while (0)
 
+#define max(a,b) ({ __typeof__ (a) _a = (a); __typeof__ (b) _b = (b); _a > _b ? _a : _b; })
+
+#define min(a,b) ({ __typeof__ (a) _a = (a); __typeof__ (b) _b = (b); _a < _b ? _a : _b; })
+
 int strmaxlen (char *str, char ch);
 
 board_t *initboard (int xsize, int ysize);
index 3a6e8a2cc1eef17f10a11cb4e762b75aea3a2dbc..c67d1eab2944c6d9ae22ae500b97fe8529899264 100644 (file)
@@ -15,8 +15,6 @@
 #include "function.h"
 #include "type.h"
 
-#define max(a,b) ({ __typeof__ (a) _a = (a); __typeof__ (b) _b = (b); _a > _b ? _a : _b; })
-
 /* static variables */
 char *progname = NULL;
 char *version = "0.1";
@@ -183,7 +181,7 @@ int main (int argc, char *argv[])
     }
     board_t *board = NULL;
     if (playground) {
-        board = resizeboard (playground, xsize, ysize, 0, 0);
+        board = resizeboard (playground, xsize, ysize, (playground->xsize - xsize) / 2, (playground->ysize - ysize) / 2);
     } else {
         board = initboard (xsize, ysize);
     }
@@ -285,10 +283,9 @@ int main (int argc, char *argv[])
                 savename = savewindow (savelen, xsave, ysave);
                 if (savename != NULL) {
                     board_t *miniboard = shrinkboard (board);
-                    board_t *temp = resizeboard (miniboard, miniboard->xsize + 2, miniboard->ysize + 2, 1, 1);
+                    resizeboard (miniboard, miniboard->xsize + 2, miniboard->ysize + 2, -1, -1);
+                    ptr = saveboard (miniboard, "Board");
                     freeboard (miniboard);
-                    ptr = saveboard (temp, "Board");
-                    freeboard (temp);
                     if (writedata (savename, ptr)) {
                         VERBOSE (WARNING, printf ("issue writing Board\n"));
                     }