Example #1
0
        public static CbmFile FromFile(string fileName)
        {
            var cbm = new CbmFile();

            cbm.FileName = fileName;

            FileStream filestream = null;

            try
            {
                filestream = new FileStream(fileName, FileMode.Open, FileAccess.Read);

                using (BinaryReader file = new BinaryReader(filestream, Encoding.ASCII))
                {
                    filestream = null;

                    int count = file.ReadInt32();

                    cbm.currentImageIndex = file.ReadInt32();

                    file.BaseStream.Position += 16;

                    cbm.ImageId = file.ReadInt32();
                    cbm.GroupId = file.ReadInt32();

                    file.BaseStream.Position += 4;

                    if (cbm.currentImageIndex < 0 || cbm.currentImageIndex >= count)
                    {
                        cbm.currentImageIndex = 0;
                    }

                    for (int i = 0; i < count; i++)
                    {
                        var image = new CbmImage();

                        image.Width        = file.ReadInt32();
                        image.Height       = file.ReadInt32();
                        image.IsCompressed = file.ReadInt32() != 0;

                        int dataLength = file.ReadInt32();

                        image.AreaLeft   = file.ReadInt32();
                        image.AreaTop    = file.ReadInt32();
                        image.AreaRight  = file.ReadInt32();
                        image.AreaBottom = file.ReadInt32();

                        file.BaseStream.Position += 4;

                        image.palette16 = new ushort[256];

                        for (int c = 0; c < 256; c++)
                        {
                            image.palette16[c] = (ushort)file.ReadUInt32();
                        }

                        image.palette32 = new uint[256];

                        for (int c = 0; c < 256; c++)
                        {
                            image.palette32[c] = file.ReadUInt32();
                        }

                        image.rawData = file.ReadBytes(dataLength);

                        cbm.Images.Add(image);
                    }
                }
            }
            finally
            {
                if (filestream != null)
                {
                    filestream.Dispose();
                }
            }

            return(cbm);
        }
        private void DeleteImage_Click(object sender, RoutedEventArgs e)
        {
            var cbm = this.CbmFile;

            if (cbm == null)
            {
                return;
            }

            int index = this.ImagesList.SelectedIndex;

            if (index == -1)
            {
                return;
            }

            this.RunBusyAction(disp =>
            {
                cbm.Images.RemoveAt(index);

                disp(() => this.ImagesList.SelectedIndex = -1);
                disp(() => this.CbmFile = this.CbmFile);
            });
        }
        public static CbmFile FromFile(string fileName)
        {
            var cbm = new CbmFile();

            cbm.FileName = fileName;

            FileStream filestream = null;

            try
            {
                filestream = new FileStream(fileName, FileMode.Open, FileAccess.Read);

                using (BinaryReader file = new BinaryReader(filestream, Encoding.ASCII))
                {
                    filestream = null;

                    int count = file.ReadInt32();

                    cbm.currentImageIndex = file.ReadInt32();

                    file.BaseStream.Position += 16;

                    cbm.ImageId = file.ReadInt32();
                    cbm.GroupId = file.ReadInt32();

                    file.BaseStream.Position += 4;

                    if (cbm.currentImageIndex < 0 || cbm.currentImageIndex >= count)
                    {
                        cbm.currentImageIndex = 0;
                    }

                    for (int i = 0; i < count; i++)
                    {
                        var image = new CbmImage();

                        image.Width = file.ReadInt32();
                        image.Height = file.ReadInt32();
                        image.IsCompressed = file.ReadInt32() != 0;

                        int dataLength = file.ReadInt32();

                        image.AreaLeft = file.ReadInt32();
                        image.AreaTop = file.ReadInt32();
                        image.AreaRight = file.ReadInt32();
                        image.AreaBottom = file.ReadInt32();

                        file.BaseStream.Position += 4;

                        image.palette16 = new ushort[256];

                        for (int c = 0; c < 256; c++)
                        {
                            image.palette16[c] = (ushort)file.ReadUInt32();
                        }

                        image.palette32 = new uint[256];

                        for (int c = 0; c < 256; c++)
                        {
                            image.palette32[c] = file.ReadUInt32();
                        }

                        image.rawData = file.ReadBytes(dataLength);

                        cbm.Images.Add(image);
                    }
                }
            }
            finally
            {
                if (filestream != null)
                {
                    filestream.Dispose();
                }
            }

            return cbm;
        }
        private void SetImageColorKey_Click(object sender, RoutedEventArgs e)
        {
            var image = this.ImagesList.SelectedItem as CbmImage;

            if (image == null)
            {
                return;
            }

            Color colorKey = this.DatImageColorKey.SelectedColor;

            this.RunBusyAction(disp =>
            {
                image.MakeColorTransparent(colorKey.R, colorKey.G, colorKey.B);
                disp(() => this.CbmFile = this.CbmFile);
            });
        }
        private void AddImage_Click(object sender, RoutedEventArgs e)
        {
            var cbm = this.CbmFile;

            if (cbm == null)
            {
                return;
            }

            var dialog = new OpenFileDialog();
            dialog.CheckFileExists = true;
            dialog.DefaultExt = ".png";
            dialog.Filter = "Images (*.png, *.bmp, *.jpg)|*.png;*.bmp;*.jpg|PNG files (*.png)|*.png|BMP files (*.bmp)|*.bmp|JPG files (*.jpg)|*.jpg";

            string fileName;

            if (dialog.ShowDialog(this) == true)
            {
                fileName = dialog.FileName;
            }
            else
            {
                return;
            }

            this.RunBusyAction(disp =>
            {
                try
                {
                    var image = CbmImage.FromFile(fileName);

                    cbm.Images.Add(image);

                    disp(() => this.CbmFile = this.CbmFile);
                    disp(() => this.ImagesList.SelectedIndex = this.ImagesList.Items.Count - 1);
                }
                catch (Exception ex)
                {
                    disp(() => MessageBox.Show(this, ex.Message, this.Title, MessageBoxButton.OK, MessageBoxImage.Error));
                }
            });
        }
        private void NewImage_Click(object sender, RoutedEventArgs e)
        {
            var cbm = this.CbmFile;

            if (cbm == null)
            {
                return;
            }

            this.RunBusyAction(disp =>
            {
                var image = new CbmImage();
                cbm.Images.Add(image);

                disp(() => this.CbmFile = this.CbmFile);
                disp(() => this.ImagesList.SelectedIndex = this.ImagesList.Items.Count - 1);
            });
        }
        private void ExecuteSaveAs(object sender, ExecutedRoutedEventArgs e)
        {
            var cbm = this.CbmFile;

            if (cbm == null)
            {
                return;
            }

            var dialog = new SaveFileDialog();
            dialog.AddExtension = true;
            dialog.DefaultExt = ".cbm";
            dialog.Filter = "CBM files (*.cbm)|*.cbm";
            dialog.FileName = System.IO.Path.GetFileName(cbm.FileName);

            string fileName;

            if (dialog.ShowDialog(this) == true)
            {
                fileName = dialog.FileName;
            }
            else
            {
                return;
            }

            this.RunBusyAction(disp =>
            {
                try
                {
                    cbm.Save(fileName);
                    disp(() => this.CbmFile = cbm);
                }
                catch (Exception ex)
                {
                    disp(() => MessageBox.Show(this, ex.Message, this.Title, MessageBoxButton.OK, MessageBoxImage.Error));
                }
            });
        }
        private void ExecuteSave(object sender, ExecutedRoutedEventArgs e)
        {
            var cbm = this.CbmFile;

            if (cbm == null)
            {
                return;
            }

            if (string.IsNullOrEmpty(cbm.FileName))
            {
                this.ExecuteSaveAs(null, null);
                return;
            }

            this.RunBusyAction(disp =>
            {
                try
                {
                    cbm.Save(cbm.FileName);

                    disp(() => this.CbmFile = cbm);
                }
                catch (Exception ex)
                {
                    disp(() => MessageBox.Show(this, ex.Message, this.Title, MessageBoxButton.OK, MessageBoxImage.Error));
                }
            });
        }
        private void ExecuteOpen(object sender, ExecutedRoutedEventArgs e)
        {
            var dialog = new OpenFileDialog();
            dialog.DefaultExt = ".cbm";
            dialog.CheckFileExists = true;
            dialog.Filter = "CBM files (*.cbm)|*.cbm";

            string fileName;

            if (dialog.ShowDialog(this) == true)
            {
                fileName = dialog.FileName;
            }
            else
            {
                return;
            }

            this.RunBusyAction(disp =>
            {
                try
                {
                    var cbm = CbmFile.FromFile(fileName);
                    disp(() => this.CbmFile = cbm);
                }
                catch (Exception ex)
                {
                    disp(() => MessageBox.Show(this, fileName + "\n" + ex.Message, this.Title, MessageBoxButton.OK, MessageBoxImage.Error));
                }
            });
        }
        private void ExecuteNew(object sender, ExecutedRoutedEventArgs e)
        {
            this.RunBusyAction(disp =>
            {
                var cbm = new CbmFile();

                disp(() => this.CbmFile = cbm);
            });
        }