7 template<
typename TPIXEL,
typename TCHANNEL>
class TPixel;
13 #include "../typedefs.hpp"
28 template<
typename TPIXEL,
typename TCHANNEL>
54 TPixel(TCHANNEL ch0, TCHANNEL ch1, TCHANNEL ch2, TCHANNEL ch3) {
setChannels(ch0, ch1, ch2, ch3); }
68 return *(((TCHANNEL *) &
value) + index);
78 *(((TCHANNEL *) &
value) + index) = newVal;
91 void setChannels(TCHANNEL ch0, TCHANNEL ch1, TCHANNEL ch2, TCHANNEL ch3) {
92 TCHANNEL * ptr = (TCHANNEL *) &
value;
108 static void getNormalized(
double &ch0,
double &ch1,
double &ch2,
double &ch3, TPIXEL
const * src) {
109 TCHANNEL
const * ptr = (TCHANNEL *) src;
150 static void setNormalized(TPIXEL * dst,
const double &ch0,
const double &ch1,
const double &ch2,
const double &ch3) {
151 TCHANNEL * ptr = (TCHANNEL *) dst;
166 void setNormalized(
const double &ch0,
const double &ch1,
const double &ch2,
const double &ch3) {
196 double cHigh, cLow, cRng;
int max;
198 if (r > b) { cHigh = r; max = 1; }
else { cHigh = b; max = 3; }
199 cLow = (g < b) ? g : b;
201 if (g > b) { cHigh = g; max = 2; }
else { cHigh = b; max = 3; }
202 cLow = (r < b) ? r : b;
206 if (cHigh <= 0) { s = 0; h = 0;
return; }
208 r = (cHigh - r) / cRng; g = (cHigh - g) / cRng; b = (cHigh - b) / cRng;
210 case 1: h = b - g;
break;
211 case 2: h = r - b + 2;
break;
212 case 3: h = g - r + 4;
break;
214 h = (h < 0) ? h + 6 : h; h /= 6;
219 double r, g, b, h, s, v, a;
236 int c1;
double c2, x, y, z;
237 h *= 6; h = h - (int) (h / 6);
239 x = (1 - s) * v; y = (1 - (s * c2)) * v; z = (1 - s * (1 - c2)) * v;
241 case 0: r = v; g = z; b = x;
break;
242 case 1: r = y; g = v; b = x;
break;
243 case 2: r = x; g = v; b = z;
break;
244 case 3: r = x; g = y; b = v;
break;
245 case 4: r = z; g = x; b = v;
break;
246 case 5: r = v; g = x; b = y;
break;
252 double r, g, b, h, s, v, a;
271 double cHigh, cLow, cRng;
int max;
274 if (r > b) { cHigh = r; max = 1; }
else { cHigh = b; max = 3; }
275 cLow = (g < b) ? g : b;
276 }
else {
if (g > b) { cHigh = g; max = 2; }
else { cHigh = b; max = 3; }
277 cLow = (r < b) ? r : b;
280 l = (cHigh + cLow) / 2;
281 if ((l == 0) || (l == 1)) {
283 }
else if (l <= 0.5) {
286 s = 0.5 * cRng / (1 - l);
288 r = (cHigh - r) / cRng; g = (cHigh - g) / cRng; b = (cHigh - b) / cRng;
290 case 1: h = b - g;
break;
291 case 2: h = r - b + 2;
break;
292 case 3: h = g - r + 4;
break;
294 h = (h < 0) ? h + 6 : h; h /= 6;
299 double r, g, b, h, s, v, a;
306 int c1;
double c2, d, w, x, y, z;
307 if (l == 0) { r = 0; g = 0; b = 0;
return; }
308 if (l == 1) { r = 1; g = 1; b = 1;
return; }
309 h *= 6; h = (h) - (
int) (h / 6);
311 d = (l <= 0.5) ? s * l : s * (1 - l);
312 w = l + d; x = l - d; y = w - (w - x) * c2; z = x + (w - x) * c2;
314 case 0: r = w; g = z; b = x;
break;
315 case 1: r = y; g = w; b = x;
break;
316 case 2: r = x; g = w; b = z;
break;
317 case 3: r = x; g = y; b = w;
break;
318 case 4: r = z; g = x; b = w;
break;
319 case 5: r = w; g = x; b = y;
break;
334 double r, g, b, h, l, s, a;
345 template<
typename TPIXEL,
typename TCHANNEL>