2 * The two methode HSB_TO_RGB and RGB_TO_HSB are from http://www.easyrgb.com/index.php?X=MATH&H=21#text21
4 #include "ColorTools_CPU.h"
6 #define max(a,b) (a>=b?a:b)
7 #define min(a,b) (a<=b?a:b)
12 //#define RED_MASK 0x000000FF
13 //#define GREEN_MASK 0x0000FF00
14 //#define BLUE_MASK 0x00FF0000
15 //#define ALPHA_MASK 0xFF000000;
17 /*--------------------------------------*\
19 \*-------------------------------------*/
21 void ColorTools::HSB_TO_RVB(const float3
& hsb
, uchar4
* ptrRVBA
)
23 ColorTools::HSB_TO_RVB(hsb
.x
, hsb
.y
, hsb
.z
, &ptrRVBA
->x
, &ptrRVBA
->y
, &ptrRVBA
->z
);
26 void ColorTools::HSB_TO_RVB(float h01
, uchar4
* ptrRVBA
)
28 ColorTools::HSB_TO_RVB(h01
, 1.0f
, 1.0f
, &ptrRVBA
->x
, &ptrRVBA
->y
, &ptrRVBA
->z
);
31 void ColorTools::HSB_TO_RVB(float h01
, float s01
, float b01
, uchar4
* ptrRVBA
)
33 ColorTools::HSB_TO_RVB(h01
, s01
, b01
, &ptrRVBA
->x
, &ptrRVBA
->y
, &ptrRVBA
->z
);
38 * H,S,B valeur comprise entre [0,1]
41 * R,G,B le resultat compris dans les valeurs [0-255]
43 void ColorTools::HSB_TO_RVB(const float H
, const float S
, const float V
, unsigned char *ptrR
, unsigned char *ptrG
, unsigned char *ptrB
)
45 if (S
== 0) //HSV from 0 to 1
59 unsigned char var_i
= (unsigned char) var_h
; //Or ... var_i = floor( var_h )
60 float var_1
= V
* (1 - S
);
61 float var_2
= V
* (1 - S
* (var_h
- var_i
));
62 float var_3
= V
* (1 - S
* (1 - (var_h
- var_i
)));
64 float var_r
, var_g
, var_b
;
102 //RGB results from 0 to 255
103 *ptrR
= (unsigned char) (var_r
* 255);
104 *ptrG
= (unsigned char) (var_g
* 255);
105 *ptrB
= (unsigned char) (var_b
* 255);
109 /*--------------------------------------*\
111 \*-------------------------------------*/
113 void ColorTools::RGB_TO_HSB(const unsigned char R
, const unsigned char G
, const unsigned char B
, float &H
, float &S
, float &V
)
116 float var_R
= (R
/ (float) 255);
117 float var_G
= (G
/ (float) 255);
118 float var_B
= (B
/ (float) 255);
120 float var_Min
= min(var_R
, min(var_G
, var_B
)); //Min. value of RGB
121 float var_Max
= max(var_R
, max(var_G
, var_B
)); //Max. value of RGB
122 float del_Max
= var_Max
- var_Min
; //Delta RGB value
126 if (del_Max
== 0) //This is a gray, no chroma...
128 H
= 0; //HSV results from 0 to 1
131 else //Chromatic data...
133 S
= del_Max
/ var_Max
;
135 float del_R
, del_G
, del_B
;
136 del_R
= (((var_Max
- var_R
) / 6) + (del_Max
/ 2)) / del_Max
;
137 del_G
= (((var_Max
- var_G
) / 6) + (del_Max
/ 2)) / del_Max
;
138 del_B
= (((var_Max
- var_B
) / 6) + (del_Max
/ 2)) / del_Max
;
140 if (var_R
== var_Max
)
142 else if (var_G
== var_Max
)
143 H
= (1 / 3) + del_R
- del_B
;
144 else if (var_B
== var_Max
)
145 H
= (2 / 3) + del_G
- del_R
;
154 /*--------------------------------------*\
156 \*-------------------------------------*/
158 int ColorTools::toIntRGBA(unsigned char r
, unsigned char g
, unsigned char b
, unsigned char a
)
163 int rgb
= var_b
^ var_g
^ ((int) r
) ^ var_a
;
168 int ColorTools::toIntRGBA(float r
, float g
, float b
, float a
)
170 return toIntRGBA((unsigned char) (r
* 255.0), (unsigned char) (g
* 255.0), (unsigned char) (b
* 255.0), (unsigned char) (a
* 255.0));
173 int ColorTools::HSB_TO_IntRGBA(float h01
, float s01
, float b01
, float a01
)
175 unsigned char result_r
, result_v
, result_b
;
176 ColorTools::HSB_TO_RVB(h01
, s01
, b01
, &result_r
, &result_v
, &result_b
);
178 return toIntRGBA(result_r
, result_v
, result_b
, (int) (a01
* 255.0));
181 void ColorTools::fromIntRGBA(const int rgba
, unsigned char &r
, unsigned char &g
, unsigned char &b
, unsigned char &a
)
183 r
= (unsigned char) rgba
;
184 g
= (unsigned char) (rgba
>> 8);
185 b
= (unsigned char) (rgba
>> 16);
186 a
= (unsigned char) (rgba
>> 24);
191 /*----------------------------------------------------------------------*\
193 \*---------------------------------------------------------------------*/