File: Colors.c

package info (click to toggle)
openclonk 8.1-5
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 169,656 kB
  • sloc: cpp: 180,484; ansic: 108,988; xml: 31,371; python: 1,223; php: 767; makefile: 148; sh: 101; javascript: 34
file content (127 lines) | stat: -rw-r--r-- 3,361 bytes parent folder | download | duplicates (5)
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
115
116
117
118
119
120
121
122
123
124
125
126
127
/**
	Colors.c
	All sorts of operations on colors.
	
	@author Tyron	
*/

static const RGBA_ALPHA = 0;
static const RGBA_RED = 1;
static const RGBA_GREEN = 2;
static const RGBA_BLUE = 3;

// documented in /docs/sdk/script/fn
global func HSL(int h, int s, int l)  { return HSL2RGB(RGB(h, s, l)); }
global func HSLa(int h, int s, int l, int a) { return  HSL2RGB(RGB(h, s, l)) ^ ~(a & 255) << 24; }

// documented in /docs/sdk/script/fn
global func RGB(int r, int g, int b) { return (255 << 24) | (r & 255) << 16 | (g & 255) << 8 | (b & 255); }
global func RGBa (int r, int g, int b, int a) { return (a & 255) << 24 | (r & 255) << 16 | (g & 255) << 8 | (b & 255); }

// documented in /docs/sdk/script/fn
global func GetRGBaValue(int val, int sel) { return val >> ((3 - sel) * 8) & 255; }
global func DoRGBaValue(int val, int chng, int sel) { return val + (chng << ((3 - sel) * 8)); }

// documented in /docs/sdk/script/fn
global func SetRGBaValue(int val, int newval, int sel)
{
	// 'delete' old color
	val = val & ~(255 << ((3 - sel) * 8));
	// add new
	return val | newval << ((3 - sel) * 8);
}

// documented in /docs/sdk/script/fn
global func SplitRGBaValue(int rgb)
{
	return {
		R = GetRGBaValue(rgb, RGBA_RED), 
		G = GetRGBaValue(rgb, RGBA_GREEN), 
		B = GetRGBaValue(rgb, RGBA_BLUE),
		Alpha = GetRGBaValue(rgb, RGBA_ALPHA)
	};
}

// documented in /docs/sdk/script/fn
global func HSL2RGB(int hsl)
{
	var hue = GetRGBaValue(hsl, 1), sat = GetRGBaValue(hsl, 2), lightness = GetRGBaValue(hsl, 3);
	var red, green, blue;
	var var1, var2;
	
	if (sat == 0)
	{
		red = green = blue = lightness;
	}
	else
	{
		if (lightness < 128)
			var2 = lightness * (255 + sat) / 255;
		else
			var2 = lightness + sat - lightness * sat / 255;
			
		var1 = 2 * lightness - var2;
			
		red = Hue_2_RGB(var1, var2, hue + 85);
		green = Hue_2_RGB(var1, var2, hue);
		blue = Hue_2_RGB(var1, var2, hue - 85);
	}
	
	return RGB(red, green, blue);
}

global func Hue_2_RGB(int var1, int var2, int hue)
{
	if (hue < 0)
		hue += 255;
	if (hue > 255)
		hue -= 255;
	if (6 * hue < 255)
		return var1 + (var2 - var1) * 6 * hue / 255;
	if (2 * hue < 255)
		return var2;
	if (3 * hue < 510)
		return var1 + (var2 - var1) * ( 510 / 3 - hue ) * 6 / 255;
	return var1;
}

// documented in /docs/sdk/script/fn
global func RGB2HSL(int rgb)
{
	var red = GetRGBaValue(rgb, RGBA_RED), green = GetRGBaValue(rgb, RGBA_GREEN), blue = GetRGBaValue(rgb, RGBA_BLUE);
	var min_val = Min(red, Min(green, blue)), max_val = Max(red, Max(green, blue));
	var diff_val = max_val - min_val;
	var lightness = (max_val + min_val) / 2;
	var hue, sat, diff_red, diff_green, diff_blue;
	
	if (diff_val==0)
	{
		hue = 0;
		sat = 0;
	}
	else
	{
		if (lightness < 128)
			sat = 255 * diff_val / (max_val + min_val);
		else
			sat = 255 * diff_val / (510 - (max_val + min_val));

		diff_red = ((255 * (max_val - red)) / 6 + (255 * diff_val) / 2) / diff_val;
		diff_green = ((255 * (max_val - green)) / 6 + (255 * diff_val) / 2) / diff_val;
		diff_blue = ((255 * (max_val - blue )) / 6 + (255 * diff_val) / 2) / diff_val;
			
		if (red == max_val)
			hue = diff_blue -diff_green;
		else if (green == max_val)
			hue = 255 / 3 + diff_red - diff_blue;
		else if (blue == max_val)
			hue = 510 / 3 + diff_green - diff_red;
		
		if (hue < 0)
			hue += 255;
		if (hue > 255)
			hue -= 255;
	}
	
	return RGB(hue, sat, lightness);
}