root/trunk/lib/cc3-ilp/cc3_hsv.c

Revision 506, 2.7 kB (checked in by goodea, 2 years ago)

indent

  • Property svn:executable set to *
Line 
1 /*
2  * Copyright 2007  Anthony Rowe and Adam Goode
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17
18
19 #include "cc3.h"
20 #include "cc3_ilp.h"
21 #include "cc3_hsv.h"
22 #include <stdbool.h>
23 #include <stdio.h>
24
25
26
27
28 /*
29  * This function will convert an RGB pixel into a HSV pixel replacing the original
30  * RGB value.
31  *
32  */
33 inline void cc3_rgb2hsv (cc3_pixel_t * pix)
34 {
35   uint8_t hue, sat, val;
36   uint8_t rgb_min, rgb_max;
37   rgb_max = 0;
38   rgb_min = 255;
39   if (pix->channel[CC3_CHANNEL_RED] > rgb_max)
40     rgb_max = pix->channel[CC3_CHANNEL_RED];
41   if (pix->channel[CC3_CHANNEL_GREEN] > rgb_max)
42     rgb_max = pix->channel[CC3_CHANNEL_GREEN];
43   if (pix->channel[CC3_CHANNEL_BLUE] > rgb_max)
44     rgb_max = pix->channel[CC3_CHANNEL_BLUE];
45   if (pix->channel[CC3_CHANNEL_RED] < rgb_min)
46     rgb_min = pix->channel[CC3_CHANNEL_RED];
47   if (pix->channel[CC3_CHANNEL_GREEN] < rgb_min)
48     rgb_min = pix->channel[CC3_CHANNEL_GREEN];
49   if (pix->channel[CC3_CHANNEL_BLUE] < rgb_min)
50     rgb_min = pix->channel[CC3_CHANNEL_BLUE];
51
52 // compute V
53   val = rgb_max;
54   if (val == 0) {
55     hue = sat = 0;
56     pix->channel[CC3_CHANNEL_HUE] = 0;
57     pix->channel[CC3_CHANNEL_SAT] = 0;
58     pix->channel[CC3_CHANNEL_VAL] = val;
59     return;
60   }
61
62 // compute S
63   sat = 255 * (rgb_max - rgb_min) / val;
64   if (sat == 0) {
65     pix->channel[CC3_CHANNEL_HUE] = 0;
66     pix->channel[CC3_CHANNEL_SAT] = 0;
67     pix->channel[CC3_CHANNEL_VAL] = val;
68     return;
69   }
70
71 // compute H
72   if (rgb_max == pix->channel[CC3_CHANNEL_RED]) {
73     hue =
74       0 + 43 * (pix->channel[CC3_CHANNEL_GREEN] -
75                 pix->channel[CC3_CHANNEL_BLUE]) / (rgb_max - rgb_min);
76   }
77   else if (rgb_max == pix->channel[CC3_CHANNEL_GREEN]) {
78     hue =
79       85 + 43 * (pix->channel[CC3_CHANNEL_BLUE] -
80                  pix->channel[CC3_CHANNEL_RED]) / (rgb_max - rgb_min);
81   }
82   else {                        /* rgb_max == blue */
83
84     hue =
85       171 + 43 * (pix->channel[CC3_CHANNEL_RED] -
86                   pix->channel[CC3_CHANNEL_GREEN]) / (rgb_max - rgb_min);
87   }
88   pix->channel[CC3_CHANNEL_HUE] = hue;
89   pix->channel[CC3_CHANNEL_SAT] = sat;
90   pix->channel[CC3_CHANNEL_VAL] = val;
91 }
92
93 void cc3_rgb2hsv_row (cc3_pixel_t * pix, uint16_t size)
94 {
95   uint16_t i;
96
97   for (i = 0; i < size; i++)
98     cc3_rgb2hsv (&pix[i]);
99
100 }
Note: See TracBrowser for help on using the browser.