|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#include "tpixelutils.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
// /*!This method is used to produce current palette colors for cm24 Toonz
|
|
Shinya Kitaoka |
120a6e |
// images.*/
|
|
Shinya Kitaoka |
120a6e |
// static inline TPixelRGBM32 combine(const TPixelRGBM32 &a, const TPixelRGBM32
|
|
Shinya Kitaoka |
120a6e |
// &b) {
|
|
Toshihiro Shimizu |
890ddd |
// return (*(TUINT32*)&a + *(TUINT32*)&b);
|
|
Toshihiro Shimizu |
890ddd |
// }
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
namespace {
|
|
Shinya Kitaoka |
120a6e |
int byteCrop(int v) { return (unsigned int)v <= 255 ? v : v > 255 ? 255 : 0; }
|
|
Shinya Kitaoka |
120a6e |
int wordCrop(int v) {
|
|
Shinya Kitaoka |
120a6e |
return (unsigned int)v <= 65535 ? v : v > 65535 ? 65535 : 0;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
} // namespace
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//-----------------------------------------------------------------------------
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
void hsv2rgb(TPixel32 &dstRgb, int srcHsv[3], int maxHsv) {
|
|
Shinya Kitaoka |
120a6e |
int i;
|
|
Shinya Kitaoka |
120a6e |
double p, q, t, f;
|
|
Shinya Kitaoka |
120a6e |
double hue, sat, value;
|
|
Shinya Kitaoka |
120a6e |
assert(maxHsv);
|
|
Shinya Kitaoka |
120a6e |
hue = ((double)srcHsv[0] / maxHsv) * 360.;
|
|
Shinya Kitaoka |
120a6e |
sat = (double)srcHsv[1] / maxHsv;
|
|
Shinya Kitaoka |
120a6e |
value = (double)srcHsv[2] / maxHsv;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (hue > 360) hue -= 360;
|
|
Shinya Kitaoka |
120a6e |
if (hue < 0) hue += 360;
|
|
Shinya Kitaoka |
120a6e |
if (sat < 0) sat = 0;
|
|
Shinya Kitaoka |
120a6e |
if (sat > 1) sat = 1;
|
|
Shinya Kitaoka |
120a6e |
if (value < 0) value = 0;
|
|
Shinya Kitaoka |
120a6e |
if (value > 1) value = 1;
|
|
Shinya Kitaoka |
120a6e |
if (sat == 0) {
|
|
Shinya Kitaoka |
120a6e |
dstRgb.r = dstRgb.g = dstRgb.b = tcrop((int)(value * 255), 0, 255);
|
|
Shinya Kitaoka |
120a6e |
} else {
|
|
Shinya Kitaoka |
120a6e |
if (hue == 360) hue = 0;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
hue = hue / 60;
|
|
Shinya Kitaoka |
120a6e |
i = (int)hue;
|
|
Shinya Kitaoka |
120a6e |
f = hue - i;
|
|
Shinya Kitaoka |
120a6e |
p = value * (1 - sat);
|
|
Shinya Kitaoka |
120a6e |
q = value * (1 - (sat * f));
|
|
Shinya Kitaoka |
120a6e |
t = value * (1 - (sat * (1 - f)));
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (i == 0) {
|
|
Shinya Kitaoka |
120a6e |
dstRgb.r = tcrop((int)(value * 255), 0, 255);
|
|
Shinya Kitaoka |
120a6e |
dstRgb.g = tcrop((int)(t * 255), 0, 255);
|
|
Shinya Kitaoka |
120a6e |
dstRgb.b = tcrop((int)(p * 255), 0, 255);
|
|
Shinya Kitaoka |
120a6e |
} else if (i == 1) {
|
|
Shinya Kitaoka |
120a6e |
dstRgb.r = tcrop((int)(q * 255), 0, 255);
|
|
Shinya Kitaoka |
120a6e |
dstRgb.g = tcrop((int)(value * 255), 0, 255);
|
|
Shinya Kitaoka |
120a6e |
dstRgb.b = tcrop((int)(p * 255), 0, 255);
|
|
Shinya Kitaoka |
120a6e |
} else if (i == 2) {
|
|
Shinya Kitaoka |
120a6e |
dstRgb.r = tcrop((int)(p * 255), 0, 255);
|
|
Shinya Kitaoka |
120a6e |
dstRgb.g = tcrop((int)(value * 255), 0, 255);
|
|
Shinya Kitaoka |
120a6e |
dstRgb.b = tcrop((int)(t * 255), 0, 255);
|
|
Shinya Kitaoka |
120a6e |
} else if (i == 3) {
|
|
Shinya Kitaoka |
120a6e |
dstRgb.r = tcrop((int)(p * 255), 0, 255);
|
|
Shinya Kitaoka |
120a6e |
dstRgb.g = tcrop((int)(q * 255), 0, 255);
|
|
Shinya Kitaoka |
120a6e |
dstRgb.b = tcrop((int)(value * 255), 0, 255);
|
|
Shinya Kitaoka |
120a6e |
} else if (i == 4) {
|
|
Shinya Kitaoka |
120a6e |
dstRgb.r = tcrop((int)(t * 255), 0, 255);
|
|
Shinya Kitaoka |
120a6e |
dstRgb.g = tcrop((int)(p * 255), 0, 255);
|
|
Shinya Kitaoka |
120a6e |
dstRgb.b = tcrop((int)(value * 255), 0, 255);
|
|
Shinya Kitaoka |
120a6e |
} else if (i == 5) {
|
|
Shinya Kitaoka |
120a6e |
dstRgb.r = tcrop((int)(value * 255), 0, 255);
|
|
Shinya Kitaoka |
120a6e |
dstRgb.g = tcrop((int)(p * 255), 0, 255);
|
|
Shinya Kitaoka |
120a6e |
dstRgb.b = tcrop((int)(q * 255), 0, 255);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
dstRgb.m = 255; // matte
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
//-----------------------------------------------------------------------------
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
void HSV2RGB(double hue, double sat, double value, double *red, double *green,
|
|
Shinya Kitaoka |
120a6e |
double *blue) {
|
|
Shinya Kitaoka |
120a6e |
int i;
|
|
Shinya Kitaoka |
120a6e |
double p, q, t, f;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// if (hue > 360 || hue < 0)
|
|
Shinya Kitaoka |
120a6e |
// hue=0;
|
|
Shinya Kitaoka |
120a6e |
if (hue > 360) hue -= 360;
|
|
Shinya Kitaoka |
120a6e |
if (hue < 0) hue += 360;
|
|
Shinya Kitaoka |
120a6e |
if (sat < 0) sat = 0;
|
|
Shinya Kitaoka |
120a6e |
if (sat > 1) sat = 1;
|
|
Shinya Kitaoka |
120a6e |
if (value < 0) value = 0;
|
|
Shinya Kitaoka |
120a6e |
if (value > 1) value = 1;
|
|
Shinya Kitaoka |
120a6e |
if (sat == 0) {
|
|
Shinya Kitaoka |
120a6e |
*red = value;
|
|
Shinya Kitaoka |
120a6e |
*green = value;
|
|
Shinya Kitaoka |
120a6e |
*blue = value;
|
|
Shinya Kitaoka |
120a6e |
} else {
|
|
Shinya Kitaoka |
120a6e |
if (hue == 360) hue = 0;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
hue = hue / 60;
|
|
Shinya Kitaoka |
120a6e |
i = (int)hue;
|
|
Shinya Kitaoka |
120a6e |
f = hue - i;
|
|
Shinya Kitaoka |
120a6e |
p = value * (1 - sat);
|
|
Shinya Kitaoka |
120a6e |
q = value * (1 - (sat * f));
|
|
Shinya Kitaoka |
120a6e |
t = value * (1 - (sat * (1 - f)));
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
switch (i) {
|
|
Shinya Kitaoka |
120a6e |
case 0:
|
|
Shinya Kitaoka |
120a6e |
*red = value;
|
|
Shinya Kitaoka |
120a6e |
*green = t;
|
|
Shinya Kitaoka |
120a6e |
*blue = p;
|
|
Shinya Kitaoka |
120a6e |
break;
|
|
Shinya Kitaoka |
120a6e |
case 1:
|
|
Shinya Kitaoka |
120a6e |
*red = q;
|
|
Shinya Kitaoka |
120a6e |
*green = value;
|
|
Shinya Kitaoka |
120a6e |
*blue = p;
|
|
Shinya Kitaoka |
120a6e |
break;
|
|
Shinya Kitaoka |
120a6e |
case 2:
|
|
Shinya Kitaoka |
120a6e |
*red = p;
|
|
Shinya Kitaoka |
120a6e |
*green = value;
|
|
Shinya Kitaoka |
120a6e |
*blue = t;
|
|
Shinya Kitaoka |
120a6e |
break;
|
|
Shinya Kitaoka |
120a6e |
case 3:
|
|
Shinya Kitaoka |
120a6e |
*red = p;
|
|
Shinya Kitaoka |
120a6e |
*green = q;
|
|
Shinya Kitaoka |
120a6e |
*blue = value;
|
|
Shinya Kitaoka |
120a6e |
break;
|
|
Shinya Kitaoka |
120a6e |
case 4:
|
|
Shinya Kitaoka |
120a6e |
*red = t;
|
|
Shinya Kitaoka |
120a6e |
*green = p;
|
|
Shinya Kitaoka |
120a6e |
*blue = value;
|
|
Shinya Kitaoka |
120a6e |
break;
|
|
Shinya Kitaoka |
120a6e |
case 5:
|
|
Shinya Kitaoka |
120a6e |
*red = value;
|
|
Shinya Kitaoka |
120a6e |
*green = p;
|
|
Shinya Kitaoka |
120a6e |
*blue = q;
|
|
Shinya Kitaoka |
120a6e |
break;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
void RGB2HSV(double r, double g, double b, double *h, double *s, double *v) {
|
|
Shinya Kitaoka |
120a6e |
double max, min;
|
|
Shinya Kitaoka |
120a6e |
double delta;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
max = std::max({r, g, b});
|
|
Shinya Kitaoka |
120a6e |
min = std::min({r, g, b});
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
*v = max;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (max != 0)
|
|
Shinya Kitaoka |
120a6e |
*s = (max - min) / max;
|
|
Shinya Kitaoka |
120a6e |
else
|
|
Shinya Kitaoka |
120a6e |
*s = 0;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (*s == 0)
|
|
Shinya Kitaoka |
120a6e |
*h = 0;
|
|
Shinya Kitaoka |
120a6e |
else {
|
|
Shinya Kitaoka |
120a6e |
delta = max - min;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (r == max)
|
|
Shinya Kitaoka |
120a6e |
*h = (g - b) / delta;
|
|
Shinya Kitaoka |
120a6e |
else if (g == max)
|
|
Shinya Kitaoka |
120a6e |
*h = 2 + (b - r) / delta;
|
|
Shinya Kitaoka |
120a6e |
else if (b == max)
|
|
Shinya Kitaoka |
120a6e |
*h = 4 + (r - g) / delta;
|
|
Shinya Kitaoka |
120a6e |
*h = *h * 60;
|
|
Shinya Kitaoka |
120a6e |
if (*h < 0) *h += 360;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
void rgb2hsv(int dstHsv[3], const TPixel32 &srcRgb, int maxHsv) {
|
|
Shinya Kitaoka |
120a6e |
double max, min;
|
|
Shinya Kitaoka |
120a6e |
double delta;
|
|
Shinya Kitaoka |
120a6e |
double r, g, b;
|
|
Shinya Kitaoka |
120a6e |
double v, s, h;
|
|
Shinya Kitaoka |
120a6e |
r = srcRgb.r / 255.;
|
|
Shinya Kitaoka |
120a6e |
g = srcRgb.g / 255.;
|
|
Shinya Kitaoka |
120a6e |
b = srcRgb.b / 255.;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
max = std::max({r, g, b});
|
|
Shinya Kitaoka |
120a6e |
min = std::min({r, g, b});
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
v = max;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (max != 0)
|
|
Shinya Kitaoka |
120a6e |
s = (max - min) / max;
|
|
Shinya Kitaoka |
120a6e |
else
|
|
Shinya Kitaoka |
120a6e |
s = 0;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (s == 0)
|
|
Shinya Kitaoka |
120a6e |
h = 0;
|
|
Shinya Kitaoka |
120a6e |
else {
|
|
Shinya Kitaoka |
120a6e |
delta = max - min;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (r == max)
|
|
Shinya Kitaoka |
120a6e |
h = (g - b) / delta;
|
|
Shinya Kitaoka |
120a6e |
else if (g == max)
|
|
Shinya Kitaoka |
120a6e |
h = 2 + (b - r) / delta;
|
|
Shinya Kitaoka |
120a6e |
else if (b == max)
|
|
Shinya Kitaoka |
120a6e |
h = 4 + (r - g) / delta;
|
|
Shinya Kitaoka |
120a6e |
h = h * 60;
|
|
Shinya Kitaoka |
120a6e |
if (h < 0) h += 360;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
dstHsv[0] = tcrop((int)((h / 360.) * maxHsv), 0, maxHsv);
|
|
Shinya Kitaoka |
120a6e |
dstHsv[1] = tcrop((int)(s * maxHsv), 0, maxHsv);
|
|
Shinya Kitaoka |
120a6e |
dstHsv[2] = tcrop((int)(v * maxHsv), 0, maxHsv);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
/*!
|
|
Toshihiro Shimizu |
890ddd |
Conversion between RGB and HLS colorspace
|
|
Toshihiro Shimizu |
890ddd |
*/
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
namespace {
|
|
Shinya Kitaoka |
120a6e |
// helper function
|
|
Shinya Kitaoka |
120a6e |
inline double HLSValue(double n1, double n2, double h) {
|
|
Shinya Kitaoka |
120a6e |
if (h > 360)
|
|
Shinya Kitaoka |
120a6e |
h -= 360;
|
|
Shinya Kitaoka |
120a6e |
else if (h < 0)
|
|
Shinya Kitaoka |
120a6e |
h += 360;
|
|
Shinya Kitaoka |
120a6e |
if (h < 60)
|
|
Shinya Kitaoka |
120a6e |
return n1 + (n2 - n1) * h / 60;
|
|
Shinya Kitaoka |
120a6e |
else if (h < 180)
|
|
Shinya Kitaoka |
120a6e |
return n2;
|
|
Shinya Kitaoka |
120a6e |
else if (h < 240)
|
|
Shinya Kitaoka |
120a6e |
return n1 + (n2 - n1) * (240 - h) / 60;
|
|
Shinya Kitaoka |
120a6e |
else
|
|
Shinya Kitaoka |
120a6e |
return n1;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
void HLS2RGB(double h, double l, double s, double *r, double *g, double *b) {
|
|
Shinya Kitaoka |
120a6e |
if (s == 0) {
|
|
Shinya Kitaoka |
120a6e |
*r = *g = *b = l;
|
|
Shinya Kitaoka |
120a6e |
return;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
double m1, m2;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
if (l < 0.5)
|
|
Shinya Kitaoka |
120a6e |
m2 = l * (1 + s);
|
|
Shinya Kitaoka |
120a6e |
else
|
|
Shinya Kitaoka |
120a6e |
m2 = l + s + l * s;
|
|
Shinya Kitaoka |
120a6e |
m1 = 2 * l - m2;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
*r = HLSValue(m1, m2, h + 120);
|
|
Shinya Kitaoka |
120a6e |
*g = HLSValue(m1, m2, h);
|
|
Shinya Kitaoka |
120a6e |
*b = HLSValue(m1, m2, h - 120);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void rgb2hls(double r, double g, double b, double *h, double *l, double *s)
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Shinya Kitaoka |
120a6e |
double max, min;
|
|
Shinya Kitaoka |
120a6e |
double delta;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
max = std::max({r, g, b});
|
|
Shinya Kitaoka |
120a6e |
min = std::min({r, g, b});
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
*l = (max + min) / 2;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
if (max == min) {
|
|
Shinya Kitaoka |
120a6e |
*s = 0;
|
|
Shinya Kitaoka |
120a6e |
*h = 0;
|
|
Shinya Kitaoka |
120a6e |
} else {
|
|
Shinya Kitaoka |
120a6e |
if (*l <= 0.5)
|
|
Shinya Kitaoka |
120a6e |
*s = (max - min) / (max + min);
|
|
Shinya Kitaoka |
120a6e |
else
|
|
Shinya Kitaoka |
120a6e |
*s = (max - min) / (2 - max - min);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
delta = max - min;
|
|
Shinya Kitaoka |
120a6e |
if (r == max)
|
|
Shinya Kitaoka |
120a6e |
*h = (g - b) / delta;
|
|
Shinya Kitaoka |
120a6e |
else if (g == max)
|
|
Shinya Kitaoka |
120a6e |
*h = 2 + (b - r) / delta;
|
|
Shinya Kitaoka |
120a6e |
else if (b == max)
|
|
Shinya Kitaoka |
120a6e |
*h = 4 + (r - g) / delta;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
*h = *h * 60;
|
|
Shinya Kitaoka |
120a6e |
if (*h < 0) *h += 360;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TPixel32 toPixel32(const TPixel64 &src) {
|
|
Shinya Kitaoka |
120a6e |
return TPixelRGBM32(byteFromUshort(src.r), byteFromUshort(src.g),
|
|
Shinya Kitaoka |
120a6e |
byteFromUshort(src.b), byteFromUshort(src.m));
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TPixel32 toPixel32(const TPixelD &src) {
|
|
Shinya Kitaoka |
120a6e |
const double factor = 255.0;
|
|
Shinya Kitaoka |
120a6e |
return TPixel32(
|
|
Shinya Kitaoka |
120a6e |
byteCrop(tround(src.r * factor)), byteCrop(tround(src.g * factor)),
|
|
Shinya Kitaoka |
120a6e |
byteCrop(tround(src.b * factor)), byteCrop(tround(src.m * factor)));
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TPixel32 toPixel32(const TPixelGR8 &src) {
|
|
Shinya Kitaoka |
120a6e |
return TPixel32(src.value, src.value, src.value);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TPixel64 toPixel64(const TPixel32 &src) {
|
|
Shinya Kitaoka |
120a6e |
return TPixelRGBM64(ushortFromByte(src.r), ushortFromByte(src.g),
|
|
Shinya Kitaoka |
120a6e |
ushortFromByte(src.b), ushortFromByte(src.m));
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TPixel64 toPixel64(const TPixelD &src) {
|
|
Shinya Kitaoka |
120a6e |
const double factor = 65535.0;
|
|
Shinya Kitaoka |
120a6e |
return TPixel64(
|
|
Shinya Kitaoka |
120a6e |
wordCrop(tround(src.r * factor)), wordCrop(tround(src.g * factor)),
|
|
Shinya Kitaoka |
120a6e |
wordCrop(tround(src.b * factor)), wordCrop(tround(src.m * factor)));
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TPixel64 toPixel64(const TPixelGR8 &src) {
|
|
Shinya Kitaoka |
120a6e |
int v = ushortFromByte(src.value);
|
|
Shinya Kitaoka |
120a6e |
return TPixel64(v, v, v);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TPixelD toPixelD(const TPixel32 &src) {
|
|
Shinya Kitaoka |
120a6e |
const double factor = 1.0 / 255.0;
|
|
Shinya Kitaoka |
120a6e |
return TPixelD(factor * src.r, factor * src.g, factor * src.b,
|
|
Shinya Kitaoka |
120a6e |
factor * src.m);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TPixelD toPixelD(const TPixel64 &src) {
|
|
Shinya Kitaoka |
120a6e |
const double factor = 1.0 / 65535.0;
|
|
Shinya Kitaoka |
120a6e |
return TPixelD(factor * src.r, factor * src.g, factor * src.b,
|
|
Shinya Kitaoka |
120a6e |
factor * src.m);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TPixelD toPixelD(const TPixelGR8 &src) {
|
|
Shinya Kitaoka |
120a6e |
const double v = (double)src.value / 255.0;
|
|
Shinya Kitaoka |
120a6e |
return TPixelD(v, v, v);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#ifdef CICCIO
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
/*!toonz color-map, 16 bits 7+5+4 bits (paint, ink, tone)*/
|
|
Shinya Kitaoka |
120a6e |
class DVAPI TPixelCM16 { // 754
|
|
Shinya Kitaoka |
120a6e |
static const int maxChannelValue;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
USHORT value;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TPixelCM16(int v = 0) : value(v){};
|
|
Shinya Kitaoka |
120a6e |
TPixelCM16(int ink, int paint, int tone)
|
|
Shinya Kitaoka |
120a6e |
: value(tone | ink << 9 | paint << 4){};
|
|
Shinya Kitaoka |
120a6e |
TPixelCM16(const TPixelCM16 &pix) : value(pix.value){};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
inline bool operator==(const TPixelCM16 &p) const {
|
|
Shinya Kitaoka |
120a6e |
return value == p.value;
|
|
Shinya Kitaoka |
120a6e |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
int getInkId() { return value >> 9; };
|
|
Shinya Kitaoka |
120a6e |
int getPaintId() { return (value >> 4) & 0x1F; };
|
|
Shinya Kitaoka |
120a6e |
int getToneId() { return value & 0xF; };
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
static TPixelCM16 pureInk(int ink) { return TPixelCM16(ink, 0, 0); };
|
|
Shinya Kitaoka |
120a6e |
static TPixelCM16 purePaint(int paint) { return TPixelCM16(0, paint, 255); };
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
/*!cmapped, 16 bits, standard SGI 256-color colormap */
|
|
Shinya Kitaoka |
120a6e |
class DVAPI TPixelCM16S8 {
|
|
Shinya Kitaoka |
120a6e |
static const int maxChannelValue;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
USHORT value;
|
|
Shinya Kitaoka |
120a6e |
TPixelCM16S8(int v = 0) : value(v){};
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
/*cmapped, 16 bits, standard SGI+Toonz 4096-color colormap */
|
|
Shinya Kitaoka |
120a6e |
class DVAPI TPixelCM16S12 {
|
|
Shinya Kitaoka |
120a6e |
static const int maxChannelValue;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
USHORT value;
|
|
Shinya Kitaoka |
120a6e |
TPixelCM16S12(int v = 0) : value(v){};
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
/*!Toonz color-map, 8+8+8 bits (col, pen, tone) + 8 msb bits extra*/
|
|
Shinya Kitaoka |
120a6e |
class DVAPI TPixelCM24 {
|
|
Shinya Kitaoka |
120a6e |
static const int maxChannelValue;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
/* serve m_value come membro? vincenzo */
|
|
Shinya Kitaoka |
120a6e |
TUINT32 m_value;
|
|
Shinya Kitaoka |
120a6e |
UCHAR m_ink, m_paint, m_tone;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
TPixelCM24(int v = 0)
|
|
Shinya Kitaoka |
120a6e |
: m_ink((v >> 8) & 0xff), m_paint((v >> 16) & 0xff), m_tone(v & 0xff){};
|
|
Shinya Kitaoka |
120a6e |
TPixelCM24(int ink, int paint, int tone)
|
|
Shinya Kitaoka |
120a6e |
: m_value(0), m_ink(ink), m_paint(paint), m_tone(tone){};
|
|
Shinya Kitaoka |
120a6e |
TPixelCM24(const TPixelCM24 &pix)
|
|
Shinya Kitaoka |
120a6e |
: m_value(pix.m_value)
|
|
Shinya Kitaoka |
120a6e |
, m_ink(pix.m_ink)
|
|
Shinya Kitaoka |
120a6e |
, m_paint(pix.m_paint)
|
|
Shinya Kitaoka |
120a6e |
, m_tone(pix.m_tone){};
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
inline bool operator==(const TPixelCM24 &p) const {
|
|
Shinya Kitaoka |
120a6e |
return m_paint == p.m_paint && m_ink == p.m_ink && m_tone == p.m_tone;
|
|
Shinya Kitaoka |
120a6e |
};
|
|
Shinya Kitaoka |
120a6e |
// rivedere
|
|
Shinya Kitaoka |
120a6e |
int getPaintIdx() { return m_paint << 16 | m_tone; };
|
|
Shinya Kitaoka |
120a6e |
int getInkIdx() { return m_ink << 16 | m_tone; };
|
|
Shinya Kitaoka |
120a6e |
// int getTone () {return m_tone;}; m_tone e' pubblico!
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// static inline TPixelRGBM from(const TPixelCM24 &pix);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
static TPixelCM24 pureInk(int ink) { return TPixelCM24(ink, 0, 0); };
|
|
Shinya Kitaoka |
120a6e |
static TPixelCM24 purePaint(int paint) { return TPixelCM24(0, paint, 255); };
|
|
Shinya Kitaoka |
120a6e |
};
|
|
Shinya Kitaoka |
120a6e |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
//! Toonz5.0 color-map, 12+12+8 bits (ink,paint,tone)
|
|
Shinya Kitaoka |
120a6e |
class DVAPI TPixelCM32 {
|
|
Shinya Kitaoka |
120a6e |
public:
|
|
Shinya Kitaoka |
120a6e |
TUINT32 m_value;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TPixelCM32(TUINT32 v = 0) : m_value{};
|
|
Shinya Kitaoka |
120a6e |
TPixelCM32(int ink, int paint, int tone)
|
|
Shinya Kitaoka |
120a6e |
: m_value(ink << 20 | paint << 8 | tone) {
|
|
Shinya Kitaoka |
120a6e |
assert(0 <= ink && ink < 4096);
|
|
Shinya Kitaoka |
120a6e |
assert(0 <= paint && paint < 4096);
|
|
Shinya Kitaoka |
120a6e |
assert(0 <= tone && tone < 256);
|
|
Shinya Kitaoka |
120a6e |
};
|
|
Shinya Kitaoka |
120a6e |
TPixelCM32(const TPixelCM32 &pix) : m_value(pix.m_value){};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
inline bool operator==(const TPixelCM32 &p) const {
|
|
Shinya Kitaoka |
120a6e |
return m_value == p.m_value;
|
|
Shinya Kitaoka |
120a6e |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
inline bool operator<(const TPixelCM32 &p) const {
|
|
Shinya Kitaoka |
120a6e |
return m_value < p.m_value;
|
|
Shinya Kitaoka |
120a6e |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
int getPaint() const { return m_paint >> 16 | m_tone; };
|
|
Shinya Kitaoka |
120a6e |
int getInk() const { return m_ink << 16 | m_tone; };
|
|
Shinya Kitaoka |
120a6e |
int getTone() const { return m_tone; };
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
// static inline TPixelRGBM from(const TPixelCM24 &pix);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
static TPixelCM24 pureInk(int ink) { return TPixelCM24(ink, 0, 0); };
|
|
Shinya Kitaoka |
120a6e |
static TPixelCM24 purePaint(int paint) { return TPixelCM24(0, paint, 255); };
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
/*!RGB 5+6+5 bits, red most significant */
|
|
Shinya Kitaoka |
120a6e |
class DVAPI TPixelRGB565 {
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
TUINT32 r : 5;
|
|
Shinya Kitaoka |
120a6e |
TUINT32 g : 6;
|
|
Shinya Kitaoka |
120a6e |
TUINT32 b : 5;
|
|
Shinya Kitaoka |
120a6e |
TPixelRGB565(int rr, int gg, int bb) : r(rr), g(gg), b(bb) {
|
|
Shinya Kitaoka |
120a6e |
assert(0 <= rr && rr < (1 << 5));
|
|
Shinya Kitaoka |
120a6e |
assert(0 <= gg && gg < (1 << 6));
|
|
Shinya Kitaoka |
120a6e |
assert(0 <= bb && bb < (1 << 5));
|
|
Shinya Kitaoka |
120a6e |
};
|
|
Shinya Kitaoka |
120a6e |
inline bool operator==(const TPixelRGB565 &p) const {
|
|
Shinya Kitaoka |
120a6e |
return r == p.r && g == p.g && b == p.b;
|
|
Shinya Kitaoka |
120a6e |
};
|
|
Shinya Kitaoka |
120a6e |
inline bool operator<(const TPixelRGB565 &p) const {
|
|
Shinya Kitaoka |
120a6e |
return r < p.r || r == p.r && (g < p.g || g == p.g && (b < p.b));
|
|
Shinya Kitaoka |
120a6e |
};
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//! Converts TPixelCM8 into TPixelRGB565
|
|
Shinya Kitaoka |
120a6e |
static inline TPixelRGB565 from(const TPixelCM8 &pix);
|
|
Shinya Kitaoka |
120a6e |
//! Returns itself
|
|
Shinya Kitaoka |
120a6e |
static inline TPixelRGB565 from(const TPixelRGB565 &pix) { return pix; };
|
|
Shinya Kitaoka |
120a6e |
//! Converts TPixelRGBM32 into TPixelRGB565
|
|
Shinya Kitaoka |
120a6e |
static inline TPixelRGB565 from(const TPixelRGBM32 &pix);
|
|
Shinya Kitaoka |
120a6e |
//! Converts TPixelRGBM64 into TPixelRGB565
|
|
Shinya Kitaoka |
120a6e |
static inline TPixelRGB565 from(const TPixelRGBM64 &pix);
|
|
Shinya Kitaoka |
120a6e |
//! Converts TPixelGR8 into TPixelRGB565
|
|
Shinya Kitaoka |
120a6e |
static inline TPixelRGB565 from(const TPixelGR8 &pix);
|
|
Shinya Kitaoka |
120a6e |
//! Converts TPixelGR16 into TPixelRGB565
|
|
Shinya Kitaoka |
120a6e |
static inline TPixelRGB565 from(const TPixelGR16 &pix);
|
|
Shinya Kitaoka |
120a6e |
/*
|
|
Shinya Kitaoka |
120a6e |
static const TPixelRGB565 Red;
|
|
Shinya Kitaoka |
120a6e |
static const TPixelRGB565 Green;
|
|
Shinya Kitaoka |
120a6e |
static const TPixelRGB565 Blue;
|
|
Shinya Kitaoka |
120a6e |
static const TPixelRGB565 White;
|
|
Shinya Kitaoka |
120a6e |
static const TPixelRGB565 Black;
|
|
Toshihiro Shimizu |
890ddd |
*/
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TPixelRGBM32 DVAPI TPixelRGBM32::from(const TPixelCM8 &pix) {
|
|
Shinya Kitaoka |
120a6e |
return TPixelRGBM32(pix.value, pix.value, pix.value);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TPixelRGBM64 DVAPI TPixelRGBM64::from(const TPixelRGBM32 &pix) {
|
|
Shinya Kitaoka |
120a6e |
return TPixelRGBM64(ushortFromByte(pix.r), ushortFromByte(pix.g),
|
|
Shinya Kitaoka |
120a6e |
ushortFromByte(pix.b), ushortFromByte(pix.m));
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TPixelRGBM32 DVAPI TPixelRGBM32::from(const TPixelRGBM64 &pix) {
|
|
Shinya Kitaoka |
120a6e |
return TPixelRGBM32(byteFromUshort(pix.r), byteFromUshort(pix.g),
|
|
Shinya Kitaoka |
120a6e |
byteFromUshort(pix.b), byteFromUshort(pix.m));
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TPixelRGBM32 DVAPI TPixelRGBM32::from(const TPixelGR8 &pix) {
|
|
Shinya Kitaoka |
120a6e |
return TPixelRGBM32(pix.value, pix.value, pix.value, maxChannelValue);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TPixelRGBM32 DVAPI TPixelRGBM32::from(const TPixelGR16 &pix) {
|
|
Shinya Kitaoka |
120a6e |
UCHAR value = byteFromUshort(pix.value);
|
|
Shinya Kitaoka |
120a6e |
return TPixelRGBM32(value, value, value, maxChannelValue);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TPixelD DVAPI TPixelD::from(const TPixelCM8 &pix) {
|
|
Shinya Kitaoka |
120a6e |
double v = (double)pix.value * (1.0 / 255.0);
|
|
Shinya Kitaoka |
120a6e |
return TPixelD(v, v, v, v);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TPixelD DVAPI TPixelD::from(const TPixelGR8 &pix) {
|
|
Shinya Kitaoka |
120a6e |
double v = (double)pix.value * (1.0 / 255.0);
|
|
Shinya Kitaoka |
120a6e |
return TPixelD(v, v, v, v);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TPixelD DVAPI TPixelD::from(const TPixelRGBM32 &pix) {
|
|
Shinya Kitaoka |
120a6e |
const double k = 1.0 / 255.0;
|
|
Shinya Kitaoka |
120a6e |
return TPixelD(k * pix.r, k * pix.g, k * pix.b, k * pix.m);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TPixelD DVAPI TPixelD::from(const TPixelRGBM64 &pix) {
|
|
Shinya Kitaoka |
120a6e |
const double k = 1.0 / 65535.0;
|
|
Shinya Kitaoka |
120a6e |
return TPixelD(k * pix.r, k * pix.g, k * pix.b, k * pix.m);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TPixelD DVAPI TPixelD::from(const TPixelGR16 &pix) {
|
|
Shinya Kitaoka |
120a6e |
double v = (double)pix.value * (1.0 / 65535.0);
|
|
Shinya Kitaoka |
120a6e |
return TPixelD(v, v, v, v);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TPixel32 DVAPI TPixel32::from(const TPixelD &pix) {
|
|
Shinya Kitaoka |
120a6e |
const int max = 255;
|
|
Shinya Kitaoka |
120a6e |
return TPixel32(tcrop((int)(pix.r * max + .5), 0, max),
|
|
Shinya Kitaoka |
120a6e |
tcrop((int)(pix.g * max + .5), 0, max),
|
|
Shinya Kitaoka |
120a6e |
tcrop((int)(pix.b * max + .5), 0, max),
|
|
Shinya Kitaoka |
120a6e |
tcrop((int)(pix.m * max + .5), 0, max));
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TPixel64 DVAPI TPixel64::from(const TPixelD &pix) {
|
|
Shinya Kitaoka |
120a6e |
const int max = 65535;
|
|
Shinya Kitaoka |
120a6e |
return TPixel64(tcrop((int)(pix.r * max + .5), 0, max),
|
|
Shinya Kitaoka |
120a6e |
tcrop((int)(pix.g * max + .5), 0, max),
|
|
Shinya Kitaoka |
120a6e |
tcrop((int)(pix.b * max + .5), 0, max),
|
|
Shinya Kitaoka |
120a6e |
tcrop((int)(pix.m * max + .5), 0, max));
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
// TPixelGR8 TPixelGR8::from(const TPixelD &pix)
|
|
Toshihiro Shimizu |
890ddd |
//{
|
|
Toshihiro Shimizu |
890ddd |
// return from(TPixel32::from(pix));
|
|
Toshihiro Shimizu |
890ddd |
//}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TPixelGR8 DVAPI TPixelGR8::from(const TPixel32 &pix) {
|
|
Shinya Kitaoka |
120a6e |
return TPixelGR8((((UINT)(pix.r) * 19594 + (UINT)(pix.g) * 38472 +
|
|
Shinya Kitaoka |
120a6e |
(UINT)(pix.b) * 7470 + (UINT)(1 << 15)) >>
|
|
Shinya Kitaoka |
120a6e |
16));
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TPixelGR16 DVAPI TPixelGR16::from(const TPixel64 &pix) {
|
|
Shinya Kitaoka |
120a6e |
return TPixelGR16((((UINT)(pix.r) * 19594 + (UINT)(pix.g) * 38472 +
|
|
Shinya Kitaoka |
120a6e |
(UINT)(pix.b) * 7470 + (UINT)(1 << 15)) >>
|
|
Shinya Kitaoka |
120a6e |
16));
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
// class ostream;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
DVAPI ostream &operator<<(ostream &out, const TPixel32 &pixel);
|
|
Toshihiro Shimizu |
890ddd |
DVAPI ostream &operator<<(ostream &out, const TPixel64 &pixel);
|
|
Toshihiro Shimizu |
890ddd |
DVAPI ostream &operator<<(ostream &out, const TPixelD &pixel);
|
|
Toshihiro Shimizu |
890ddd |
DVAPI ostream &operator<<(ostream &out, const TPixelCM8 &pixel);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
/*
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TPixel64 inline TPixel32::to64() const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Shinya Kitaoka |
120a6e |
return TPixel64(ushortFromByte(r), ushortFromByte(g),
|
|
Shinya Kitaoka |
120a6e |
ushortFromByte(b),ushortFromByte(m));
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TPixel32 inline TPixel64::to32() const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Shinya Kitaoka |
120a6e |
return TPixel32(byteFromUshort(r), byteFromUshort(g), byteFromUshort(b),
|
|
Shinya Kitaoka |
120a6e |
byteFromUshort(m));
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
*/
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
#endif
|