37
# define PROGCLASS "Lisa"
38
# define HACK_INIT init_lisa
39
# define HACK_DRAW draw_lisa
40
# define lisa_opts xlockmore_opts
41
# define DEFAULTS "*delay: 25000 \n" \
46
# define UNIFORM_COLORS
47
# include "xlockmore.h" /* from the xscreensaver distribution */
48
void refresh_lisa(ModeInfo * mi);
49
void change_lisa(ModeInfo * mi);
50
#else /* !STANDALONE */
51
# include "xlock.h" /* from the xlockmore distribution */
52
#endif /* !STANDALONE */
40
#define PROGCLASS "Lisa"
41
#define HACK_INIT init_lisa
42
#define HACK_DRAW draw_lisa
43
#define lisa_opts xlockmore_opts
44
#define DEFAULTS "*delay: 25000 \n" \
49
#define UNIFORM_COLORS
50
#include "xlockmore.h" /* in xscreensaver distribution */
52
#else /* STANDALONE */
53
#include "xlock.h" /* in xlockmore distribution */
55
#endif /* STANDALONE */
54
59
#define DEF_ADDITIVE "True"
56
61
static Bool additive;
58
static XrmOptionDescRec lisa_xrm_opts[] =
60
{"-additive", ".lisa.additive", XrmoptionNoArg, (caddr_t) "True"},
61
{"+additive", ".lisa.additive", XrmoptionNoArg, (caddr_t) "False"}
64
static argtype lisa_vars[] =
66
{(caddr_t *) & additive, "additive", "Additive", DEF_ADDITIVE, t_Bool}
69
static OptionStruct lisa_vars_desc[] =
63
static XrmOptionDescRec opts[] =
65
{"-additive", ".lisa.additive", XrmoptionNoArg, "True"},
66
{"+additive", ".lisa.additive", XrmoptionNoArg, "False"}
69
static argtype vars[] =
71
{&additive, "additive", "Additive", DEF_ADDITIVE, t_Bool}
74
static OptionStruct desc[] =
71
76
{"-/+additive", "turn on/off additive functions mode"}
74
79
ModeSpecOpt lisa_opts =
75
{2, lisa_xrm_opts, 1, lisa_vars, lisa_vars_desc};
80
{sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc};
83
ModStruct lisa_description =
84
{"lisa", "init_lisa", "draw_lisa", "release_lisa",
85
"refresh_lisa", "change_lisa", (char *) NULL, &lisa_opts,
86
25000, 1, 256, -1, 64, 1.0, "",
87
"Shows animated lisajous loops", 0, NULL};
78
91
#define DRAWLINES 1
107
120
typedef struct lisa_struct {
108
int radius, color, dx, dy, nsteps, nfuncs, melting;
122
int radius, dx, dy, nsteps, nfuncs, melting;
109
123
double pistep, phi, theta;
110
124
XPoint center, *lastpoint;
111
125
lisafuncs *function[LISAMAXFUNCS];
114
129
typedef struct lisacontext_struct {
116
131
int width, height, nlisajous, loopcount;
120
static lisacons *Lisa = NULL;
136
static lisacons *Lisa = (lisacons *) NULL;
122
138
static lisafuncs Function[NUMSTDFUNCS] =
204
237
yprod += sin(lf[fctr]->ycoeff[yctr] * loop->phi);
205
238
if (loop->melting) {
208
*(double) (loop->nsteps - loop->melting) \
209
/(double) loop->nsteps;
211
*(double) (loop->nsteps - loop->melting) \
212
/(double) loop->nsteps;
240
xsum += xprod * (double) (loop->nsteps - loop->melting) /
241
(double) loop->nsteps;
242
ysum += yprod * (double) (loop->nsteps - loop->melting) /
243
(double) loop->nsteps;
215
*(double) loop->melting \
216
/(double) loop->nsteps;
218
*(double) loop->melting \
219
/(double) loop->nsteps;
245
xsum += xprod * (double) loop->melting / (double) loop->nsteps;
246
ysum += yprod * (double) loop->melting / (double) loop->nsteps;
227
*(double) loop->radius \
228
/(double) lf[fctr]->nx;
230
*(double) loop->radius \
231
/(double) lf[fctr]->ny;
253
xsum = xsum * (double) loop->radius / (double) lf[fctr]->nx;
254
ysum = ysum * (double) loop->radius / (double) lf[fctr]->ny;
234
257
if (loop->melting) {
236
yprod = xprod = (double) loop->radius \
237
*(double) (loop->nsteps - loop->melting) \
238
/(double) (loop->nsteps);
259
yprod = xprod = (double) loop->radius *
260
(double) (loop->nsteps - loop->melting) /
261
(double) (loop->nsteps);
240
yprod = xprod = (double) loop->radius \
241
*(double) (loop->melting) \
242
/(double) (loop->nsteps);
263
yprod = xprod = (double) loop->radius *
264
(double) (loop->melting) / (double) (loop->nsteps);
245
267
xprod = yprod = (double) loop->radius;
271
293
for (pctr = 0; pctr < loop->nsteps; pctr++) {
273
295
#if defined DRAWLINES
296
XSetLineAttributes(MI_DISPLAY(mi), MI_GC(mi), loop->linewidth,
297
LineSolid, CapProjecting, JoinMiter);
274
298
/* erase the last cycle's point */
275
XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_WIN_BLACK_PIXEL(mi));
276
XDrawLine(MI_DISPLAY(mi), MI_WINDOW(mi), \
277
MI_GC(mi), lp[pctr].x, lp[pctr].y, \
278
lp[(pctr + 1) % loop->nsteps].x, \
299
XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_BLACK_PIXEL(mi));
300
XDrawLine(MI_DISPLAY(mi), MI_WINDOW(mi),
301
MI_GC(mi), lp[pctr].x, lp[pctr].y,
302
lp[(pctr + 1) % loop->nsteps].x,
279
303
lp[(pctr + 1) % loop->nsteps].y);
281
305
/* Set the new color */
284
308
/* plot this cycle's point */
285
XDrawLine(MI_DISPLAY(mi), MI_WINDOW(mi), \
286
MI_GC(mi), np[pctr].x, np[pctr].y, \
287
np[(pctr + 1) % loop->nsteps].x, \
309
XDrawLine(MI_DISPLAY(mi), MI_WINDOW(mi),
310
MI_GC(mi), np[pctr].x, np[pctr].y,
311
np[(pctr + 1) % loop->nsteps].x,
288
312
np[(pctr + 1) % loop->nsteps].y);
313
XSetLineAttributes(MI_DISPLAY(mi), MI_GC(mi), 1,
314
LineSolid, CapProjecting, JoinMiter);
290
316
/* erase the last cycle's point */
291
XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_WIN_BLACK_PIXEL(mi));
292
XDrawPoint(MI_DISPLAY(mi), MI_WINDOW(mi), \
317
XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_BLACK_PIXEL(mi));
318
XDrawPoint(MI_DISPLAY(mi), MI_WINDOW(mi),
293
319
MI_GC(mi), lp[pctr].x, lp[pctr].y);
295
321
/* Set the new color */
298
324
/* plot this cycle's point */
299
XDrawPoint(MI_DISPLAY(mi), MI_WINDOW(mi), \
325
XDrawPoint(MI_DISPLAY(mi), MI_WINDOW(mi),
300
326
MI_GC(mi), np[pctr].x, np[pctr].y);
303
329
(void) free((void *) lp);
304
330
loop->lastpoint = np;
308
335
initlisa(ModeInfo * mi, lisas * loop)
310
337
lisacons *lc = &Lisa[MI_SCREEN(mi)];
364
393
lp[pctr].x = (int) ceil(xsum);
365
394
lp[pctr].y = (int) ceil(ysum);
396
#if defined DRAWLINES
398
loop->linewidth = -8; /* #### make this a resource */
400
if (loop->linewidth == 0)
402
if (loop->linewidth < 0)
403
loop->linewidth = NRAND(-loop->linewidth) + 1;
404
XSetLineAttributes(MI_DISPLAY(mi), MI_GC(mi), loop->linewidth,
405
LineSolid, CapProjecting, JoinMiter);
367
408
for (pctr = 0; pctr < loop->nsteps; pctr++) {
368
409
/* Set the color */
370
411
#if defined DRAWLINES
371
XDrawLine(MI_DISPLAY(mi), MI_WINDOW(mi), \
372
MI_GC(mi), lp[pctr].x, lp[pctr].y, \
373
lp[(pctr + 1) % loop->nsteps].x, \
412
XDrawLine(MI_DISPLAY(mi), MI_WINDOW(mi),
413
MI_GC(mi), lp[pctr].x, lp[pctr].y,
414
lp[(pctr + 1) % loop->nsteps].x,
374
415
lp[(pctr + 1) % loop->nsteps].y);
376
XDrawPoint(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi), \
417
XDrawPoint(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
377
418
lp[pctr].x, lp[pctr].y);
382
int line_width = -15; /* #### make this a resource */
386
line_width = NRAND(-line_width)+1;
387
XSetLineAttributes(MI_DISPLAY(mi), MI_GC(mi), line_width,
388
LineSolid, CapProjecting, JoinMiter);
421
#if defined DRAWLINES
422
XSetLineAttributes(MI_DISPLAY(mi), MI_GC(mi), 1,
423
LineSolid, CapProjecting, JoinMiter);
429
refreshlisa(ModeInfo * mi)
431
lisacons *lc = &Lisa[MI_SCREEN(mi)];
434
for (lctr = 0; lctr < lc->nlisajous; lctr++) {
435
if (!drawlisa(mi, &lc->lisajous[lctr]))
441
refresh_lisa(ModeInfo * mi)
447
lc = &Lisa[MI_SCREEN(mi)];
448
if (lc->lisajous == NULL)
459
change_lisa(ModeInfo * mi)
467
lc = &Lisa[MI_SCREEN(mi)];
468
if (lc->lisajous == NULL)
472
for (lctr = 0; lctr < lc->nlisajous; lctr++) {
473
loop = &lc->lisajous[lctr];
474
loop->function[1] = &Function[(loop->function[0]->index + 1) %
476
loop->melting = loop->nsteps - 1;
393
482
init_lisa(ModeInfo * mi)
398
487
if (Lisa == NULL) {
399
if ((Lisa = (lisacons *) calloc(MI_NUM_SCREENS(mi), sizeof (lisacons))) \
488
if ((Lisa = (lisacons *) calloc(MI_NUM_SCREENS(mi),
489
sizeof (lisacons))) == NULL)
403
492
lc = &Lisa[MI_SCREEN(mi)];
404
lc->width = MI_WIN_WIDTH(mi);
405
lc->height = MI_WIN_HEIGHT(mi);
493
lc->width = MI_WIDTH(mi);
494
lc->height = MI_HEIGHT(mi);
406
495
lc->loopcount = 0;
407
lc->nlisajous = MI_BATCHCOUNT(mi);
496
lc->nlisajous = MI_COUNT(mi);
408
497
if (lc->nlisajous <= 0)
409
498
lc->nlisajous = 1;
411
502
if (lc->lisajous == NULL) {
412
if ((lc->lisajous = (lisas *) calloc(lc->nlisajous, sizeof (lisas))) \
503
if ((lc->lisajous = (lisas *) calloc(lc->nlisajous,
504
sizeof (lisas))) == NULL)
415
XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
416
506
for (lctr = 0; lctr < lc->nlisajous; lctr++) {
417
initlisa(mi, &lc->lisajous[lctr]);
507
if (!initlisa(mi, &lc->lisajous[lctr]))
423
XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
427
517
draw_lisa(ModeInfo * mi)
429
lisacons *lc = &Lisa[MI_SCREEN(mi)];
523
lc = &Lisa[MI_SCREEN(mi)];
524
if (lc->lisajous == NULL)
527
MI_IS_DRAWN(mi) = True;
431
529
if (++lc->loopcount > lc->maxcycles) {
438
refresh_lisa(ModeInfo * mi)
440
lisacons *lc = &Lisa[MI_SCREEN(mi)];
443
for (lctr = 0; lctr < lc->nlisajous; lctr++) {
444
drawlisa(mi, &lc->lisajous[lctr]);
449
536
release_lisa(ModeInfo * mi)
455
for (sctr = 0; sctr < MI_NUM_SCREENS(mi); sctr++) {
457
while (lc->lisajous) {
458
for (lctr = 0; lctr < lc->nlisajous; lctr++) {
459
(void) free(lc->lisajous[lctr].lastpoint);
461
(void) free(lc->lisajous);
541
for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++)
542
free_lisa(&Lisa[screen]);
465
543
(void) free(Lisa);
471
change_lisa(ModeInfo * mi)
473
lisacons *lc = &Lisa[MI_SCREEN(mi)];
478
for (lctr = 0; lctr < lc->nlisajous; lctr++) {
479
loop = &lc->lisajous[lctr];
480
loop->function[1] = &Function[(loop->function[0]->index + 1) %
482
loop->melting = loop->nsteps - 1;
544
Lisa = (lisacons *) NULL;
548
#endif /* MODE_lisa */