예제 #1
0
파일: Main.cs 프로젝트: kwsch/png2bclim
        public void makeBCLIM(string path)
        {
            byte[] data = BCLIM.getBCLIM(path, CB_OutFormat.Text[0]);

            string fp = Path.GetFileNameWithoutExtension(path);

            fp = "new_" + fp.Substring(fp.IndexOf('_') + 1);
            string pp      = Path.GetDirectoryName(path);
            string newPath = Path.Combine(pp, fp + ".bclim");

            var sfd = new SaveFileDialog
            {
                FileName         = newPath,
                InitialDirectory = pp,
                Filter           = "BCLIM File|*.bclim" +
                                   "|All Files|*.*"
            };

            if (CHK_AutoSaveBCLIM.Checked || (sfd.ShowDialog() == DialogResult.OK))
            {
                File.WriteAllBytes(sfd.FileName, data);
            }

            PB_BCLIM.Image = new Bitmap(path);
            var bclim = BCLIM.analyze(sfd.FileName);

            showPaletteBox(bclim);
            GB_Details.Visible = true;
            L_Details.Text     = String.Format("{1}{0}{2}{0}{3}{0}{4}{0}{5}", Environment.NewLine,
                                               bclim.FileFormat, bclim.Width, bclim.Height, bclim.TileWidth, bclim.TileHeight);
        }
예제 #2
0
        private void changeFile(object sender, EventArgs e)
        {
            // When the file is changed, we need to display the new file.
            string filename = CB_File.Text;
            int    entry    = -1;
            // Find entry in darc
            var darc = darcs[CB_DARC.SelectedIndex];

            for (int i = 0; i < darc.Entries.Length; i++)
            {
                if (darc.FileNameTable[i].FileName == filename)
                {
                    entry = i;
                    break;
                }
            }
            if (entry < 0)
            {
                throw new Exception("File not found!?");
            }

            // Load file
            byte[] data    = darc.Data.Skip((int)(darc.Entries[entry].DataOffset - darc.Header.FileDataOffset)).Take((int)darc.Entries[entry].DataLength).ToArray();
            BCLIM  bclim   = BCLIM.analyze(data, filename);
            Image  CropBMP = bclim.GetBitmap();

            PB_Image.Image = CropBMP;
            // store image locally for saving if need be
            currentBytes = data;

            L_Dimensions.Text = $"Dimensions: {PB_Image.Width}w && {PB_Image.Height}h";
        }
예제 #3
0
파일: Main.cs 프로젝트: kwsch/png2bclim
        public void showPaletteBox(BCLIM.CLIM bclim)
        {
            // Palette Box
            PaletteBox.Visible = BitConverter.ToUInt16(bclim.Data, 0) == 2 && bclim.FileFormat == 7;
            if (!PaletteBox.Visible)
            {
                return;
            }

            int colors = BitConverter.ToUInt16(bclim.Data, 2);

            Color[] ca = new Color[colors];
            for (int i = 0; i < colors; i++)
            {
                ca[i] = BCLIM.DecodeColor(BitConverter.ToUInt16(bclim.Data, 4 + 2 * i), 7);
            }
            Bitmap palette = new Bitmap(ca.Length * 8, 8, PixelFormat.Format32bppArgb);

            for (int x = 0; x < ca.Length * 8; x++)
            {
                for (int y = 0; y < 8; y++)
                {
                    palette.SetPixel(x, y, ca[x / 8]);
                }
            }
            PaletteBox.Image = palette; PaletteBox.Visible = true;
        }
예제 #4
0
        private void insertFile(string path)
        {
            if (DialogResult.Yes != WinFormsUtil.Prompt(MessageBoxButtons.YesNo, "Overwrite image?"))
            {
                return;
            }
            byte[] data = File.ReadAllBytes(path);
            byte[] bclim;

            if (Path.GetExtension(path) == ".bclim") // bclim opened
            {
                var img = BCLIM.analyze(data, path);
                if (img.Width != PB_Image.Width || img.Height != PB_Image.Height)
                {
                    WinFormsUtil.Alert("Image sizes do not match.",
                                       $"Width: {img.Width} - {PB_Image.Width}\nHeight: {img.Height} - {PB_Image.Height}");
                    return;
                }
                bclim = data;
            }
            else // image
            {
                using (Stream BitmapStream = new MemoryStream(data))
                {
                    Image img = Image.FromStream(BitmapStream);
                    if (img.Width != PB_Image.Width || img.Height != PB_Image.Height)
                    {
                        WinFormsUtil.Alert("Image sizes do not match.",
                                           $"Width: {img.Width} - {PB_Image.Width}\nHeight: {img.Height} - {PB_Image.Height}");
                        return;
                    }
                    bclim = BCLIM.IMGToBCLIM(img, '9');
                }
            }

            string filename = CB_File.Text;
            int    entry    = -1;
            // Find entry in darc
            var darc = darcs[CB_DARC.SelectedIndex];

            for (int i = 0; i < darc.Entries.Length; i++)
            {
                if (darc.FileNameTable[i].FileName == filename)
                {
                    entry = i;
                    break;
                }
            }
            if (entry < 0)
            {
                throw new Exception("File not found!?");
            }

            DARC.insertFile(ref darc, entry, bclim);
            darcs[CB_DARC.SelectedIndex] = darc;

            // Trigger reloading of the image
            changeFile(null, null);
        }
예제 #5
0
        private void openIMG(string path)
        {
            var img = BCLIM.makeBMP(path, CHK_PNG.Checked);

            if (img == null)
            {
                return;
            }
            PB_BCLIM.Size            = new Size(img.Width + 2, img.Height + 2);
            PB_BCLIM.BackgroundImage = img;
        }
예제 #6
0
파일: Main.cs 프로젝트: kwsch/png2bclim
        // File Generation
        public void makeBMP(string path)
        {
            BCLIM.CLIM bclim = BCLIM.analyze(path);
            GB_Details.Visible = true;
            L_Details.Text     = String.Format("{1}{0}{2}{0}{3}{0}{4}{0}{5}", Environment.NewLine,
                                               bclim.FileFormat, bclim.Width, bclim.Height, bclim.TileWidth, bclim.TileHeight);

            var img = BCLIM.makeBMP(path, CHK_AutoSavePNG.Checked, !CHK_NoCrop.Checked);

            if (img == null)
            {
                return;
            }
            showPaletteBox(bclim);
            PB_BCLIM.Image = img;
        }
예제 #7
0
        private void OpenIMG(string path)
        {
            var img = BCLIM.MakeBMP(path, CHK_PNG.Checked);

            if (img == null)
            {
                try
                {
                    var flim = new BFLIM(path);
                    if (!flim.Footer.Valid)
                    {
                        return;
                    }
                    img = flim.GetBitmap();
                }
                catch (Exception ree)
                {
                    Console.WriteLine(ree.Message);
                    return;
                }
                if (CHK_PNG.Checked)
                {
                    var dir     = Path.GetDirectoryName(path);
                    var fn      = Path.GetFileNameWithoutExtension(path);
                    var outpath = Path.Combine(dir, $"{fn}.png");
                    img.Save(outpath);
                }
            }
            PB_BCLIM.Size            = new Size(img.Width + 2, img.Height + 2);
            PB_BCLIM.BackgroundImage = img;
            int leftpad        = PB_BCLIM.Location.X;
            int suggestedWidth = (leftpad * 2) + PB_BCLIM.Width + 10;

            if (Width < suggestedWidth)
            {
                Width = suggestedWidth;
            }

            int suggestedHeight = PB_BCLIM.Location.Y + PB_BCLIM.Height + leftpad + 30;

            if (Height < suggestedHeight)
            {
                Height = suggestedHeight;
            }
        }
예제 #8
0
        public Dictionary <string, STGenericTexture> GetTextures()
        {
            Dictionary <string, STGenericTexture> textures = new Dictionary <string, STGenericTexture>();

            if (IFileInfo.ArchiveParent != null)
            {
                foreach (var file in IFileInfo.ArchiveParent.Files)
                {
                    if (Utils.GetExtension(file.FileName) == ".bclim")
                    {
                        BCLIM bclim = (BCLIM)file.OpenFile();
                        file.FileFormat = bclim;
                        textures.Add(bclim.FileName, bclim);
                    }
                }
            }

            return(textures);
        }
예제 #9
0
        private void changeFile(object sender, EventArgs e)
        {
            // When the file is changed, we need to display the new file.
            string filename = CB_File.Text;
            int    entry    = -1;
            // Find entry in darc
            var darc = darcs[CB_DARC.SelectedIndex];

            for (int i = 0; i < darc.Entries.Length; i++)
            {
                if (darc.FileNameTable[i].FileName == filename)
                {
                    entry = i;
                    break;
                }
            }
            if (entry < 0)
            {
                throw new Exception("File not found!?");
            }

            // Load file
            byte[]     data  = darc.Data.Skip((int)(darc.Entries[entry].DataOffset - darc.Header.FileDataOffset)).Take((int)darc.Entries[entry].DataLength).ToArray();
            BCLIM.CLIM bclim = BCLIM.analyze(data, filename);
            Image      img   = BCLIM.getIMG(bclim);

            Rectangle cropRect = new Rectangle(0, 0, bclim.Width, bclim.Height);
            Bitmap    CropBMP  = new Bitmap(cropRect.Width, cropRect.Height);

            using (Graphics g = Graphics.FromImage(CropBMP))
            {
                g.DrawImage(img,
                            new Rectangle(0, 0, CropBMP.Width, CropBMP.Height),
                            cropRect,
                            GraphicsUnit.Pixel);
            }

            PB_Image.Image = CropBMP;
            // store image locally for saving if need be
            currentBytes = data;

            L_Dimensions.Text = $"Dimensions: {PB_Image.Width}w && {PB_Image.Height}h";
        }
예제 #10
0
파일: Main.cs 프로젝트: HelloOO7/png2bclim
        public void makeBCLIM(string path)
        {
            string fp = Path.GetFileNameWithoutExtension(path);

            fp = "new_" + fp.Substring(fp.IndexOf('_') + 1);
            string pp = Path.GetDirectoryName(path);

            var sfd = new SaveFileDialog
            {
                FileName         = fp + (SaveAsBFLIM.Checked ? ".bflim" : ".bclim"),
                InitialDirectory = pp,
                Filter           = "BCLIM File|*.bclim" +
                                   "|BFLIM FILE|*.bflim" +
                                   "|All Files|*.*"
            };

            sfd.FilterIndex = SaveAsBFLIM.Checked ? 2 : 1;

            if (CHK_AutoSaveBCLIM.Checked || (sfd.ShowDialog() == DialogResult.OK))
            {
                bool FLIM = false;
                if (sfd.FileName.EndsWith(".bflim"))
                {
                    FLIM = true;
                }
                byte[] data = BCLIM.getBCLIM(path, CB_OutFormat.Text[0], FLIM);

                File.WriteAllBytes(sfd.FileName, data);

                PB_BCLIM.Image = new Bitmap(path);
                var bclim = BCLIM.analyze(sfd.FileName);
                showPaletteBox(bclim);
                GB_Details.Visible = true;
                L_Details.Text     = String.Format("{1}{0}{2}{0}{3}{0}{4}{0}{5}", Environment.NewLine,
                                                   bclim.FileFormat, bclim.Width, bclim.Height, 4, 4);
            }
        }
예제 #11
0
        private void TexturesList_DoubleClick(object sender, EventArgs e)
        {
            if (texturesList.Items.Count == 0)
            {
                return;
            }

            string ext = Path.GetExtension(texturesList.GetItemText(texturesList.SelectedItem));

            string[] exts        = { ".bti", ".tpl", ".bclim" };
            bool     isSupported = false;

            for (int i = 0; i < exts.Length; i++)
            {
                if (exts[i] == ext)
                {
                    isSupported = true;
                    break;
                }
            }

            if (!isSupported)
            {
                MessageBox.Show("This image format does not support viewing yet.");
                return;
            }

            string fullPath = mMainRoot + "timg/" + texturesList.GetItemText(texturesList.SelectedItem);

            byte[] data = null;

            if (mLayoutImages.ContainsKey(fullPath))
            {
                data = mLayoutImages[fullPath];
            }

            // this is because TEX1 has paths as upper but the filenames are lowercase
            if (data == null)
            {
                if (mLayoutImages.ContainsKey(fullPath.ToLower()))
                {
                    data = mLayoutImages[fullPath.ToLower()];
                }
            }

            if (data == null)
            {
                return;
            }

            EndianBinaryReader reader = new EndianBinaryReader(data);

            ImageContainerBase container = null;

            // no need for a default case since it will return if the format isnt supported
            switch (ext)
            {
            case ".tpl":
                container = new TPL(ref reader);
                break;

            case ".bti":
                container = new BTI(ref reader);
                break;

            case ".bclim":
                container = new BCLIM(ref reader);
                break;
            }

            if (container == null)
            {
                return;
            }

            ImageViewer viewer = new ImageViewer(texturesList.GetItemText(texturesList.SelectedItem));

            viewer.setImage(container.getImage(0));
            viewer.Show();
        }
예제 #12
0
        public static file load(Stream data)
        {
            //Too small
            if (data.Length < 0x10)
            {
                data.Close();
                return(new file {
                    type = formatType.unsupported
                });
            }

            BinaryReader input = new BinaryReader(data);
            uint         magic, length;

            switch (peek(input))
            {
            case 0x00010000: return(new file {
                    data = GfModel.load(data), type = formatType.model
                });

            case 0x00060000: return(new file {
                    data = GfMotion.loadAnim(input), type = formatType.anims
                });

            case 0x15041213: return(new file {
                    data = GfTexture.load(data), type = formatType.image
                });

            case 0x15122117:
                RenderBase.OModelGroup mdls = new RenderBase.OModelGroup();
                mdls.model.Add(GfModel.loadModel(data));
                return(new file {
                    data = mdls, type = formatType.model
                });
            }

            switch (getMagic(input, 5))
            {
            case "MODEL": return(new file {
                    data = DQVIIPack.load(data), type = formatType.container
                });
            }

            switch (getMagic(input, 4))
            {
            case "CGFX": return(new file {
                    data = CGFX.load(data), type = formatType.model
                });

            case "CRAG": return(new file {
                    data = GARC.load(data), type = formatType.container
                });

            case "darc": return(new file {
                    data = DARC.load(data), type = formatType.container
                });

            case "FPT0": return(new file {
                    data = FPT0.load(data), type = formatType.container
                });

            case "IECP":
                magic  = input.ReadUInt32();
                length = input.ReadUInt32();
                return(load(new MemoryStream(LZSS.decompress(data, length))));

            case "NLK2":
                data.Seek(0x80, SeekOrigin.Begin);
                return(new file
                {
                    data = CGFX.load(data),
                    type = formatType.model
                });

            case "SARC": return(new file {
                    data = SARC.load(data), type = formatType.container
                });

            case "SMES": return(new file {
                    data = NLP.loadMesh(data), type = formatType.model
                });

            case "Yaz0":
                magic  = input.ReadUInt32();
                length = IOUtils.endianSwap(input.ReadUInt32());
                data.Seek(8, SeekOrigin.Current);
                return(load(new MemoryStream(Yaz0.decompress(data, length))));

            case "zmdl": return(new file {
                    data = ZMDL.load(data), type = formatType.model
                });

            case "ztex": return(new file {
                    data = ZTEX.load(data), type = formatType.texture
                });
            }

            //Check if is a BCLIM or BFLIM file (header on the end)
            if (data.Length > 0x28)
            {
                data.Seek(-0x28, SeekOrigin.End);
                string clim = IOUtils.readStringWithLength(input, 4);
                if (clim == "CLIM" || clim == "FLIM")
                {
                    return new file {
                               data = BCLIM.load(data), type = formatType.image
                    }
                }
                ;
            }

            switch (getMagic(input, 3))
            {
            case "BCH":
                byte[] buffer = new byte[data.Length];
                input.Read(buffer, 0, buffer.Length);
                data.Close();
                return(new file
                {
                    data = BCH.load(new MemoryStream(buffer)),
                    type = formatType.model
                });

            case "DMP": return(new file {
                    data = DMP.load(data), type = formatType.image
                });
            }

            string magic2b = getMagic(input, 2);

            switch (magic2b)
            {
            case "AD": return(new file {
                    data = AD.load(data), type = formatType.model
                });

            case "BM": return(new file {
                    data = MM.load(data), type = formatType.model
                });

            case "BS": return(new file {
                    data = BS.load(data), type = formatType.anims
                });

            case "CM": return(new file {
                    data = CM.load(data), type = formatType.model
                });

            case "CP": return(new file {
                    data = CP.load(data), type = formatType.model
                });

            case "GR": return(new file {
                    data = GR.load(data), type = formatType.model
                });

            case "MM": return(new file {
                    data = MM.load(data), type = formatType.model
                });

            case "PC": return(new file {
                    data = PC.load(data), type = formatType.model
                });

            case "PT": return(new file {
                    data = PT.load(data), type = formatType.texture
                });
            }

            if (magic2b.Length == 2)
            {
                if ((magic2b[0] >= 'A' && magic2b[0] <= 'Z') &&
                    (magic2b[1] >= 'A' && magic2b[1] <= 'Z'))
                {
                    return(new file {
                        data = PkmnContainer.load(data), type = formatType.container
                    });
                }
            }

            //Compressions
            data.Seek(0, SeekOrigin.Begin);
            uint cmp = input.ReadUInt32();

            if ((cmp & 0xff) == 0x13)
            {
                cmp = input.ReadUInt32();
            }
            switch (cmp & 0xff)
            {
            case 0x11: return(load(new MemoryStream(LZSS_Ninty.decompress(data, cmp >> 8))));

            case 0x90:
                byte[] buffer  = BLZ.decompress(data);
                byte[] newData = new byte[buffer.Length - 1];
                Buffer.BlockCopy(buffer, 1, newData, 0, newData.Length);
                return(load(new MemoryStream(newData)));
            }

            data.Close();
            return(new file {
                type = formatType.unsupported
            });
        }
예제 #13
0
파일: Form1.cs 프로젝트: mhvuze/png2bclim
        public void makeBMP(string path)
        {
            PaletteBox.Visible = false;
            pictureBox1.Image  = null;
            CLIM bclim = BCLIM.analyze(path);

            if (bclim.Magic != 0x4D494C43)
            {
                System.Media.SystemSounds.Beep.Play();
                return;
            }
            // Label up.
            L_FileFormat.Text = bclim.FileFormat.ToString();
            L_Width.Text      = bclim.Width.ToString();
            L_Height.Text     = bclim.Height.ToString();
            L_TileWidth.Text  = bclim.TileWidth.ToString();
            L_TileHeight.Text = bclim.TileHeight.ToString();
            groupBox2.Visible = true;

            L_FileFormat.Text = bclim.FileFormat.ToString();

            // Interpret data.
            int f = bclim.FileFormat;

            if (f > 13)
            {
                System.Media.SystemSounds.Exclamation.Play();
                return;
            }

            Bitmap img = new Bitmap(1, 1);

            if (f == 7 && BitConverter.ToUInt16(bclim.Data, 0) == 2 && 0 == 0)
            {
                // PKM XY Format 7 (Color Palette)
                img = getIMG_XY7(bclim);
            }
            else if (f == 10 || f == 11)
            {
                img = getIMG_ETC(bclim); // etc1
            }
            else
            {
                img = getIMG(bclim);
            }

            Rectangle cropRect = new Rectangle(0, 0, bclim.Width, bclim.Height);
            Bitmap    CropBMP  = new Bitmap(cropRect.Width, cropRect.Height);

            using (Graphics g = Graphics.FromImage(CropBMP))
            {
                g.DrawImage(img,
                            new Rectangle(0, 0, CropBMP.Width, CropBMP.Height),
                            cropRect,
                            GraphicsUnit.Pixel);
            }
            if (CHK_NoCrop.Checked)
            {
                pictureBox1.Image = img;
            }
            else
            {
                pictureBox1.Image = CropBMP;
            }
            if (CHK_AutoSavePNG.Checked)
            {
                using (MemoryStream ms = new MemoryStream())
                {
                    //error will throw from here
                    CropBMP.Save(ms, ImageFormat.Png);
                    byte[] data = ms.ToArray();
                    File.WriteAllBytes(bclim.FilePath + "\\" + bclim.FileName + ".png", data);
                }
            }
        }