using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Media;
namespace WozLib.UI.Util
{
public class HlsConverter
{
public static Color ConvertFromHls(HlsValue value){
return ConvertFromHls(value.Hue, value.Lightness, value.Saturation);
}
///
/// Converts a hls value to a Color.
///
/// The hue, H, of the new color (from 0 to 1).
/// The lightness, L, of the new color (from 0 to 1).
/// The saturation, S, of the new color (from 0 to 1).
public static Color ConvertFromHls(Double h, Double l, Double s) {
Double p1;
Double p2;
Double r;
Double g;
Double b;
h *= 360;
if (l <= 0.5){
p2 = l * (1 + s);
}
else {
p2 = l + s - l * s;
}
p1 = 2 * l - p2;
if (s == 0) {
r = l;
g = l;
b = l;
}
else {
r = QqhToRgb(p1, p2, h + 120);
g = QqhToRgb(p1, p2, h);
b = QqhToRgb(p1, p2, h - 120);
}
r *= Byte.MaxValue;
g *= Byte.MaxValue;
b *= Byte.MaxValue;
return Color.FromRgb((byte)r, (byte)g, (byte)b);
}
private static double QqhToRgb(double q1, double q2, double hue){
if (hue > 360) {
hue = hue - 360;
}
else if (hue < 0) {
hue = hue + 360;
}
if (hue < 60) {
return q1 + (q2 - q1) * hue / 60.0;
}
else if (hue < 180) {
return q2;
}
else if (hue < 240) {
return q1 + (q2 - q1) * (240 - hue) / 60.0;
}
else {
return q1;
}
}
///
/// Converts a color to a HlsValue.
///
/// The color to convert.
public static HlsValue ConvertToHls(Color color){
Double max;
Double min;
Double diff;
Double r_dist;
Double g_dist;
Double b_dist;
Double R;
Double G;
Double B;
Double h;
Double l;
Double s;
double ByteMaxValue = Byte.MaxValue;
R = color.R / ByteMaxValue;
G = color.G / ByteMaxValue;
B = color.B / ByteMaxValue;
max = R;
if ( max < G ) max = G;
if ( max < B ) max = B;
min = R;
if ( min > G ) min = G;
if ( min > B ) min = B;
diff = max - min;
l = (max + min) / 2.0;
if (Math.Abs(diff) < 0.00001) {
s = 0;
h = 0;
}
else {
if (l <= 0.5) {
s = diff / (max + min);
}
else {
s = diff / (2 - max - min);
}
r_dist = (max - R) / diff;
g_dist = (max - G) / diff;
b_dist = (max - B) / diff;
if (R == max) {
h = b_dist - g_dist;
}
else if (G == max) {
h = 2 + r_dist - b_dist;
}
else {
h = 4 + g_dist - r_dist;
}
h = h * 60;
if (h < 0) h = h + 360;
}
h /= 360;
return new HlsValue(h, l, s);
}
}
public struct HlsValue
{
private double mHue;
private double mLightness;
private double mSaturation;
public HlsValue(double h, double l, double s)
{
mHue = h;
mLightness = l;
mSaturation = s;
}
public double Hue
{
get
{
return mHue;
}
set
{
mHue = value;
}
}
public double Lightness
{
get
{
return mLightness;
}
set
{
mLightness = value;
}
}
public double Saturation
{
get
{
return mSaturation;
}
set
{
mSaturation = value;
}
}
public static bool operator !=(HlsValue left, HlsValue right)
{
bool bool1;
bool1 = left.Lightness != right.Lightness || left.Saturation != right.Saturation;
if (!bool1)
{
return left.Hue != right.Hue && (left.Hue > 0 && right.Hue < 1) && (left.Hue < 1 && right.Hue > 0);
}
else
{
return bool1;
}
}
public static bool operator ==(HlsValue left, HlsValue right)
{
bool bool1;
bool1 = left.Lightness == right.Lightness && left.Saturation == right.Saturation;
if (bool1)
{
return Math.Round(left.Hue, 2) == Math.Round(right.Hue, 2) || (Math.Round(left.Hue, 2) == 1 &&
Math.Round(right.Hue, 2) == 0) || (Math.Round(left.Hue, 2) == 0 && Math.Round(right.Hue, 2) == 1);
}
else
{
return false;
}
}
public override string ToString()
{
return String.Format("H: {0:0.00} L: {1:0.00} S: {2:0.00}", Hue, Lightness, Saturation);
}
}
}