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"
{"-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};
#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;
#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
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);
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++)
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;
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;
}
(void) free((void *) rects);
}
free_state(lp, state);
- XFlush(display);
return True;
}
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
}
}
-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;
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;
}
}
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);
}
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) {
}
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()) {
init_adam(mi);
}
-void
-draw_loop(ModeInfo * mi)
+ENTRYPOINT void
+draw_loop (ModeInfo * mi)
{
int offset, i, j;
unsigned char *z, *znew;
}
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) {
}
}
-void
-refresh_loop(ModeInfo * mi)
+#ifndef STANDALONE
+ENTRYPOINT void
+refresh_loop (ModeInfo * mi)
{
loopstruct *lp;
lp->redrawing = 1;
lp->redrawpos = lp->by * lp->ncols + lp->bx;
}
+#endif
+
+XSCREENSAVER_MODULE ("Loop", loop)
#endif /* MODE_loop */