- if (fg_pixel == bg_pixel)
- {
- HSV_AGAIN:
- fg_h = random () % 360;
- bg_h = random () % 360;
- fg_s = frand (1.0);
- bg_s = frand (1.0);
- V_AGAIN:
- fg_v = frand (1.0);
- bg_v = frand (1.0);
- if ((fg_v - bg_v) > -0.4 && (fg_v - bg_v) < 0.4)
- goto V_AGAIN;
- hsv_to_rgb (fg_h, fg_s, fg_v,
- &fg_color.red, &fg_color.green, &fg_color.blue);
- hsv_to_rgb (bg_h, bg_s, bg_v,
- &bg_color.red, &bg_color.green, &bg_color.blue);
- }
- else
- {
- XQueryColor (dsp, cmap, &fg_color);
- XQueryColor (dsp, cmap, &bg_color);
- fg_color.pixel = fg_pixel;
- bg_color.pixel = bg_pixel;
- }
- fg_color.flags = DoRed|DoGreen|DoBlue;
- bg_color.flags = DoRed|DoGreen|DoBlue;
-
- rgb_to_hsv (fg_color.red, fg_color.green, fg_color.blue,
- &fg_h, &fg_s, &fg_v);
- rgb_to_hsv (bg_color.red, bg_color.green, bg_color.blue,
- &bg_h, &bg_s, &bg_v);
-
- if (/*mode == MODE_RANDOM &&*/
- ((this_mode == MODE_S && (fg_s-bg_s) > -0.3 && (fg_s-bg_s) < 0.3) ||
- (this_mode == MODE_V && (fg_v-bg_v) > -0.3 && (fg_v-bg_v) < 0.3) ||
- (this_mode == MODE_H && (fg_h-bg_h) > -30 && (fg_h-bg_h) < 30)))
- goto HSV_AGAIN;
-
- switch (this_mode) {
- case MODE_H: shift = (bg_h - fg_h) / ncolors; break;
- case MODE_S: dshift = (bg_s - fg_s) / ncolors; break;
- case MODE_V: dshift = (bg_v - fg_v) / ncolors; break;
- default: abort ();
- }
-
- if (mode == MODE_RANDOM &&
- ((this_mode == MODE_H)
- ? ((shift > -2 && shift < 2) || fg_s < 0.3 || fg_v < 0.3)
- : (dshift > -0.005 && dshift < 0.005)))
- goto HSV_AGAIN;
-
- if (mode == MODE_RANDOM && this_mode == MODE_S && fg_v < 0.5)
- goto V_AGAIN;
-
- for (npixels = 0; npixels < ncolors; npixels++)
- {
- if (cycle_p)
- {
- unsigned long plane_masks;
- /* allocate the writable color cells, one at a time. */
- if (! XAllocColorCells (dsp, cmap, False, &plane_masks, 0,
- &fg_color.pixel, 1))
- {
- fprintf (stderr,
- "%s: couldn't allocate %s writable color cells. Turning off -cycle.\n",
- progname, (npixels ? "enough" : "any"));
- cycle_p = 0;
- goto NON_CYCLE;
- }
- XStoreColor (dsp, cmap, &fg_color);
- }
- else
- {
- NON_CYCLE:
- if (!XAllocColor (dsp, cmap, &fg_color))
- break;
- }
- pixels[npixels] = fg_color.pixel;
-
- switch (this_mode)
- {
- case MODE_H: fg_h = (fg_h + shift) % 360; break;
- case MODE_S: fg_s += dshift; break;
- case MODE_V: fg_v += dshift; break;
- default: abort ();
- }
- hsv_to_rgb (fg_h, fg_s, fg_v,
- &fg_color.red, &fg_color.green, &fg_color.blue);
- }
- }
- XSetForeground (dsp, gc, pixels [0]);
- XFillRectangle (dsp, win, gc, 0, 0, wattrs.width, wattrs.height);
-}