aboutsummaryrefslogtreecommitdiff
path: root/src/color.c
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);
}