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 |      |