00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include "plstdpch.h"
00012 #include "plhsvconvert.h"
00013
00014 void fp_rgb_to_hsv (double *r,
00015 double *g,
00016 double *b)
00017 {
00018 int red, green, blue;
00019 double h=0, s, v;
00020 int min, max;
00021 int delta;
00022
00023 red = (int)*r;
00024 green = (int)*g;
00025 blue = (int)*b;
00026
00027 if (red > green)
00028 {
00029 if (red > blue)
00030 max = red;
00031 else
00032 max = blue;
00033
00034 if (green < blue)
00035 min = green;
00036 else
00037 min = blue;
00038 }
00039 else
00040 {
00041 if (green > blue)
00042 max = green;
00043 else
00044 max = blue;
00045
00046 if (red < blue)
00047 min = red;
00048 else
00049 min = blue;
00050 }
00051
00052 v = max;
00053
00054 if (max != 0)
00055 s = ((max - min) * 255) / (double) max;
00056 else
00057 s = 0;
00058
00059 if (s == 0)
00060 h = 0;
00061 else
00062 {
00063 delta = max - min;
00064 if (red == max)
00065 h = (green - blue) / (double) delta;
00066 else if (green == max)
00067 h = 2 + (blue - red) / (double) delta;
00068 else if (blue == max)
00069 h = 4 + (red - green) / (double) delta;
00070 h *= 42.5;
00071
00072 if (h < 0)
00073 h += 255;
00074 if (h > 255)
00075 h -= 255;
00076 }
00077
00078 *r = h;
00079 *g = s;
00080 *b = v;
00081 }
00082
00083
00084 void fp_hsv_to_rgb (double *h,
00085 double *s,
00086 double *v)
00087 {
00088 double hue, saturation, value;
00089 double f, p, q, t;
00090
00091 if (((int)*s) == 0)
00092 {
00093 *h = *v;
00094 *s = *v;
00095 *v = *v;
00096 }
00097 else
00098 {
00099 hue = *h * 6.0 / 255.0;
00100 saturation = *s / 255.0;
00101 value = *v / 255.0;
00102
00103 f = hue - (int) hue;
00104 p = value * (1.0 - saturation);
00105 q = value * (1.0 - (saturation * f));
00106 t = value * (1.0 - (saturation * (1.0 - f)));
00107
00108 switch ((int) hue)
00109 {
00110 case 0:
00111 *h = value * 255.0;
00112 *s = t * 255.0;
00113 *v = p * 255.0;
00114 break;
00115 case 1:
00116 *h = q * 255.0;
00117 *s = value * 255.0;
00118 *v = p * 255.0;
00119 break;
00120 case 2:
00121 *h = p * 255.0;
00122 *s = value * 255.0;
00123 *v = t * 255.0;
00124 break;
00125 case 3:
00126 *h = p * 255.0;
00127 *s = q * 255.0;
00128 *v = value * 255.0;
00129 break;
00130 case 4:
00131 *h = t * 255.0;
00132 *s = p * 255.0;
00133 *v = value * 255.0;
00134 break;
00135 case 5:
00136 *h = value * 255.0;
00137 *s = p * 255.0;
00138 *v = q * 255.0;
00139 break;
00140 }
00141 }
00142 }
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164