/**
 * This file has no copyright assigned and is placed in the Public Domain.
 * This file is part of the w64 mingw-runtime package.
 * No warranty is given; refer to the file DISCLAIMER within this package.
 */
#ifndef _GDIPLUSCOLOR_H
#define _GDIPLUSCOLOR_H

enum ColorMode {
  ColorModeARGB32 = 0,ColorModeARGB64 = 1
};

enum ColorChannelFlags {
  ColorChannelFlagsC = 0,ColorChannelFlagsM,ColorChannelFlagsY,ColorChannelFlagsK,ColorChannelFlagsLast
};

class Color {
public:
  Color() { Argb = (ARGB)Color::Black; }
  Color(BYTE r,BYTE g,BYTE b) { Argb = MakeARGB(255,r,g,b); }
  Color(BYTE a,BYTE r,BYTE g,BYTE b) { Argb = MakeARGB(a,r,g,b); }
  Color(ARGB argb) { Argb = argb; }
  BYTE GetAlpha() const { return (BYTE) (Argb >> AlphaShift); }
  BYTE GetA() const { return GetAlpha(); }
  BYTE GetRed() const { return (BYTE) (Argb >> RedShift); }
  BYTE GetR() const { return GetRed(); }
  BYTE GetGreen() const { return (BYTE) (Argb >> GreenShift); }
  BYTE GetG() const { return GetGreen(); }
  BYTE GetBlue() const { return (BYTE) (Argb >> BlueShift); }
  BYTE GetB() const { return GetBlue(); }
  ARGB GetValue() const { return Argb; }
  VOID SetValue(ARGB argb) { Argb = argb; }
  VOID SetFromCOLORREF(COLORREF rgb) { Argb = MakeARGB(255,GetRValue(rgb),GetGValue(rgb),GetBValue(rgb)); }
  COLORREF ToCOLORREF() const { return RGB(GetRed(),GetGreen(),GetBlue()); }
public:
  enum {
    AliceBlue = 0xFFF0F8FF,AntiqueWhite = 0xFFFAEBD7,Aqua = 0xFF00FFFF,Aquamarine = 0xFF7FFFD4,Azure = 0xFFF0FFFF,Beige = 0xFFF5F5DC,
    Bisque = 0xFFFFE4C4,Black = 0xFF000000,BlanchedAlmond = 0xFFFFEBCD,Blue = 0xFF0000FF,BlueViolet = 0xFF8A2BE2,Brown = 0xFFA52A2A,
    BurlyWood = 0xFFDEB887,CadetBlue = 0xFF5F9EA0,Chartreuse = 0xFF7FFF00,Chocolate = 0xFFD2691E,Coral = 0xFFFF7F50,CornflowerBlue = 0xFF6495ED,
    Cornsilk = 0xFFFFF8DC,Crimson = 0xFFDC143C,Cyan = 0xFF00FFFF,DarkBlue = 0xFF00008B,DarkCyan = 0xFF008B8B,DarkGoldenrod = 0xFFB8860B,
    DarkGray = 0xFFA9A9A9,DarkGreen = 0xFF006400,DarkKhaki = 0xFFBDB76B,DarkMagenta = 0xFF8B008B,DarkOliveGreen = 0xFF556B2F,
    DarkOrange = 0xFFFF8C00,DarkOrchid = 0xFF9932CC,DarkRed = 0xFF8B0000,DarkSalmon = 0xFFE9967A,DarkSeaGreen = 0xFF8FBC8B,
    DarkSlateBlue = 0xFF483D8B,DarkSlateGray = 0xFF2F4F4F,DarkTurquoise = 0xFF00CED1,DarkViolet = 0xFF9400D3,DeepPink = 0xFFFF1493,
    DeepSkyBlue = 0xFF00BFFF,DimGray = 0xFF696969,DodgerBlue = 0xFF1E90FF,Firebrick = 0xFFB22222,FloralWhite = 0xFFFFFAF0,
    ForestGreen = 0xFF228B22,Fuchsia = 0xFFFF00FF,Gainsboro = 0xFFDCDCDC,GhostWhite = 0xFFF8F8FF,Gold = 0xFFFFD700,Goldenrod = 0xFFDAA520,
    Gray = 0xFF808080,Green = 0xFF008000,GreenYellow = 0xFFADFF2F,Honeydew = 0xFFF0FFF0,HotPink = 0xFFFF69B4,IndianRed = 0xFFCD5C5C,
    Indigo = 0xFF4B0082,Ivory = 0xFFFFFFF0,Khaki = 0xFFF0E68C,Lavender = 0xFFE6E6FA,LavenderBlush = 0xFFFFF0F5,LawnGreen = 0xFF7CFC00,
    LemonChiffon = 0xFFFFFACD,LightBlue = 0xFFADD8E6,LightCoral = 0xFFF08080,LightCyan = 0xFFE0FFFF,LightGoldenrodYellow = 0xFFFAFAD2,
    LightGray = 0xFFD3D3D3,LightGreen = 0xFF90EE90,LightPink = 0xFFFFB6C1,LightSalmon = 0xFFFFA07A,LightSeaGreen = 0xFF20B2AA,
    LightSkyBlue = 0xFF87CEFA,LightSlateGray = 0xFF778899,LightSteelBlue = 0xFFB0C4DE,LightYellow = 0xFFFFFFE0,Lime = 0xFF00FF00,
    LimeGreen = 0xFF32CD32,Linen = 0xFFFAF0E6,Magenta = 0xFFFF00FF,Maroon = 0xFF800000,MediumAquamarine = 0xFF66CDAA,MediumBlue = 0xFF0000CD,
    MediumOrchid = 0xFFBA55D3,MediumPurple = 0xFF9370DB,MediumSeaGreen = 0xFF3CB371,MediumSlateBlue = 0xFF7B68EE,MediumSpringGreen = 0xFF00FA9A,
    MediumTurquoise = 0xFF48D1CC,MediumVioletRed = 0xFFC71585,MidnightBlue = 0xFF191970,MintCream = 0xFFF5FFFA,MistyRose = 0xFFFFE4E1,
    Moccasin = 0xFFFFE4B5,NavajoWhite = 0xFFFFDEAD,Navy = 0xFF000080,OldLace = 0xFFFDF5E6,Olive = 0xFF808000,OliveDrab = 0xFF6B8E23,
    Orange = 0xFFFFA500,OrangeRed = 0xFFFF4500,Orchid = 0xFFDA70D6,PaleGoldenrod = 0xFFEEE8AA,PaleGreen = 0xFF98FB98,PaleTurquoise = 0xFFAFEEEE,
    PaleVioletRed = 0xFFDB7093,PapayaWhip = 0xFFFFEFD5,PeachPuff = 0xFFFFDAB9,Peru = 0xFFCD853F,Pink = 0xFFFFC0CB,Plum = 0xFFDDA0DD,
    PowderBlue = 0xFFB0E0E6,Purple = 0xFF800080,Red = 0xFFFF0000,RosyBrown = 0xFFBC8F8F,RoyalBlue = 0xFF4169E1,SaddleBrown = 0xFF8B4513,
    Salmon = 0xFFFA8072,SandyBrown = 0xFFF4A460,SeaGreen = 0xFF2E8B57,SeaShell = 0xFFFFF5EE,Sienna = 0xFFA0522D,Silver = 0xFFC0C0C0,
    SkyBlue = 0xFF87CEEB,SlateBlue = 0xFF6A5ACD,SlateGray = 0xFF708090,Snow = 0xFFFFFAFA,SpringGreen = 0xFF00FF7F,SteelBlue = 0xFF4682B4,
    Tan = 0xFFD2B48C,Teal = 0xFF008080,Thistle = 0xFFD8BFD8,Tomato = 0xFFFF6347,Transparent = 0x00FFFFFF,Turquoise = 0xFF40E0D0,
    Violet = 0xFFEE82EE,Wheat = 0xFFF5DEB3,White = 0xFFFFFFFF,WhiteSmoke = 0xFFF5F5F5,Yellow = 0xFFFFFF00,YellowGreen = 0xFF9ACD32
  };
  enum {
    AlphaShift = 24,RedShift = 16,GreenShift = 8,BlueShift = 0
  };
  enum {
    AlphaMask = 0xff000000,RedMask = 0x00ff0000,GreenMask = 0x0000ff00,BlueMask = 0x000000ff
  };
  static ARGB MakeARGB(BYTE a,BYTE r,BYTE g,BYTE b) { return (((ARGB) (b) << BlueShift) | ((ARGB) (g) << GreenShift) | ((ARGB) (r) << RedShift) | ((ARGB) (a) << AlphaShift)); }
protected:
  ARGB Argb;
};
#endif
