public void Serialize(Stream stream, ColourCollection palette, AdobePhotoshopColourSwatchFileVersion version, AdobePhotoshopColourSwatchColourSpace colourSpace)
        {
            if (stream == null)
            {
                throw new ArgumentNullException(nameof(stream));
            }

            if (palette == null)
            {
                throw new ArgumentNullException(nameof(palette));
            }

            if (version == AdobePhotoshopColourSwatchFileVersion.VERSION2)
            {
                this.WritePalette(stream, palette, AdobePhotoshopColourSwatchFileVersion.VERSION1, colourSpace);
            }
            this.WritePalette(stream, palette, version, colourSpace);
        }
        protected virtual void WritePalette(Stream stream, ColourCollection palette, AdobePhotoshopColourSwatchFileVersion version, AdobePhotoshopColourSwatchColourSpace colorSpace)
        {
            int swatchIndex;

            this.WriteInt16(stream, (short)version);
            this.WriteInt16(stream, (short)palette.Count);

            swatchIndex = 0;

            foreach (Color colour in palette)
            {
                short value1;
                short value2;
                short value3;
                short value4;

                swatchIndex++;

                switch (colorSpace)
                {
                case AdobePhotoshopColourSwatchColourSpace.RGB:
                    value1 = (short)(colour.R * 256);
                    value2 = (short)(colour.G * 256);
                    value3 = (short)(colour.B * 256);
                    value4 = 0;
                    break;

                case AdobePhotoshopColourSwatchColourSpace.HSB:
                    value1 = (short)(colour.GetHue() * 182.04);
                    value2 = (short)(colour.GetSaturation() * 655.35);
                    value3 = (short)(colour.GetBrightness() * 655.35);
                    value4 = 0;
                    break;

                case AdobePhotoshopColourSwatchColourSpace.GRAYSCALE:
                    if (colour.R == colour.G && colour.R == colour.B)
                    {
                        // already grayscale
                        value1 = (short)(colour.R * 39.0625);
                    }
                    else
                    {
                        // color is not grayscale, convert
                        value1 = (short)((colour.R + colour.G + colour.B) / 3.0 * 39.0625);
                    }
                    value2 = 0;
                    value3 = 0;
                    value4 = 0;
                    break;

                default:
                    throw new InvalidOperationException("Color space not supported.");
                }

                this.WriteInt16(stream, (short)colorSpace);
                this.WriteInt16(stream, value1);
                this.WriteInt16(stream, value2);
                this.WriteInt16(stream, value3);
                this.WriteInt16(stream, value4);

                if (version == AdobePhotoshopColourSwatchFileVersion.VERSION2)
                {
                    string name;

#if USENAMEHACK
                    name = palette.GetName(swatchIndex - 1);
                    if (string.IsNullOrEmpty(name))
                    {
                        name = string.Format("Swatch {0}", swatchIndex);
                    }
#else
                    name = colour.IsNamedColor ? colour.Name : string.Format("Swatch {0}", swatchIndex);
#endif

                    this.WriteInt32(stream, name.Length);
                    this.WriteString(stream, name);
                }
            }
        }
 public void Serialize(Stream stream, ColourCollection palette, AdobePhotoshopColourSwatchColourSpace colourSpace)
 {
     this.Serialize(stream, palette, AdobePhotoshopColourSwatchFileVersion.VERSION2, colourSpace);
 }