public override id InitWithCoder(NSCoder aDecoder)
{
id self = this;
if (aDecoder.AllowsKeyedCoding)
{
int colorSpace = aDecoder.DecodeIntForKey(@"NSColorSpace");
if ((colorSpace == 1) || (colorSpace == 2))
{
int length = 0;
byte[] data = null;
double red = 0.0;
double green = 0.0;
double blue = 0.0;
double alpha = 1.0;
NSString str = null;
NSScanner scanner = null;
if (aDecoder.ContainsValueForKey(@"NSRGB"))
{
data = aDecoder.DecodeBytesForKey(@"NSRGB", ref length);
str = (NSString)NSString.Alloc().InitWithBytes(data, (uint)data.Length, NSStringEncoding.NSASCIIStringEncoding);
scanner = (NSScanner)NSScanner.Alloc().InitWithString(str);
scanner.ScanDouble(ref red);
scanner.ScanDouble(ref green);
scanner.ScanDouble(ref blue);
scanner.ScanDouble(ref alpha);
}
if (colorSpace == 1)
{
self = NSColor.ColorWithCalibratedRed((double)red, (double)green, (double)blue, (double)alpha);
}
else
{
self = NSColor.ColorWithDeviceRed((double)red, (double)green, (double)blue, (double)alpha);
}
}
else if ((colorSpace == 3) || (colorSpace == 4))
{
int length = 0;
byte[] data = null;
double white = 0.0;
double alpha = 0.0;
NSString str = null;
NSScanner scanner = null;
if (aDecoder.ContainsValueForKey(@"NSWhite"))
{
data = aDecoder.DecodeBytesForKey(@"NSWhite", ref length);
str = (NSString)NSString.Alloc().InitWithBytes(data, (uint)data.Length, NSStringEncoding.NSASCIIStringEncoding);
scanner = (NSScanner)NSScanner.Alloc().InitWithString(str);
scanner.ScanDouble(ref white);
scanner.ScanDouble(ref alpha);
}
if (colorSpace == 3)
{
self = NSColor.ColorWithCalibratedWhite((double)white, (double)alpha);
}
else
{
self = NSColor.ColorWithDeviceWhite((double)white, (double)alpha);
}
}
else if (colorSpace == 5)
{
int length = 0;
byte[] data = null;
double cyan = 0.0;
double yellow = 0.0;
double magenta = 0.0;
double black = 0.0;
double alpha = 1.0;
NSString str = null;
NSScanner scanner = null;
if (aDecoder.ContainsValueForKey(@"NSCYMK"))
{
data = aDecoder.DecodeBytesForKey(@"NSCYMK", ref length);
str = (NSString)NSString.Alloc().InitWithBytes(data, (uint)data.Length, NSStringEncoding.NSASCIIStringEncoding);
scanner = (NSScanner)NSScanner.Alloc().InitWithString(str);
scanner.ScanDouble(ref cyan);
scanner.ScanDouble(ref yellow);
scanner.ScanDouble(ref magenta);
scanner.ScanDouble(ref black);
scanner.ScanDouble(ref alpha);
}
self = NSColor.ColorWithDeviceCyan((double)cyan, (double)magenta, (double)yellow, (double)black, (double)alpha);
}
else if (colorSpace == 6)
{
NSString catalog = (NSString)aDecoder.DecodeObjectForKey(@"NSCatalogName");
NSString name = (NSString)aDecoder.DecodeObjectForKey(@"NSColorName");
//NSColor color = (NSColor)aDecoder.DecodeObjectForKey(@"NSColor");
self = NSColor.ColorWithCatalogName(catalog, name);
}
else if (colorSpace == 10)
{
NSImage image = (NSImage)aDecoder.DecodeObjectForKey(@"NSImage");
self = NSColor.ColorWithPatternImage(image);
}
return self;
}
else if (aDecoder.VersionForClassName(@"NSColor") < 3)
{
double red;
double green;
double blue;
double cyan;
double magenta;
double yellow;
double black;
double hue;
double saturation;
double brightness;
double alpha;
double white;
int active_component;
int valid_components;
NSString colorspace_name;
NSString catalog_name;
NSString color_name;
bool is_clear;
// Version 1
aDecoder.DecodeValueOfObjCType2<double>(out red);
aDecoder.DecodeValueOfObjCType2<double>(out green);
aDecoder.DecodeValueOfObjCType2<double>(out blue);
aDecoder.DecodeValueOfObjCType2<double>(out alpha);
aDecoder.DecodeValueOfObjCType2<bool>(out is_clear);
// Version 2
aDecoder.DecodeValueOfObjCType2<NSString>(out colorspace_name);
aDecoder.DecodeValueOfObjCType2<NSString>(out catalog_name);
aDecoder.DecodeValueOfObjCType2<NSString>(out color_name);
aDecoder.DecodeValueOfObjCType2<double>(out cyan);
aDecoder.DecodeValueOfObjCType2<double>(out magenta);
aDecoder.DecodeValueOfObjCType2<double>(out yellow);
aDecoder.DecodeValueOfObjCType2<double>(out black);
aDecoder.DecodeValueOfObjCType2<double>(out hue);
aDecoder.DecodeValueOfObjCType2<double>(out saturation);
aDecoder.DecodeValueOfObjCType2<double>(out brightness);
aDecoder.DecodeValueOfObjCType2<double>(out white);
aDecoder.DecodeValueOfObjCType2<int>(out active_component);
aDecoder.DecodeValueOfObjCType2<int>(out valid_components);
if (colorspace_name.IsEqualToString(@"NSDeviceCMYKColorSpace"))
{
self = NSColor.ColorWithDeviceCyan((double)cyan, (double)magenta, (double)yellow, (double)black, (double)alpha);
}
else if (colorspace_name.IsEqualToString(@"NSDeviceWhiteColorSpace"))
{
self = NSColor.ColorWithDeviceWhite((double)white, (double)alpha);
}
else if (colorspace_name.IsEqualToString(@"NSCalibratedWhiteColorSpace"))
{
self = NSColor.ColorWithCalibratedWhite((double)white, (double)alpha);
}
else if (colorspace_name.IsEqualToString(@"NSDeviceRGBColorSpace"))
{
self = NSColor.ColorWithDeviceRed((double)red, (double)green, (double)blue, (double)alpha);
}
else if (colorspace_name.IsEqualToString(@"NSCalibratedRGBColorSpace"))
{
self = NSColor.ColorWithCalibratedRed((double)red, (double)green, (double)blue, (double)alpha);
}
else if (colorspace_name.IsEqualToString(@"NSNamedColorSpace"))
{
self = NSColor.ColorWithCatalogName(catalog_name, color_name);
}
return self;
}
else
{
NSString csName = (NSString)aDecoder.DecodeObject();
if (csName.IsEqualToString(@"NSDeviceCMYKColorSpace"))
{
self = GSDeviceCMYKColor.Alloc().InitWithCoder(aDecoder);
}
else if (csName.IsEqualToString(@"NSDeviceRGBColorSpace"))
{
self = GSDeviceRGBColor.Alloc().InitWithCoder(aDecoder);
}
else if (csName.IsEqualToString(@"NSDeviceWhiteColorSpace"))
{
self = GSDeviceWhiteColor.Alloc().InitWithCoder(aDecoder);
}
else if (csName.IsEqualToString(@"NSCalibratedWhiteColorSpace"))
{
self = GSCalibratedWhiteColor.Alloc().InitWithCoder(aDecoder);
}
else if (csName.IsEqualToString(@"NSCalibratedRGBColorSpace"))
{
self = GSCalibratedRGBColor.Alloc().InitWithCoder(aDecoder);
}
else if (csName.IsEqualToString(@"NSNamedColorSpace"))
{
self = GSNamedColor.Alloc().InitWithCoder(aDecoder);
}
else
{
System.Diagnostics.Trace.WriteLine("Unknown colorspace name in decoded color");
return null;
}
return self;
}
}