Skip to content

File colors.cpp

File List > isom > colors.cpp

Go to the documentation of this file

#include "colors.hpp"

#include <opencv2/opencv.hpp>

#include "lib/assert/assert.hpp"

RGBColor RGBColor::FromCMYK(const CMYKColor& cmyk) {
  double c = cmyk.getCyan() / 100.0;
  double m = cmyk.getMagenta() / 100.0;
  double y = cmyk.getYellow() / 100.0;
  double k = cmyk.getBlack() / 100.0;
  double r = 255 * (1 - c) * (1 - k);
  double g = 255 * (1 - m) * (1 - k);
  double b = 255 * (1 - y) * (1 - k);
  return RGBColor(r, g, b);
}

RGBColor::RGBColor(unsigned char r, unsigned char g, unsigned char b, unsigned char a)
    : m_data{{r, g, b, a}} {
  for (auto i : m_data) {
    Assert(i >= 0 && i <= 255, "Invalid color value");
  }
}

CMYKColor::CMYKColor(unsigned char c, unsigned char m, unsigned char y, unsigned char k)
    : m_data{{c, m, y, k}} {
  for (auto i : m_data) {
    Assert(i >= 0 && i <= 100, "Invalid color value");
  }
}
CMYKColor CMYKColor::FromRGB(const RGBColor& rgb) {
  double c = 1 - rgb.getRed() / 255.0;
  double m = 1 - rgb.getGreen() / 255.0;
  double y = 1 - rgb.getBlue() / 255.0;
  double k = std::min({c, m, y});
  if (k >= 1.0) {
    return CMYKColor(0, 0, 0, 100);
  }
  c = (c - k) / (1 - k);
  m = (m - k) / (1 - k);
  y = (y - k) / (1 - k);
  return CMYKColor(
      std::clamp<int>(std::round(c * 100), 0, 100), std::clamp<int>(std::round(m * 100), 0, 100),
      std::clamp<int>(std::round(y * 100), 0, 100), std::clamp<int>(std::round(k * 100), 0, 100));
}
CMYKColor RGBColor::toCMYK() const { return CMYKColor::FromRGB(*this); }

std::map<std::string, ColorVariant> COLOR_MAP;

cv::Scalar RGBColor::toScalar() const {
  return cv::Scalar(getBlue(), getGreen(), getRed(), getAlpha());
}