hsv_rgb.c


1
/*
2
 * hsv_rgb.c
3
 *
4
 *  Created on: 15.10.2011
5
 *      Author: Frank
6
 */
7
#include "hsv_rgb.h"
8
9
void hsv_to_rgb12(colorstruc *value)
10
{
11
  uint16_t q;
12
  uint16_t p;
13
  uint16_t t;
14
15
  uint8_t i;
16
  uint16_t f;
17
18
  if( value->S == 0 )
19
   {
20
    value->Pin_R = value->V;
21
    value->Pin_G = value->V;
22
    value->Pin_B = value->V;
23
  }
24
  else
25
  {  i = value->H / 683;
26
    f = value->H % 683;
27
    p = (uint16_t)( ( value->V * ( 4095 - value->S ) ) / 4096 );
28
    q = (uint16_t)( ( value->V * ( ( 2796885 - ( value->S * f ) ) / 683 ) ) / 4096 );
29
    t = (uint16_t)( ( ( value->V * ( ( 2796885 - ( value->S * ( 683 - ( (uint32_t)f ) ) ) ) / 683 ) ) ) / 4096 );
30
31
  switch( i )
32
     {
33
      case 0:
34
        value->Pin_R = value->V; value->Pin_G = t; value->Pin_B = p; break;
35
36
      case 1:
37
        value->Pin_R = q; value->Pin_G = value->V; value->Pin_B = p; break;
38
39
      case 2:
40
        value->Pin_R = p; value->Pin_G = value->V; value->Pin_B = t; break;
41
42
      case 3:
43
        value->Pin_R = p; value->Pin_G = q; value->Pin_B = value->V; break;
44
45
      case 4:
46
        value->Pin_R = t; value->Pin_G = p; value->Pin_B = value->V; break;
47
48
      default:
49
        value->Pin_R = value->V; value->Pin_G = p; value->Pin_B = q; break;
50
     }
51
  }
52
}