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
}