1   //*****************************************************************************
2   //
3   //  File  Name    :  'hsv.c'
4   //  Title                :  Itronove  hodiny 
5   #define  __PIC18F8720A__
6   //  Author              :  http://www.prochazka.zde.cz  -&rsaquo   hacesoft  2017
7   //  Created            :  15-06-2017,  07:03
8   //  Revised            :  15-06-2017,  07:03
9   //  Version            :  1.0
10   //  Target  MCU   :  PIC  18F8720
11   //
12   //  This  code  is  distributed  under  the  GNU  Public  License
13   //  Vsechny  informace  jsou  zahrnuty  pod  GPL  licenci,  pokud  není  explicitne  uveden  jiný  typ  licence.
14   //  Pouzivání  techto  stránek  ke  komercním  úcelum  lze  jen  se  souhlasem  autora.
15   //  Vsechna  práva  vyhrazena  (c)  1997  -  2017  hacesoft.
16   //
17   //*****************************************************************************
18   //https://stackoverflow.com/questions/3018313/algorithm-to-convert-rgb-to-hsv-and-hsv-to-rgb-in-range-0-255-for-both
19  
20   #include  "hsv.h"
21   #include &lsaquo xc.h&rsaquo
22  
23   RgbColor  HsvToRgb(HsvColor  hsv){
24        RgbColor  rgb;
25        unsigned  char  region,  p,  q,  t;
26        unsigned  int  h,  s,  v,  remainder;
27  
28        if  (hsv.s  ==  0){
29            rgb.r  =  hsv.v;
30            rgb.g  =  hsv.v;
31            rgb.b  =  hsv.v;
32            return  rgb;
33        }
34  
35        //  converting  to  16  bit  to  prevent  overflow
36        h  =  hsv.h;
37        s  =  hsv.s;
38        v  =  hsv.v;
39  
40        region  =  h  /  43;
41        remainder  =  (h  -  (region  *  (unsigned)43))  *  6; 
42  
43        p  =  (v  *  (255  -  s)) &rsaquo &rsaquo   8;
44        q  =  (v  *  (255  -  ((s  *  remainder) &rsaquo &rsaquo   8))) &rsaquo &rsaquo   8;
45        t  =  (v  *  (255  -  ((s  *  (255  -  remainder)) &rsaquo &rsaquo   8))) &rsaquo &rsaquo   8;
46  
47        switch  (region){
48            case  0:
49                rgb.r  =  v;
50                rgb.g  =  t;
51                rgb.b  =  p;
52                break;
53            case  1:
54                rgb.r  =  q;
55                rgb.g  =  v;
56                rgb.b  =  p;
57                break;
58            case  2:
59                rgb.r  =  p;
60                rgb.g  =  v;
61                rgb.b  =  t;
62                break;
63            case  3:
64                rgb.r  =  p;
65                rgb.g  =  q;
66                rgb.b  =  v;
67                break;
68            case  4:
69                rgb.r  =  t;
70                rgb.g  =  p;
71                rgb.b  =  v;
72                break;
73            default:
74                rgb.r  =  v;
75                rgb.g  =  p;
76                rgb.b  =  q;
77                break;
78        }
79  
80        return  rgb;
81   }
82  
83   HsvColor  RgbToHsv(RgbColor  rgb){
84        HsvColor  hsv;
85        unsigned  char  rgbMin,  rgbMax;
86  
87        rgbMin  =  (unsigned)rgb.r &lsaquo   (unsigned)rgb.g  ?  (unsigned)(rgb.r &lsaquo   rgb.b  ?  rgb.r  :  rgb.b)  :  (unsigned)(rgb.g &lsaquo   rgb.b  ?  rgb.g  :  rgb.b);
88        rgbMax  =  (unsigned)rgb.r &rsaquo   (unsigned)rgb.g  ?  (unsigned)(rgb.r &rsaquo   rgb.b  ?  rgb.r  :  rgb.b)  :  (unsigned)(rgb.g &rsaquo   rgb.b  ?  rgb.g  :  rgb.b);
89  
90        hsv.v  =  rgbMax;
91        if  (hsv.v  ==  0){
92            hsv.h  =  0;
93            hsv.s  =  0;
94            return  hsv;
95        }
96  
97        hsv.s  =  255  *  (unsigned)((long)(rgbMax  -  rgbMin))  /  hsv.v;
98        if  (hsv.s  ==  0){
99            hsv.h  =  0;
100            return  hsv;
101        }
102  
103        if  (rgbMax  ==  rgb.r)
104            hsv.h  =  0  +  43  *  (unsigned)(rgb.g  -  rgb.b)  /  (unsigned)(rgbMax  -  rgbMin);
105        else  if  (rgbMax  ==  rgb.g)
106            hsv.h  =  85  +  43  *  (unsigned)(rgb.b  -  rgb.r)  /  (unsigned)(rgbMax  -  rgbMin);
107        else
108            hsv.h  =  171  +  43  *  (unsigned)(rgb.r  -  rgb.g)  /  (unsigned)(rgbMax  -  rgbMin);
109  
110        return  hsv;
111   }
112