diff options
author | Andrew Kannan <andrew.kannan@klaviyo.com> | 2018-12-18 11:26:43 -0500 |
---|---|---|
committer | Drashna Jaelre <drashna@live.com> | 2018-12-18 08:26:43 -0800 |
commit | 20e134e6817f2927dfa146524f84335b0b7cced3 (patch) | |
tree | 8400bae1bc4a240148bbb2facd4355a4bbc8c889 /keyboards/handwired/ortho60/hsv2rgb.c | |
parent | 398204b2a03bdac68fccb6f7592ed3ea52741ce5 (diff) |
Keyboard: Adding ortho60 to handwired (#4672)
* Adding ortho60 to handwired
* update to use LAYOUT_ortho_5x12
* Address PR comments about layout macros
* Add default layout to info.json for configurator
* Hack to xyverz layout until RGB branch is merged
* Fix undef RGBDIPIN in xyverz 12x5 layout
* Revert change to xvyerz's layout
* Fix typo
* Fix order
* Revert xyverz rules.mk
Diffstat (limited to 'keyboards/handwired/ortho60/hsv2rgb.c')
-rw-r--r-- | keyboards/handwired/ortho60/hsv2rgb.c | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/keyboards/handwired/ortho60/hsv2rgb.c b/keyboards/handwired/ortho60/hsv2rgb.c new file mode 100644 index 0000000000..adb7af8fa5 --- /dev/null +++ b/keyboards/handwired/ortho60/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 |