示例#1
0
        public void GetObjectData(SerializationInfo si, StreamingContext context)
        {
            MemoryStream stream = new MemoryStream();
            BinaryWriter writer = new BinaryWriter(stream);

            writer.Write(header);

            Image [] images = (imageCollection != null) ? imageCollection.ToArray() : this.images;
            int      cols   = 4;
            int      rows   = images.Length / cols;

            if (images.Length % cols > 0)
            {
                ++rows;
            }

            writer.Write((ushort)images.Length);
            writer.Write((ushort)images.Length);
            writer.Write((ushort)0x4);
            writer.Write((ushort)(images [0].Width));
            writer.Write((ushort)(images [0].Height));
            writer.Write(0xFFFFFFFF); //BackColor.ToArgb ()); //FIXME: should set the right one here.
            writer.Write((ushort)0x1009);
            for (int i = 0; i < 4; i++)
            {
                writer.Write((short)-1);
            }

            Bitmap main = new Bitmap(cols * ImageSize.Width, rows * ImageSize.Height);

            using (Graphics g = Graphics.FromImage(main))
            {
                g.FillRectangle(ThemeEngine.Current.ResPool.GetSolidBrush(BackColor), 0, 0,
                                main.Width, main.Height);
                for (int i = 0; i < images.Length; i++)
                {
                    g.DrawImage(images [i], (i % cols) * ImageSize.Width,
                                (i / cols) * ImageSize.Height);
                }
            }

            MemoryStream tmp = new MemoryStream();

            main.Save(tmp, ImageFormat.Bmp);
            tmp.WriteTo(stream);

            Bitmap mask = Get1bppMask(main);

            main.Dispose();
            main = null;

            tmp = new MemoryStream();
            mask.Save(tmp, ImageFormat.Bmp);
            tmp.WriteTo(stream);
            mask.Dispose();

            stream = GetRLEStream(stream, 4);
            si.AddValue("Data", stream.ToArray(), typeof(byte []));
        }