protected static void SetColor(XamlDomObject domObject, XElement color, XamlMember colorMember) { var colorType = color.Attribute(XName.Get("key")).Value; //XamlMember colorMember = GetColorMember(domObject.Type, colorType); //Image doesn't have a background but the XIB file allows setting it if (colorMember == null && domObject.Type.UnderlyingType == typeof(Image)) { return; } var colorSpace = int.Parse(GetElementWithMatchingAttribute(color, "key", "NSColorSpace").Value); string value = null; switch (colorSpace) { case 1: //NSRGB { var values = XamlLegacyXibReader.DecodeFromBase64(GetElementWithMatchingAttribute(color, "key", "NSRGB").Value) .Split(' '); var color2 = Color.FromRgb((byte)(double.Parse(values[0]) * 255), (byte)(double.Parse(values[1]) * 255), (byte)(double.Parse(values[2]) * 255)); value = color2.ToString(); } break; case 2: case 3: { var searchKey = colorSpace == 2 ? "NSRGB" : "NSWhite"; var asciiDecodedString = XamlLegacyXibReader.DecodeFromBase64(GetElementWithMatchingAttribute(color, "key", searchKey).Value) .Replace("\0", ""); var values = asciiDecodedString.Split(' '); var doubleValues = colorSpace == 2 ? new double[4] : new double[3]; if (values.Length >= 1) { doubleValues[0] = double.Parse(values[0]); } if (values.Length >= 2) { doubleValues[1] = double.Parse(values[1]); } if (values.Length >= 3) { doubleValues[2] = double.Parse(values[2]); } if (colorSpace == 2) { if (values.Length == 4) { doubleValues[3] = double.Parse(values[3]); } Debug.Assert(values.Length <= 4); } else { Debug.Assert(values.Length <= 3); } byte[] rgbValues = null; if (colorSpace == 2) { rgbValues = ColorConverters.CMYKtoRGB(doubleValues[0], doubleValues[1], doubleValues[2], doubleValues[3]); } else if (colorSpace == 3) { rgbValues = ColorConverters.LabToRGB(doubleValues[0], doubleValues[1], doubleValues[2]); } var color2 = Color.FromRgb(rgbValues[0], rgbValues[1], rgbValues[2]); value = color2.ToString(); } break; default: throw new NotImplementedException("Doesn't suppor colorspace: " + colorSpace); } Debug.Assert(value != null); domObject.SetMemberValue(colorMember, value); }