argv@island.uu.net (Dan Heller) (09/25/89)
Submitted-by: Ed Kubaitis <uunet!ux1.cso.uiuc.edu!ejk> Posting-number: Volume 5, Issue 3 Archive-name: xfroot/part01 xfroot provides something like 1e48 new monochrome things to have in your root window. (Just what the world needs.) BTW, thank you for your efforts in providing this service. Ed Kubaitis (ejk@ux1.cso.uiuc.edu) Computing Services Office University of Illinois, Urbana #! /bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #! /bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create: # Imakefile # Makefile # README # xfroot.c # xfroot.man # This archive created: Sat Sep 23 12:20:19 1989 export PATH; PATH=/bin:/usr/bin:$PATH if test -f 'Imakefile' then echo shar: "will not over-write existing file 'Imakefile'" else cat << \SHAR_EOF > 'Imakefile' INCLUDES = -I$(TOP) -I$(TOP)/X11 LOCAL_LIBRARIES = $(XLIB) SYS_LIBRARIES = -lm SRCS = xfroot.c OBJS = xfroot.o SimpleProgramTarget(xfroot) SHAR_EOF fi if test -f 'Makefile' then echo shar: "will not over-write existing file 'Makefile'" else cat << \SHAR_EOF > 'Makefile' # Makefile generated by imake - do not edit! # $XConsortium: imake.c,v 1.37 88/10/08 20:08:30 jim Exp $ ########################################################################### # X Window System Makefile generated from template file Imake.tmpl # $XConsortium: Imake.tmpl,v 1.91 88/10/23 22:37:10 jim Exp $ # # Do not change the body of the imake template file. Server-specific # parameters may be set in the appropriate .macros file; site-specific # parameters (but shared by all servers) may be set in site.def. If you # make any changes, you'll need to rebuild the makefiles using # "make World" (at best) or "make Makefile; make Makefiles" (at least) in # the top level directory. # # If your C preprocessor doesn't define any unique symbols, you'll need # to set BOOTSTRAPCFLAGS when rebuilding imake (usually when doing # "make Makefile", "make Makefiles", or "make World"). # # If you absolutely can't get imake to work, you'll need to set the # variables at the top of each Makefile as well as the dependencies at the # bottom (makedepend will do this automatically). # ########################################################################### # platform-specific configuration parameters - edit Sqnt.macros to change # P = & TOP = TOPDIR BOOTSTRAPCFLAGS = AS = as CC = cc CPP = /lib/cpp LD = ld LINT = lint INSTALL = install TAGS = ctags RM = rm -f MV = mv LN = ln -s RANLIB = ranlib AR = ar clq LS = ls LINTOPTS = -axz LINTLIBFLAG = -C MAKE = make STD_DEFINES = CDEBUGFLAGS = -O DESTDIR = ########################################################################### # site-specific configuration parameters - edit site.def to change # site: $XConsortium: site.def,v 1.16 88/10/12 10:30:24 jim Exp $ ########################################################################### # definitions common to all Makefiles - do not edit SHELL = /bin/sh DESTDIR = USRLIBDIR = $(DESTDIR)/usr/lib BINDIR = $(DESTDIR)/usr/bin/X11 INCDIR = $(DESTDIR)/usr/include/X11 ADMDIR = $(DESTDIR)/usr/adm LIBDIR = $(USRLIBDIR)/X11 LINTLIBDIR = $(USRLIBDIR)/lint FONTDIR = $(LIBDIR)/fonts XINITDIR = $(LIBDIR)/xinit XDMDIR = $(LIBDIR)/xdm UWMDIR = $(LIBDIR)/uwm AWMDIR = $(LIBDIR)/awm TWMDIR = $(LIBDIR)/twm MANPATH = $(DESTDIR)/usr/man MANSOURCEPATH = $(MANPATH)/man MANDIR = $(MANSOURCEPATH)n LIBMANDIR = $(MANSOURCEPATH)3 XAPPLOADDIR = $(LIBDIR)/app-defaults INSTBINFLAGS = -m 0755 INSTUIDFLAGS = -m 4755 INSTLIBFLAGS = -m 0664 INSTINCFLAGS = -m 0444 INSTMANFLAGS = -m 0444 INSTAPPFLAGS = -m 0444 INSTKMEMFLAGS = -m 4755 FCFLAGS = -t CDEBUGFLAGS = -O PATHSEP = / DEPEND = makedepend IMAKE = imake RGB = $(RGBSRC)/rgb FC = $(BDFTOSNFSRC)/bdftosnf MKFONTDIR = $(MKFONTDIRSRC)/mkfontdir MKDIRHIER = $(SCRIPTSSRC)/mkdirhier.sh CFLAGS = $(CDEBUGFLAGS) $(INCLUDES) $(STD_DEFINES) $(DEFINES) LINTFLAGS = $(LINTOPTS) $(INCLUDES) $(STD_DEFINES) $(DEFINES) -DLINT LDFLAGS = $(CDEBUGFLAGS) $(SYS_LIBRARIES) $(SYSAUX_LIBRARIES) TOP = TOPDIR CLIENTSRC = $(TOP)/clients DEMOSRC = $(TOP)/demos LIBSRC = $(TOP)/lib FONTSRC = $(TOP)/fonts INCLUDESRC = $(TOP)/X11 SERVERSRC = $(TOP)/server UTILSRC = $(TOP)/util SCRIPTSSRC = $(UTILSRC)/scripts EXAMPLESRC = $(TOP)/examples CONTRIBSRC = $(TOP)/contrib DOCSRC = $(TOP)/doc RGBSRC = $(TOP)/rgb DEPENDSRC = $(UTILSRC)/makedepend IMAKESRC = $(UTILSRC)/imake IRULESRC = $(UTILSRC)/imake.includes XLIBSRC = $(LIBSRC)/X XMUSRC = $(LIBSRC)/Xmu TOOLKITSRC = $(LIBSRC)/Xt AWIDGETSRC = $(LIBSRC)/Xaw OLDXLIBSRC = $(LIBSRC)/oldX BDFTOSNFSRC = $(FONTSRC)/bdftosnf MKFONTDIRSRC = $(FONTSRC)/mkfontdir EXTENSIONSRC = $(TOP)/extensions EXTENSIONLIB = $(EXTENSIONSRC)/lib/libXext.a XLIB = $(XLIBSRC)/libX11.a XMULIB = $(XMUSRC)/libXmu.a OLDXLIB = $(OLDXLIBSRC)/liboldX.a XTOOLLIB = $(TOOLKITSRC)/libXt.a XAWLIB = $(AWIDGETSRC)/libXaw.a LINTXLIB = $(XLIBSRC)/llib-lX11.ln LINTXMU = $(XMUSRC)/llib-lXmu.ln LINTXTOOL = $(TOOLKITSRC)/llib-lXt.ln LINTXAW = $(AWIDGETSRC)/llib-lXaw.ln INCLUDES = -I$(TOP) MACROFILE = Sqnt.macros ICONFIGFILES = $(IRULESRC)/Imake.tmpl \ $(IRULESRC)/$(MACROFILE) $(IRULESRC)/site.def IMAKE_DEFINES = IMAKE_CMD = $(NEWTOP)$(IMAKE) -TImake.tmpl -I$(NEWTOP)$(IRULESRC) \ -s Makefile $(IMAKE_DEFINES) RM_CMD = $(RM) *.CKP *.ln *.BAK *.bak *.o core errs ,* *~ *.a \ .emacs_* tags TAGS make.log MakeOut ########################################################################### # rules: $XConsortium: Imake.rules,v 1.71 88/10/23 22:46:34 jim Exp $ # # The following settings allow this Makefile to stand OUTSIDE of # a complete X build tree. # SYS_LIBS=/usr/lib XLIB = $(SYS_LIBS)/libX11.a XMULIB = $(SYS_LIBS)/libXmu.a OLDXLIB = $(SYS_LIBS)/liboldX.a XTOOLLIB = $(SYS_LIBS)/libXt.a XAWLIB = $(SYS_LIBS)/libXaw.a ########################################################################### # start of Imakefile INCLUDES = -I$(TOP) -I$(TOP)/X11 LOCAL_LIBRARIES = $(XLIB) SYS_LIBRARIES = -lm SRCS = xfroot.c OBJS = xfroot.o OBJS = xfroot.o SRCS = xfroot.c PROGRAM = xfroot all:: xfroot xfroot:$(P) $(OBJS) $(LOCAL_LIBRARIES) $(RM) $@ $(CC) -o $@ $(OBJS) $(LOCAL_LIBRARIES) $(LDFLAGS) $(SYSLAST_LIBRARIES) relink:: $(RM) $(PROGRAM) $(MAKE) $(MFLAGS) $(PROGRAM) install:: xfroot $(INSTALL) -c $(INSTALLFLAGS) xfroot $(BINDIR) install.man:: xfroot.man $(INSTALL) -c $(INSTMANFLAGS) xfroot.man $(MANDIR)/xfroot.n depend:: $(DEPEND) -s "# DO NOT DELETE" -- $(CFLAGS) -- $(SRCS) clean:: $(RM) $(PROGRAM) ########################################################################### # Imake.tmpl common rules for all Makefiles - do not edit clean:: $(RM_CMD) \#* Makefile:: $(IMAKE) Makefile:: Imakefile \ $(IRULESRC)/Imake.tmpl \ $(IRULESRC)/Imake.rules \ $(IRULESRC)/site.def \ $(IRULESRC)/$(MACROFILE) -@if [ -f Makefile ]; then \ echo "$(RM) Makefile.bak; $(MV) Makefile Makefile.bak"; \ $(RM) Makefile.bak; $(MV) Makefile Makefile.bak; \ else exit 0; fi $(IMAKE_CMD) -DTOPDIR=$(TOP) $(IMAKE): @echo "making $@"; \ cd $(IMAKESRC); $(MAKE) BOOTSTRAPCFLAGS=$(BOOTSTRAPCFLAGS) tags:: $(TAGS) -w *.[ch] $(TAGS) -xw *.[ch] > TAGS ########################################################################### # empty rules for directories that do not have SUBDIRS - do not edit install:: @echo "install done" install.man:: @echo "install.man done" Makefiles:: ########################################################################### # dependencies generated by makedepend SHAR_EOF fi if test -f 'README' then echo shar: "will not over-write existing file 'README'" else cat << \SHAR_EOF > 'README' xfroot - set fractal root window (monochrome) 23 September 1989 The only tailoring needed is the definition of "HZ" in xfroot.c, and that only if your client uses other than 60 HZ ticks in values returned by times(3c). Clients found to have 60 HZ ticks include: Convex C200 Sequent Symmetry Vaxstation 2000 Vaxserver 3500 Sun 3/50 & 3/60 Clients found to have other than 60 HZ ticks: Cray 2 (replace "#define HZ 60" with "#include <sys/param.h>" Cray X (replace "#define HZ 60" with "#include <sys/machd.h>" For other clients, checks the times(3c) man page. The man page lists fractal points/cp_second measured by xfroot on the clients listed above. I would appreciate hearing about values measured on other platforms. The Makefile was generated by imake on a Sequent Symmetry, but the "P = &" (parallel make) platform-specific parameter was commented out. Portions of xfroot.c are copyrighted by Jef Poskanzer & Craig Leres. See their copyright and permission notice therein. For other acknowledgements, see the comments at the beginning of xfroot.c. Ed Kubaitis (ejk@ux1.cso.uiuc.edu) Computing Services Office University of Illinois, Urbana SHAR_EOF fi if test -f 'xfroot.c' then echo shar: "will not over-write existing file 'xfroot.c'" else cat << \SHAR_EOF > 'xfroot.c' /* * xfroot - set root window to monochrome fractal * * xfroot [-p npoints] [-P npoints] [-a value] [-b value] [-c value] * [-display display] * * -p npoints: maximum in-range points to calculate * -P npoints: maximum total points to calculate * defaults: -p: 25% of pixels in display * -P: 3 * -p value * value: floating point values for hopalong a, b, and c parameters * (default: randomly selected) * * The fractal algorithm (hopalong) was adapted from A. K. Dewdney's * "Computer Recreations" in the 9/86 Scientific American (attributed * to Barry Martin of Aston University, Birmingham, England.) * * The Xlib business-end (setroot) was adapted from "xphoon" by * Jef Poskanzer and Craig Leres. * * The Ranf portable random number generator is based on work by * D. H. Lehmer, Knuth, David Sachs(Fermilab) and Curt Canada(NCSA). * * This software is provided "as is" and with no warranties of any kind. * * Ed Kubaitis * Computing Services Office * University of Illinois, Urbana */ #include <X11/Xlib.h> #include <X11/Xutil.h> #include <stdio.h> #include <math.h> #include <stdio.h> #include <sys/times.h> #define HZ 60 /* see REAMDME */ #define Ranf() (double)((Ranfseed=(Ranfseed*1629+1)%1048576)/1048576.) #define Ranfset(l) (Ranfseed=((abs(l)*1629)+1)%1048576) long Ranfseed=4326; int mxp=0, np=0; /* max in-range points, in-range points */ int mxP=0, nP=0; /* max total points, total points */ double A=0, B=0, C=0; /* hopalong parameters */ int W, H; /* width and height of display (pixels) */ char *bmap; /* bitmap */ int bmn; /* number of bytes in bitmap */ Display *dpy = NULL; main(argc, argv) int argc; char *argv[]; { struct tms t; preset(argc, argv); hopalong(); times(&t); printf("xfroot: %d points %d(%d%%) in-range %d points/cp_second\n", nP, np, (100*np)/nP, (int)((double)nP/((double)(t.tms_utime + t.tms_stime)/(double)HZ))); setroot(W,H,bmap); XCloseDisplay(dpy); exit(0); } hopalong() { int wc=W/8, cx=W/2, cy=H/2, ix, iy; double x=0, y=0, xx, yy, t; while (np < mxp && ++nP < mxP) { t = sqrt(fabs(B*x-C)); xx = y - ( (x<0) ? t : -t ); yy = A - x; x = xx; y = yy; ix = cx + x; iy = cy + y; if (ix>-1 && iy>-1 && ix<(W-1) && iy<(H-1)) { bmap[iy*wc+(ix>>3)] |= 1<<(ix&7); np++; } } } hopset() { int r = Ranfseed; double pmax=1.0*W, logpmax=log(pmax); A = (A) ? A : exp(Ranf()*logpmax); if (r&2) A = -A; B = (B) ? B : exp(Ranf()*logpmax); if (r&4) B = -B; C = (C) ? C : Ranf()*pmax; if (r&8) C = -C; } preset(argc, argv) int argc; char *argv[]; { char *display = NULL; int i; for (i=1; i<argc; i++) { if (!strcmp(argv[i], "-p")) { if (++i>argc) usage(); if(!sscanf(argv[i], "%d", &mxp)) usage(); if (mxp <= 0) usage(); } else if (!strcmp(argv[i], "-P")) { if (++i>argc) usage(); if(!sscanf(argv[i], "%d", &mxP)) usage(); if (mxP <= 0) usage(); } else if (!strcmp(argv[i], "-a")) { if (++i>argc) usage(); if(!sscanf(argv[i], "%lf", &A)) usage(); } else if (!strcmp(argv[i], "-b")) { if (++i>argc) usage(); if(!sscanf(argv[i], "%lf", &B)) usage(); } else if (!strcmp(argv[i], "-c")) { if (++i>argc) usage(); if(!sscanf(argv[i], "%lf", &C)) usage(); } else if (!strcmp(argv[i], "-display")) { if (++i>argc) usage(); display=argv[i]; } else usage(); } dpy = XOpenDisplay(display); if (!dpy) { fprintf(stderr, "xfroot: Can't open display '%s'.\n", display); exit(1); } W = (int) DisplayWidth(dpy,0); H = (int) DisplayHeight(dpy,0); bmn =((W+7)/8)*H; bmap = (char *) malloc((unsigned)bmn); if (!bmap) { fprintf(stderr, "xfroot: malloc failed.\n"); exit(1);} bzero(bmap, bmn); Ranfset(time(0)%getpid()); hopset(); if (!mxp && !mxP) { mxp = (int) (0.25 * (float)(W*H)); mxP = 3 * mxp; } else if (!mxp) mxp = mxP; else if (!mxP) mxP = 3 * mxp; fprintf(stderr, "xfroot: A:%f B:%f C:%f\n", A, B, C); } /* ** Copyright (C) 1988 by Jef Poskanzer and Craig Leres. ** ** Permission to use, copy, modify, and distribute this software and its ** documentation for any purpose and without fee is hereby granted, provided ** that the above copyright notice appear in all copies and that both that ** copyright notice and this permission notice appear in supporting ** documentation. This software is provided "as is" without express or ** implied warranty. */ setroot(w, h, bits) int w, h; char *bits; { Pixmap bitmap, pixmap; GC gc; XGCValues gcv; bitmap = XCreateBitmapFromData(dpy, DefaultRootWindow(dpy), bits, w, h); if (bitmap == 0) { fprintf(stderr, "%s: Unable to store Bitmap", "xfroot"); exit(1); } gcv.foreground = WhitePixel(dpy,DefaultScreen(dpy)); gcv.background = BlackPixel(dpy,DefaultScreen(dpy)); gc = XCreateGC( dpy, DefaultRootWindow(dpy), GCForeground|GCBackground, &gcv); pixmap = XCreatePixmap( dpy, DefaultRootWindow(dpy), w, h, DefaultDepth(dpy, DefaultScreen(dpy))); if (pixmap == 0) { fprintf(stderr, "%s: Unable to create Pixmap", "xfroot"); exit(1); } XCopyPlane(dpy, bitmap, pixmap, gc, 0, 0, w, h, 0, 0, 1L); XSetWindowBackgroundPixmap(dpy, DefaultRootWindow(dpy), pixmap); XFreeGC(dpy, gc); XFreePixmap(dpy, bitmap); XFreePixmap(dpy, pixmap); XClearWindow(dpy, DefaultRootWindow(dpy)); XFlush(dpy); } usage() { fprintf(stderr, "usage: xfroot "); fprintf(stderr, "[-p npoints] "); fprintf(stderr, "[-P npoints] "); fprintf(stderr, "[-a real] "); fprintf(stderr, "[-b real] "); fprintf(stderr, "[-c real] "); fprintf(stderr, "[-display display] "); fprintf(stderr, "\n"); exit(1); } SHAR_EOF fi if test -f 'xfroot.man' then echo shar: "will not over-write existing file 'xfroot.man'" else cat << \SHAR_EOF > 'xfroot.man' .TH xfroot 1 "21 September 1989" .SH NAME xfroot \- set fractal root window (monochrome) .SH SYNOPSIS .in +.5i .ti -.5i xfroot \%[\-p n] \%[\-P n] \%[\-a r] \%[\-b r] \%[\-c r] \%[\-display display] .in -.5i .SH DESCRIPTION .I Xfroot sets the X root window to display a monochrome fractal. The fractal algorithm was published in A. K. Dewdney's .I "Computer Recreations" column in the September 1986 .I "Scientific American" and attributed to Barry Martin of Aston University, Birmingham, England. .sp .SH OPTIONS .PP .B "\-p \-P" .RS 5 Sets maximum points to calculate to \fIn\fP. \fB\-p\fP sets the maximum for in-range (i.e. on display) points. \fB\-P\fP sets the total points to calculate. Defaults: \fB\-p\fP: 25% of pixels in server display. \fB\-P\fP: 3 times the \fB\-p\fP value. .RE .sp .B "\-a \-b \-c" .RS 5 Sets the corresponding fractal algorithm parameter to the real value .IR r . Interesting values seem to be in the range -1000 < r < 1000. The algorithm seems sensitive to changes in the values out to the precision (double) of the arithmetic, about 16 significant digits. By default, random values are assigned. .SH SPECIAL CONSIDERATIONS With the default parameters, .I xfroot calculates hundreds of thousands of points. Each point requires a double precision square root, multiply and three or four subtracts, plus integer arithmetic to determine if the point is in range and store the point in a bit map. Since each point depends on the value for the previous point, the calculation does not lend itself to vectorizing or parallelization. .LP The following table is a rough guide to the amount of processor time involved. It gives ranges of fractal points per uniprocessor second measured on a variety of client hosts. The lower values for a processor reflect the case when all or most points are in in-range and require bit-manipulation to record the point. .sp .B " Cray X-MP: 157,000 to 194,000 *" .br .B " Cray 2: 129,000 to 183,000 *" .br .B " Convex C200: 41,000 to 47,000 *" .br .B " Vaxserver 3500: 13,200 to 15,200" .br .B " Sequent Symmetry: 9,900 to 10,500 *" .br .B " Vaxstation 2000: 4,670 to 5,530" .br .B " Sun 3/60: 1,960 to 2,060" .br .B " Sun 3/50: 1,270 to 1,330" .br .B " (* = per processor)" .sp .SH AUTHORS .LP Ed Kubaitis, Computing Services Office, University of Illinois. .LP The Xlib code to set the root screen was adapted from code in xphoon by Jef Poskanzer and Craig Leres, and carries the following copyright: Copyright (C) 1988 by Jef Poskanzer and Craig Leres. Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation. This software is provided "as is" without express or implied warranty. SHAR_EOF fi exit 0 # End of shell archive