]> git.donarmstrong.com Git - qmk_firmware.git/blob - keyboards/handwired/practice60/hsv2rgb.c
The "Practice60" Board, Blue Pill powered (#4407)
[qmk_firmware.git] / keyboards / handwired / practice60 / hsv2rgb.c
1 /* hsv2rgb.c
2  * Integer only conversion functions between HSV and RGB
3  */
4
5 #include "hsv2rgb.h"
6
7 // TODO fix these buggy macros
8 #define max(x,y) ((x>y) ? x:y)
9 #define min(x,y) ((x>y) ? y:x)
10 #define min3(x,y,z) (min(min(x,y),z))
11 #define max3(x,y,z) (max(max(x,y),z))
12
13
14 rgb_color hsv2rgb(hsv_color hsv)
15 {
16   // From : http://qscribble.blogspot.fr/2008/06/integer-conversion-from-hsl-to-rgb.html
17   int h = hsv.h;
18   int s = hsv.s;
19   int v = hsv.v;
20   rgb_color rgb = {0, 0, 0};
21
22   if (v == 0)
23     return rgb;
24
25   // sextant = 0 .. 5
26   int sextant = (h*6)/256;
27   // f = 0 .. 42
28   int f = h - (sextant*256)/6;
29
30   int p = (v * (256 - s))/256;
31   int q = (v * (256*43 - s*f))/(256*43);
32   int t = (v * (256*43 - s*(43-f)))/(256*43);
33
34   // Corrige les erreurs dues aux arrondis
35   p = max(min(p, 255), 0);
36   q = max(min(q, 255), 0);
37   t = max(min(t, 255), 0);
38
39   switch(sextant){
40   case 0: rgb.r = v; rgb.g = t; rgb.b = p; break;
41   case 1: rgb.r = q; rgb.g = v; rgb.b = p; break;
42   case 2: rgb.r = p; rgb.g = v; rgb.b = t; break;
43   case 3: rgb.r = p; rgb.g = q; rgb.b = v; break;
44   case 4: rgb.r = t; rgb.g = p; rgb.b = v; break;
45   default:rgb.r = v; rgb.g = p; rgb.b = q; break;
46   }
47   return rgb;
48 }
49
50
51 hsv_color rgb2hsv(rgb_color rgb)
52 {
53   // From : http://www.ruinelli.ch/rgb-to-hsv
54   hsv_color hsv = {0, 0, 0};
55   int min, max, delta;
56
57   min = min3(rgb.r, rgb.g, rgb.b);
58   max = max3(rgb.r, rgb.g, rgb.b);
59
60   if(max==0) {
61     hsv.h = 0;
62     hsv.s = 0;
63     hsv.v = 0;
64     return hsv;
65   }
66
67   hsv.v = max;
68   delta = max - min;
69
70   hsv.s = (delta)*255 / max;
71
72   if(rgb.r == max)
73     hsv.h = (rgb.g - rgb.b)*42/delta;        // between yellow & magenta
74   else if(rgb.g == max)
75     hsv.h = 120 + (rgb.b - rgb.r)*42/delta;    // between cyan & yellow
76   else
77     hsv.h = 240 + (rgb.r - rgb.g)*42/delta;    // between magenta & cyan
78
79   return hsv;
80 }