////////////////////////////////////////////////////////////////////////////// // // Color // ////////////////////////////////////////////////////////////////////////////// #ifndef _color_h_ #define _color_h_ class Color; class Color { private: float m_r, m_g, m_b, m_a; static const Color s_colorWhite; static const Color s_colorRed; static const Color s_colorGreen; static const Color s_colorBlue; static const Color s_colorYellow; static const Color s_colorMagenta; static const Color s_colorCyan; static const Color s_colorBlack; static const Color s_colorGray; public: Color() {} Color(float r, float g, float b, float a = 1) : m_r(r), m_g(g), m_b(b), m_a(a) { } Color(float gray, float a = 1) : m_r(gray), m_g(gray), m_b(gray), m_a(a) { } static const Color& White() { return s_colorWhite; } static const Color& Red() { return s_colorRed; } static const Color& Green() { return s_colorGreen; } static const Color& Blue() { return s_colorBlue; } static const Color& Yellow() { return s_colorYellow; } static const Color& Magenta() { return s_colorMagenta; } static const Color& Cyan() { return s_colorCyan; } static const Color& Black() { return s_colorBlack; } static const Color& Gray() { return s_colorGray; } void SetHSBA(float hue, float saturation, float brightness, float alpha = 1); void SetRGBA(float r, float g, float b, float a = 1) { m_r = r; m_g = g; m_b = b; m_a = a; } float GetRed() const { return m_r; } float GetGreen() const { return m_g; } float GetBlue() const { return m_b; } float GetAlpha() const { return m_a; } void GetHSB(float& h, float& s, float& b); float R() const { return m_r; } float G() const { return m_g; } float B() const { return m_b; } float A() const { return m_a; } void SetRed(float value) { m_r = value; } void SetGreen(float value) { m_g = value; } void SetBlue(float value) { m_b = value; } void SetAlpha(float value) { m_a = value; } COLORREF MakeCOLORREF() const { return RGB(min(m_r * 255, 255), min(m_g * 255, 255), min(m_b * 255, 255)); } Color AdjustAlpha(float scale) { return Color( scale * m_r, scale * m_g, scale * m_b, scale * m_a ); } friend Color operator*(const Color& color, float scale) { return Color( scale * color.m_r, scale * color.m_g, scale * color.m_b, color.m_a ); } friend Color operator*(float scale, const Color& color) { return color * scale; } friend Color operator+(const Color& color1, const Color& color2) { return Color( color1.GetRed() + color2.GetRed(), color1.GetGreen() + color2.GetGreen(), color1.GetBlue() + color2.GetBlue() ); } friend bool operator==(const Color& color1, const Color& color2) { return (color1.GetRed() == color2.GetRed()) && (color1.GetGreen() == color2.GetGreen()) && (color1.GetBlue() == color2.GetBlue()); } friend bool operator!=(const Color& color1, const Color& color2) { return (color1.GetRed() != color2.GetRed()) || (color1.GetGreen() != color2.GetGreen()) || (color1.GetBlue() != color2.GetBlue()); } }; class HSBColor : public Color { public: HSBColor(float hue, float saturation, float brightness, float alpha = 1) { SetHSBA(hue, saturation, brightness, alpha); } }; inline Color MakeColorFromCOLORREF(COLORREF color) { return Color( (float)((color >> 16) & 0xff) / 255.0f, (float)((color >> 8) & 0xff) / 255.0f, (float)((color >> 0) & 0xff) / 255.0f, (float)((color >> 24) & 0xff) / 255.0f ); } #endif