Merge branch 'master' into TrackBackToHeader
[inav.git] / src / main / common / colorconversion.c
bloba37bc821ab6daefcf2774186341267b491bf8803
1 /*
2 * This file is part of Cleanflight.
4 * Cleanflight is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your option) any later version.
9 * Cleanflight is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with Cleanflight. If not, see <http://www.gnu.org/licenses/>.
18 #include "stdint.h"
20 #include "color.h"
21 #include "colorconversion.h"
24 * Source below found here: http://www.kasperkamperman.com/blog/arduino/arduino-programming-hsb-to-rgb/
27 rgbColor24bpp_t* hsvToRgb24(const hsvColor_t* c)
29 static rgbColor24bpp_t r;
31 uint16_t val = c->v;
32 uint16_t sat = 255 - c->s;
33 uint32_t base;
34 uint16_t hue = c->h;
36 if (sat == 0) { // Acromatic color (gray). Hue doesn't mind.
37 r.rgb.r = val;
38 r.rgb.g = val;
39 r.rgb.b = val;
40 } else {
42 base = ((255 - sat) * val) >> 8;
44 switch (hue / 60) {
45 case 0:
46 r.rgb.r = val;
47 r.rgb.g = (((val - base) * hue) / 60) + base;
48 r.rgb.b = base;
49 break;
50 case 1:
51 r.rgb.r = (((val - base) * (60 - (hue % 60))) / 60) + base;
52 r.rgb.g = val;
53 r.rgb.b = base;
54 break;
56 case 2:
57 r.rgb.r = base;
58 r.rgb.g = val;
59 r.rgb.b = (((val - base) * (hue % 60)) / 60) + base;
60 break;
62 case 3:
63 r.rgb.r = base;
64 r.rgb.g = (((val - base) * (60 - (hue % 60))) / 60) + base;
65 r.rgb.b = val;
66 break;
68 case 4:
69 r.rgb.r = (((val - base) * (hue % 60)) / 60) + base;
70 r.rgb.g = base;
71 r.rgb.b = val;
72 break;
74 case 5:
75 r.rgb.r = val;
76 r.rgb.g = base;
77 r.rgb.b = (((val - base) * (60 - (hue % 60))) / 60) + base;
78 break;
82 return &r;