blob: 7fabc9c4a2aa41a51d5e5323f2ede03d219fc1c5 (
plain)
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* color.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/02/25 14:36:12 by cacharle #+# #+# */
/* Updated: 2020/02/25 15:23:44 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
#include "fractol.h"
t_color_hsl color_rgb_to_hsl(t_color color_rgb)
{
t_color_hsl color_hsl;
double h;
double s;
double l;
double r;
double g;
double b;
r = color_rgb.rgb.r / 256.0;
g = color_rgb.rgb.g / 256.0;
b = color_rgb.rgb.b / 256.0;
double maxColor = ft_fmax(r, ft_fmax(g, b));
double minColor = ft_fmin(r, ft_fmin(g, b));
if (maxColor == minColor) // grey
{
h = 0.0;
s = 0.0;
l = minColor;
}
else
{
l = (maxColor + minColor) / 2.0;
if (l < 0.5)
s = (maxColor - minColor) / (maxColor + minColor);
else
s = (maxColor - minColor) / (2.0 - maxColor - minColor);
if (r == maxColor)
h = (g - b) / (maxColor - minColor);
else if (g == maxColor)
h = 2.0 + (b - r) / (maxColor - minColor);
else
h = 4.0 + (r - g) / (maxColor - minColor);
h /= 6; //to bring it to a number between 0 and 1
if (h < 0)
h++;
}
color_hsl.h = (int)(h * 256.0);
color_hsl.s = (int)(s * 256.0);
color_hsl.l = (int)(l * 256.0);
return (color_hsl);
}
t_color color_hsl_to_rgb(t_color_hsl color_hsl)
{
t_color color_rgb;
double h;
double s;
double l;
double r;
double g;
double b;
double temp1, temp2, tempr, tempg, tempb;
h = color_hsl.h / 256.0;
s = color_hsl.s / 256.0;
l = color_hsl.l / 256.0;
if(s == 0)
{
r = l;
g = l;
b = l;
}
else
{
if (l < 0.5) temp2 = l * (1 + s);
else temp2 = (l + s) - (l * s);
temp1 = 2 * l - temp2;
tempr = h + 1.0 / 3.0;
if (tempr > 1) tempr--;
tempg = h;
tempb = h - 1.0 / 3.0;
if (tempb < 0) tempb++;
if (tempr < 1.0 / 6.0) r = temp1 + (temp2 - temp1) * 6.0 * tempr;
else if (tempr < 0.5) r = temp2;
else if (tempr < 2.0 / 3.0) r = temp1 + (temp2 - temp1) * ((2.0 / 3.0) - tempr) * 6.0;
else r = temp1;
if (tempg < 1.0 / 6.0) g = temp1 + (temp2 - temp1) * 6.0 * tempg;
else if (tempg < 0.5) g = temp2;
else if (tempg < 2.0 / 3.0) g = temp1 + (temp2 - temp1) * ((2.0 / 3.0) - tempg) * 6.0;
else g = temp1;
if(tempb < 1.0 / 6.0) b = temp1 + (temp2 - temp1) * 6.0 * tempb;
else if(tempb < 0.5) b = temp2;
else if(tempb < 2.0 / 3.0) b = temp1 + (temp2 - temp1) * ((2.0 / 3.0) - tempb) * 6.0;
else b = temp1;
}
color_rgb.hexcode = 0x0;
color_rgb.rgb.r = (int)(r * 256.0);
color_rgb.rgb.g = (int)(g * 256.0);
color_rgb.rgb.b = (int)(b * 256.0);
return (color_rgb);
}
|