From: Laurent Mazet Date: Thu, 27 Jun 2024 21:02:40 +0000 (+0200) Subject: fix shrink feature X-Git-Tag: v1.0~3 X-Git-Url: https://secure.softndesign.org/git/?a=commitdiff_plain;h=e41f113dccbb080252caa56d4a5fd14d0b31add4;p=gameoflife.git fix shrink feature --- diff --git a/function.c b/function.c index 8c3bb5b..1618b22 100644 --- a/function.c +++ b/function.c @@ -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) diff --git a/function.h b/function.h index 1c94d7f..2be51dd 100644 --- a/function.h +++ b/function.h @@ -11,6 +11,10 @@ } \ } 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); diff --git a/gameoflife.c b/gameoflife.c index 3a6e8a2..c67d1ea 100644 --- a/gameoflife.c +++ b/gameoflife.c @@ -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")); }