private Texture PopulateTexture(int i, BigEndianBinaryReader f, TexHeaderMap textureHeader) { Texture texture = new Texture(); f.BaseStream.Seek(textureHeader.FileListOffset + (4 * i) + (12 * i), SeekOrigin.Begin); texture.BitsPerPixel = f.ReadInt32() == 5 ? 8 : 4; // TODO documentation texture.Number = f.ReadInt32(); texture.Unk08 = f.ReadInt32(); texture.InfoOffset = f.ReadInt32(); f.BaseStream.Seek(texture.InfoOffset, SeekOrigin.Begin); texture.Width = f.ReadInt16(); texture.Height = f.ReadInt16(); texture.Largest = f.ReadInt16(); texture.Unk06 = f.ReadInt16(); texture.DataOffset = f.ReadInt32(); f.BaseStream.Seek(textureHeader.FileInfoOffset + 4 + (8 * i), SeekOrigin.Begin); texture.PaletteOffset = f.ReadInt32(); byte[] nb = f.ReadAt(textureHeader.FileNamesOffset, (int)f.BaseStream.Length - textureHeader.FileNamesOffset); string name = System.Text.Encoding.UTF8.GetString(nb, 0, nb.Length).Split('\x00')[i]; texture.Name = name; texture.Binary = f.ReadAt(texture.DataOffset, texture.PaletteOffset - texture.DataOffset); texture.Palette = f.ReadAt(texture.PaletteOffset, texture.InfoOffset - texture.PaletteOffset); texture.Unswizzled = UnSwizzle(texture); texture.Bitmap = GetBitmapFromPalette(texture); Console.WriteLine(texture); return(texture); }
public List <Texture> ParseFile(string filename) { using (BigEndianBinaryReader reader = new BigEndianBinaryReader(File.Open(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))) { TexHeaderMap textureHeader = this.PopulateHeaderMap(reader); if (textureHeader.FileExtension != "XET.") { throw new InvalidDataException("Invalid file extension!"); } Console.WriteLine("Image count:" + textureHeader.FileCount.ToString()); List <Texture> images = new List <Texture>(); for (int i = 0; i < textureHeader.FileCount; i++) { images.Add(this.PopulateTexture(i, reader, textureHeader)); } return(images); } }
public static void SaveTexFile(List <Texture> images) { TexHeaderMap header = new TexHeaderMap((short)images.Count); List <byte> file = Enumerable.Repeat((byte)0x00, 48).ToList(); for (int i = 0; i < images.Count; i++) { Texture texture = images[i]; texture.DataOffset = file.Count; Console.WriteLine(texture.Binary.Length); file.AddRange(texture.Binary.ToList()); texture.PaletteOffset = file.Count; file.AddRange(texture.Palette.ToList()); texture.InfoOffset = file.Count; file.AddRange(BitConverter.GetBytes((short)texture.Width).ToList()); file.AddRange(BitConverter.GetBytes((short)texture.Height).ToList()); file.AddRange(BitConverter.GetBytes(texture.Largest).ToList()); file.AddRange(new List <byte> { 0x00, 0x00 }); file.AddRange(BitConverter.GetBytes(texture.DataOffset).ToList()); file.AddRange(new List <byte> { 0x00, 0x00, 0x00, 0x00 }); } header.FileListOffset = file.Count; for (int i = 0; i < images.Count; i++) { Texture texture = images[i]; file.AddRange(BitConverter.GetBytes(texture.BitsPerPixel == 8 ? 5 : 4).ToList()); file.AddRange(BitConverter.GetBytes(i).ToList()); file.AddRange(BitConverter.GetBytes(0).ToList()); file.AddRange(BitConverter.GetBytes(texture.InfoOffset).ToList()); } header.FileInfoOffset = file.Count; for (int i = 0; i < images.Count; i++) { Texture texture = images[i]; file.AddRange(BitConverter.GetBytes((short)3).ToList()); file.AddRange(BitConverter.GetBytes((short)(texture.BitsPerPixel == 8 ? 8447 : 767)).ToList()); file.AddRange(BitConverter.GetBytes(texture.PaletteOffset).ToList()); } if (file.Count % 16 != 0) { file.AddRange(Enumerable.Repeat((byte)0x00, 16 - (file.Count % 16)).ToList()); } header.FileNamesOffset = file.Count; for (int i = 0; i < images.Count; i++) { Texture texture = images[i]; file.AddRange(System.Text.Encoding.UTF8.GetBytes(texture.Name).ToList()); if (i < images.Count) { file.Add(0); } } if (file.Count % 16 != 0) { file.AddRange(Enumerable.Repeat((byte)0x00, 16 - (file.Count % 16)).ToList()); } file.RemoveRange(0, 4); file.InsertRange(0, System.Text.Encoding.UTF8.GetBytes(header.FileExtension).ToList()); file.RemoveRange(4, 4); file.InsertRange(4, BitConverter.GetBytes(1).ToList()); file.RemoveRange(8, 2); file.InsertRange(8, BitConverter.GetBytes((short)header.FileCount).ToList()); file.RemoveRange(10, 2); file.InsertRange(10, BitConverter.GetBytes((short)header.FileCountB).ToList()); file.RemoveRange(16, 4); file.InsertRange(16, BitConverter.GetBytes(header.FileListOffset).ToList()); file.RemoveRange(20, 4); file.InsertRange(20, BitConverter.GetBytes(header.FileInfoOffset).ToList()); file.RemoveRange(24, 4); file.InsertRange(24, BitConverter.GetBytes(header.FileNamesOffset).ToList()); //IMPLEMENT PADDING HERE??? File.WriteAllBytes("__TEST.xet", file.ToArray()); }