Merge branch 'master' of git://git.xonotic.org/xonotic/xonotic
[xonotic/xonotic.git] / misc / tools / hslimage.c
1 #include <math.h>
2 #include <stdio.h>
3
4 #define MARGIN_X 0
5 #define MARGIN_Y 0
6
7 void hsl_to_rgb(float hsl_x, float hsl_y, float hsl_z, float *rgb_x, float *rgb_y, float *rgb_z)
8 {
9         float mi, ma, maminusmi, h;
10
11         if(hsl_z <= 0.5)
12                 maminusmi = hsl_y * 2 * hsl_z;
13         else
14                 maminusmi = hsl_y * (2 - 2 * hsl_z);
15         
16         // hsl_z     = 0.5 * mi + 0.5 * ma
17         // maminusmi =     - mi +       ma
18         mi = hsl_z - 0.5 * maminusmi;
19         ma = hsl_z + 0.5 * maminusmi;
20
21         h = hsl_x - 6 * floor(hsl_x / 6);
22
23         //else if(ma == rgb_x)
24         //      h = 60 * (rgb_y - rgb_z) / (ma - mi);
25         if(h <= 1)
26         {
27                 *rgb_x = ma;
28                 *rgb_y = h * (ma - mi) + mi;
29                 *rgb_z = mi;
30         }
31         //else if(ma == rgb_y)
32         //      h = 60 * (rgb_z - rgb_x) / (ma - mi) + 120;
33         else if(h <= 2)
34         {
35                 *rgb_x = (2 - h) * (ma - mi) + mi;
36                 *rgb_y = ma;
37                 *rgb_z = mi;
38         }
39         else if(h <= 3)
40         {
41                 *rgb_x = mi;
42                 *rgb_y = ma;
43                 *rgb_z = (h - 2) * (ma - mi) + mi;
44         }
45         //else // if(ma == rgb_z)
46         //      h = 60 * (rgb_x - rgb_y) / (ma - mi) + 240;
47         else if(h <= 4)
48         {
49                 *rgb_x = mi;
50                 *rgb_y = (4 - h) * (ma - mi) + mi;
51                 *rgb_z = ma;
52         }
53         else if(h <= 5)
54         {
55                 *rgb_x = (h - 4) * (ma - mi) + mi;
56                 *rgb_y = mi;
57                 *rgb_z = ma;
58         }
59         //else if(ma == rgb_x)
60         //      h = 60 * (rgb_y - rgb_z) / (ma - mi);
61         else // if(h <= 6)
62         {
63                 *rgb_x = ma;
64                 *rgb_y = mi;
65                 *rgb_z = (6 - h) * (ma - mi) + mi;
66         }
67 }
68
69 void hslimage_color(float v_x, float v_y, float margin_x, float margin_y, float *rgb_x, float *rgb_y, float *rgb_z)
70 {
71         v_x = (v_x - margin_x) / (1 - 2 * margin_x);
72         v_y = (v_y - margin_y) / (1 - 2 * margin_y);
73         if(v_x < 0) v_x = 0;
74         if(v_y < 0) v_y = 0;
75         if(v_x > 1) v_x = 1;
76         if(v_y > 1) v_y = 1;
77         if(v_y > 0.875) // grey bar
78                 hsl_to_rgb(0, 0, v_x, rgb_x, rgb_y, rgb_z);
79         else
80                 hsl_to_rgb(v_x * 6, 1, (v_y / 0.875), rgb_x, rgb_y, rgb_z);
81 }
82
83 int main()
84 {
85         int x, y;
86         float r, g, b;
87
88         for(y = 0; y < 512; ++y)
89         {
90                 for(x = 0; x < 512; ++x)
91                 {
92                         hslimage_color(x / 512.0, y / 512.0, MARGIN_X, MARGIN_Y, &r, &g, &b);
93                         /*
94                         putc(floor(r * 15 + 0.5) * 17, stdout);
95                         putc(floor(g * 15 + 0.5) * 17, stdout);
96                         putc(floor(b * 15 + 0.5) * 17, stdout);
97                         */
98                         putc(floor(r * 255 + 0.5), stdout);
99                         putc(floor(g * 255 + 0.5), stdout);
100                         putc(floor(b * 255 + 0.5), stdout);
101                 }
102         }
103         return 0;
104 }