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

Revision 506, 2.7 KB (checked in by goodea, 3 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 */
33inline 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
93void 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.