-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathpixel.c
More file actions
72 lines (61 loc) · 1.16 KB
/
pixel.c
File metadata and controls
72 lines (61 loc) · 1.16 KB
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
#include <stddef.h>
#include "pixel.h"
#include "tmath.h"
Px_rgba hsva2rgba(Px_hsva hsva)
{
float h = hsva.h;
float s = hsva.s;
float v = hsva.v;
int l = h / 60; // l = floor(h/60)
float m = h /60.0 - l;
float d = v * (1-s);
float e = v * (1 - m*s);
float f = v * (1 - (1-m)*s);
float r = 0, g = 0, b = 0;
switch (l) {
case 0:
r = v, g = f, b = d;
break;
case 1:
r = e, g = v, b = d;
break;
case 2:
r = d, g = v, b = f;
break;
case 3:
r = d, g = e, b = v;
break;
case 4:
r = f, g = d, b = v;
break;
case 5:
r = v, g = d, b = e;
break;
}
Px_def rgba = {r * 255, g * 255, b * 255, hsva.a * 255};
return rgba;
}
Px_hsva rgba2hsva(Px_rgba rgba)
{
float r = rgba.r / 255.0f;
float g = rgba.g / 255.0f;
float b = rgba.b / 255.0f;
float mini = min3(r, g, b);
float maxi = max3(r, g, b);
float diff = maxi - mini;
float v = maxi;
float s = (v != 0) ? diff / v : 0;
float h = 0;
if (diff == 0)
h = 0;
else if (v == r)
h = 0 + 60 * (g-b) / diff;
else if (v == g)
h = 120 + 60 * (b-r) / diff;
else // v == b
h = 240 + 60 * (r-g) / diff;
if (h < 0.0)
h += 360;
Px_hsva hsva = {h, s, v, rgba.a / 255.0};
return hsva;
}