http://ftp.x.org/contrib/applications/xscreensaver-3.10.tar.gz
[xscreensaver] / hacks / xlyap.c
index 350888d0c379a45f6e3fab3acb65c6bb7070f247..3742df68858b61e40a6d5236a70c3f87ae738a21 100644 (file)
@@ -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,8 +599,8 @@ 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;
@@ -637,7 +649,14 @@ complyap(void)
   if (useprod) {      /* using log(a*b) */
     for (i=0;i<dwell;i++) {
       x = (*map)(x, r);
-      prod *= ABS((*deriv)(x, r));
+      dx = (*deriv)(x, r); /* ABS is a macro, so don't be fancy */
+      dx = ABS(dx);
+      if (dx == 0.0) /* log(0) is nasty so break out. */
+      {
+        i++;
+        break;
+      }
+      prod *= dx;
       /* we need to prevent overflow and underflow */
       if ((prod > 1.0e12) || (prod < 1.0e-12)) {
        total += log(prod);
@@ -657,12 +676,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<dwell;i++) {
       x = (*map)(x, r);
-      total += log(ABS((*deriv)(x, r)));
+      dx = (*deriv)(x, r); /* ABS is a macro, so don't be fancy */
+      dx = ABS(dx);
+      if (x == 0.0)  /* log(0) check */
+      {
+        i++;
+        break;
+      }
+      total += log(dx);
       if (++bindex >= maxindex) {
        bindex = 0;
        if (Rflag)
@@ -676,8 +702,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 +804,6 @@ init_data(void)
   if (show)
     show_defaults();
   InitBuffer();
-  ya_rand_init(0);
 }
 
 static void
@@ -1414,6 +1440,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 +1881,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 +2004,5 @@ setforcing(void)
 {
   static int i;
   for (i=0;i<MAXINDEX;i++)
-    forcing[i] = (ya_random() > prob) ? 0 : 1;
+    forcing[i] = (random() > prob) ? 0 : 1;
 }