summaryrefslogtreecommitdiffstats
path: root/keyboards/handwired/practice60/hsv2rgb.c
diff options
context:
space:
mode:
Diffstat (limited to 'keyboards/handwired/practice60/hsv2rgb.c')
-rw-r--r--keyboards/handwired/practice60/hsv2rgb.c80
1 files changed, 80 insertions, 0 deletions
diff --git a/keyboards/handwired/practice60/hsv2rgb.c b/keyboards/handwired/practice60/hsv2rgb.c
new file mode 100644
index 000000000..adb7af8fa
--- /dev/null
+++ b/keyboards/handwired/practice60/hsv2rgb.c
@@ -0,0 +1,80 @@
+/* hsv2rgb.c
+ * Integer only conversion functions between HSV and RGB
+ */
+
+#include "hsv2rgb.h"
+
+// TODO fix these buggy macros
+#define max(x,y) ((x>y) ? x:y)
+#define min(x,y) ((x>y) ? y:x)
+#define min3(x,y,z) (min(min(x,y),z))
+#define max3(x,y,z) (max(max(x,y),z))
+
+
+rgb_color hsv2rgb(hsv_color hsv)
+{
+ // From : http://qscribble.blogspot.fr/2008/06/integer-conversion-from-hsl-to-rgb.html
+ int h = hsv.h;
+ int s = hsv.s;
+ int v = hsv.v;
+ rgb_color rgb = {0, 0, 0};
+
+ if (v == 0)
+ return rgb;
+
+ // sextant = 0 .. 5
+ int sextant = (h*6)/256;
+ // f = 0 .. 42
+ int f = h - (sextant*256)/6;
+
+ int p = (v * (256 - s))/256;
+ int q = (v * (256*43 - s*f))/(256*43);
+ int t = (v * (256*43 - s*(43-f)))/(256*43);
+
+ // Corrige les erreurs dues aux arrondis
+ p = max(min(p, 255), 0);
+ q = max(min(q, 255), 0);
+ t = max(min(t, 255), 0);
+
+ switch(sextant){
+ case 0: rgb.r = v; rgb.g = t; rgb.b = p; break;
+ case 1: rgb.r = q; rgb.g = v; rgb.b = p; break;
+ case 2: rgb.r = p; rgb.g = v; rgb.b = t; break;
+ case 3: rgb.r = p; rgb.g = q; rgb.b = v; break;
+ case 4: rgb.r = t; rgb.g = p; rgb.b = v; break;
+ default:rgb.r = v; rgb.g = p; rgb.b = q; break;
+ }
+ return rgb;
+}
+
+
+hsv_color rgb2hsv(rgb_color rgb)
+{
+ // From : http://www.ruinelli.ch/rgb-to-hsv
+ hsv_color hsv = {0, 0, 0};
+ int min, max, delta;
+
+ min = min3(rgb.r, rgb.g, rgb.b);
+ max = max3(rgb.r, rgb.g, rgb.b);
+
+ if(max==0) {
+ hsv.h = 0;
+ hsv.s = 0;
+ hsv.v = 0;
+ return hsv;
+ }
+
+ hsv.v = max;
+ delta = max - min;
+
+ hsv.s = (delta)*255 / max;
+
+ if(rgb.r == max)
+ hsv.h = (rgb.g - rgb.b)*42/delta; // between yellow & magenta
+ else if(rgb.g == max)
+ hsv.h = 120 + (rgb.b - rgb.r)*42/delta; // between cyan & yellow
+ else
+ hsv.h = 240 + (rgb.r - rgb.g)*42/delta; // between magenta & cyan
+
+ return hsv;
+} \ No newline at end of file