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); }
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"; }
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; }
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); }
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; }
// 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; }
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; } }
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); }
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"; }
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); } }
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(); }
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 }); }
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); } } }