X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Fant.c;h=56d3036cc8e8baa718e3343671325df3037a34dc;hb=39809ded547bdbb08207d3e514950425215b4410;hp=f41f19dee18561d93799b5d2d03aaee52a85f7b7;hpb=a94197e76a5dea5cb60542840809d6c20d0abbf3;p=xscreensaver diff --git a/hacks/ant.c b/hacks/ant.c index f41f19de..56d3036c 100644 --- a/hacks/ant.c +++ b/hacks/ant.c @@ -4,9 +4,8 @@ * as Greg Turk's turmites) whose tape is the screen */ -#if !defined( lint ) && !defined( SABER ) +#if 0 static const char sccsid[] = "@(#)ant.c 5.00 2000/11/01 xlockmore"; - #endif /*- @@ -53,23 +52,25 @@ static const char sccsid[] = "@(#)ant.c 5.00 2000/11/01 xlockmore"; Neighbors 6 and neighbors 3 produce the same Turk ants. */ +#ifndef HAVE_JWXYZ +/*# define DO_STIPPLE*/ +#endif + #ifdef STANDALONE -#define MODE_ant -#define PROGCLASS "Ant" -#define HACK_INIT init_ant -#define HACK_DRAW draw_ant -#define ant_opts xlockmore_opts -#define DEFAULTS "*delay: 1000 \n" \ - "*count: -3 \n" \ - "*cycles: 40000 \n" \ - "*size: -12 \n" \ - "*ncolors: 64 \n" \ - "*neighbors: 0 \n" \ - "*sharpturn: False \n" -#include "xlockmore.h" /* in xscreensaver distribution */ -#include "erase.h" +# define MODE_ant +# define DEFAULTS "*delay: 20000 \n" \ + "*count: -3 \n" \ + "*cycles: 40000 \n" \ + "*size: -12 \n" \ + "*ncolors: 64 \n" \ + "*fpsSolid: true \n" \ + +# define reshape_ant 0 +# define release_ant 0 +# define ant_handle_event 0 +# include "xlockmore.h" /* in xscreensaver distribution */ #else /* STANDALONE */ -#include "xlock.h" /* in xlockmore distribution */ +# include "xlock.h" /* in xlockmore distribution */ #endif /* STANDALONE */ #include "automata.h" @@ -91,40 +92,37 @@ static Bool sharpturn; static XrmOptionDescRec opts[] = { - {(char *) "-neighbors", (char *) ".ant.neighbors", XrmoptionSepArg, (caddr_t) NULL}, - {(char *) "-truchet", (char *) ".ant.truchet", XrmoptionNoArg, (caddr_t) "on"}, - {(char *) "+truchet", (char *) ".ant.truchet", XrmoptionNoArg, (caddr_t) "off"}, - {(char *) "-eyes", (char *) ".ant.eyes", XrmoptionNoArg, (caddr_t) "on"}, - {(char *) "+eyes", (char *) ".ant.eyes", XrmoptionNoArg, (caddr_t) "off"}, - {(char *) "-sharpturn", (char *) ".ant.sharpturn", XrmoptionNoArg, (caddr_t) "on"}, - {(char *) "+sharpturn", (char *) ".ant.sharpturn", XrmoptionNoArg, (caddr_t) "off"}, - {"-neighbors", ".ant.neighbors", XrmoptionSepArg, (caddr_t) 0}, - {"+neighbors", ".ant.neighbors", XrmoptionSepArg, (caddr_t) 0} + {"-neighbors", ".ant.neighbors", XrmoptionSepArg, 0}, + {"-truchet", ".ant.truchet", XrmoptionNoArg, "on"}, + {"+truchet", ".ant.truchet", XrmoptionNoArg, "off"}, + {"-eyes", ".ant.eyes", XrmoptionNoArg, "on"}, + {"+eyes", ".ant.eyes", XrmoptionNoArg, "off"}, + {"-sharpturn", ".ant.sharpturn", XrmoptionNoArg, "on"}, + {"+sharpturn", ".ant.sharpturn", XrmoptionNoArg, "off"}, }; static argtype vars[] = { - {(caddr_t *) & neighbors, (char *) "neighbors", (char *) "Neighbors", (char *) DEF_NEIGHBORS, t_Int}, - {(caddr_t *) & truchet, (char *) "truchet", (char *) "Truchet", (char *) DEF_TRUCHET, t_Bool}, - {(caddr_t *) & eyes, (char *) "eyes", (char *) "Eyes", (char *) DEF_EYES, t_Bool}, - {(caddr_t *) & sharpturn, (char *) "sharpturn", (char *) "SharpTurn", (char *) DEF_SHARPTURN, t_Bool}, - {(caddr_t *) & neighbors, "neighbors", "Neighbors", DEF_NEIGHBORS, t_Int} + {&neighbors, "neighbors", "Neighbors", DEF_NEIGHBORS, t_Int}, + {&truchet, "truchet", "Truchet", DEF_TRUCHET, t_Bool}, + {&eyes, "eyes", "Eyes", DEF_EYES, t_Bool}, + {&sharpturn, "sharpturn", "SharpTurn", DEF_SHARPTURN, t_Bool}, }; static OptionStruct desc[] = { - {(char *) "-neighbors num", (char *) "squares 4 or 8, hexagons 6, triangles 3 or 12"}, - {(char *) "-/+truchet", (char *) "turn on/off Truchet lines"}, - {(char *) "-/+eyes", (char *) "turn on/off eyes"}, - {(char *) "-/+sharpturn", (char *) "turn on/off sharp turns (6, 8 or 12 neighbors only)"} + {"-neighbors num", "squares 4 or 8, hexagons 6, triangles 3 or 12"}, + {"-/+truchet", "turn on/off Truchet lines"}, + {"-/+eyes", "turn on/off eyes"}, + {"-/+sharpturn", "turn on/off sharp turns (6, 8 or 12 neighbors only)"} }; -ModeSpecOpt ant_opts = +ENTRYPOINT ModeSpecOpt ant_opts = {sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc}; #ifdef USE_MODULES const ModStruct ant_description = {"ant", - "init_ant", "draw_ant", "release_ant", - "refresh_ant", "init_ant", (char *) NULL, &ant_opts, + "init_ant", "draw_ant", (char *) NULL, + "refresh_ant", "init_ant", "free_ant", &ant_opts, 1000, -3, 40000, -12, 64, 1.0, "", "Shows Langton's and Turk's generalized ants", 0, NULL}; @@ -133,7 +131,7 @@ const ModStruct ant_description = #define ANTBITS(n,w,h)\ if ((ap->pixmaps[ap->init_bits]=\ XCreatePixmapFromBitmapData(display,window,(char *)n,w,h,1,0,1))==None){\ - free_ant(display,ap); return;} else {ap->init_bits++;} + free_ant(mi); return;} else {ap->init_bits++;} /* If you change the table you may have to change the following 2 constants */ #define STATES 2 @@ -177,7 +175,9 @@ typedef struct { antstruct *ants; int init_bits; unsigned char colors[NUMSTIPPLES - 1]; +# ifdef DO_STIPPLE GC stippledGC; +# endif /* DO_STIPPLE */ Pixmap pixmaps[NUMSTIPPLES - 1]; union { XPoint hexagon[7]; /* Need more than 6 for truchet */ @@ -642,19 +642,20 @@ drawcell(ModeInfo * mi, int col, int row, unsigned char color) if (!color) { XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_BLACK_PIXEL(mi)); gc = MI_GC(mi); - } else if (MI_NPIXELS(mi) > 2) { - XSetForeground(MI_DISPLAY(mi), MI_GC(mi), - MI_PIXEL(mi, ap->colors[color - 1])); - gc = MI_GC(mi); - } else { +# ifdef DO_STIPPLE + } else if (MI_NPIXELS(mi) <= 2) { XGCValues gcv; - - gcv.stipple = ap->pixmaps[color - 1]; gcv.foreground = MI_WHITE_PIXEL(mi); gcv.background = MI_BLACK_PIXEL(mi); + gcv.stipple = ap->pixmaps[color - 1]; XChangeGC(MI_DISPLAY(mi), ap->stippledGC, GCStipple | GCForeground | GCBackground, &gcv); gc = ap->stippledGC; +# endif /* !DO_STIPPLE */ + } else { + XSetForeground(MI_DISPLAY(mi), MI_GC(mi), + MI_PIXEL(mi, ap->colors[color - 1])); + gc = MI_GC(mi); } fillcell(mi, gc, col, row); } @@ -971,15 +972,19 @@ getTurk(ModeInfo * mi, int i) ap->n, ap->neighbors, number, ap->ncolors); } -static void -free_ant(Display *display, antfarmstruct *ap) +ENTRYPOINT void +free_ant(ModeInfo * mi) { + Display *display = MI_DISPLAY(mi); + antfarmstruct *ap = &antfarms[MI_SCREEN(mi)]; int shade; +#ifdef DO_STIPPLE if (ap->stippledGC != None) { XFreeGC(display, ap->stippledGC); ap->stippledGC = None; } +#endif /* DO_STIPPLE */ for (shade = 0; shade < ap->init_bits; shade++) { XFreePixmap(display, ap->pixmaps[shade]); } @@ -998,32 +1003,35 @@ free_ant(Display *display, antfarmstruct *ap) } } -void +ENTRYPOINT void init_ant(ModeInfo * mi) { Display *display = MI_DISPLAY(mi); - Window window = MI_WINDOW(mi); int size = MI_SIZE(mi); antfarmstruct *ap; int col, row, dir; int i; - if (antfarms == NULL) { + MI_INIT(mi, antfarms); + /*if (antfarms == NULL) { if ((antfarms = (antfarmstruct *) calloc(MI_NUM_SCREENS(mi), sizeof (antfarmstruct))) == NULL) return; - } + }*/ ap = &antfarms[MI_SCREEN(mi)]; ap->redrawing = 0; +#ifdef DO_STIPPLE if (MI_NPIXELS(mi) <= 2) { - if (ap->stippledGC == None) { + Window window = MI_WINDOW(mi); + if (ap->stippledGC == None) { XGCValues gcv; gcv.fill_style = FillOpaqueStippled; - if ((ap->stippledGC = XCreateGC(display, window, GCFillStyle, + if ((ap->stippledGC = XCreateGC(display, window, + GCFillStyle, &gcv)) == None) { - free_ant(display, ap); + free_ant(mi); return; } } @@ -1033,6 +1041,7 @@ init_ant(ModeInfo * mi) } } } +#endif /* DO_STIPPLE */ ap->generation = 0; ap->n = MI_COUNT(mi); if (ap->n < -MINANTS) { @@ -1182,7 +1191,7 @@ init_ant(ModeInfo * mi) if (ap->ants == NULL) { if ((ap->ants = (antstruct *) malloc(ap->n * sizeof (antstruct))) == NULL) { - free_ant(display, ap); + free_ant(mi); return; } } @@ -1190,14 +1199,14 @@ init_ant(ModeInfo * mi) (void) free((void *) ap->tape); if ((ap->tape = (unsigned char *) calloc(ap->ncols * ap->nrows, sizeof (unsigned char))) == NULL) { - free_ant(display, ap); + free_ant(mi); return; } if (ap->truchet_state != NULL) (void) free((void *) ap->truchet_state); if ((ap->truchet_state = (unsigned char *) calloc(ap->ncols * ap->nrows, sizeof (unsigned char))) == NULL) { - free_ant(display, ap); + free_ant(mi); return; } @@ -1221,7 +1230,7 @@ init_ant(ModeInfo * mi) draw_anant(mi, dir, col, row); } -void +ENTRYPOINT void draw_ant(ModeInfo * mi) { antstruct *anant; @@ -1297,9 +1306,6 @@ draw_ant(ModeInfo * mi) draw_anant(mi, anant->direction, anant->col, anant->row); } if (++ap->generation > MI_CYCLES(mi)) { -#ifdef STANDALONE - erase_full_window(MI_DISPLAY(mi), MI_WINDOW(mi)); -#endif init_ant(mi); } if (ap->redrawing) { @@ -1321,20 +1327,8 @@ draw_ant(ModeInfo * mi) } } -void -release_ant(ModeInfo * mi) -{ - if (antfarms != NULL) { - int screen; - - for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) - free_ant(MI_DISPLAY(mi), &antfarms[screen]); - (void) free((void *) antfarms); - antfarms = (antfarmstruct *) NULL; - } -} - -void +#ifndef STANDALONE +ENTRYPOINT void refresh_ant(ModeInfo * mi) { antfarmstruct *ap; @@ -1349,5 +1343,8 @@ refresh_ant(ModeInfo * mi) ap->redrawpos = 0; } } +#endif + +XSCREENSAVER_MODULE ("Ant", ant) #endif /* MODE_ant */