public static void Save(WadFile wad, Stream stream) { if (stream == null) { throw new ArgumentNullException(nameof(stream)); } var writer = new BinaryWriter(stream); var startOffset = stream.Position; // Version writer.Write(Version); writer.Flush(); // Header // Valid texture count (number of entries) writer.Write((int)wad.Textures.Count(t => t is TextureByteIndexPaletteWithMipmaps || t is TextureByteIndexPalette)); // TextureLumpInfo offset position // Will be changed later var global_textureLumpInfo_offset_position = stream.Position; writer.Write((int)0); writer.Flush(); List <int> positions = new List <int>(); List <char[]> names = new List <char[]>(); List <int> sizes = new List <int>(); for (int i = 0; i < wad.Textures.Count; i++) { long position = stream.Position - startOffset; positions.Add((int)position); //TODO Save entry throw new NotImplementedException("Saving entry is not implemented yet."); long length = stream.Position - position - startOffset; sizes.Add((int)length); } var global_wadEntry_position = stream.Position; stream.Position = global_textureLumpInfo_offset_position; writer.Write((int)(global_wadEntry_position - startOffset)); writer.Flush(); stream.Position = global_wadEntry_position; for (int i = 0; i < positions.Count; i++) { var position = positions[i]; var name = names[i]; var size = sizes[i]; var entry = new WadEntry((int)(position - startOffset), size, WadEntry.TextureType, name); entry.Write(writer); } }
public static void Save(WadFile wad, Stream stream) { if (stream == null) { throw new ArgumentNullException(nameof(stream)); } var writer = new BinaryWriter(stream); var startOffset = stream.Position; // Version writer.Write(Version); writer.Flush(); // Header // Valid texture count (number of entries) writer.Write((int)wad.Textures.Count(t => t is Texture)); // TextureLumpInfo offset position // Will be changed later var global_textureLumpInfo_offset_position = stream.Position; writer.Write((int)0); writer.Flush(); List <int> positions = new List <int>(); List <char[]> names = new List <char[]>(); List <int> sizes = new List <int>(); for (int i = 0; i < wad.Textures.Count; i++) { long position = stream.Position - startOffset; positions.Add((int)position); TextureByteIndexPaletteWithMipmaps texture; TextureLumpInfo textureLump; var t = wad.Textures[i]; if (t is TextureByteIndexPalette) { if (t is TextureByteIndexPaletteWithMipmaps) { texture = (TextureByteIndexPaletteWithMipmaps)t; } else { var tbip = (TextureByteIndexPalette)t; texture = tbip.GenerateMipmaps(TextureLumpInfo.MipmapOffsetsLength); } } else { //throw new NotImplementedException("Textures without byte palette are not supported yet"); var tbip = TextureByteIndexPalette.CreateFromBitmap(t); texture = tbip.GenerateMipmaps(TextureLumpInfo.MipmapOffsetsLength); } textureLump = new TextureLumpInfo(texture); textureLump.Save(writer); long length = stream.Position - position - startOffset; sizes.Add((int)length); } var global_wadEntry_position = stream.Position; stream.Position = global_textureLumpInfo_offset_position; writer.Write((int)(global_wadEntry_position - startOffset)); writer.Flush(); stream.Position = global_wadEntry_position; for (int i = 0; i < positions.Count; i++) { var position = positions[i]; var name = names[i]; var size = sizes[i]; var entry = new WadEntry((int)(position - startOffset), size, WadEntry.TextureType, name); entry.Write(writer); } }