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