| 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) rgb_max=pix->channel[CC3_CHANNEL_RED]; |
|---|
| 40 | | if(pix->channel[CC3_CHANNEL_GREEN]>rgb_max) rgb_max=pix->channel[CC3_CHANNEL_GREEN]; |
|---|
| 41 | | if(pix->channel[CC3_CHANNEL_BLUE]>rgb_max) rgb_max=pix->channel[CC3_CHANNEL_BLUE]; |
|---|
| 42 | | if(pix->channel[CC3_CHANNEL_RED]<rgb_min) rgb_min=pix->channel[CC3_CHANNEL_RED]; |
|---|
| 43 | | if(pix->channel[CC3_CHANNEL_GREEN]<rgb_min) rgb_min=pix->channel[CC3_CHANNEL_GREEN]; |
|---|
| 44 | | if(pix->channel[CC3_CHANNEL_BLUE]<rgb_min) rgb_min=pix->channel[CC3_CHANNEL_BLUE]; |
|---|
| | 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]; |
|---|
| | 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; |
|---|
| 65 | | // compute H |
|---|
| 66 | | if (rgb_max == pix->channel[CC3_CHANNEL_RED]) { |
|---|
| 67 | | hue = 0 + 43*(pix->channel[CC3_CHANNEL_GREEN] - pix->channel[CC3_CHANNEL_BLUE])/(rgb_max - rgb_min); |
|---|
| 68 | | } else if (rgb_max == pix->channel[CC3_CHANNEL_GREEN]) { |
|---|
| 69 | | hue = 85 + 43*(pix->channel[CC3_CHANNEL_BLUE] - pix->channel[CC3_CHANNEL_RED])/(rgb_max - rgb_min); |
|---|
| 70 | | } else /* rgb_max == blue */ { |
|---|
| 71 | | hue = 171 + 43*(pix->channel[CC3_CHANNEL_RED] - pix->channel[CC3_CHANNEL_GREEN])/(rgb_max - rgb_min); |
|---|
| 72 | | } |
|---|
| 73 | | pix->channel[CC3_CHANNEL_HUE]=hue; |
|---|
| 74 | | pix->channel[CC3_CHANNEL_SAT]=sat; |
|---|
| 75 | | pix->channel[CC3_CHANNEL_VAL]=val; |
|---|
| 76 | | } |
|---|
| 77 | | |
|---|
| 78 | | void cc3_rgb2hsv_row(cc3_pixel_t *pix, uint16_t size) |
|---|
| 79 | | { |
|---|
| 80 | | uint16_t i; |
|---|
| 81 | | |
|---|
| 82 | | for(i=0; i<size; i++ ) |
|---|
| 83 | | cc3_rgb2hsv(&pix[i]); |
|---|
| | 97 | for (i = 0; i < size; i++) |
|---|
| | 98 | cc3_rgb2hsv (&pix[i]); |
|---|