110 lines
2.0 KiB
C++
110 lines
2.0 KiB
C++
#include "color.h"
|
|
|
|
Color Color::fromHsv(const float &h, const float &s, const float &v)
|
|
{
|
|
float C = s * v;
|
|
float X = C * (1.0f - abs(fmod(h / 60.0f, 2.0f) - 1.0f));
|
|
float m = v - C;
|
|
float Rs, Gs, Bs;
|
|
|
|
if(h >= 0.0f && h < 60.0f) {
|
|
Rs = C;
|
|
Gs = X;
|
|
Bs = 0.0f;
|
|
}
|
|
else if(h >= 60.0f && h < 120.0f) {
|
|
Rs = X;
|
|
Gs = C;
|
|
Bs = 0.0f;
|
|
}
|
|
else if(h >= 120.0f && h < 180.0f) {
|
|
Rs = 0.0f;
|
|
Gs = C;
|
|
Bs = X;
|
|
}
|
|
else if(h >= 180.0f && h < 240.0f) {
|
|
Rs = 0.0f;
|
|
Gs = X;
|
|
Bs = C;
|
|
}
|
|
else if(h >= 240.0f && h < 300.0f) {
|
|
Rs = X;
|
|
Gs = 0.0f;
|
|
Bs = C;
|
|
}
|
|
else {
|
|
Rs = C;
|
|
Gs = 0.0f;
|
|
Bs = X;
|
|
}
|
|
|
|
return Color(Rs + m, Gs + m, Bs + m);
|
|
}
|
|
|
|
Color::Color(const char *data, const PixelFormat::Format &format)
|
|
{
|
|
OIIO::convert_type(PixelFormat::GetOIIOTypeDesc(format),
|
|
data,
|
|
PixelFormat::GetOIIOTypeDesc(PixelFormat::PIX_FMT_RGB32F),
|
|
data_,
|
|
PixelFormat::FormatHasAlphaChannel(format) ? kRGBAChannels : kRGBChannels);
|
|
|
|
if (!PixelFormat::FormatHasAlphaChannel(format)) {
|
|
set_alpha(1.0f);
|
|
}
|
|
}
|
|
|
|
void Color::toHsv(float *hue, float *sat, float *val) const
|
|
{
|
|
float fCMax = qMax(qMax(red(), green()), blue());
|
|
float fCMin = qMin(qMin(red(), green()), blue());
|
|
float fDelta = fCMax - fCMin;
|
|
|
|
if(fDelta > 0) {
|
|
if(fCMax == red()) {
|
|
*hue = 60 * (fmod(((green() - blue()) / fDelta), 6));
|
|
} else if(fCMax == green()) {
|
|
*hue = 60 * (((blue() - red()) / fDelta) + 2);
|
|
} else if(fCMax == blue()) {
|
|
*hue = 60 * (((red() - green()) / fDelta) + 4);
|
|
}
|
|
|
|
if(fCMax > 0) {
|
|
*sat = fDelta / fCMax;
|
|
} else {
|
|
*sat = 0;
|
|
}
|
|
|
|
*val = fCMax;
|
|
} else {
|
|
*hue = 0;
|
|
*sat = 0;
|
|
*val = fCMax;
|
|
}
|
|
|
|
if(*hue < 0) {
|
|
*hue = 360 + *hue;
|
|
}
|
|
}
|
|
|
|
float Color::hue() const
|
|
{
|
|
float h, s, v;
|
|
toHsv(&h, &s, &v);
|
|
return h;
|
|
}
|
|
|
|
float Color::saturation() const
|
|
{
|
|
float h, s, v;
|
|
toHsv(&h, &s, &v);
|
|
return s;
|
|
}
|
|
|
|
float Color::value() const
|
|
{
|
|
float h, s, v;
|
|
toHsv(&h, &s, &v);
|
|
return v;
|
|
}
|