Ajout de l'ensemble du workspace.
[GPU.git] / WCudaMSE / BilatTools_CPP / src / core / tools / cpp / namespace_cpu / ColorTools_CPU.cpp
diff --git a/WCudaMSE/BilatTools_CPP/src/core/tools/cpp/namespace_cpu/ColorTools_CPU.cpp b/WCudaMSE/BilatTools_CPP/src/core/tools/cpp/namespace_cpu/ColorTools_CPU.cpp
new file mode 100755 (executable)
index 0000000..7762d55
--- /dev/null
@@ -0,0 +1,194 @@
+/*\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