X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Fxlyap.c;h=ab7fde5db42b3fd1120da61a1732129284b762bd;hb=af290bcdf2d1c61efc8aaaff653745c900cbe98c;hp=350888d0c379a45f6e3fab3acb65c6bb7070f247;hpb=5b7bc6e70fb439cf4c4bf771ae9f94077fe4fe08;p=xscreensaver diff --git a/hacks/xlyap.c b/hacks/xlyap.c index 350888d0..ab7fde5d 100644 --- a/hacks/xlyap.c +++ b/hacks/xlyap.c @@ -47,7 +47,8 @@ char *progclass = "XLyap"; char *defaults [] = { - "XLyap.background: black", /* to placate SGI */ + ".background: black", + ".foreground: white", "*randomize: false", "*builtin: -1", "*minColor: 1", @@ -109,14 +110,22 @@ XrmOptionDescRec options [] = { #ifdef SIXTEEN_COLORS #define MAXPOINTS 128 +#ifdef BIGMEM #define MAXFRAMES 4 +#else +#define MAXFRAMES 2 +#endif #define MAXCOLOR 16 static int maxcolor=16, startcolor=0, color_offset=0, mincolindex=1; static int dwell=50, settle=25; static int width=128, height=128, xposition=128, yposition=128; #else #define MAXPOINTS 256 +#ifdef BIGMEM #define MAXFRAMES 8 +#else +#define MAXFRAMES 2 +#endif #define MAXCOLOR 256 static int maxcolor=256, startcolor=17, color_offset=96, mincolindex=33; static int dwell=100, settle=50; @@ -573,6 +582,9 @@ main_event(void) break; case ButtonRelease: EndRubberBand(canvas, &rubber_data, &event); + break; + default: + screenhack_handle_event (dpy, &event); break; } } @@ -587,13 +599,13 @@ main_event(void) static int complyap(void) { - register i, bindex; - double total, prod, x, r; + int i, bindex; + double total, prod, x, dx, r; if (!run) return TRUE; a += a_inc; - if (a >= max_a) + if (a >= max_a) { if (sendpoint(lyapunov) == TRUE) return FALSE; else { @@ -602,6 +614,7 @@ complyap(void) save_to_file(); return TRUE; } + } if (b >= max_b) { FlushBuffer(); if (savefile) @@ -637,7 +650,14 @@ complyap(void) if (useprod) { /* using log(a*b) */ for (i=0;i 1.0e12) || (prod < 1.0e-12)) { total += log(prod); @@ -657,12 +677,19 @@ complyap(void) #endif } total += log(prod); - lyapunov = (total * M_LOG2E) / (double)dwell; + lyapunov = (total * M_LOG2E) / (double)i; } else { /* use log(a) + log(b) */ for (i=0;i= maxindex) { bindex = 0; if (Rflag) @@ -676,8 +703,9 @@ complyap(void) deriv = Derivs[Forcing[findex]]; #endif } - lyapunov = (total * M_LOG2E) / (double)dwell; + lyapunov = (total * M_LOG2E) / (double)i; } + if (sendpoint(lyapunov) == TRUE) return FALSE; else { @@ -777,7 +805,6 @@ init_data(void) if (show) show_defaults(); InitBuffer(); - ya_rand_init(0); } static void @@ -1414,6 +1441,15 @@ sendpoint(double expo) static int index; static double tmpexpo; +#if 0 +/* The relationship minexp <= expo <= maxexp should always be true. This test + enforces that. But maybe not enforcing it makes better pictures. */ + if (expo < minexp) + expo = minexp; + else if (expo > maxexp) + expo = maxexp; +#endif + point.x++; tmpexpo = (negative) ? expo : -1.0 * expo; if (tmpexpo > 0) { @@ -1846,6 +1882,14 @@ InitBuffer(void) static void BufferPoint(Display *display, Window window, int color, int x, int y) { + +/* Guard against bogus color values. Shouldn't be necessary but paranoia + is good. */ + if (color < 0) + color = 0; + else if (color >= maxcolor) + color = maxcolor - 1; + if (Points.npoints[color] == MAXPOINTS) { XDrawPoints(display, window, Data_GC[color], @@ -1961,5 +2005,5 @@ setforcing(void) { static int i; for (i=0;i prob) ? 0 : 1; + forcing[i] = (random() > prob) ? 0 : 1; }