DASH  0.3.0
Colorspace.h
1 #ifndef DASH__TOOLS__COLORSPACE
2 #define DASH__TOOLS__COLORSPACE
3 
4 namespace dash {
5 namespace tools {
6 namespace color {
7 
8 typedef struct {
9  double r; // percent
10  double g; // percent
11  double b; // percent
12 } rgb;
13 
14 typedef struct {
15  double h; // angle in degrees
16  double s; // percent
17  double v; // percent
18 } hsv;
19 
20 static hsv rgb2hsv(rgb in);
21 static rgb hsv2rgb(hsv in);
22 
23 hsv rgb2hsv(rgb in)
24 {
25  hsv out;
26  double min, max, delta;
27 
28  min = in.r < in.g ? in.r : in.g;
29  min = min < in.b ? min : in.b;
30 
31  max = in.r > in.g ? in.r : in.g;
32  max = max > in.b ? max : in.b;
33 
34  out.v = max; // v
35  delta = max - min;
36  if (delta < 0.00001) {
37  out.s = 0;
38  out.h = 0; // undefined, maybe nan?
39  return out;
40  }
41  if ( max > 0.0 ) {
42  out.s = (delta / max); // s
43  } else {
44  // if max is 0, then r = g = b = 0
45  // s = 0, v is undefined
46  out.s = 0.0;
47  out.h = NAN; // its now undefined
48  return out;
49  }
50  if (in.r >= max) {
51  // between yellow & magenta
52  out.h = ( in.g - in.b ) / delta;
53  } else if ( in.g >= max ) {
54  out.h = 2.0 + ( in.b - in.r ) / delta; // between cyan & yellow
55  } else {
56  out.h = 4.0 + ( in.r - in.g ) / delta; // between magenta & cyan
57  }
58 
59  out.h *= 60.0; // degrees
60 
61  if ( out.h < 0.0 ) {
62  out.h += 360.0;
63  }
64 
65  return out;
66 }
67 
68 
69 rgb hsv2rgb(hsv in)
70 {
71  double hh, p, q, t, ff;
72  long i;
73  rgb out;
74 
75  if (in.s <= 0.0) { // < is bogus, just shuts up warnings
76  out.r = in.v;
77  out.g = in.v;
78  out.b = in.v;
79  return out;
80  }
81  hh = in.h;
82  if (hh >= 360.0) {
83  hh = 0.0;
84  }
85  hh /= 60.0;
86  i = (long)hh;
87  ff = hh - i;
88  p = in.v * (1.0 - in.s);
89  q = in.v * (1.0 - (in.s * ff));
90  t = in.v * (1.0 - (in.s * (1.0 - ff)));
91 
92  switch (i) {
93  case 0:
94  out.r = in.v;
95  out.g = t;
96  out.b = p;
97  break;
98  case 1:
99  out.r = q;
100  out.g = in.v;
101  out.b = p;
102  break;
103  case 2:
104  out.r = p;
105  out.g = in.v;
106  out.b = t;
107  break;
108 
109  case 3:
110  out.r = p;
111  out.g = q;
112  out.b = in.v;
113  break;
114  case 4:
115  out.r = t;
116  out.g = p;
117  out.b = in.v;
118  break;
119  case 5:
120  default:
121  out.r = in.v;
122  out.g = p;
123  out.b = q;
124  break;
125  }
126  return out;
127 }
128 
129 } // namespace color
130 } // namespace tools
131 } // namespace dash
132 
133 #endif // DASH__TOOLS__COLORSPACE
This class is a simple memory pool which holds allocates elements of size ValueType.
Definition: AllOf.h:8
Reduce operands to their maximum value.
Definition: Operation.h:144