|
|
1.1 root 1: /*
2: * $Locker: $
3: */
4: static char *rcsid = "$Header: muncher.c,v 1.3 87/09/08 08:08:17 swick Exp $";
5: /******************************************************************************
6: * Description:
7: * The famous munching squares.
8: *
9: * Brought to you by Jef Poskanzer.
10: *
11: * Copyright (C) 1987 by UniSoft Systems. Permission to use, copy,
12: * modify, and distribute this software and its documentation for any
13: * purpose and without fee is hereby granted, provided that this copyright
14: * notice appear in all copies and in all supporting documentation. No
15: * representation is made about the suitability of this software for any
16: * purpose. It is provided "as is" without express or implied warranty.
17: *
18: * Arguments:
19: * -r display on root window instead of creating a new one
20: * -s seed use this for the seed
21: * =wxh+x+y X geometry for new window (default 256x256 centered)
22: * host:display X display on which to run
23: *****************************************************************************/
24:
25:
26: #include <X11/Xlib.h>
27: #include <X11/Xatom.h>
28: #include <X11/Xutil.h>
29: #include <stdio.h>
30: #include <ctype.h>
31:
32:
33: extern GC XCreateGC();
34: extern long time();
35:
36: #ifdef BSD
37: extern long random();
38: #else
39: extern int rand();
40: #endif
41:
42: /* Some good seeds - if the user does not specify one, one of these gets
43: chosen randomly. */
44: int seeds[] =
45: {
46: 0x0001, 0x0002, 0x0101, 0x0666, 0x1111, 0x1212, 0x1249, 0x2222,
47: 0x3333, 0x4001, 0x4444, 0x5252, 0x5555, 0x6666, 0x8001, 0x8010
48: };
49:
50:
51: main(argc, argv)
52: int argc;
53: char **argv;
54: {
55: char **ap;
56: char *display = NULL;
57: char *geom = NULL;
58: int useRoot = 0;
59: int seed = 0;
60: char *usage = "usage: %s [=WIDxHGT+XOFF+YOFF] [-r] [-s SEED]\n";
61:
62: Window win;
63: int winX, winY, winW, winH;
64: XSetWindowAttributes xswa;
65: Display *dpy;
66: Screen *scr;
67: GC gc;
68: XEvent xev;
69:
70: #define BATCHSIZE 400
71: XPoint points[BATCHSIZE];
72: int size, n, nmask;
73: register int acc, i, x, y;
74: int xoffset, yoffset;
75:
76: /* Process arguments: */
77: ap = argv;
78: while (*++ap)
79: {
80: if (**ap == '=')
81: geom = *ap;
82: else if (index(*ap, ':'))
83: display = *ap;
84: else if (!strcmp(*ap, "-r"))
85: useRoot = 1;
86: else if (!strcmp(*ap, "-s"))
87: {
88: if ( *++ap )
89: {
90: if ( sscanf( *ap, "%x", &seed ) != 1 )
91: if ( sscanf( *ap, "0x%x", &seed ) != 1 )
92: {
93: fprintf( stderr, usage, *argv );
94: exit( 1 );
95: }
96: }
97: else
98: {
99: fprintf( stderr, usage, *argv );
100: exit( 1 );
101: }
102: }
103: else
104: {
105: fprintf( stderr, usage, *argv );
106: exit( 1 );
107: }
108: }
109:
110: if (!(dpy= XOpenDisplay(display)))
111: {
112: perror("Cannot open display\n");
113: exit(-1);
114: }
115:
116: scr = DefaultScreenOfDisplay(dpy);
117:
118: /* Set up window parameters, create and map window if necessary: */
119: if (useRoot)
120: {
121: win = DefaultRootWindow(dpy);
122: winX = 0;
123: winY = 0;
124: winW = DisplayWidth(dpy, DefaultScreen(dpy));
125: winH = DisplayHeight(dpy, DefaultScreen(dpy));
126: }
127: else
128: {
129: winW = 256;
130: winH = 256;
131: winX = (WidthOfScreen(scr) - winW) >> 1;
132: winY = (HeightOfScreen(scr) - winH) >> 1;
133: if (geom)
134: XParseGeometry(geom, &winX, &winY, &winW, &winH);
135:
136: xswa.event_mask = 0;
137: xswa.background_pixel = BlackPixelOfScreen(scr);
138: win = XCreateWindow(dpy, RootWindowOfScreen(scr),
139: winX, winY, winW, winH, 0,
140: DefaultDepthOfScreen(scr), InputOutput,
141: DefaultVisualOfScreen(scr),
142: CWEventMask | CWBackPixel, &xswa);
143: XChangeProperty(dpy, win, XA_WM_NAME, XA_STRING, 8,
144: PropModeReplace, "Muncher", 3);
145: XMapWindow(dpy, win);
146: }
147:
148: /* Set up a graphics context: */
149: gc = XCreateGC(dpy, win, 0, NULL);
150: XSetForeground(dpy, gc, WhitePixelOfScreen(scr));
151: XSetFunction(dpy, gc, GXinvert);
152: /* XSetFunction(dpy, gc, GXcopy); */
153:
154: /* Initialize munch algorithm. */
155: size = ( winW < winH ? winW : winH );
156: if ( size <= 0 ) size = 1;
157: for ( n = 30, nmask = 0x40000000; n >= 0; n--, nmask >>= 1 )
158: if ( size & nmask )
159: break;
160: size = 1 << n;
161: nmask = size - 1;
162: xoffset = ( winW - size ) / 2;
163: yoffset = ( winH - size ) / 2;
164: if ( seed == 0 )
165: {
166: #ifdef BSD
167: srandom((int) time(0) % 231);
168: seed = seeds[random() % (sizeof(seeds)/sizeof(seeds[0]) )];
169: #else
170: srand((int) time(0) % 231);
171: seed = seeds[rand() % (sizeof(seeds)/sizeof(seeds[0]) )];
172: #endif
173: }
174: printf( "size = %d, seed = 0x%x\n", size, seed );
175: acc = 0;
176:
177: /* Loop forever computing and drawing batches of points. */
178: for (;;)
179: {
180: if (XPending(dpy))
181: XNextEvent(dpy, &xev);
182:
183: for ( i=0; i < BATCHSIZE; i++ )
184: {
185: x = acc & nmask;
186: y = ( ( acc >> n ) & nmask ) ^ x;
187:
188: points[i].x = x + xoffset;
189: points[i].y = y + yoffset;
190:
191: acc += seed;
192: }
193:
194: XDrawPoints(dpy, win, gc, points, BATCHSIZE, CoordModeOrigin);
195: XSync(dpy, 0);
196: }
197: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.