public IColor FromXYZColor(XYZColor xyzColor)
        {
            var x = xyzColor.X / (xyzColor.X + xyzColor.Y + xyzColor.Z);
            var y = xyzColor.Y / (xyzColor.X + xyzColor.Y + xyzColor.Z);

            return new xyYColor(xyzColor.Alpha, x, y, xyzColor.Y);
        }
        public IColor FromXYZColor(XYZColor xyzColor)
        {
            var xyzVector = new double[3] { xyzColor.X.Value, xyzColor.Y.Value, xyzColor.Z.Value };

            var rgbVector = Multiply(M_XYZToRGB, xyzVector);

            return GetColor(xyzColor.Alpha.Value, rgbVector[0], rgbVector[1], rgbVector[2]);
        }
        internal XYZColorSpace()
        {
            Alpha = new ColorChannelDefinition(this, "Alpha", "A");

            // DisplayValue = Value * 100 and up to three fraction digits
            X = new ColorChannelDefinition(this, "X", "X", (v) => Math.Round(100 * v, 3, MidpointRounding.AwayFromZero));
            Y = new ColorChannelDefinition(this, "Y", "Y", (v) => Math.Round(100 * v, 3, MidpointRounding.AwayFromZero));
            Z = new ColorChannelDefinition(this, "Z", "Z", (v) => Math.Round(100 * v, 3, MidpointRounding.AwayFromZero));

            whitePoint = new XYZColor(this, 1.0, 0.95047, 1.0, 1.088969);
        }
        public IColor FromXYZColor(XYZColor xyzColor)
        {
            /// conversion algorithm created with help of http://en.wikipedia.org/wiki/Lab_color_space
            
            var fx = f_forward_conversion(xyzColor.X, KnownColorSpaces.XYZ.WhitePoint.X);
            var fy = f_forward_conversion(xyzColor.Y, KnownColorSpaces.XYZ.WhitePoint.Y);
            var fz = f_forward_conversion(xyzColor.Z, KnownColorSpaces.XYZ.WhitePoint.Z);

            var L = 116 * fy - 16;
            var a = 500 * (fx - fy);
            var b = 200 * (fy - fz);

            return new LabColor(xyzColor.Alpha, L, a, b);
        }
 public IColor FromXYZColor(XYZColor xyzColor)
 {
     return xyzColor;
 }