public void ShowImage(Bitmap imageTexture)
        {
            ShandalarAsset image = loadedImages[loadedImageIndex];

            imagePanel.BackgroundImage = imageTexture;
            switch (image.imageType)
            {
            case ImageType.Pic:
                label2.Text = "Width: " + imageTexture.Width + "\nHeight: " + imageTexture.Height + "\nHas Embedded Palette:" + image.hasEmbeddedPalette;
                break;

            default:
                label2.Text = "Width: " + imageTexture.Width + "\n" + "Height: " + imageTexture.Height;
                break;
            }

            if (imageTexture.Width > imagePanel.Width || imageTexture.Height > imagePanel.Height)
            {
                imagePanel.BackgroundImageLayout = ImageLayout.Zoom;
            }
            else
            {
                imagePanel.BackgroundImageLayout = ImageLayout.Center;
            }
        }
        private void LoadCATFileToolStripMenuItem_Click(object sender, EventArgs e)
        {
            OpenFileDialog openFileDialog = new OpenFileDialog();

            openFileDialog.DefaultExt = "cat";
            openFileDialog.Filter     = "Cat Files|*.cat|All Files|*.*";
            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                Cat cat = new Cat(openFileDialog.FileName);
                assetsListBox.Items.Clear();
                loadedImages.Clear();
                UpdateStatusBarText("Loading CAT file...");
                for (int i = 0; i < cat.files.Count; i++)
                {
                    string         filepath = Path.GetFileNameWithoutExtension(openFileDialog.FileName);
                    ShandalarAsset asset    = new ShandalarAsset(filepath, cat.files[i].data, ImageType.Cat);
                    asset.childIndex = i;
                    asset.parentName = filepath;
                    asset.filename   = cat.files[i].name;
                    asset.image      = CATImageDecoder.DecodeCatImage(asset);
                    assetsListBox.Items.Add(cat.files[i].name);
                    loadedImages.Add(asset);
                    SetProgressBarValue((int)Math.Round(100f * ((float)i / (float)cat.files.Count)));
                }
                SetProgressBarValue(0);
                UpdateStatusBarText("Finished loading CAT file.");
            }
            exportToolStripMenuItem.Enabled    = true;
            exportAllToolStripMenuItem.Enabled = true;
        }
        public void OpenWvlFileTest(string path)
        {
            byte[]         data  = File.ReadAllBytes(path);
            ShandalarAsset asset = new ShandalarAsset(path, data, ImageType.Cat);

            asset.filename = Path.GetFileName(path);
            path           = path.Replace(".tif", "").Replace(".wvl", ".png"); //replace both extensions seperately, because a few card image files don't have the tif file extension
            CATImageDecoder.DecodeCatImage(asset).Save(path);
        }
 private void AssetsListBox_SelectedIndexChanged(object sender, EventArgs e)
 {
     loadedImageIndex = assetsListBox.SelectedIndex;
     if (loadedImageIndex != -1)
     {
         ShandalarAsset asset = loadedImages[loadedImageIndex];
         if (loadedImages[assetsListBox.SelectedIndex].image != null)
         {
             ShowImage(asset.image);
         }
         string fileText = Encoding.UTF8.GetString(asset.data);
         string tempText = Regex.Replace(fileText, @"\p{C}+", string.Empty);
         hexEditor1.LoadData(asset.data);
         if (tempText != fileText)
         {
             textBox1.Text = fileText;
         }
     }
 }
        private void LoadSprToolStripMenuItem_Click(object sender, EventArgs e)
        {
            OpenFileDialog openFileDialog = new OpenFileDialog();

            openFileDialog.DefaultExt = "spr";
            openFileDialog.Filter     = "Sprite Files|*.spr|All Files|*.*";
            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                exportToolStripMenuItem.Enabled = true;
                byte[] data = File.ReadAllBytes(openFileDialog.FileName);
                previewModeComboBox.SelectedIndex = 0;
                Text = windowTitle + " - " + Path.GetFileName(openFileDialog.FileName);
                string loadedImageFilename = Path.GetFileNameWithoutExtension(openFileDialog.FileName);
                Console.WriteLine("Loaded file path: " + openFileDialog.FileName);
                Color[]       palette = useLastEmbeddedPalette && lastEmbeddedPalette != null ? lastEmbeddedPalette : palettes[selectedPaletteIndex];
                List <Bitmap> sprites = SprDecoder.GetSprites(data, palette).ToList();
                ClearImagePanel();
                assetsListBox.Items.Clear();
                loadedImages.Clear();
                UpdateStatusBarText("Loading images from spr file...");
                for (int i = 0; i < sprites.Count; i++)
                {
                    ShandalarAsset asset = new ShandalarAsset(loadedImageFilename, data, ImageType.Spr);
                    asset.image      = sprites[i];
                    asset.childIndex = i;
                    asset.parentName = loadedImageFilename;
                    asset.filename   = Path.GetFileNameWithoutExtension(asset.filePath) + "_" + i;
                    loadedImages.Add(asset);
                    SetProgressBarValue((int)Math.Round(100f * ((float)i / (float)sprites.Count)));
                }
                for (int i = 0; i < loadedImages.Count; i++)
                {
                    assetsListBox.Items.Add(loadedImageFilename + "_" + i);
                }
                SetProgressBarValue(0);
                UpdateStatusBarText("Finished loading images from spr file.");
                exportToolStripMenuItem.Enabled    = true;
                exportAllToolStripMenuItem.Enabled = true;
            }
        }
        public ShandalarAsset GetPic(byte [] data, string name)
        {
            Color[]    originalPalette = palettes[selectedPaletteIndex];
            PicDecoder decoder         = new PicDecoder(data);

            if (decoder.hasPalette)
            {
                palettes[selectedPaletteIndex] = decoder.embeddedPalette;
            }

            /// Output image as picture box
            Bitmap bitmap = new Bitmap(decoder.width, decoder.height);

            byte[,] imageData = new byte[decoder.width, decoder.height];

            decoder.DecodeImage(imageData);

            if (decoder.hasPalette)
            {
                useLastEmbeddedPaletteCheckbox.Enabled = true;
                lastEmbeddedPalette = decoder.embeddedPalette;
            }

            for (int y = 0; y < decoder.height; y++)
            {
                for (int x = 0; x < decoder.width; x++)
                {
                    byte  value = imageData[x, y];
                    Color color = palettes[selectedPaletteIndex][value];
                    if (useLastEmbeddedPalette && lastEmbeddedPalette != null)
                    {
                        color = lastEmbeddedPalette[value];
                    }
                    if (color == Color.Transparent)
                    {
                        if (name.Contains("Cardart") || name.Contains("Duelart") || name.Contains("Exp1art"))
                        {
                            color = Color.Black;                                                                                   //The Cardart pic files have a strange palette difference
                        }
                        else
                        {
                            color = Color.FromArgb(value, value, value);
                        }
                    }
                    bitmap.SetPixel(x, y, color);
                }
            }
            ShandalarAsset asset = new ShandalarAsset(name, data, ImageType.Pic);

            asset.image    = bitmap;
            asset.filename = Path.GetFileNameWithoutExtension(asset.filePath);
            Console.WriteLine(asset.filename);
            if (asset.filePath.Contains("Rogue") || asset.filePath.Contains("Faces") || duelTransparentPicFiles.Contains(asset.filename + ".pic")) //Combine the embedded alpha channel with the main image for the face sprites
            {
                Bitmap transparentSprite = new Bitmap(asset.image.Width / 2, asset.image.Height);
                for (int x = 0; x < asset.image.Width / 2; x++)
                {
                    for (int y = 0; y < asset.image.Height; y++)
                    {
                        byte  paletteIndex = imageData[x + asset.image.Width / 2, y];
                        Color color        = palettes[selectedPaletteIndex][paletteIndex];
                        if ((paletteIndex == 0))
                        {
                            transparentSprite.SetPixel(x, y, asset.image.GetPixel(x, y));
                        }
                        else
                        {
                            transparentSprite.SetPixel(x, y, Color.Transparent);
                        }
                    }
                }
                asset.image = transparentSprite;
            }
            palettes[selectedPaletteIndex] = originalPalette;
            asset.hasEmbeddedPalette       = decoder.hasPalette;
            ClearImagePanel();
            return(asset);
        }