using System;
using Colourful.Implementation.Conversion;
namespace Colourful.Conversion
{
public partial class ColourfulConverter
{
///
/// Convert to CIE L*a*b* (1976) color
///
public LabColor ToLab(in RGBColor color)
{
var xyzColor = ToXYZ(color);
var result = ToLab(xyzColor);
return result;
}
///
/// Convert to CIE L*a*b* (1976) color
///
public LabColor ToLab(in LinearRGBColor color)
{
var xyzColor = ToXYZ(color);
var result = ToLab(xyzColor);
return result;
}
///
/// Convert to CIE L*a*b* (1976) color
///
public LabColor ToLab(in XYZColor color)
{
// adaptation
var adapted = !WhitePoint.Equals(TargetLabWhitePoint) && IsChromaticAdaptationPerformed
? ChromaticAdaptation.Transform(color, WhitePoint, TargetLabWhitePoint)
: color;
// conversion
var converter = new XYZToLabConverter(TargetLabWhitePoint);
var result = converter.Convert(adapted);
return result;
}
///
/// Convert to CIE L*a*b* (1976) color
///
public LabColor ToLab(in xyYColor color)
{
var xyzColor = ToXYZ(color);
var result = ToLab(xyzColor);
return result;
}
///
/// Convert to CIE L*a*b* (1976) color
///
public LabColor ToLab(in LChabColor color)
{
// conversion (preserving white point)
var converter = LChabToLabConverter.Default;
var unadapted = converter.Convert(color);
if (!IsChromaticAdaptationPerformed)
return unadapted;
// adaptation to target lab white point (LabWhitePoint)
var adapted = Adapt(unadapted);
return adapted;
}
///
/// Convert to CIE L*a*b* (1976) color
///
public LabColor ToLab(in HunterLabColor color)
{
var xyzColor = ToXYZ(color);
var result = ToLab(xyzColor);
return result;
}
///
/// Convert to CIE L*a*b* (1976) color
///
public LabColor ToLab(in LuvColor color)
{
var xyzColor = ToXYZ(color);
var result = ToLab(xyzColor);
return result;
}
///
/// Convert to CIE L*a*b* (1976) color
///
public LabColor ToLab(in LChuvColor color)
{
var xyzColor = ToXYZ(color);
var result = ToLab(xyzColor);
return result;
}
///
/// Convert to CIE L*a*b* (1976) color
///
public LabColor ToLab(in LMSColor color)
{
var xyzColor = ToXYZ(color);
var result = ToLab(xyzColor);
return result;
}
///
/// Convert to CIE L*a*b* (1976) color
///
public LabColor ToLab(T color) where T : struct, IColorVector
{
switch (color)
{
case RGBColor typedColor:
return ToLab(in typedColor);
case LinearRGBColor typedColor:
return ToLab(in typedColor);
case XYZColor typedColor:
return ToLab(in typedColor);
case xyYColor typedColor:
return ToLab(in typedColor);
case HunterLabColor typedColor:
return ToLab(in typedColor);
case LabColor typedColor:
return typedColor;
case LChabColor typedColor:
return ToLab(in typedColor);
case LuvColor typedColor:
return ToLab(in typedColor);
case LChuvColor typedColor:
return ToLab(in typedColor);
case LMSColor typedColor:
return ToLab(in typedColor);
default:
throw new ArgumentException($"Cannot accept type '{typeof(T)}'.", nameof(color));
}
}
}
}