4 * Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
37 int HSV::rgb_to_hsv(float r, float g, float b, float &h, float &s, float &v)
39 float min, max, delta;
40 min = ((r < g) ? r : g) < b ? ((r < g) ? r : g) : b;
41 max = ((r > g) ? r : g) > b ? ((r > g) ? r : g) : b;
46 if(max != 0 && delta != 0)
51 h = (g - b) / delta; // between yellow & magenta
54 h = 2 + (b - r) / delta; // between cyan & yellow
56 h = 4 + (r - g) / delta; // between magenta & cyan
64 // r = g = b = 0 // s = 0, v is undefined
72 int HSV::hsv_to_rgb(float &r, float &g, float &b, float h, float s, float v)
83 h /= 60; // sector 0 to 5
85 f = h - i; // factorial part of h
88 t = v * (1 - s * (1 - f));
126 int HSV::yuv_to_hsv(int y, int u, int v, float &h, float &s, float &va, int max)
133 // yuv_static.yuv_to_rgb_16(r_i, g_i, b_i, y, u, v);
137 yuv_static.yuv_to_rgb_8(r_i, g_i, b_i, y, u, v);
139 r = (float)r_i / max;
140 g = (float)g_i / max;
141 b = (float)b_i / max;
144 HSV::rgb_to_hsv(r, g, b, h2, s2, v2);
152 int HSV::hsv_to_yuv(int &y, int &u, int &v, float h, float s, float va, int max)
156 HSV::hsv_to_rgb(r, g, b, h, s, va);
160 r_i = (int)CLIP(r, 0, max);
161 g_i = (int)CLIP(g, 0, max);
162 b_i = (int)CLIP(b, 0, max);
166 // yuv_static.rgb_to_yuv_16(r_i, g_i, b_i, y2, u2, v2);
168 yuv_static.rgb_to_yuv_8(r_i, g_i, b_i, y2, u2, v2);
201 for(int i = 0; i < 0x100; i++)
204 rtoy_tab_8[i] = (int)(R_TO_Y * 0x100 * i);
205 rtou_tab_8[i] = (int)(R_TO_U * 0x100 * i);
206 rtov_tab_8[i] = (int)(R_TO_V * 0x100 * i);
208 gtoy_tab_8[i] = (int)(G_TO_Y * 0x100 * i);
209 gtou_tab_8[i] = (int)(G_TO_U * 0x100 * i);
210 gtov_tab_8[i] = (int)(G_TO_V * 0x100 * i);
212 btoy_tab_8[i] = (int)(B_TO_Y * 0x100 * i);
213 btou_tab_8[i] = (int)(B_TO_U * 0x100 * i) + 0x8000;
214 btov_tab_8[i] = (int)(B_TO_V * 0x100 * i) + 0x8000;
217 vtor_8 = &(vtor_tab_8[(0x100) / 2]);
218 vtog_8 = &(vtog_tab_8[(0x100) / 2]);
219 utog_8 = &(utog_tab_8[(0x100) / 2]);
220 utob_8 = &(utob_tab_8[(0x100) / 2]);
222 for(int i = (-0x100) / 2; i < (0x100) / 2; i++)
225 vtor_8[i] = (int)(V_TO_R * 0x100 * i);
226 vtog_8[i] = (int)(V_TO_G * 0x100 * i);
228 utog_8[i] = (int)(U_TO_G * 0x100 * i);
229 utob_8[i] = (int)(U_TO_B * 0x100 * i);
232 for(int i = 0; i < 0x10000; i++)
235 rtoy_tab_16[i] = (int)(R_TO_Y * 0x100 * i);
236 rtou_tab_16[i] = (int)(R_TO_U * 0x100 * i);
237 rtov_tab_16[i] = (int)(R_TO_V * 0x100 * i);
239 gtoy_tab_16[i] = (int)(G_TO_Y * 0x100 * i);
240 gtou_tab_16[i] = (int)(G_TO_U * 0x100 * i);
241 gtov_tab_16[i] = (int)(G_TO_V * 0x100 * i);
243 btoy_tab_16[i] = (int)(B_TO_Y * 0x100 * i);
244 btou_tab_16[i] = (int)(B_TO_U * 0x100 * i) + 0x800000;
245 btov_tab_16[i] = (int)(B_TO_V * 0x100 * i) + 0x800000;
248 vtor_16 = &(vtor_tab_16[(0x10000) / 2]);
249 vtog_16 = &(vtog_tab_16[(0x10000) / 2]);
250 utog_16 = &(utog_tab_16[(0x10000) / 2]);
251 utob_16 = &(utob_tab_16[(0x10000) / 2]);
253 for(int i = (-0x10000) / 2; i < (0x10000) / 2; i++)
256 vtor_16[i] = (int)(V_TO_R * 0x100 * i);
257 vtog_16[i] = (int)(V_TO_G * 0x100 * i);
259 utog_16[i] = (int)(U_TO_G * 0x100 * i);
260 utob_16[i] = (int)(U_TO_B * 0x100 * i);