using Vector = System.Collections.Generic.IReadOnlyList; namespace Colourful.Implementation.Conversion { /// /// Converts from to . /// public sealed class RGBToLinearRGBConverter : IColorConversion { /// /// Default singleton instance of the converter. /// public static readonly RGBToLinearRGBConverter Default = new RGBToLinearRGBConverter(); /// /// Converts from to . /// public LinearRGBColor Convert(in RGBColor input) { var uncompandedVector = UncompandVector(input); var converted = new LinearRGBColor(uncompandedVector, input.WorkingSpace); return converted; } /// /// Applying the working space inverse companding function () to RGB vector. /// private static Vector UncompandVector(in RGBColor rgbColor) { var companding = rgbColor.WorkingSpace.Companding; var compandedVector = rgbColor.Vector; Vector uncompandedVector = new[] { companding.InverseCompanding(compandedVector[0]).CropRange(0, 1), companding.InverseCompanding(compandedVector[1]).CropRange(0, 1), companding.InverseCompanding(compandedVector[2]).CropRange(0, 1) }; return uncompandedVector; } #region Overrides /// public bool Equals(RGBToLinearRGBConverter other) => other != null; /// public override bool Equals(object obj) => obj is RGBToLinearRGBConverter; /// public override int GetHashCode() => 1; /// public static bool operator ==(RGBToLinearRGBConverter left, RGBToLinearRGBConverter right) => Equals(left, right); /// public static bool operator !=(RGBToLinearRGBConverter left, RGBToLinearRGBConverter right) => !Equals(left, right); #endregion } }