X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Floop.c;h=8d9cc95efbc1a087362837993b1ce1786bbae84d;hb=78add6e627ee5f10e1fa6f3852602ea5066eee5a;hp=e271951960fa97cf4fe97cc93d276e181f35e287;hpb=ffd8c0873576a9e3065696a624dce6b766b77062;p=xscreensaver diff --git a/hacks/loop.c b/hacks/loop.c index e2719519..8d9cc95e 100644 --- a/hacks/loop.c +++ b/hacks/loop.c @@ -79,22 +79,27 @@ static const char sccsid[] = "@(#)loop.c 5.01 2000/03/15 xlockmore"; there is handedness at both the initial condition and the transition rule. */ +#ifndef HAVE_JWXYZ +# define DO_STIPPLE +#endif + #ifdef STANDALONE -#define MODE_loop -#define PROGCLASS "loop" -#define HACK_INIT init_loop -#define HACK_DRAW draw_loop -#define loop_opts xlockmore_opts -#define DEFAULTS "*delay: 100000 \n" \ - "*count: -5 \n" \ - "*cycles: 1600 \n" \ - "*size: -12 \n" \ - "*ncolors: 15 \n" \ - "*neighbors: 0 \n" -#define UNIFORM_COLORS -#include "xlockmore.h" /* in xscreensaver distribution */ +# define MODE_loop +# define DEFAULTS "*delay: 100000 \n" \ + "*count: -5 \n" \ + "*cycles: 1600 \n" \ + "*size: -12 \n" \ + "*ncolors: 15 \n" \ + "*fpsSolid: true \n" \ + "*ignoreRotation: True \n" \ + ".lowrez: True \n" \ + +# define reshape_loop 0 +# define loop_handle_event 0 +# define UNIFORM_COLORS +# 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" @@ -122,14 +127,14 @@ static OptionStruct desc[] = {"-neighbors num", "squares 4 or hexagons 6"} }; -ModeSpecOpt loop_opts = +ENTRYPOINT ModeSpecOpt loop_opts = {sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc}; #ifdef USE_MODULES ModStruct loop_description = {"loop", "init_loop", "draw_loop", "release_loop", - "refresh_loop", "init_loop", (char *) NULL, &loop_opts, + "refresh_loop", "init_loop", "free_loop", &loop_opts, 100000, 5, 1600, -12, 64, 1.0, "", "Shows Langton's self-producing loops", 0, NULL}; @@ -137,8 +142,8 @@ ModStruct loop_description = #define LOOPBITS(n,w,h)\ if ((lp->pixmaps[lp->init_bits]=\ - XCreatePixmapFromBitmapData(display,window,(char *)n,w,h,1,0,1))==None){\ - free_loop(display,lp); return;} else {lp->init_bits++;} + XCreatePixmapFromBitmapData(MI_DISPLAY(mi),window,(char *)n,w,h,1,0,1))==None){\ + free_loop(mi); return;} else {lp->init_bits++;} static int local_neighbors = 0; @@ -186,7 +191,8 @@ static int local_neighbors = 0; #define HEX_ADAM_LOOPY 7 #endif #define HEX_MINGRIDSIZE (6*HEX_ADAM_LOOPX) -#define MINSIZE ((MI_NPIXELS(mi)>=COLORS)?1:(2+(local_neighbors==6))) +/* #define MINSIZE ((MI_NPIXELS(mi)>=COLORS)?1:(2+(local_neighbors==6))) */ +#define MINSIZE 5 #define NEIGHBORKINDS 2 #define ANGLES 360 #define MAXNEIGHBORS 6 @@ -858,11 +864,16 @@ drawcell(ModeInfo * mi, int col, int row, int state) gc = MI_GC(mi); XSetForeground(MI_DISPLAY(mi), gc, lp->colors[state]); } else { +#ifdef DO_STIPPLE gcv.stipple = lp->pixmaps[state]; +#endif /* DO_STIPPLE */ gcv.foreground = MI_WHITE_PIXEL(mi); gcv.background = MI_BLACK_PIXEL(mi); XChangeGC(MI_DISPLAY(mi), lp->stippledGC, - GCStipple | GCForeground | GCBackground, &gcv); +#ifdef DO_STIPPLE + GCStipple | +#endif /* DO_STIPPLE */ + GCForeground | GCBackground, &gcv); gc = lp->stippledGC; } fillcell(mi, gc, col, row); @@ -909,9 +920,11 @@ free_list(loopstruct * lp) free_state(lp, state); } -static void -free_loop(Display *display, loopstruct * lp) +ENTRYPOINT void +free_loop(ModeInfo * mi) { + Display *display = MI_DISPLAY(mi); + loopstruct *lp = &loops[MI_SCREEN(mi)]; int shade; for (shade = 0; shade < lp->init_bits; shade++) @@ -943,7 +956,7 @@ addtolist(ModeInfo * mi, int col, int row, unsigned char state) if ((lp->cellList[state] = (CellList *) malloc(sizeof (CellList))) == NULL) { lp->cellList[state] = current; - free_loop(MI_DISPLAY(mi), lp); + free_loop(mi); return False; } lp->cellList[state]->pt.x = col; @@ -966,11 +979,16 @@ draw_state(ModeInfo * mi, int state) gc = MI_GC(mi); XSetForeground(display, gc, lp->colors[state]); } else { +#ifdef DO_STIPPLE gcv.stipple = lp->pixmaps[state]; +#endif /* DO_STIPPLE */ gcv.foreground = MI_WHITE_PIXEL(mi); gcv.background = MI_BLACK_PIXEL(mi); XChangeGC(display, lp->stippledGC, - GCStipple | GCForeground | GCBackground, &gcv); +#ifdef DO_STIPPLE + GCStipple | +#endif /* DO_STIPPLE */ + GCForeground | GCBackground, &gcv); gc = lp->stippledGC; } @@ -1016,7 +1034,6 @@ draw_state(ModeInfo * mi, int state) (void) free((void *) rects); } free_state(lp, state); - XFlush(display); return True; } @@ -1140,7 +1157,7 @@ static void init_adam(ModeInfo * mi) { loopstruct *lp = &loops[MI_SCREEN(mi)]; - XPoint start, dirx, diry; + XPoint start = { 0, 0 }, dirx = { 0, 0 }, diry = { 0, 0 }; int i, j, dir; #ifdef DELAYDEBUGLOOP @@ -1408,17 +1425,9 @@ do_gen(loopstruct * lp) } } -void -release_loop(ModeInfo * mi) +ENTRYPOINT void +release_loop (ModeInfo * mi) { - if (loops != NULL) { - int screen; - - for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) - free_loop(MI_DISPLAY(mi), &loops[screen]); - (void) free((void *) loops); - loops = (loopstruct *) NULL; - } if (table != NULL) { (void) free((void *) table); table = (unsigned int *) NULL; @@ -1428,32 +1437,31 @@ release_loop(ModeInfo * mi) static void *stop_warning_about_triangleUnit_already; -void -init_loop(ModeInfo * mi) +ENTRYPOINT void +init_loop (ModeInfo * mi) { - Display *display = MI_DISPLAY(mi); - Window window = MI_WINDOW(mi); int i, size = MI_SIZE(mi); loopstruct *lp; - XGCValues gcv; stop_warning_about_triangleUnit_already = (void *) &triangleUnit; - if (loops == NULL) { - if ((loops = (loopstruct *) calloc(MI_NUM_SCREENS(mi), - sizeof (loopstruct))) == NULL) - return; - } + MI_INIT (mi, loops); lp = &loops[MI_SCREEN(mi)]; lp->redrawing = 0; + if (MI_WIDTH(mi) < 100 || MI_HEIGHT(mi) < 100) /* tiny window */ + size = MIN(MI_WIDTH(mi), MI_HEIGHT(mi)); + +#ifdef DO_STIPPLE if ((MI_NPIXELS(mi) < COLORS) && (lp->init_bits == 0)) { - if (lp->stippledGC == None) { + Window window = MI_WINDOW(mi); + XGCValues gcv; + if (lp->stippledGC == None) { gcv.fill_style = FillOpaqueStippled; - if ((lp->stippledGC = XCreateGC(display, window, + if ((lp->stippledGC = XCreateGC(MI_DISPLAY(mi), window, GCFillStyle, &gcv)) == None) { - free_loop(display, lp); + free_loop(mi); return; } } @@ -1466,6 +1474,7 @@ init_loop(ModeInfo * mi) LOOPBITS(stipples[8], STIPPLESIZE, STIPPLESIZE); LOOPBITS(stipples[10], STIPPLESIZE, STIPPLESIZE); } +#endif /* DO_STIPPLE */ if (MI_NPIXELS(mi) >= COLORS) { /* Maybe these colors should be randomized */ lp->colors[0] = MI_BLACK_PIXEL(mi); @@ -1561,7 +1570,7 @@ init_loop(ModeInfo * mi) } if ((lp->oldcells = (unsigned char *) calloc(lp->bncols * lp->bnrows, sizeof (unsigned char))) == NULL) { - free_loop(display, lp); + free_loop(mi); return; } if (lp->newcells != NULL) { @@ -1570,7 +1579,7 @@ init_loop(ModeInfo * mi) } if ((lp->newcells = (unsigned char *) calloc(lp->bncols * lp->bnrows, sizeof (unsigned char))) == NULL) { - free_loop(display, lp); + free_loop(mi); return; } if (!init_table()) { @@ -1596,8 +1605,8 @@ init_loop(ModeInfo * mi) init_adam(mi); } -void -draw_loop(ModeInfo * mi) +ENTRYPOINT void +draw_loop (ModeInfo * mi) { int offset, i, j; unsigned char *z, *znew; @@ -1640,7 +1649,7 @@ draw_loop(ModeInfo * mi) } for (i = 0; i < COLORS; i++) if (!draw_state(mi, i)) { - free_loop(MI_DISPLAY(mi), lp); + free_loop(mi); return; } if (++lp->generation > MI_CYCLES(mi) || lp->dead) { @@ -1664,8 +1673,9 @@ draw_loop(ModeInfo * mi) } } -void -refresh_loop(ModeInfo * mi) +#ifndef STANDALONE +ENTRYPOINT void +refresh_loop (ModeInfo * mi) { loopstruct *lp; @@ -1677,5 +1687,8 @@ refresh_loop(ModeInfo * mi) lp->redrawing = 1; lp->redrawpos = lp->by * lp->ncols + lp->bx; } +#endif + +XSCREENSAVER_MODULE ("Loop", loop) #endif /* MODE_loop */