Пример #1
0
        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);
        }
Пример #2
0
        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);
            }
        }
Пример #3
0
        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());
        }