http://www.jwz.org/xscreensaver/xscreensaver-5.12.tar.gz
[xscreensaver] / utils / colors.c
index 71e56daa7a036dc0d0dc1d23674259c121f5a2c4..e06359c72db811738959df9bc1f733e359485a4d 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1997 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 1997, 2002 Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
@@ -77,16 +77,18 @@ static void
 complain (int wanted_colors, int got_colors,
          Bool wanted_writable, Bool got_writable)
 {
-  if (wanted_writable && !got_writable)
-    fprintf(stderr,
-           "%s: wanted %d writable colors; got %d read-only colors.\n",
-           progname, wanted_colors, got_colors);
-
-  else if (wanted_colors > (got_colors + 10))
+  if (got_colors > wanted_colors - 10)
     /* don't bother complaining if we're within ten pixels. */
-    fprintf(stderr, "%s: wanted %d%s colors; got %d.\n",
-           progname, wanted_colors, (got_writable ? " writable" : ""),
-           got_colors);
+    return;
+
+  if (wanted_writable && !got_writable)
+    fprintf (stderr,
+             "%s: wanted %d writable colors; got %d read-only colors.\n",
+             progname, wanted_colors, got_colors);
+  else
+    fprintf (stderr, "%s: wanted %d%s colors; got %d.\n",
+             progname, wanted_colors, (got_writable ? " writable" : ""),
+             got_colors);
 }
 
 
@@ -334,16 +336,11 @@ make_color_path (Display *dpy, Colormap cmap,
   k = 0;
   for (i = 0; i < npoints; i++)
     {
-      int distance, direction;
-      distance = h[(i+1) % npoints] - h[i];
-      direction = (distance >= 0 ? -1 : 1);
-
-      if (distance > 180)
-       distance = 180 - (distance - 180);
-      else if (distance < -180)
-       distance = -(180 - ((-distance) - 180));
-      else
-       direction = -direction;
+      int distance = h[(i+1) % npoints] - h[i];
+      int direction = (distance >= 0 ? -1 : 1);
+
+      if (distance <= 180 && distance >= -180)
+        direction = -direction;
 
 #ifdef DEBUG
       fprintf (stderr, "point %d: %3d %.2f %.2f\n",
@@ -477,7 +474,8 @@ make_smooth_colormap (Display *dpy, Visual *visual, Colormap cmap,
   double v[MAXPOINTS];
   double total_s = 0;
   double total_v = 0;
-  Screen *screen = DefaultScreenOfDisplay(dpy); /* #### WRONG! */
+  Screen *screen = (dpy ? DefaultScreenOfDisplay(dpy) : 0); /* #### WRONG! */
+  int loop = 0;
 
   if (*ncolorsP <= 0) return;
 
@@ -493,6 +491,7 @@ make_smooth_colormap (Display *dpy, Visual *visual, Colormap cmap,
   for (i = 0; i < npoints; i++)
     {
     REPICK_THIS_COLOR:
+      if (++loop > 10000) abort();
       h[i] = random() % 360;
       s[i] = frand(1.0);
       v[i] = frand(0.8) + 0.2;
@@ -537,7 +536,7 @@ make_smooth_colormap (Display *dpy, Visual *visual, Colormap cmap,
                   allocate_p, (writable_pP && *writable_pP));
 
   /* If we tried for writable cells and got none, try for non-writable. */
-  if (allocate_p && *ncolorsP == 0 && *writable_pP)
+  if (allocate_p && *ncolorsP == 0 && writable_pP && *writable_pP)
     {
       *writable_pP = False;
       goto RETRY_NON_WRITABLE;
@@ -560,7 +559,7 @@ make_uniform_colormap (Display *dpy, Visual *visual, Colormap cmap,
 {
   int ncolors = *ncolorsP;
   Bool wanted_writable = (allocate_p && writable_pP && *writable_pP);
-  Screen *screen = DefaultScreenOfDisplay(dpy); /* #### WRONG! */
+  Screen *screen = (dpy ? DefaultScreenOfDisplay(dpy) : 0); /* #### WRONG! */
 
   double S = ((double) (random() % 34) + 66) / 100.0;  /* range 66%-100% */
   double V = ((double) (random() % 34) + 66) / 100.0;  /* range 66%-100% */
@@ -576,7 +575,7 @@ make_uniform_colormap (Display *dpy, Visual *visual, Colormap cmap,
                  0,   S, V,
                  359, S, V,
                  colors, &ncolors,
-                 False, True,
+                 False, allocate_p,
                   (writable_pP && *writable_pP));
 
   /* If we tried for writable cells and got none, try for non-writable. */
@@ -606,7 +605,7 @@ make_random_colormap (Display *dpy, Visual *visual, Colormap cmap,
   Bool wanted_writable = (allocate_p && writable_pP && *writable_pP);
   int ncolors = *ncolorsP;
   int i;
-  Screen *screen = DefaultScreenOfDisplay(dpy); /* #### WRONG! */
+  Screen *screen = (dpy ? DefaultScreenOfDisplay(dpy) : 0); /* #### WRONG! */
 
   if (*ncolorsP <= 0) return;