Imported Upstream version 3.1.9
[platform/upstream/Imath.git] / src / Imath / ImathColorAlgo.cpp
1 //
2 // SPDX-License-Identifier: BSD-3-Clause
3 // Copyright Contributors to the OpenEXR Project.
4 //
5
6 ///
7 /// @file  ImathColorAlgo.cpp
8 ///
9 /// @brief Implementation of non-template items declared in ImathColorAlgo.h
10 ///
11
12 #include "ImathColorAlgo.h"
13
14 IMATH_INTERNAL_NAMESPACE_SOURCE_ENTER
15
16 Vec3<double>
17 hsv2rgb_d (const Vec3<double>& hsv) IMATH_NOEXCEPT
18 {
19     double hue = hsv.x;
20     double sat = hsv.y;
21     double val = hsv.z;
22
23     double x = 0.0, y = 0.0, z = 0.0;
24
25     if (hue == 1)
26         hue = 0;
27     else
28         hue *= 6;
29
30     int i    = int (std::floor (hue));
31     double f = hue - i;
32     double p = val * (1 - sat);
33     double q = val * (1 - (sat * f));
34     double t = val * (1 - (sat * (1 - f)));
35
36     switch (i)
37     {
38     case 0:
39         x = val;
40         y = t;
41         z = p;
42         break;
43     case 1:
44         x = q;
45         y = val;
46         z = p;
47         break;
48     case 2:
49         x = p;
50         y = val;
51         z = t;
52         break;
53     case 3:
54         x = p;
55         y = q;
56         z = val;
57         break;
58     case 4:
59         x = t;
60         y = p;
61         z = val;
62         break;
63     case 5:
64         x = val;
65         y = p;
66         z = q;
67         break;
68     }
69
70     return Vec3<double> (x, y, z);
71 }
72
73 Color4<double>
74 hsv2rgb_d (const Color4<double>& hsv) IMATH_NOEXCEPT
75 {
76     double hue = hsv.r;
77     double sat = hsv.g;
78     double val = hsv.b;
79
80     double r = 0.0, g = 0.0, b = 0.0;
81
82     if (hue == 1)
83         hue = 0;
84     else
85         hue *= 6;
86
87     int i    = int (std::floor (hue));
88     double f = hue - i;
89     double p = val * (1 - sat);
90     double q = val * (1 - (sat * f));
91     double t = val * (1 - (sat * (1 - f)));
92
93     switch (i)
94     {
95     case 0:
96         r = val;
97         g = t;
98         b = p;
99         break;
100     case 1:
101         r = q;
102         g = val;
103         b = p;
104         break;
105     case 2:
106         r = p;
107         g = val;
108         b = t;
109         break;
110     case 3:
111         r = p;
112         g = q;
113         b = val;
114         break;
115     case 4:
116         r = t;
117         g = p;
118         b = val;
119         break;
120     case 5:
121         r = val;
122         g = p;
123         b = q;
124         break;
125     }
126
127     return Color4<double> (r, g, b, hsv.a);
128 }
129
130 Vec3<double>
131 rgb2hsv_d (const Vec3<double>& c) IMATH_NOEXCEPT
132 {
133     const double& x = c.x;
134     const double& y = c.y;
135     const double& z = c.z;
136
137     double max   = (x > y) ? ((x > z) ? x : z) : ((y > z) ? y : z);
138     double min   = (x < y) ? ((x < z) ? x : z) : ((y < z) ? y : z);
139     double range = max - min;
140     double val   = max;
141     double sat   = 0;
142     double hue   = 0;
143
144     if (max != 0)
145         sat = range / max;
146
147     if (sat != 0)
148     {
149         double h;
150
151         if (x == max)
152             h = (y - z) / range;
153         else if (y == max)
154             h = 2 + (z - x) / range;
155         else
156             h = 4 + (x - y) / range;
157
158         hue = h / 6.;
159
160         if (hue < 0.)
161             hue += 1.0;
162     }
163     return Vec3<double> (hue, sat, val);
164 }
165
166 Color4<double>
167 rgb2hsv_d (const Color4<double>& c) IMATH_NOEXCEPT
168 {
169     const double& r = c.r;
170     const double& g = c.g;
171     const double& b = c.b;
172
173     double max   = (r > g) ? ((r > b) ? r : b) : ((g > b) ? g : b);
174     double min   = (r < g) ? ((r < b) ? r : b) : ((g < b) ? g : b);
175     double range = max - min;
176     double val   = max;
177     double sat   = 0;
178     double hue   = 0;
179
180     if (max != 0)
181         sat = range / max;
182
183     if (sat != 0)
184     {
185         double h;
186
187         if (r == max)
188             h = (g - b) / range;
189         else if (g == max)
190             h = 2 + (b - r) / range;
191         else
192             h = 4 + (r - g) / range;
193
194         hue = h / 6.;
195
196         if (hue < 0.)
197             hue += 1.0;
198     }
199     return Color4<double> (hue, sat, val, c.a);
200 }
201
202 IMATH_INTERNAL_NAMESPACE_SOURCE_EXIT