ftp://ftp.krokus.ru/pub/OpenBSD/distfiles/xscreensaver-4.22.tar.gz
[xscreensaver] / hacks / maze.c
index cfd212c4f9505a6bd601767be7c1898b2d48eb29..ba80e835e399d43893942063531318d25123831e 100644 (file)
@@ -91,14 +91,15 @@ static int solve_delay, pre_solve_delay, post_solve_delay;
 #include  <stdio.h>
 #include  <X11/Xlib.h>
 #include  <X11/Xutil.h>
-#ifndef VMS
-# include  <X11/bitmaps/gray1>
-#else  /* VMS */
-# include "sys$common:[decw$include.bitmaps]gray1.xbm"
-#endif /* VMS */
 
-#define MAX_MAZE_SIZE_X        500
-#define MAX_MAZE_SIZE_Y        500
+/* #include  <X11/bitmaps/gray1> */
+#define gray1_width  2
+#define gray1_height 2
+static char gray1_bits[] = { 0x01, 0x02 };
+
+
+#define MAX_MAZE_SIZE_X        1000
+#define MAX_MAZE_SIZE_Y        1000
 
 #define MOVE_LIST_SIZE  (MAX_MAZE_SIZE_X * MAX_MAZE_SIZE_Y)
 
@@ -134,8 +135,8 @@ static int solve_delay, pre_solve_delay, post_solve_delay;
 static int logo_x, logo_y;
 
 #ifdef XSCREENSAVER_LOGO
-# define logo_width  128
-# define logo_height 128
+# define logo_width  54
+# define logo_height 54
 #else
 # include  <X11/bitmaps/xlogo64>
 # define logo_width xlogo64_width
@@ -146,8 +147,8 @@ static int logo_x, logo_y;
 static unsigned short maze[MAX_MAZE_SIZE_X][MAX_MAZE_SIZE_Y];
 
 static struct {
-  unsigned char x;
-  unsigned char y;
+  unsigned short x;
+  unsigned short y;
   unsigned char dir, ways;
 } move_list[MOVE_LIST_SIZE], save_path[MOVE_LIST_SIZE], path[MOVE_LIST_SIZE];
 
@@ -1128,17 +1129,32 @@ draw_maze_border (void)                         /* draw the maze outline */
       Window r;
       int x, y;
       unsigned int w, h, bw, d;
+
+      /* round up to grid size */
+      int ww = ((logo_width  / grid_width) + 1)  * grid_width;
+      int hh = ((logo_height / grid_height) + 1) * grid_height;
+
       XGetGeometry (dpy, logo_map, &r, &x, &y, &w, &h, &bw, &d);
+
+# ifdef XSCREENSAVER_LOGO
+      /* kludge: if the logo "hole" is around the same size as the logo,
+         don't center it (since the xscreensaver logo image is a little
+         off center...  But do center if if the hole/gridsize is large. */
+      if (ww < logo_width  + 5) ww = w; 
+      if (hh < logo_height + 5) hh = h; 
+# endif /* XSCREENSAVER_LOGO */
+
       if (d == 1)
         XCopyPlane (dpy, logo_map, win, logo_gc,
                     0, 0, w, h,
-                    border_x + 3 + grid_width * logo_x,
-                    border_y + 3 + grid_height * logo_y, 1);
+                    border_x + 3 + grid_width  * logo_x + ((ww - w) / 2),
+                    border_y + 3 + grid_height * logo_y + ((hh - h) / 2),
+                    1);
       else
         XCopyArea (dpy, logo_map, win, logo_gc,
                    0, 0, w, h,
-                   border_x + 3 + grid_width * logo_x,
-                   border_y + 3 + grid_height * logo_y);
+                   border_x + 3 + grid_width  * logo_x + ((ww - w) / 2),
+                   border_y + 3 + grid_height * logo_y + ((hh - h) / 2));
     }
   draw_solid_square (start_x, start_y, WALL_TOP >> start_dir, tgc);
   draw_solid_square (end_x, end_y, WALL_TOP >> end_dir, tgc);
@@ -1258,27 +1274,27 @@ draw_solid_square(int i, int j,          /* draw a solid square in a square */
   switch (dir) {
   case WALL_TOP:
       XFillRectangle(dpy, win, gc,
-                    border_x + bw + grid_width * i, 
-                    border_y - bw + grid_height * j, 
-                    grid_width - (bw+bw), grid_height);
+                    border_x + bw+(bw==0?1:0) + grid_width * i, 
+                    border_y - bw-(bw==0?1:0) + grid_height * j, 
+                    grid_width - (bw+bw+(bw==0?1:0)), grid_height);
       break;
   case WALL_RIGHT:
       XFillRectangle(dpy, win, gc,
-                    border_x + bw + grid_width * i, 
-                    border_y + bw + grid_height * j, 
-                    grid_width, grid_height - (bw+bw));
+                    border_x + bw+(bw==0?1:0) + grid_width * i, 
+                    border_y + bw+(bw==0?1:0) + grid_height * j, 
+                    grid_width, grid_height - (bw+bw+(bw==0?1:0)));
       break;
   case WALL_BOTTOM:
       XFillRectangle(dpy, win, gc,
-                    border_x + bw + grid_width * i, 
-                    border_y + bw + grid_height * j, 
-                    grid_width - (bw+bw), grid_height);
+                    border_x + bw+(bw==0?1:0) + grid_width * i, 
+                    border_y + bw+(bw==0?1:0) + grid_height * j, 
+                    grid_width - (bw+bw+(bw==0?1:0)), grid_height);
       break;
   case WALL_LEFT:
       XFillRectangle(dpy, win, gc,
-                    border_x - bw + grid_width * i, 
-                    border_y + bw + grid_height * j, 
-                    grid_width, grid_height - (bw+bw));
+                    border_x - bw-(bw==0?1:0) + grid_width * i, 
+                    border_y + bw+(bw==0?1:0) + grid_height * j, 
+                    grid_width, grid_height - (bw+bw+(bw==0?1:0)));
       break;
   }
   XSync (dpy, False);
@@ -1361,7 +1377,9 @@ find_dead_regions(void)
          if((x < logo_x || x > logo_x + logo_width / grid_width) ||
             (y < logo_y || y > logo_y + logo_height / grid_height))
          {
-           if (!maze[x][y] & WALL_ANY)
+            /* if we are completely surrounded by walls, just draw the
+               inside part */
+            if ((maze[x][y] & WALL_ANY) == WALL_ANY)
              XFillRectangle(dpy, win, ugc,
                             border_x + bw + grid_width * x,
                             border_y + bw + grid_height * y,
@@ -1594,6 +1612,8 @@ XrmOptionDescRec options[] = {
   { "-solve-delay",    ".solveDelay",  XrmoptionSepArg, 0 },
   { "-pre-delay",      ".preDelay",    XrmoptionSepArg, 0 },
   { "-post-delay",     ".postDelay",   XrmoptionSepArg, 0 },
+  { "-bg-color",       ".background",  XrmoptionSepArg, 0 },
+  { "-fg-color",       ".foreground",  XrmoptionSepArg, 0 },
   { "-live-color",     ".liveColor",   XrmoptionSepArg, 0 },
   { "-dead-color",     ".deadColor",   XrmoptionSepArg, 0 },
   { "-skip-color",     ".skipColor",   XrmoptionSepArg, 0 },
@@ -1605,10 +1625,6 @@ XrmOptionDescRec options[] = {
   { 0, 0, 0, 0 }
 };
 
-#ifdef XSCREENSAVER_LOGO
-extern void xscreensaver_logo (Display *,Drawable,Colormap, Bool next_frame_p);
-#endif
-
 void
 screenhack(Display *display, Window window)
 {
@@ -1645,8 +1661,7 @@ screenhack(Display *display, Window window)
       XWindowAttributes xgwa;
       XGetWindowAttributes (dpy, window, &xgwa);
       XSelectInput (dpy, win,
-                    xgwa.your_event_mask | ExposureMask |
-                    ButtonPressMask |StructureNotifyMask);
+                    xgwa.your_event_mask | ExposureMask | ButtonPressMask);
     }
   
   gc  = XCreateGC(dpy, win, 0, 0);
@@ -1690,12 +1705,12 @@ screenhack(Display *display, Window window)
   
 #ifdef XSCREENSAVER_LOGO
   {
-    int w, h;
-    /* round up to grid size */
-    w = ((logo_width  / grid_width) + 1)  * grid_width;
-    h = ((logo_height / grid_height) + 1) * grid_height;
-    logo_map = XCreatePixmap (dpy, win, w, h, xgwa.depth);
-    xscreensaver_logo (dpy, logo_map, xgwa.colormap, False);
+    unsigned long *pixels; /* ignored - unfreed */
+    int npixels;
+    logo_map = xscreensaver_logo (xgwa.screen, xgwa.visual, win,
+                                  xgwa.colormap, bg,
+                                  &pixels, &npixels, 0,
+                                  logo_width > 150);
   }
 #else
   if  (!(logo_map = XCreateBitmapFromData (dpy, win, logo_bits,