/*
* Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
*
* Licensed under the Apache License, Version 2.0 (the License);
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an AS IS BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System;
using System.Globalization;
namespace ElmSharp
{
///
/// The Color is a struct to record Check's state.
///
public struct Color
{
readonly int _a;
readonly int _r;
readonly int _g;
readonly int _b;
readonly Mode _mode;
enum Mode
{
Default,
Rgb
}
///
/// Gets a default Color instance.
///
///
/// In default Color instance,Mode type is Default,RGBA all set as -1.
///
public static Color Default
{
get { return new Color(-1, -1, -1, -1, Mode.Default); }
}
///
/// Gets whether the Color instance's mode is default or not.
/// Return type is bool.
///
public bool IsDefault
{
get { return _mode == Mode.Default; }
}
///
/// Gets A value of RGBA.
/// A means the Alpha in color.
///
public int A
{
get { return _a; }
}
///
/// Gets R value of RGBA.
/// R means the Red in color.
///
public int R
{
get { return _r; }
}
///
/// Gets G value of RGBA.
/// G means the Green in color.
///
public int G
{
get { return _g; }
}
///
/// Gets B value of RGBA.
/// B means the Blue in color.
///
public int B
{
get { return _b; }
}
///
/// Creates and initializes a new instance of the Color class.
/// With RGB parameters.
///
/// Red of RGB
/// Green of RGB
/// Blue of RGB
public Color(int r, int g, int b) : this(r, g, b, 255)
{
}
///
/// Creates and initializes a new instance of the Color class.
/// With RGBA parameters.
///
/// Red of RGBA
/// Green of RGBA<
/// Blue of RGBA<
/// Alpha of RGBA<
public Color(int r, int g, int b, int a) : this(r, g, b, a, Mode.Rgb)
{
}
Color(int r, int g, int b, int a, Mode mode)
{
_mode = mode;
if (mode == Mode.Rgb)
{
_r = Clamp(r, 0, 255);
_g = Clamp(g, 0, 255);
_b = Clamp(b, 0, 255);
_a = Clamp(a, 0, 255);
}
else // Default
{
_r = _g = _b = _a = -1;
}
}
public override int GetHashCode()
{
int hashcode = _r.GetHashCode();
hashcode = (hashcode * 397) ^ _g.GetHashCode();
hashcode = (hashcode * 397) ^ _b.GetHashCode();
hashcode = (hashcode * 397) ^ _a.GetHashCode();
return hashcode;
}
public override bool Equals(object obj)
{
if (obj is Color)
{
return EqualsInner(this, (Color)obj);
}
return base.Equals(obj);
}
///
/// Compare whether two Color instance is same or not.
///
/// A Color instance.
/// A Color instance.
/// The result whether two instance is same or not.
/// Return type is bool.If they are same, return true.
///
public static bool operator ==(Color a, Color b)
{
if (ReferenceEquals(a, b))
return true;
if ((object)a == null || (object)b == null)
return false;
return EqualsInner(a, b);
}
///
/// Compare whether two Color instance is different or not.
///
/// A Color instance.
/// A Color instance.
/// The result whether two instance is different or not.
/// Return type is bool.If they are different, return true.
///
public static bool operator !=(Color a, Color b)
{
return !(a == b);
}
static bool EqualsInner(Color color1, Color color2)
{
if (color1._mode == Mode.Default && color2._mode == Mode.Default)
return true;
return color1._r == color2._r && color1._g == color2._g && color1._b == color2._b && color1._a == color2._a;
}
public override string ToString()
{
return string.Format(CultureInfo.InvariantCulture, "[Color: R={0}, G={1}, B={2}, A={3}]", R, G, B, A);
}
///
/// Gets a Color instance with a hexadecimal string parameter.
///
/// Hexadecimal string.
/// New instance of Color struct.
public static Color FromHex(string hex)
{
hex = hex.Replace("#", "");
switch (hex.Length)
{
case 3: //#rgb => ffrrggbb
hex = string.Format("ff{0}{1}{2}{3}{4}{5}", hex[0], hex[0], hex[1], hex[1], hex[2], hex[2]);
break;
case 4: //#argb => aarrggbb
hex = string.Format("{0}{1}{2}{3}{4}{5}{6}{7}", hex[0], hex[0], hex[1], hex[1], hex[2], hex[2], hex[3], hex[3]);
break;
case 6: //#rrggbb => ffrrggbb
hex = string.Format("ff{0}", hex);
break;
}
return FromUint(Convert.ToUInt32(hex.Replace("#", ""), 16));
}
///
/// Gets a Color instance with a Unsigned integer parameter.
///
/// Unsigned integer indicates RGBA.
/// New instance of Color struct.
[CLSCompliant(false)]
public static Color FromUint(uint argb)
{
return FromRgba((byte)((argb & 0x00ff0000) >> 0x10), (byte)((argb & 0x0000ff00) >> 0x8), (byte)(argb & 0x000000ff), (byte)((argb & 0xff000000) >> 0x18));
}
///
/// Gets a Color instance with R,G,B,A parameters.
///
/// Red in RGBA.
/// Green in RGBA.
/// Blue in RGBA.
/// Alpha in RGBA.
/// New instance of Color struct.
public static Color FromRgba(int r, int g, int b, int a)
{
return new Color(r, g, b, a);
}
///
/// Gets a Color instance with R,G,B,A parameters.
///
/// Red in RGB.
/// Green in RGB.
/// Blue in RGB.
/// New instance of Color struct.
public static Color FromRgb(int r, int g, int b)
{
return FromRgba(r, g, b, 255);
}
internal static int Clamp(int self, int min, int max)
{
return Math.Min(max, Math.Max(self, min));
}
#region Color Definitions
///
/// The Tansparent is a predefined Color, it's rgba value is (0, 0, 0, 0).
///
public static readonly Color Transparent = FromRgba(0, 0, 0, 0);
///
/// The Aqua is a predefined Color instance, it's rgb value is (0, 255, 255).
///
public static readonly Color Aqua = FromRgb(0, 255, 255);
///
/// The Black is a predefined Color instance, it's rgb value is (0, 0, 0).
///
public static readonly Color Black = FromRgb(0, 0, 0);
///
/// The Blue is a predefined Color instance, it's rgb value is (0, 0, 255).
///
public static readonly Color Blue = FromRgb(0, 0, 255);
///
/// The Fuchsia is a predefined Color instance, it's rgb value is (255, 0, 255).
///
public static readonly Color Fuchsia = FromRgb(255, 0, 255);
///
/// The Gray is a predefined Color instance, it's rgb value is (128, 128, 128).
///
public static readonly Color Gray = FromRgb(128, 128, 128);
///
/// The Green is a predefined Color instance, it's rgb value is (0, 128, 0).
///
public static readonly Color Green = FromRgb(0, 128, 0);
///
/// The Lime is a predefined Color instance, it's rgb value is (0, 255, 0).
///
public static readonly Color Lime = FromRgb(0, 255, 0);
///
/// The Maroon is a predefined Color instance, it's rgb value is (128, 0, 0).
///
public static readonly Color Maroon = FromRgb(128, 0, 0);
///
/// The Navy is a predefined Color instance, it's rgb value is (0, 0, 128).
///
public static readonly Color Navy = FromRgb(0, 0, 128);
///
/// The Olive is a predefined Color instance, it's rgb value is (128, 128, 0).
///
public static readonly Color Olive = FromRgb(128, 128, 0);
///
/// The Orange is a predefined Color instance, it's rgb value is (255, 165, 0).
///
public static readonly Color Orange = FromRgb(255, 165, 0);
///
/// The Purple is a predefined Color instance, it's rgb value is (128, 0, 128).
///
public static readonly Color Purple = FromRgb(128, 0, 128);
///
/// The Pink is a predefined Color instance, it's rgb value is (255, 102, 255).
///
public static readonly Color Pink = FromRgb(255, 102, 255);
///
/// The Red is a predefined Color instance, it's rgb value is (255, 0, 0).
///
public static readonly Color Red = FromRgb(255, 0, 0);
///
/// The Silver is a predefined Color instance, it's rgb value is (192, 192, 192).
///
public static readonly Color Silver = FromRgb(192, 192, 192);
///
/// The Teal is a predefined Color instance, it's rgb value is (0, 128, 128).
///
public static readonly Color Teal = FromRgb(0, 128, 128);
///
/// The White is a predefined Color instance, it's rgb value is (255, 255, 255).
///
public static readonly Color White = FromRgb(255, 255, 255);
///
/// The Yellow is a predefined Color instance, it's rgb value is (255, 255, 0).
///
public static readonly Color Yellow = FromRgb(255, 255, 0);
#endregion
}
}