From http://www.jwz.org/xscreensaver/xscreensaver-5.38.tar.gz
[xscreensaver] / hacks / pacman.c
index 58b2bed6114562d8d2b0f0e427646a5a748c09f8..ae1b029bc9b71fb767e64f4eca57795aeda07e7e 100644 (file)
@@ -55,6 +55,7 @@ static const char sccsid[] = "@(#)pacman.c    5.00 2000/11/01 xlockmore";
 
 #      define UNIFORM_COLORS
 #      define BRIGHT_COLORS
+#      define release_pacman 0
 #   define pacman_handle_event 0
 #      include "xlockmore.h"   /* in xscreensaver distribution */
 #   include <assert.h>
@@ -148,10 +149,10 @@ ModStruct pacman_description = {
     "pacman",                   /* *cmdline_arg; */
     "init_pacman",              /* *init_name; */
     "draw_pacman",              /* *callback_name; */
-    "release_pacman",           /* *release_name; */
+    (char *) NULL,              /* *release_name; */
     "refresh_pacman",           /* *refresh_name; */
     "change_pacman",            /* *change_name; */
-    (char *) NULL,              /* *unused_name; */
+    "free_pacman",              /* *free_name; */
     &pacman_opts,               /* *msopts */
     10000, 4, 1, 0, 64, 1.0, "", "Shows Pacman(tm)", 0, NULL
 };
@@ -165,9 +166,11 @@ static void repopulate (ModeInfo * mi);
 static void drawlevel (ModeInfo * mi);
 
 
-static void
-free_pacman (Display * display, pacmangamestruct * pp)
+ENTRYPOINT void
+free_pacman (ModeInfo * mi)
 {
+    Display * display = MI_DISPLAY (mi);
+    pacmangamestruct * pp = &pacman_games[MI_SCREEN (mi)];
     int dir, mouth, i, j, k;
 
     if (pp->ghosts != NULL) {
@@ -204,7 +207,7 @@ reset_level (ModeInfo * mi, int n, int pac_init)
     pacmangamestruct *pp = &pacman_games[MI_SCREEN (mi)];
     unsigned int ghost;
 
-    MI_CLEARWINDOW (mi);
+    XClearWindow (MI_DISPLAY(mi), MI_WINDOW(mi));
     drawlevel (mi);
 
     pp->gamestate = GHOST_DANGER;
@@ -1487,12 +1490,7 @@ init_pacman (ModeInfo * mi)
     int dir, mouth;
 #endif
 
-    if (pacman_games == NULL) {
-        if ((pacman_games = (pacmangamestruct *)
-             calloc ((size_t) MI_NUM_SCREENS (mi),
-                     sizeof (pacmangamestruct))) == NULL)
-            return;
-    }
+    MI_INIT (mi, pacman_games);
     pp = &pacman_games[MI_SCREEN (mi)];
 
     pp->width = (unsigned short) MI_WIDTH (mi);
@@ -1521,9 +1519,15 @@ init_pacman (ModeInfo * mi)
     if (size == 0 ||
         MINGRIDSIZE * size > (int) pp->width ||
         MINGRIDSIZE * size > (int) pp->height) {
-
-        pp->ys = pp->xs = MAX (MIN (pp->width / LEVWIDTH,
-                                    pp->height / LEVHEIGHT), 1);
+        double scale = MIN (pp->width / LEVWIDTH, pp->height / LEVHEIGHT);
+
+        if (pp->width > pp->height * 5 ||  /* weird window aspect ratio */
+            pp->height > pp->width * 5)
+            scale = 0.8 * (pp->width / pp->height
+                           ? pp->width / (double) pp->height
+                           : pp->height / (double) pp->width);
+        pp->ys = MAX (scale, 1);
+        pp->xs = pp->ys;
     }
     else {
         if (size < -MINSIZE)
@@ -1541,6 +1545,7 @@ init_pacman (ModeInfo * mi)
         pp->xs = pp->ys;
     }
 
+
     pp->wallwidth = (unsigned int) (pp->xs + pp->ys) >> 4;
     if (pp->wallwidth < 1)
         pp->wallwidth = 1;
@@ -1562,7 +1567,7 @@ init_pacman (ModeInfo * mi)
         if ((pp->stippledGC = XCreateGC (display, window,
                                          GCForeground | GCBackground,
                                          &gcv)) == None) {
-            free_pacman (display, pp);
+            free_pacman (mi);
             return;
         }
     }
@@ -1578,7 +1583,7 @@ init_pacman (ModeInfo * mi)
     if ((pp->ghostPixmap[0][0][0] = XCreatePixmap (display, window,
                                                    pp->spritexs, pp->spriteys,
                                                    1)) == None) {
-        free_pacman (display, pp);
+        free_pacman (mi);
         return;
     }
 
@@ -1586,7 +1591,7 @@ init_pacman (ModeInfo * mi)
     gcv.background = 1;
     if ((bg_gc = XCreateGC (display, pp->ghostPixmap[0][0][0],
                             GCForeground | GCBackground, &gcv)) == None) {
-        free_pacman (display, pp);
+        free_pacman (mi);
         return;
     }
 
@@ -1595,7 +1600,7 @@ init_pacman (ModeInfo * mi)
     if ((fg_gc = XCreateGC (display, pp->ghostPixmap[0][0][0],
                             GCForeground | GCBackground, &gcv)) == None) {
         XFreeGC (display, bg_gc);
-        free_pacman (display, pp);
+        free_pacman (mi);
         return;
     }
 
@@ -1633,7 +1638,7 @@ init_pacman (ModeInfo * mi)
             if ((pp->pacmanPixmap[dir][mouth] =
                  XCreatePixmap (display, MI_WINDOW (mi), pp->spritexs,
                                 pp->spriteys, 1)) == None) {
-                free_pacman (display, pp);
+                free_pacman (mi);
                 return;
             }
             gcv.foreground = 1;
@@ -1641,7 +1646,7 @@ init_pacman (ModeInfo * mi)
             if ((fg_gc = XCreateGC (display, pp->pacmanPixmap[dir][mouth],
                                     GCForeground | GCBackground,
                                     &gcv)) == None) {
-                free_pacman (display, pp);
+                free_pacman (mi);
                 return;
             }
             gcv.foreground = 0;
@@ -1651,7 +1656,7 @@ init_pacman (ModeInfo * mi)
                                     GCForeground |
                                     GCBackground, &gcv)) == None) {
                 XFreeGC (display, fg_gc);
-                free_pacman (display, pp);
+                free_pacman (mi);
                 return;
             }
             XFillRectangle (display,
@@ -1688,13 +1693,13 @@ init_pacman (ModeInfo * mi)
         if ((pp->ghosts = (ghoststruct *) calloc ((size_t) pp->nghosts,
                                                   sizeof (ghoststruct))) ==
             NULL) {
-            free_pacman (display, pp);
+            free_pacman (mi);
             return;
         }
 
     pp->pacman.mouthstage = MAXMOUTH - 1;
 
-    MI_CLEARWINDOW (mi);
+    XClearWindow (MI_DISPLAY(mi), MI_WINDOW(mi));
     repopulate (mi);
 }
 
@@ -1750,20 +1755,7 @@ draw_pacman (ModeInfo * mi)
     pacman_tick (mi);
 }
 
-/* Releases resources. */
-ENTRYPOINT void
-release_pacman (ModeInfo * mi)
-{
-    if (pacman_games != NULL) {
-        int screen;
-
-        for (screen = 0; screen < MI_NUM_SCREENS (mi); screen++)
-            free_pacman (MI_DISPLAY (mi), &pacman_games[screen]);
-        free (pacman_games);
-        pacman_games = (pacmangamestruct *) NULL;
-    }
-}
-
+#ifndef STANDALONE
 /* Refresh current level. */
 ENTRYPOINT void
 refresh_pacman (ModeInfo * mi)
@@ -1771,6 +1763,7 @@ refresh_pacman (ModeInfo * mi)
     drawlevel (mi);
     pacman_tick (mi);
 }
+#endif
 
 ENTRYPOINT void
 reshape_pacman(ModeInfo * mi, int width, int height)
@@ -1780,7 +1773,7 @@ reshape_pacman(ModeInfo * mi, int width, int height)
     pp->height = height;
     pp->xb = (pp->width  - pp->ncols * pp->xs) >> 1;
     pp->yb = (pp->height - pp->nrows * pp->ys) >> 1;
-    MI_CLEARWINDOW (mi);
+    XClearWindow (MI_DISPLAY(mi), MI_WINDOW(mi));
     /* repopulate (mi); */
     drawlevel (mi);
 }
@@ -1790,7 +1783,7 @@ reshape_pacman(ModeInfo * mi, int width, int height)
 ENTRYPOINT void
 change_pacman (ModeInfo * mi)
 {
-    MI_CLEARWINDOW (mi);
+    XClearWindow (MI_DISPLAY(mi), MI_WINDOW(mi));
     repopulate (mi);
 }
 #endif /* !STANDALONE */