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
}