Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Tetragramm
GitHub Repository: Tetragramm/opencv
Path: blob/master/3rdparty/openexr/Imath/ImathColorAlgo.cpp
16337 views
1
///////////////////////////////////////////////////////////////////////////
2
//
3
// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas
4
// Digital Ltd. LLC
5
//
6
// All rights reserved.
7
//
8
// Redistribution and use in source and binary forms, with or without
9
// modification, are permitted provided that the following conditions are
10
// met:
11
// * Redistributions of source code must retain the above copyright
12
// notice, this list of conditions and the following disclaimer.
13
// * Redistributions in binary form must reproduce the above
14
// copyright notice, this list of conditions and the following disclaimer
15
// in the documentation and/or other materials provided with the
16
// distribution.
17
// * Neither the name of Industrial Light & Magic nor the names of
18
// its contributors may be used to endorse or promote products derived
19
// from this software without specific prior written permission.
20
//
21
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32
//
33
///////////////////////////////////////////////////////////////////////////
34
35
36
//----------------------------------------------------------------------------
37
//
38
// Implementation of non-template items declared in ImathColorAlgo.h
39
//
40
//----------------------------------------------------------------------------
41
42
#include "ImathColorAlgo.h"
43
44
namespace Imath {
45
46
47
Vec3<double>
48
hsv2rgb_d(const Vec3<double> &hsv)
49
{
50
double hue = hsv.x;
51
double sat = hsv.y;
52
double val = hsv.z;
53
54
double x = 0.0, y = 0.0, z = 0.0;
55
56
if (hue == 1) hue = 0;
57
else hue *= 6;
58
59
int i = int(Math<double>::floor(hue));
60
double f = hue-i;
61
double p = val*(1-sat);
62
double q = val*(1-(sat*f));
63
double t = val*(1-(sat*(1-f)));
64
65
switch (i)
66
{
67
case 0: x = val; y = t; z = p; break;
68
case 1: x = q; y = val; z = p; break;
69
case 2: x = p; y = val; z = t; break;
70
case 3: x = p; y = q; z = val; break;
71
case 4: x = t; y = p; z = val; break;
72
case 5: x = val; y = p; z = q; break;
73
}
74
75
return Vec3<double>(x,y,z);
76
}
77
78
79
Color4<double>
80
hsv2rgb_d(const Color4<double> &hsv)
81
{
82
double hue = hsv.r;
83
double sat = hsv.g;
84
double val = hsv.b;
85
86
double r = 0.0, g = 0.0, b = 0.0;
87
88
if (hue == 1) hue = 0;
89
else hue *= 6;
90
91
int i = int(Math<double>::floor(hue));
92
double f = hue-i;
93
double p = val*(1-sat);
94
double q = val*(1-(sat*f));
95
double t = val*(1-(sat*(1-f)));
96
97
switch (i)
98
{
99
case 0: r = val; g = t; b = p; break;
100
case 1: r = q; g = val; b = p; break;
101
case 2: r = p; g = val; b = t; break;
102
case 3: r = p; g = q; b = val; break;
103
case 4: r = t; g = p; b = val; break;
104
case 5: r = val; g = p; b = q; break;
105
}
106
107
return Color4<double>(r,g,b,hsv.a);
108
}
109
110
111
112
Vec3<double>
113
rgb2hsv_d(const Vec3<double> &c)
114
{
115
const double &x = c.x;
116
const double &y = c.y;
117
const double &z = c.z;
118
119
double max = (x > y) ? ((x > z) ? x : z) : ((y > z) ? y : z);
120
double min = (x < y) ? ((x < z) ? x : z) : ((y < z) ? y : z);
121
double range = max - min;
122
double val = max;
123
double sat = 0;
124
double hue = 0;
125
126
if (max != 0) sat = range/max;
127
128
if (sat != 0)
129
{
130
double h;
131
132
if (x == max) h = (y - z) / range;
133
else if (y == max) h = 2 + (z - x) / range;
134
else h = 4 + (x - y) / range;
135
136
hue = h/6.;
137
138
if (hue < 0.)
139
hue += 1.0;
140
}
141
return Vec3<double>(hue,sat,val);
142
}
143
144
145
Color4<double>
146
rgb2hsv_d(const Color4<double> &c)
147
{
148
const double &r = c.r;
149
const double &g = c.g;
150
const double &b = c.b;
151
152
double max = (r > g) ? ((r > b) ? r : b) : ((g > b) ? g : b);
153
double min = (r < g) ? ((r < b) ? r : b) : ((g < b) ? g : b);
154
double range = max - min;
155
double val = max;
156
double sat = 0;
157
double hue = 0;
158
159
if (max != 0) sat = range/max;
160
161
if (sat != 0)
162
{
163
double h;
164
165
if (r == max) h = (g - b) / range;
166
else if (g == max) h = 2 + (b - r) / range;
167
else h = 4 + (r - g) / range;
168
169
hue = h/6.;
170
171
if (hue < 0.)
172
hue += 1.0;
173
}
174
return Color4<double>(hue,sat,val,c.a);
175
}
176
177
178
} // namespace Imath
179
180