-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathcolor_utils.cpp
88 lines (76 loc) · 1.95 KB
/
color_utils.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include "color_utils.hpp"
/*
Color3 hue(float h)
{
float r = abs(h * 6 - 3) - 1;
float g = 2 - abs(h * 6 - 2);
float b = 2 - abs(h * 6 - 4);
return saturate(Color3(r, g, b));
}
Color3 HSVtoRGB(const Color3& hsv)
{
return Color3(((hue(hsv.r) - 1.0f) * hsv.g + 1.0f) * hsv.b);
}
*/
Color3 HSVtoRGB(const Color3& hsv)
{
Color3 out;
float h = hsv.r;
float s = hsv.g;
float v = hsv.b;
if (s == 0.0f)
{
// gray
out.r = out.g = out.b = v;
return out;
}
h = fmodf(h, 1.0f) / (60.0f/360.0f);
int i = (int)h;
float f = h - (float)i;
float p = v * (1.0f - s);
float q = v * (1.0f - s * f);
float t = v * (1.0f - s * (1.0f - f));
switch (i)
{
case 0: out.r = v; out.g = t; out.b = p; break;
case 1: out.r = q; out.g = v; out.b = p; break;
case 2: out.r = p; out.g = v; out.b = t; break;
case 3: out.r = p; out.g = q; out.b = v; break;
case 4: out.r = t; out.g = p; out.b = v; break;
case 5: default: out.r = v; out.g = p; out.b = q; break;
}
return out;
}
Color3 RGBtoHSV(Color3 rgb)
{
rgb.r *= 255.0f;
rgb.g *= 255.0f;
rgb.b *= 255.0f;
Color3 hsv;
unsigned char rgbMin, rgbMax;
rgbMin = rgb.r < rgb.g ? (rgb.r < rgb.b ? rgb.r : rgb.b) : (rgb.g < rgb.b ? rgb.g : rgb.b);
rgbMax = rgb.r > rgb.g ? (rgb.r > rgb.b ? rgb.r : rgb.b) : (rgb.g > rgb.b ? rgb.g : rgb.b);
hsv.b = rgbMax;
if (hsv.b == 0)
{
hsv.r = 0;
hsv.g = 0;
return hsv;
}
hsv.g = 255 * long(rgbMax - rgbMin) / hsv.b;
if (hsv.g == 0)
{
hsv.r = 0;
return hsv;
}
if (rgbMax == rgb.r)
hsv.r = 0 + 43 * (rgb.g - rgb.b) / (rgbMax - rgbMin);
else if (rgbMax == rgb.g)
hsv.r = 85 + 43 * (rgb.b - rgb.r) / (rgbMax - rgbMin);
else
hsv.r = 171 + 43 * (rgb.r - rgb.g) / (rgbMax - rgbMin);
hsv.r /= 255.0f;
hsv.g /= 255.0f;
hsv.b /= 255.0f;
return hsv;
}