source: trunk/third/xscreensaver/utils/hsv.c @ 12203

Revision 12203, 2.1 KB checked in by ghudson, 26 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r12202, which included commits to RCS files with non-trunk default branches.
Line 
1/* xscreensaver, Copyright (c) 1992, 1997 Jamie Zawinski <jwz@jwz.org>
2 *
3 * Permission to use, copy, modify, distribute, and sell this software and its
4 * documentation for any purpose is hereby granted without fee, provided that
5 * the above copyright notice appear in all copies and that both that
6 * copyright notice and this permission notice appear in supporting
7 * documentation.  No representations are made about the suitability of this
8 * software for any purpose.  It is provided "as is" without express or
9 * implied warranty.
10 */
11
12/* This file contains some utility routines for randomly picking the colors
13   to hack the screen with.
14 */
15
16#include "utils.h"
17#include "hsv.h"
18
19void
20hsv_to_rgb (int h, double s, double v,
21            unsigned short *r, unsigned short *g, unsigned short *b)
22{
23  double H, S, V, R, G, B;
24  double p1, p2, p3;
25  double f;
26  int i;
27
28  if (s < 0) s = 0;
29  if (v < 0) v = 0;
30  if (s > 1) s = 1;
31  if (v > 1) v = 1;
32
33  S = s; V = v;
34  H = (h % 360) / 60.0;
35  i = H;
36  f = H - i;
37  p1 = V * (1 - S);
38  p2 = V * (1 - (S * f));
39  p3 = V * (1 - (S * (1 - f)));
40  if      (i == 0) { R = V;  G = p3; B = p1; }
41  else if (i == 1) { R = p2; G = V;  B = p1; }
42  else if (i == 2) { R = p1; G = V;  B = p3; }
43  else if (i == 3) { R = p1; G = p2; B = V;  }
44  else if (i == 4) { R = p3; G = p1; B = V;  }
45  else             { R = V;  G = p1; B = p2; }
46  *r = R * 65535;
47  *g = G * 65535;
48  *b = B * 65535;
49}
50
51void
52rgb_to_hsv (unsigned short r, unsigned short g, unsigned short b,
53            int *h, double *s, double *v)
54{
55  double R, G, B, H, S, V;
56  double cmax, cmin;
57  double cmm;
58  int imax;
59  R = ((double) r) / 65535.0;
60  G = ((double) g) / 65535.0;
61  B = ((double) b) / 65535.0;
62  cmax = R; cmin = G; imax = 1;
63  if  ( cmax < G ) { cmax = G; cmin = R; imax = 2; }
64  if  ( cmax < B ) { cmax = B; imax = 3; }
65  if  ( cmin > B ) { cmin = B; }
66  cmm = cmax - cmin;
67  V = cmax;
68  if (cmm == 0)
69    S = H = 0;
70  else
71    {
72      S = cmm / cmax;
73      if       (imax == 1)    H =       (G - B) / cmm;
74      else  if (imax == 2)    H = 2.0 + (B - R) / cmm;
75      else /*if (imax == 3)*/ H = 4.0 + (R - G) / cmm;
76      if (H < 0) H += 6.0;
77    }
78  *h = (H * 60.0);
79  *s = S;
80  *v = V;
81}
Note: See TracBrowser for help on using the repository browser.