|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#include "tcolorvalue.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//===================================================================
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TColorValue::getHsv(int &ih, int &is, int &iv) const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
double max, min;
|
|
Toshihiro Shimizu |
890ddd |
double delta;
|
|
Toshihiro Shimizu |
890ddd |
double r, g, b;
|
|
Toshihiro Shimizu |
890ddd |
double v, s, h;
|
|
Toshihiro Shimizu |
890ddd |
r = m_r;
|
|
Toshihiro Shimizu |
890ddd |
g = m_g;
|
|
Toshihiro Shimizu |
890ddd |
b = m_b;
|
|
Toshihiro Shimizu |
890ddd |
assert(0 <= r && r <= 1);
|
|
Toshihiro Shimizu |
890ddd |
assert(0 <= g && g <= 1);
|
|
Toshihiro Shimizu |
890ddd |
assert(0 <= b && b <= 1);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
max = tmax(r, g, b);
|
|
Toshihiro Shimizu |
890ddd |
min = tmin(r, g, b);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
v = max;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
if (max != 0)
|
|
Toshihiro Shimizu |
890ddd |
s = (max - min) / max;
|
|
Toshihiro Shimizu |
890ddd |
else
|
|
Toshihiro Shimizu |
890ddd |
s = 0;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
if (s == 0)
|
|
Toshihiro Shimizu |
890ddd |
h = 0;
|
|
Toshihiro Shimizu |
890ddd |
else {
|
|
Toshihiro Shimizu |
890ddd |
delta = max - min;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
if (r == max)
|
|
Toshihiro Shimizu |
890ddd |
h = (g - b) / delta;
|
|
Toshihiro Shimizu |
890ddd |
else if (g == max)
|
|
Toshihiro Shimizu |
890ddd |
h = 2 + (b - r) / delta;
|
|
Toshihiro Shimizu |
890ddd |
else if (b == max)
|
|
Toshihiro Shimizu |
890ddd |
h = 4 + (r - g) / delta;
|
|
Toshihiro Shimizu |
890ddd |
h = h * 60;
|
|
Toshihiro Shimizu |
890ddd |
if (h < 0)
|
|
Toshihiro Shimizu |
890ddd |
h += 360;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
assert(0 <= h && h <= 360);
|
|
Toshihiro Shimizu |
890ddd |
assert(0 <= s && s <= 1);
|
|
Toshihiro Shimizu |
890ddd |
assert(0 <= v && v <= 1);
|
|
Toshihiro Shimizu |
890ddd |
ih = (int)h;
|
|
Toshihiro Shimizu |
890ddd |
is = (int)(s * 100);
|
|
Toshihiro Shimizu |
890ddd |
iv = (int)(v * 100);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//===================================================================
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TColorValue::getHls(double &h, double &l, double &s) const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
double max, min;
|
|
Toshihiro Shimizu |
890ddd |
double delta;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
max = tmax(m_r, m_g, m_b);
|
|
Toshihiro Shimizu |
890ddd |
min = tmin(m_r, m_g, m_b);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
l = (max + min) / 2;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
if (max == min) {
|
|
Toshihiro Shimizu |
890ddd |
s = 0;
|
|
Toshihiro Shimizu |
890ddd |
h = 0;
|
|
Toshihiro Shimizu |
890ddd |
} else {
|
|
Toshihiro Shimizu |
890ddd |
if (l <= 0.5)
|
|
Toshihiro Shimizu |
890ddd |
s = (max - min) / (max + min);
|
|
Toshihiro Shimizu |
890ddd |
else
|
|
Toshihiro Shimizu |
890ddd |
s = (max - min) / (2 - max - min);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
delta = max - min;
|
|
Toshihiro Shimizu |
890ddd |
if (m_r == max)
|
|
Toshihiro Shimizu |
890ddd |
h = (m_g - m_b) / delta;
|
|
Toshihiro Shimizu |
890ddd |
else if (m_g == max)
|
|
Toshihiro Shimizu |
890ddd |
h = 2 + (m_b - m_r) / delta;
|
|
Toshihiro Shimizu |
890ddd |
else if (m_b == max)
|
|
Toshihiro Shimizu |
890ddd |
h = 4 + (m_r - m_g) / delta;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
h = h * 60;
|
|
Toshihiro Shimizu |
890ddd |
if (h < 0)
|
|
Toshihiro Shimizu |
890ddd |
h += 360;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//===================================================================
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TColorValue::setHsv(int h, int s, int v)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
int i;
|
|
Toshihiro Shimizu |
890ddd |
double p, q, t, f;
|
|
Toshihiro Shimizu |
890ddd |
double hue, sat, value;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
hue = h;
|
|
Toshihiro Shimizu |
890ddd |
sat = 0.01 * s;
|
|
Toshihiro Shimizu |
890ddd |
value = 0.01 * v;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
assert(0 <= hue && hue <= 360);
|
|
Toshihiro Shimizu |
890ddd |
assert(0 <= sat && sat <= 1);
|
|
Toshihiro Shimizu |
890ddd |
assert(0 <= value && value <= 1);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
if (sat == 0) {
|
|
Toshihiro Shimizu |
890ddd |
m_r = m_g = m_b = value;
|
|
Toshihiro Shimizu |
890ddd |
} else {
|
|
Toshihiro Shimizu |
890ddd |
if (hue == 360)
|
|
Toshihiro Shimizu |
890ddd |
hue = 0;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
hue = hue / 60;
|
|
Toshihiro Shimizu |
890ddd |
i = (int)hue;
|
|
Toshihiro Shimizu |
890ddd |
f = hue - i;
|
|
Toshihiro Shimizu |
890ddd |
p = tcrop(value * (1 - sat), 0., 1.);
|
|
Toshihiro Shimizu |
890ddd |
q = tcrop(value * (1 - (sat * f)), 0., 1.);
|
|
Toshihiro Shimizu |
890ddd |
t = tcrop(value * (1 - (sat * (1 - f))), 0., 1.);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
switch (i) {
|
|
Toshihiro Shimizu |
890ddd |
case 0:
|
|
Toshihiro Shimizu |
890ddd |
m_r = value;
|
|
Toshihiro Shimizu |
890ddd |
m_g = t;
|
|
Toshihiro Shimizu |
890ddd |
m_b = p;
|
|
Toshihiro Shimizu |
890ddd |
break;
|
|
Toshihiro Shimizu |
890ddd |
case 1:
|
|
Toshihiro Shimizu |
890ddd |
m_r = q;
|
|
Toshihiro Shimizu |
890ddd |
m_g = value;
|
|
Toshihiro Shimizu |
890ddd |
m_b = p;
|
|
Toshihiro Shimizu |
890ddd |
break;
|
|
Toshihiro Shimizu |
890ddd |
case 2:
|
|
Toshihiro Shimizu |
890ddd |
m_r = p;
|
|
Toshihiro Shimizu |
890ddd |
m_g = value;
|
|
Toshihiro Shimizu |
890ddd |
m_b = t;
|
|
Toshihiro Shimizu |
890ddd |
break;
|
|
Toshihiro Shimizu |
890ddd |
case 3:
|
|
Toshihiro Shimizu |
890ddd |
m_r = p;
|
|
Toshihiro Shimizu |
890ddd |
m_g = q;
|
|
Toshihiro Shimizu |
890ddd |
m_b = value;
|
|
Toshihiro Shimizu |
890ddd |
break;
|
|
Toshihiro Shimizu |
890ddd |
case 4:
|
|
Toshihiro Shimizu |
890ddd |
m_r = t;
|
|
Toshihiro Shimizu |
890ddd |
m_g = p;
|
|
Toshihiro Shimizu |
890ddd |
m_b = value;
|
|
Toshihiro Shimizu |
890ddd |
break;
|
|
Toshihiro Shimizu |
890ddd |
case 5:
|
|
Toshihiro Shimizu |
890ddd |
m_r = value;
|
|
Toshihiro Shimizu |
890ddd |
m_g = p;
|
|
Toshihiro Shimizu |
890ddd |
m_b = q;
|
|
Toshihiro Shimizu |
890ddd |
break;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//===================================================================
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TColorValue::getRgb(int &r, int &g, int &b) const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
r = (int)(m_r * 255 + 0.5);
|
|
Toshihiro Shimizu |
890ddd |
g = (int)(m_g * 255 + 0.5);
|
|
Toshihiro Shimizu |
890ddd |
b = (int)(m_b * 255 + 0.5);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//===================================================================
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TPixel32 TColorValue::getPixel() const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
int r, g, b;
|
|
Toshihiro Shimizu |
890ddd |
getRgb(r, g, b);
|
|
Toshihiro Shimizu |
890ddd |
return TPixel32(r, g, b, (int)(m_m * 255.0 + 0.5));
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//===================================================================
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TColorValue::setRgb(int r, int g, int b)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
m_r = r / 255.0;
|
|
Toshihiro Shimizu |
890ddd |
m_g = g / 255.0;
|
|
Toshihiro Shimizu |
890ddd |
m_b = b / 255.0;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//===================================================================
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TColorValue::setPixel(const TPixel32 &src)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
setRgb(src.r, src.g, src.b);
|
|
Toshihiro Shimizu |
890ddd |
m_m = src.m / 255.0;
|
|
Toshihiro Shimizu |
890ddd |
}
|