--- /dev/null
+/*\r
+ * The two methode HSB_TO_RGB and RGB_TO_HSB are from http://www.easyrgb.com/index.php?X=MATH&H=21#text21\r
+ */\r
+#include "ColorTools_CPU.h"\r
+\r
+#define max(a,b) (a>=b?a:b)\r
+#define min(a,b) (a<=b?a:b)\r
+\r
+namespace cpu\r
+ {\r
+\r
+//#define RED_MASK 0x000000FF\r
+//#define GREEN_MASK 0x0000FF00\r
+//#define BLUE_MASK 0x00FF0000\r
+//#define ALPHA_MASK 0xFF000000;\r
+\r
+ /*--------------------------------------*\\r
+|* HSB_TO_RVB *|\r
+ \*-------------------------------------*/\r
+\r
+ void ColorTools::HSB_TO_RVB(const float3& hsb, uchar4* ptrRVBA)\r
+ {\r
+ ColorTools::HSB_TO_RVB(hsb.x, hsb.y, hsb.z, &ptrRVBA->x, &ptrRVBA->y, &ptrRVBA->z);\r
+ }\r
+\r
+ void ColorTools::HSB_TO_RVB(float h01, uchar4* ptrRVBA)\r
+ {\r
+ ColorTools::HSB_TO_RVB(h01, 1.0f, 1.0f, &ptrRVBA->x, &ptrRVBA->y, &ptrRVBA->z);\r
+ }\r
+\r
+ void ColorTools::HSB_TO_RVB(float h01, float s01, float b01, uchar4* ptrRVBA)\r
+ {\r
+ ColorTools::HSB_TO_RVB(h01, s01, b01, &ptrRVBA->x, &ptrRVBA->y, &ptrRVBA->z);\r
+ }\r
+\r
+ /**\r
+ * Inputs :\r
+ * H,S,B valeur comprise entre [0,1]\r
+ *\r
+ * Outpus :\r
+ * R,G,B le resultat compris dans les valeurs [0-255]\r
+ */\r
+ void ColorTools::HSB_TO_RVB(const float H, const float S, const float V, unsigned char *ptrR, unsigned char *ptrG, unsigned char *ptrB)\r
+ {\r
+ if (S == 0) //HSV from 0 to 1\r
+ {\r
+ *ptrR = V * 255;\r
+ *ptrG = V * 255;\r
+ *ptrB = V * 255;\r
+ }\r
+ else\r
+ {\r
+ float var_h = H * 6;\r
+ if (var_h == 6)\r
+ {\r
+ var_h = 0;\r
+ } //H must be < 1\r
+\r
+ unsigned char var_i = (unsigned char) var_h; //Or ... var_i = floor( var_h )\r
+ float var_1 = V * (1 - S);\r
+ float var_2 = V * (1 - S * (var_h - var_i));\r
+ float var_3 = V * (1 - S * (1 - (var_h - var_i)));\r
+\r
+ float var_r, var_g, var_b;\r
+ if (var_i == 0)\r
+ {\r
+ var_r = V;\r
+ var_g = var_3;\r
+ var_b = var_1;\r
+ }\r
+ else if (var_i == 1)\r
+ {\r
+ var_r = var_2;\r
+ var_g = V;\r
+ var_b = var_1;\r
+ }\r
+ else if (var_i == 2)\r
+ {\r
+ var_r = var_1;\r
+ var_g = V;\r
+ var_b = var_3;\r
+ }\r
+ else if (var_i == 3)\r
+ {\r
+ var_r = var_1;\r
+ var_g = var_2;\r
+ var_b = V;\r
+ }\r
+ else if (var_i == 4)\r
+ {\r
+ var_r = var_3;\r
+ var_g = var_1;\r
+ var_b = V;\r
+ }\r
+ else\r
+ {\r
+ var_r = V;\r
+ var_g = var_1;\r
+ var_b = var_2;\r
+ }\r
+\r
+ //RGB results from 0 to 255\r
+ *ptrR = (unsigned char) (var_r * 255);\r
+ *ptrG = (unsigned char) (var_g * 255);\r
+ *ptrB = (unsigned char) (var_b * 255);\r
+ }\r
+ }\r
+\r
+ /*--------------------------------------*\\r
+ |* RGB_TO_HSV *|\r
+ \*-------------------------------------*/\r
+\r
+ void ColorTools::RGB_TO_HSB(const unsigned char R, const unsigned char G, const unsigned char B, float &H, float &S, float &V)\r
+ {\r
+ //RGB from 0 to 255\r
+ float var_R = (R / (float) 255);\r
+ float var_G = (G / (float) 255);\r
+ float var_B = (B / (float) 255);\r
+\r
+ float var_Min = min(var_R, min(var_G, var_B)); //Min. value of RGB\r
+ float var_Max = max(var_R, max(var_G, var_B)); //Max. value of RGB\r
+ float del_Max = var_Max - var_Min; //Delta RGB value\r
+\r
+ V = var_Max;\r
+\r
+ if (del_Max == 0) //This is a gray, no chroma...\r
+ {\r
+ H = 0; //HSV results from 0 to 1\r
+ S = 0;\r
+ }\r
+ else //Chromatic data...\r
+ {\r
+ S = del_Max / var_Max;\r
+\r
+ float del_R, del_G, del_B;\r
+ del_R = (((var_Max - var_R) / 6) + (del_Max / 2)) / del_Max;\r
+ del_G = (((var_Max - var_G) / 6) + (del_Max / 2)) / del_Max;\r
+ del_B = (((var_Max - var_B) / 6) + (del_Max / 2)) / del_Max;\r
+\r
+ if (var_R == var_Max)\r
+ H = del_B - del_G;\r
+ else if (var_G == var_Max)\r
+ H = (1 / 3) + del_R - del_B;\r
+ else if (var_B == var_Max)\r
+ H = (2 / 3) + del_G - del_R;\r
+\r
+ if (H < 0)\r
+ H += 1;\r
+ if (H > 1)\r
+ H -= 1;\r
+ }\r
+ }\r
+\r
+ /*--------------------------------------*\\r
+ |* int *|\r
+ \*-------------------------------------*/\r
+\r
+ int ColorTools::toIntRGBA(unsigned char r, unsigned char g, unsigned char b, unsigned char a)\r
+ {\r
+ int var_a = a << 24;\r
+ int var_b = b << 16;\r
+ int var_g = g << 8;\r
+ int rgb = var_b ^ var_g ^ ((int) r) ^ var_a;\r
+\r
+ return rgb;\r
+ }\r
+\r
+ int ColorTools::toIntRGBA(float r, float g, float b, float a)\r
+ {\r
+ return toIntRGBA((unsigned char) (r * 255.0), (unsigned char) (g * 255.0), (unsigned char) (b * 255.0), (unsigned char) (a * 255.0));\r
+ }\r
+\r
+ int ColorTools::HSB_TO_IntRGBA(float h01, float s01, float b01, float a01)\r
+ {\r
+ unsigned char result_r, result_v, result_b;\r
+ ColorTools::HSB_TO_RVB(h01, s01, b01, &result_r, &result_v, &result_b);\r
+\r
+ return toIntRGBA(result_r, result_v, result_b, (int) (a01 * 255.0));\r
+ }\r
+\r
+ void ColorTools::fromIntRGBA(const int rgba, unsigned char &r, unsigned char &g, unsigned char &b, unsigned char &a)\r
+ {\r
+ r = (unsigned char) rgba;\r
+ g = (unsigned char) (rgba >> 8);\r
+ b = (unsigned char) (rgba >> 16);\r
+ a = (unsigned char) (rgba >> 24);\r
+ }\r
+\r
+ }\r
+\r
+/*----------------------------------------------------------------------*\\r
+ |* End *|\r
+ \*---------------------------------------------------------------------*/\r
+\r