#pragma once
#include <algorithm>
#include <stdexcept>
#include <string>
#include <string_view>
#include <fmt/format.h>
#include <gcem.hpp>
#include <wpi/StringExtras.h>
#include <wpi/ct_string.h>
namespace frc {
class Color {
public:
static const Color kDenim;
static const Color kFirstBlue;
static const Color kFirstRed;
static const Color kAliceBlue;
static const Color kAntiqueWhite;
static const Color kAqua;
static const Color kAquamarine;
static const Color kAzure;
static const Color kBeige;
static const Color kBisque;
static const Color kBlack;
static const Color kBlanchedAlmond;
static const Color kBlue;
static const Color kBlueViolet;
static const Color kBrown;
static const Color kBurlywood;
static const Color kCadetBlue;
static const Color kChartreuse;
static const Color kChocolate;
static const Color kCoral;
static const Color kCornflowerBlue;
static const Color kCornsilk;
static const Color kCrimson;
static const Color kCyan;
static const Color kDarkBlue;
static const Color kDarkCyan;
static const Color kDarkGoldenrod;
static const Color kDarkGray;
static const Color kDarkGreen;
static const Color kDarkKhaki;
static const Color kDarkMagenta;
static const Color kDarkOliveGreen;
static const Color kDarkOrange;
static const Color kDarkOrchid;
static const Color kDarkRed;
static const Color kDarkSalmon;
static const Color kDarkSeaGreen;
static const Color kDarkSlateBlue;
static const Color kDarkSlateGray;
static const Color kDarkTurquoise;
static const Color kDarkViolet;
static const Color kDeepPink;
static const Color kDeepSkyBlue;
static const Color kDimGray;
static const Color kDodgerBlue;
static const Color kFirebrick;
static const Color kFloralWhite;
static const Color kForestGreen;
static const Color kFuchsia;
static const Color kGainsboro;
static const Color kGhostWhite;
static const Color kGold;
static const Color kGoldenrod;
static const Color kGray;
static const Color kGreen;
static const Color kGreenYellow;
static const Color kHoneydew;
static const Color kHotPink;
static const Color kIndianRed;
static const Color kIndigo;
static const Color kIvory;
static const Color kKhaki;
static const Color kLavender;
static const Color kLavenderBlush;
static const Color kLawnGreen;
static const Color kLemonChiffon;
static const Color kLightBlue;
static const Color kLightCoral;
static const Color kLightCyan;
static const Color kLightGoldenrodYellow;
static const Color kLightGray;
static const Color kLightGreen;
static const Color kLightPink;
static const Color kLightSalmon;
static const Color kLightSeaGreen;
static const Color kLightSkyBlue;
static const Color kLightSlateGray;
static const Color kLightSteelBlue;
static const Color kLightYellow;
static const Color kLime;
static const Color kLimeGreen;
static const Color kLinen;
static const Color kMagenta;
static const Color kMaroon;
static const Color kMediumAquamarine;
static const Color kMediumBlue;
static const Color kMediumOrchid;
static const Color kMediumPurple;
static const Color kMediumSeaGreen;
static const Color kMediumSlateBlue;
static const Color kMediumSpringGreen;
static const Color kMediumTurquoise;
static const Color kMediumVioletRed;
static const Color kMidnightBlue;
static const Color kMintcream;
static const Color kMistyRose;
static const Color kMoccasin;
static const Color kNavajoWhite;
static const Color kNavy;
static const Color kOldLace;
static const Color kOlive;
static const Color kOliveDrab;
static const Color kOrange;
static const Color kOrangeRed;
static const Color kOrchid;
static const Color kPaleGoldenrod;
static const Color kPaleGreen;
static const Color kPaleTurquoise;
static const Color kPaleVioletRed;
static const Color kPapayaWhip;
static const Color kPeachPuff;
static const Color kPeru;
static const Color kPink;
static const Color kPlum;
static const Color kPowderBlue;
static const Color kPurple;
static const Color kRed;
static const Color kRosyBrown;
static const Color kRoyalBlue;
static const Color kSaddleBrown;
static const Color kSalmon;
static const Color kSandyBrown;
static const Color kSeaGreen;
static const Color kSeashell;
static const Color kSienna;
static const Color kSilver;
static const Color kSkyBlue;
static const Color kSlateBlue;
static const Color kSlateGray;
static const Color kSnow;
static const Color kSpringGreen;
static const Color kSteelBlue;
static const Color kTan;
static const Color kTeal;
static const Color kThistle;
static const Color kTomato;
static const Color kTurquoise;
static const Color kViolet;
static const Color kWheat;
static const Color kWhite;
static const Color kWhiteSmoke;
static const Color kYellow;
static const Color kYellowGreen;
constexpr Color() = default;
constexpr Color(double r, double g, double b)
: red(roundAndClamp(r)),
green(roundAndClamp(g)),
blue(roundAndClamp(b)) {}
constexpr Color(int r, int g, int b)
: Color(r / 255.0, g / 255.0, b / 255.0) {}
explicit constexpr Color(std::string_view hexString) {
if (hexString.length() != 7 || !hexString.starts_with("#") ||
!wpi::isHexDigit(hexString[1]) || !wpi::isHexDigit(hexString[2]) ||
!wpi::isHexDigit(hexString[3]) || !wpi::isHexDigit(hexString[4]) ||
!wpi::isHexDigit(hexString[5]) || !wpi::isHexDigit(hexString[6])) {
throw std::invalid_argument(
fmt::format("Invalid hex string for Color \"{}\"", hexString));
}
int r = wpi::hexDigitValue(hexString[1]) * 16 +
wpi::hexDigitValue(hexString[2]);
int g = wpi::hexDigitValue(hexString[3]) * 16 +
wpi::hexDigitValue(hexString[4]);
int b = wpi::hexDigitValue(hexString[5]) * 16 +
wpi::hexDigitValue(hexString[6]);
red = r / 255.0;
green = g / 255.0;
blue = b / 255.0;
}
constexpr bool operator==(const Color&) const = default;
static constexpr Color FromHSV(int h, int s, int v) {
int chroma = (s * v) >> 8;
int region = (h / 30) % 6;
int remainder = static_cast<int>((h % 30) * (255 / 30.0));
int m = v - chroma;
int X = (chroma * remainder) >> 8;
switch (region) {
case 0:
return Color(v, X + m, m);
case 1:
return Color(v - X, v, m);
case 2:
return Color(m, v, X + m);
case 3:
return Color(m, v - X, v);
case 4:
return Color(X + m, m, v);
default:
return Color(v, m, v - X);
}
}
constexpr auto HexString() const {
const int r = 255.0 * red;
const int g = 255.0 * green;
const int b = 255.0 * blue;
return wpi::ct_string<char, std::char_traits<char>, 7>{
{'#', wpi::hexdigit(r / 16), wpi::hexdigit(r % 16),
wpi::hexdigit(g / 16), wpi::hexdigit(g % 16), wpi::hexdigit(b / 16),
wpi::hexdigit(b % 16)}};
}
double red = 0.0;
double green = 0.0;
double blue = 0.0;
private:
static constexpr double roundAndClamp(double value) {
return std::clamp(gcem::ceil(value * (1 << 12)) / (1 << 12), 0.0, 1.0);
}
};
inline constexpr Color Color::kDenim{0.0823529412, 0.376470589, 0.7411764706};
inline constexpr Color Color::kFirstBlue{0.0, 0.4, 0.7019607844};
inline constexpr Color Color::kFirstRed{0.9294117648, 0.1098039216,
0.1411764706};
inline constexpr Color Color::kAliceBlue{0.9411765f, 0.972549f, 1.0f};
inline constexpr Color Color::kAntiqueWhite{0.98039216f, 0.92156863f,
0.84313726f};
inline constexpr Color Color::kAqua{0.0f, 1.0f, 1.0f};
inline constexpr Color Color::kAquamarine{0.49803922f, 1.0f, 0.83137256f};
inline constexpr Color Color::kAzure{0.9411765f, 1.0f, 1.0f};
inline constexpr Color Color::kBeige{0.9607843f, 0.9607843f, 0.8627451f};
inline constexpr Color Color::kBisque{1.0f, 0.89411765f, 0.76862746f};
inline constexpr Color Color::kBlack{0.0f, 0.0f, 0.0f};
inline constexpr Color Color::kBlanchedAlmond{1.0f, 0.92156863f, 0.8039216f};
inline constexpr Color Color::kBlue{0.0f, 0.0f, 1.0f};
inline constexpr Color Color::kBlueViolet{0.5411765f, 0.16862746f, 0.8862745f};
inline constexpr Color Color::kBrown{0.64705884f, 0.16470589f, 0.16470589f};
inline constexpr Color Color::kBurlywood{0.87058824f, 0.72156864f, 0.5294118f};
inline constexpr Color Color::kCadetBlue{0.37254903f, 0.61960787f, 0.627451f};
inline constexpr Color Color::kChartreuse{0.49803922f, 1.0f, 0.0f};
inline constexpr Color Color::kChocolate{0.8235294f, 0.4117647f, 0.11764706f};
inline constexpr Color Color::kCoral{1.0f, 0.49803922f, 0.3137255f};
inline constexpr Color Color::kCornflowerBlue{0.39215687f, 0.58431375f,
0.92941177f};
inline constexpr Color Color::kCornsilk{1.0f, 0.972549f, 0.8627451f};
inline constexpr Color Color::kCrimson{0.8627451f, 0.078431375f, 0.23529412f};
inline constexpr Color Color::kCyan{0.0f, 1.0f, 1.0f};
inline constexpr Color Color::kDarkBlue{0.0f, 0.0f, 0.54509807f};
inline constexpr Color Color::kDarkCyan{0.0f, 0.54509807f, 0.54509807f};
inline constexpr Color Color::kDarkGoldenrod{0.72156864f, 0.5254902f,
0.043137256f};
inline constexpr Color Color::kDarkGray{0.6627451f, 0.6627451f, 0.6627451f};
inline constexpr Color Color::kDarkGreen{0.0f, 0.39215687f, 0.0f};
inline constexpr Color Color::kDarkKhaki{0.7411765f, 0.7176471f, 0.41960785f};
inline constexpr Color Color::kDarkMagenta{0.54509807f, 0.0f, 0.54509807f};
inline constexpr Color Color::kDarkOliveGreen{0.33333334f, 0.41960785f,
0.18431373f};
inline constexpr Color Color::kDarkOrange{1.0f, 0.54901963f, 0.0f};
inline constexpr Color Color::kDarkOrchid{0.6f, 0.19607843f, 0.8f};
inline constexpr Color Color::kDarkRed{0.54509807f, 0.0f, 0.0f};
inline constexpr Color Color::kDarkSalmon{0.9137255f, 0.5882353f, 0.47843137f};
inline constexpr Color Color::kDarkSeaGreen{0.56078434f, 0.7372549f,
0.56078434f};
inline constexpr Color Color::kDarkSlateBlue{0.28235295f, 0.23921569f,
0.54509807f};
inline constexpr Color Color::kDarkSlateGray{0.18431373f, 0.30980393f,
0.30980393f};
inline constexpr Color Color::kDarkTurquoise{0.0f, 0.80784315f, 0.81960785f};
inline constexpr Color Color::kDarkViolet{0.5803922f, 0.0f, 0.827451f};
inline constexpr Color Color::kDeepPink{1.0f, 0.078431375f, 0.5764706f};
inline constexpr Color Color::kDeepSkyBlue{0.0f, 0.7490196f, 1.0f};
inline constexpr Color Color::kDimGray{0.4117647f, 0.4117647f, 0.4117647f};
inline constexpr Color Color::kDodgerBlue{0.11764706f, 0.5647059f, 1.0f};
inline constexpr Color Color::kFirebrick{0.69803923f, 0.13333334f, 0.13333334f};
inline constexpr Color Color::kFloralWhite{1.0f, 0.98039216f, 0.9411765f};
inline constexpr Color Color::kForestGreen{0.13333334f, 0.54509807f,
0.13333334f};
inline constexpr Color Color::kFuchsia{1.0f, 0.0f, 1.0f};
inline constexpr Color Color::kGainsboro{0.8627451f, 0.8627451f, 0.8627451f};
inline constexpr Color Color::kGhostWhite{0.972549f, 0.972549f, 1.0f};
inline constexpr Color Color::kGold{1.0f, 0.84313726f, 0.0f};
inline constexpr Color Color::kGoldenrod{0.85490197f, 0.64705884f, 0.1254902f};
inline constexpr Color Color::kGray{0.5019608f, 0.5019608f, 0.5019608f};
inline constexpr Color Color::kGreen{0.0f, 0.5019608f, 0.0f};
inline constexpr Color Color::kGreenYellow{0.6784314f, 1.0f, 0.18431373f};
inline constexpr Color Color::kHoneydew{0.9411765f, 1.0f, 0.9411765f};
inline constexpr Color Color::kHotPink{1.0f, 0.4117647f, 0.7058824f};
inline constexpr Color Color::kIndianRed{0.8039216f, 0.36078432f, 0.36078432f};
inline constexpr Color Color::kIndigo{0.29411766f, 0.0f, 0.50980395f};
inline constexpr Color Color::kIvory{1.0f, 1.0f, 0.9411765f};
inline constexpr Color Color::kKhaki{0.9411765f, 0.9019608f, 0.54901963f};
inline constexpr Color Color::kLavender{0.9019608f, 0.9019608f, 0.98039216f};
inline constexpr Color Color::kLavenderBlush{1.0f, 0.9411765f, 0.9607843f};
inline constexpr Color Color::kLawnGreen{0.4862745f, 0.9882353f, 0.0f};
inline constexpr Color Color::kLemonChiffon{1.0f, 0.98039216f, 0.8039216f};
inline constexpr Color Color::kLightBlue{0.6784314f, 0.84705883f, 0.9019608f};
inline constexpr Color Color::kLightCoral{0.9411765f, 0.5019608f, 0.5019608f};
inline constexpr Color Color::kLightCyan{0.8784314f, 1.0f, 1.0f};
inline constexpr Color Color::kLightGoldenrodYellow{0.98039216f, 0.98039216f,
0.8235294f};
inline constexpr Color Color::kLightGray{0.827451f, 0.827451f, 0.827451f};
inline constexpr Color Color::kLightGreen{0.5647059f, 0.93333334f, 0.5647059f};
inline constexpr Color Color::kLightPink{1.0f, 0.7137255f, 0.75686276f};
inline constexpr Color Color::kLightSalmon{1.0f, 0.627451f, 0.47843137f};
inline constexpr Color Color::kLightSeaGreen{0.1254902f, 0.69803923f,
0.6666667f};
inline constexpr Color Color::kLightSkyBlue{0.5294118f, 0.80784315f,
0.98039216f};
inline constexpr Color Color::kLightSlateGray{0.46666667f, 0.53333336f, 0.6f};
inline constexpr Color Color::kLightSteelBlue{0.6901961f, 0.76862746f,
0.87058824f};
inline constexpr Color Color::kLightYellow{1.0f, 1.0f, 0.8784314f};
inline constexpr Color Color::kLime{0.0f, 1.0f, 0.0f};
inline constexpr Color Color::kLimeGreen{0.19607843f, 0.8039216f, 0.19607843f};
inline constexpr Color Color::kLinen{0.98039216f, 0.9411765f, 0.9019608f};
inline constexpr Color Color::kMagenta{1.0f, 0.0f, 1.0f};
inline constexpr Color Color::kMaroon{0.5019608f, 0.0f, 0.0f};
inline constexpr Color Color::kMediumAquamarine{0.4f, 0.8039216f, 0.6666667f};
inline constexpr Color Color::kMediumBlue{0.0f, 0.0f, 0.8039216f};
inline constexpr Color Color::kMediumOrchid{0.7294118f, 0.33333334f, 0.827451f};
inline constexpr Color Color::kMediumPurple{0.5764706f, 0.4392157f,
0.85882354f};
inline constexpr Color Color::kMediumSeaGreen{0.23529412f, 0.7019608f,
0.44313726f};
inline constexpr Color Color::kMediumSlateBlue{0.48235294f, 0.40784314f,
0.93333334f};
inline constexpr Color Color::kMediumSpringGreen{0.0f, 0.98039216f, 0.6039216f};
inline constexpr Color Color::kMediumTurquoise{0.28235295f, 0.81960785f, 0.8f};
inline constexpr Color Color::kMediumVioletRed{0.78039217f, 0.08235294f,
0.52156866f};
inline constexpr Color Color::kMidnightBlue{0.09803922f, 0.09803922f,
0.4392157f};
inline constexpr Color Color::kMintcream{0.9607843f, 1.0f, 0.98039216f};
inline constexpr Color Color::kMistyRose{1.0f, 0.89411765f, 0.88235295f};
inline constexpr Color Color::kMoccasin{1.0f, 0.89411765f, 0.70980394f};
inline constexpr Color Color::kNavajoWhite{1.0f, 0.87058824f, 0.6784314f};
inline constexpr Color Color::kNavy{0.0f, 0.0f, 0.5019608f};
inline constexpr Color Color::kOldLace{0.99215686f, 0.9607843f, 0.9019608f};
inline constexpr Color Color::kOlive{0.5019608f, 0.5019608f, 0.0f};
inline constexpr Color Color::kOliveDrab{0.41960785f, 0.5568628f, 0.13725491f};
inline constexpr Color Color::kOrange{1.0f, 0.64705884f, 0.0f};
inline constexpr Color Color::kOrangeRed{1.0f, 0.27058825f, 0.0f};
inline constexpr Color Color::kOrchid{0.85490197f, 0.4392157f, 0.8392157f};
inline constexpr Color Color::kPaleGoldenrod{0.93333334f, 0.9098039f,
0.6666667f};
inline constexpr Color Color::kPaleGreen{0.59607846f, 0.9843137f, 0.59607846f};
inline constexpr Color Color::kPaleTurquoise{0.6862745f, 0.93333334f,
0.93333334f};
inline constexpr Color Color::kPaleVioletRed{0.85882354f, 0.4392157f,
0.5764706f};
inline constexpr Color Color::kPapayaWhip{1.0f, 0.9372549f, 0.8352941f};
inline constexpr Color Color::kPeachPuff{1.0f, 0.85490197f, 0.7254902f};
inline constexpr Color Color::kPeru{0.8039216f, 0.52156866f, 0.24705882f};
inline constexpr Color Color::kPink{1.0f, 0.7529412f, 0.79607844f};
inline constexpr Color Color::kPlum{0.8666667f, 0.627451f, 0.8666667f};
inline constexpr Color Color::kPowderBlue{0.6901961f, 0.8784314f, 0.9019608f};
inline constexpr Color Color::kPurple{0.5019608f, 0.0f, 0.5019608f};
inline constexpr Color Color::kRed{1.0f, 0.0f, 0.0f};
inline constexpr Color Color::kRosyBrown{0.7372549f, 0.56078434f, 0.56078434f};
inline constexpr Color Color::kRoyalBlue{0.25490198f, 0.4117647f, 0.88235295f};
inline constexpr Color Color::kSaddleBrown{0.54509807f, 0.27058825f,
0.07450981f};
inline constexpr Color Color::kSalmon{0.98039216f, 0.5019608f, 0.44705883f};
inline constexpr Color Color::kSandyBrown{0.95686275f, 0.6431373f, 0.3764706f};
inline constexpr Color Color::kSeaGreen{0.18039216f, 0.54509807f, 0.34117648f};
inline constexpr Color Color::kSeashell{1.0f, 0.9607843f, 0.93333334f};
inline constexpr Color Color::kSienna{0.627451f, 0.32156864f, 0.1764706f};
inline constexpr Color Color::kSilver{0.7529412f, 0.7529412f, 0.7529412f};
inline constexpr Color Color::kSkyBlue{0.5294118f, 0.80784315f, 0.92156863f};
inline constexpr Color Color::kSlateBlue{0.41568628f, 0.3529412f, 0.8039216f};
inline constexpr Color Color::kSlateGray{0.4392157f, 0.5019608f, 0.5647059f};
inline constexpr Color Color::kSnow{1.0f, 0.98039216f, 0.98039216f};
inline constexpr Color Color::kSpringGreen{0.0f, 1.0f, 0.49803922f};
inline constexpr Color Color::kSteelBlue{0.27450982f, 0.50980395f, 0.7058824f};
inline constexpr Color Color::kTan{0.8235294f, 0.7058824f, 0.54901963f};
inline constexpr Color Color::kTeal{0.0f, 0.5019608f, 0.5019608f};
inline constexpr Color Color::kThistle{0.84705883f, 0.7490196f, 0.84705883f};
inline constexpr Color Color::kTomato{1.0f, 0.3882353f, 0.2784314f};
inline constexpr Color Color::kTurquoise{0.2509804f, 0.8784314f, 0.8156863f};
inline constexpr Color Color::kViolet{0.93333334f, 0.50980395f, 0.93333334f};
inline constexpr Color Color::kWheat{0.9607843f, 0.87058824f, 0.7019608f};
inline constexpr Color Color::kWhite{1.0f, 1.0f, 1.0f};
inline constexpr Color Color::kWhiteSmoke{0.9607843f, 0.9607843f, 0.9607843f};
inline constexpr Color Color::kYellow{1.0f, 1.0f, 0.0f};
inline constexpr Color Color::kYellowGreen{0.6039216f, 0.8039216f, 0.19607843f};
}