00001 #include "plugincolors.h"
00002
00003 #include <stdio.h>
00004
00005 HSV::HSV()
00006 {
00007 }
00008
00009
00010 HSV::~HSV()
00011 {
00012 }
00013
00014 YUV HSV::yuv_static;
00015
00016 int HSV::rgb_to_hsv(float r, float g, float b, float &h, float &s, float &v)
00017 {
00018 int i;
00019 float min, max, delta;
00020 float f, p, q, t;
00021 min = ((r < g) ? r : g) < b ? ((r < g) ? r : g) : b;
00022 max = ((r > g) ? r : g) > b ? ((r > g) ? r : g) : b;
00023 v = max;
00024
00025 delta = max - min;
00026
00027 if(max != 0 && delta != 0)
00028 {
00029 s = delta / max;
00030
00031 if(r == max)
00032 h = (g - b) / delta;
00033 else
00034 if(g == max)
00035 h = 2 + (b - r) / delta;
00036 else
00037 h = 4 + (r - g) / delta;
00038
00039 h *= 60;
00040 if(h < 0)
00041 h += 360;
00042 }
00043 else
00044 {
00045
00046 s = 0;
00047 h = -1;
00048 }
00049
00050 return 0;
00051 }
00052
00053 int HSV::hsv_to_rgb(float &r, float &g, float &b, float h, float s, float v)
00054 {
00055 int i;
00056 float min, max, delta;
00057 float f, p, q, t;
00058 if(s == 0)
00059 {
00060
00061 r = g = b = v;
00062 return 0;
00063 }
00064
00065 h /= 60;
00066 i = (int)h;
00067 f = h - i;
00068 p = v * (1 - s);
00069 q = v * (1 - s * f);
00070 t = v * (1 - s * (1 - f));
00071
00072 switch(i)
00073 {
00074 case 0:
00075 r = v;
00076 g = t;
00077 b = p;
00078 break;
00079 case 1:
00080 r = q;
00081 g = v;
00082 b = p;
00083 break;
00084 case 2:
00085 r = p;
00086 g = v;
00087 b = t;
00088 break;
00089 case 3:
00090 r = p;
00091 g = q;
00092 b = v;
00093 break;
00094 case 4:
00095 r = t;
00096 g = p;
00097 b = v;
00098 break;
00099 default:
00100 r = v;
00101 g = p;
00102 b = q;
00103 break;
00104 }
00105 return 0;
00106 }
00107
00108 int HSV::yuv_to_hsv(int y, int u, int v, float &h, float &s, float &va, int max)
00109 {
00110 float r, g, b;
00111 int r_i, g_i, b_i;
00112
00113 if(max == 0xffff)
00114 {
00115 yuv_static.yuv_to_rgb_16(r_i, g_i, b_i, y, u, v);
00116 }
00117 else
00118 {
00119 yuv_static.yuv_to_rgb_8(r_i, g_i, b_i, y, u, v);
00120 }
00121 r = (float)r_i / max;
00122 g = (float)g_i / max;
00123 b = (float)b_i / max;
00124
00125 float h2, s2, v2;
00126 HSV::rgb_to_hsv(r, g, b, h2, s2, v2);
00127 h = h2;
00128 s = s2;
00129 va = v2;
00130
00131 return 0;
00132 }
00133
00134 int HSV::hsv_to_yuv(int &y, int &u, int &v, float h, float s, float va, int max)
00135 {
00136 float r, g, b;
00137 int r_i, g_i, b_i;
00138 HSV::hsv_to_rgb(r, g, b, h, s, va);
00139 r = r * max + 0.5;
00140 g = g * max + 0.5;
00141 b = b * max + 0.5;
00142 r_i = (int)CLIP(r, 0, max);
00143 g_i = (int)CLIP(g, 0, max);
00144 b_i = (int)CLIP(b, 0, max);
00145
00146 int y2, u2, v2;
00147 if(max == 0xffff)
00148 yuv_static.rgb_to_yuv_16(r_i, g_i, b_i, y2, u2, v2);
00149 else
00150 yuv_static.rgb_to_yuv_8(r_i, g_i, b_i, y2, u2, v2);
00151 y = y2;
00152 u = u2;
00153 v = v2;
00154
00155 return 0;
00156 }
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181 YUV::YUV()
00182 {
00183 for(int i = 0; i < 0x100; i++)
00184 {
00185
00186 rtoy_tab_8[i] = (int)(R_TO_Y * 0x100 * i);
00187 rtou_tab_8[i] = (int)(R_TO_U * 0x100 * i);
00188 rtov_tab_8[i] = (int)(R_TO_V * 0x100 * i);
00189
00190 gtoy_tab_8[i] = (int)(G_TO_Y * 0x100 * i);
00191 gtou_tab_8[i] = (int)(G_TO_U * 0x100 * i);
00192 gtov_tab_8[i] = (int)(G_TO_V * 0x100 * i);
00193
00194 btoy_tab_8[i] = (int)(B_TO_Y * 0x100 * i);
00195 btou_tab_8[i] = (int)(B_TO_U * 0x100 * i) + 0x8000;
00196 btov_tab_8[i] = (int)(B_TO_V * 0x100 * i) + 0x8000;
00197 }
00198
00199 vtor_8 = &(vtor_tab_8[(0x100) / 2]);
00200 vtog_8 = &(vtog_tab_8[(0x100) / 2]);
00201 utog_8 = &(utog_tab_8[(0x100) / 2]);
00202 utob_8 = &(utob_tab_8[(0x100) / 2]);
00203
00204 for(int i = (-0x100) / 2; i < (0x100) / 2; i++)
00205 {
00206
00207 vtor_8[i] = (int)(V_TO_R * 0x100 * i);
00208 vtog_8[i] = (int)(V_TO_G * 0x100 * i);
00209
00210 utog_8[i] = (int)(U_TO_G * 0x100 * i);
00211 utob_8[i] = (int)(U_TO_B * 0x100 * i);
00212 }
00213
00214 for(int i = 0; i < 0x10000; i++)
00215 {
00216
00217 rtoy_tab_16[i] = (int)(R_TO_Y * 0x100 * i);
00218 rtou_tab_16[i] = (int)(R_TO_U * 0x100 * i);
00219 rtov_tab_16[i] = (int)(R_TO_V * 0x100 * i);
00220
00221 gtoy_tab_16[i] = (int)(G_TO_Y * 0x100 * i);
00222 gtou_tab_16[i] = (int)(G_TO_U * 0x100 * i);
00223 gtov_tab_16[i] = (int)(G_TO_V * 0x100 * i);
00224
00225 btoy_tab_16[i] = (int)(B_TO_Y * 0x100 * i);
00226 btou_tab_16[i] = (int)(B_TO_U * 0x100 * i) + 0x800000;
00227 btov_tab_16[i] = (int)(B_TO_V * 0x100 * i) + 0x800000;
00228 }
00229
00230 vtor_16 = &(vtor_tab_16[(0x10000) / 2]);
00231 vtog_16 = &(vtog_tab_16[(0x10000) / 2]);
00232 utog_16 = &(utog_tab_16[(0x10000) / 2]);
00233 utob_16 = &(utob_tab_16[(0x10000) / 2]);
00234
00235 for(int i = (-0x10000) / 2; i < (0x10000) / 2; i++)
00236 {
00237
00238 vtor_16[i] = (int)(V_TO_R * 0x100 * i);
00239 vtog_16[i] = (int)(V_TO_G * 0x100 * i);
00240
00241 utog_16[i] = (int)(U_TO_G * 0x100 * i);
00242 utob_16[i] = (int)(U_TO_B * 0x100 * i);
00243 }
00244 }
00245
00246 YUV::~YUV()
00247 {
00248 }