X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Flissie.c;h=f968421b201525dc7d0258e0c38353da873c55d6;hb=4361b69d3178d7fc98d0388f9a223af6c2651aba;hp=2a8fafacb0ca5e1b6cad8ff4f8a22a0fe38d476a;hpb=df7adbee81405e2849728a24b498ad2117784b1f;p=xscreensaver diff --git a/hacks/lissie.c b/hacks/lissie.c index 2a8fafac..f968421b 100644 --- a/hacks/lissie.c +++ b/hacks/lissie.c @@ -1,8 +1,8 @@ /* -*- Mode: C; tab-width: 4 -*- */ /* lissie --- the Lissajous worm */ -#if !defined( lint ) && !defined( SABER ) -static const char sccsid[] = "@(#)lissie.c 4.04 97/07/28 xlockmore"; +#if 0 +static const char sccsid[] = "@(#)lissie.c 5.00 2000/11/01 xlockmore"; #endif /*- @@ -24,29 +24,42 @@ static const char sccsid[] = "@(#)lissie.c 4.04 97/07/28 xlockmore"; * other special, indirect and consequential damages. * * Revision History: - * 10-May-97: Compatible with xscreensaver - * 18-Aug-96: added refresh-hook. - * 01-May-96: written. + * 01-Nov-2000: Allocation checks + * 10-May-1997: Compatible with xscreensaver + * 18-Aug-1996: added refresh-hook. + * 01-May-1996: written. */ #ifdef STANDALONE -# define PROGCLASS "Lissie" -# define HACK_INIT init_lissie -# define HACK_DRAW draw_lissie -# define lissie_opts xlockmore_opts -# define DEFAULTS "*delay: 10000 \n" \ - "*count: 1 \n" \ - "*cycles: 2000 \n" \ - "*size: -200 \n" \ - "*ncolors: 64 \n" +# define MODE_lissie +# define DEFAULTS "*delay: 10000 \n" \ + "*count: 1 \n" \ + "*cycles: 20000 \n" \ + "*size: -200 \n" \ + "*ncolors: 200 \n" \ + "*fpsSolid: true \n" \ + # define SMOOTH_COLORS +# define reshape_lissie 0 +# define lissie_handle_event 0 # include "xlockmore.h" /* in xscreensaver distribution */ #else /* STANDALONE */ # include "xlock.h" /* in xlockmore distribution */ #endif /* STANDALONE */ -ModeSpecOpt lissie_opts = -{0, NULL, 0, NULL, NULL}; +#ifdef MODE_lissie + +ENTRYPOINT ModeSpecOpt lissie_opts = +{0, (XrmOptionDescRec *) NULL, 0, (argtype *) NULL, (OptionStruct *) NULL}; + +#ifdef USE_MODULES +ModStruct lissie_description = +{"lissie", "init_lissie", "draw_lissie", "release_lissie", + "refresh_lissie", "init_lissie", (char *) NULL, &lissie_opts, + 10000, 1, 2000, -200, 64, 0.6, "", + "Shows lissajous worms", 0, NULL}; + +#endif #define MINSIZE 1 @@ -81,17 +94,18 @@ typedef struct { int xi, yi, ri, rx, ry, len, pos; int redrawing, redrawpos; XPoint loc[MAXLISSIELEN]; - int color; + unsigned long color; } lissiestruct; typedef struct { + Bool painted; int width, height; int nlissies; lissiestruct *lissie; int loopcount; } lissstruct; -static lissstruct *lisses = NULL; +static lissstruct *lisses = (lissstruct *) NULL; static void @@ -127,16 +141,16 @@ drawlissie(ModeInfo * mi, lissiestruct * lissie) lissie->loc[p].y = lissie->yi + (int) (sin(lissie->ty) * lissie->ry); /* Mask */ - XSetForeground(display, gc, MI_WIN_BLACK_PIXEL(mi)); + XSetForeground(display, gc, MI_BLACK_PIXEL(mi)); Lissie(oldp); /* Redraw */ if (MI_NPIXELS(mi) > 2) { XSetForeground(display, gc, MI_PIXEL(mi, lissie->color)); - if (++lissie->color >= MI_NPIXELS(mi)) + if (++lissie->color >= (unsigned) MI_NPIXELS(mi)) lissie->color = 0; } else - XSetForeground(display, gc, MI_WIN_WHITE_PIXEL(mi)); + XSetForeground(display, gc, MI_WHITE_PIXEL(mi)); Lissie(p); if (lissie->redrawing) { int i; @@ -165,7 +179,7 @@ initlissie(ModeInfo * mi, lissiestruct * lissie) if (MI_NPIXELS(mi) > 2) lissie->color = NRAND(MI_NPIXELS(mi)); else - lissie->color = MI_WIN_WHITE_PIXEL(mi); + lissie->color = MI_WHITE_PIXEL(mi); /* Initialize parameters */ if (size < -MINSIZE) lissie->ri = NRAND(MIN(-size, MAX(MINSIZE, @@ -201,27 +215,28 @@ initlissie(ModeInfo * mi, lissiestruct * lissie) drawlissie(mi, lissie); } -void -init_lissie(ModeInfo * mi) +ENTRYPOINT void +init_lissie (ModeInfo * mi) { lissstruct *lp; unsigned char ball; - if (lisses == NULL) { - if ((lisses = (lissstruct *) calloc(MI_NUM_SCREENS(mi), - sizeof (lissstruct))) == NULL) - return; - } + MI_INIT (mi, lisses, 0); lp = &lisses[MI_SCREEN(mi)]; - lp->width = MI_WIN_WIDTH(mi); - lp->height = MI_WIN_HEIGHT(mi); + lp->width = MI_WIDTH(mi); - lp->nlissies = MI_BATCHCOUNT(mi); +#ifdef HAVE_JWXYZ + jwxyz_XSetAntiAliasing (MI_DISPLAY(mi), MI_GC(mi), False); +#endif + + lp->height = MI_HEIGHT(mi); + + lp->nlissies = MI_COUNT(mi); if (lp->nlissies < -MINLISSIES) { if (lp->lissie) { (void) free((void *) lp->lissie); - lp->lissie = NULL; + lp->lissie = (lissiestruct *) NULL; } lp->nlissies = NRAND(-lp->nlissies - MINLISSIES + 1) + MINLISSIES; } else if (lp->nlissies < MINLISSIES) @@ -229,29 +244,44 @@ init_lissie(ModeInfo * mi) lp->loopcount = 0; - if (!lp->lissie) - lp->lissie = (lissiestruct *) calloc(lp->nlissies, sizeof (lissiestruct)); - XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi)); + if (lp->lissie == NULL) + if ((lp->lissie = (lissiestruct *) calloc(lp->nlissies, + sizeof (lissiestruct))) == NULL) + return; + + MI_CLEARWINDOW(mi); + lp->painted = False; + for (ball = 0; ball < (unsigned char) lp->nlissies; ball++) initlissie(mi, &lp->lissie[ball]); } -void -draw_lissie(ModeInfo * mi) +ENTRYPOINT void +draw_lissie (ModeInfo * mi) { - lissstruct *lp = &lisses[MI_SCREEN(mi)]; register unsigned char ball; + lissstruct *lp; + + if (lisses == NULL) + return; + lp = &lisses[MI_SCREEN(mi)]; + if (lp->lissie == NULL) + return; + + MI_IS_DRAWN(mi) = True; - if (++lp->loopcount > MI_CYCLES(mi)) + if (++lp->loopcount > MI_CYCLES(mi)) { init_lissie(mi); - else + } else { + lp->painted = True; for (ball = 0; ball < (unsigned char) lp->nlissies; ball++) drawlissie(mi, &lp->lissie[ball]); + } } -void -release_lissie(ModeInfo * mi) +ENTRYPOINT void +release_lissie (ModeInfo * mi) { if (lisses != NULL) { int screen; @@ -259,26 +289,37 @@ release_lissie(ModeInfo * mi) for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) { lissstruct *lp = &lisses[screen]; - if (lp->lissie) { + if (lp->lissie != NULL) { (void) free((void *) lp->lissie); - lp->lissie = NULL; + /* lp->lissie = NULL; */ } } (void) free((void *) lisses); - lisses = NULL; + lisses = (lissstruct *) NULL; } } -void +ENTRYPOINT void refresh_lissie(ModeInfo * mi) { - if (lisses != NULL) { - lissstruct *lp = &lisses[MI_SCREEN(mi)]; - int i; + int i; + lissstruct *lp; + if (lisses == NULL) + return; + lp = &lisses[MI_SCREEN(mi)]; + if (lp->lissie == NULL) + return; + + if (lp->painted) { + MI_CLEARWINDOW(mi); for (i = 0; i < lp->nlissies; i++) { lp->lissie[i].redrawing = 1; lp->lissie[i].redrawpos = 0; } } } + +XSCREENSAVER_MODULE ("Lissie", lissie) + +#endif /* MODE_lissie */