using System; using Matrix = System.Collections.Generic.IReadOnlyList>; namespace Colourful.Implementation.Conversion { /// /// Converts from to . /// public sealed class LinearRGBToXYZConverter : LinearRGBAndXYZConverterBase, IColorConversion { private readonly Matrix _conversionMatrix; /// Source RGB working space public LinearRGBToXYZConverter(IRGBWorkingSpace sourceRGBWorkingSpace) { SourceRGBWorkingSpace = sourceRGBWorkingSpace; _conversionMatrix = GetRGBToXYZMatrix(SourceRGBWorkingSpace); } /// /// Source RGB working space /// public IRGBWorkingSpace SourceRGBWorkingSpace { get; } /// /// Converts from to . /// public XYZColor Convert(in LinearRGBColor input) { if (!Equals(input.WorkingSpace, SourceRGBWorkingSpace)) throw new InvalidOperationException("Working space of input RGB color must be equal to converter source RGB working space."); var xyz = _conversionMatrix.MultiplyBy(input.Vector); var converted = new XYZColor(xyz); return converted; } #region Overrides /// public bool Equals(LinearRGBToXYZConverter other) { if (ReferenceEquals(this, other)) return true; return Equals(SourceRGBWorkingSpace, other.SourceRGBWorkingSpace); } /// public override bool Equals(object obj) => obj is LinearRGBToXYZConverter other && Equals(other); /// public override int GetHashCode() => SourceRGBWorkingSpace?.GetHashCode() ?? 0; /// public static bool operator ==(LinearRGBToXYZConverter left, LinearRGBToXYZConverter right) => Equals(left, right); /// public static bool operator !=(LinearRGBToXYZConverter left, LinearRGBToXYZConverter right) => !Equals(left, right); #endregion } }