// Read tileset represented by Outpost 2 specific format into memory // After Reading into memory, reformats into standard 8 bit indexed bitmap before returning results public static BitmapFile ReadCustomTileset(Stream streamToRead) { using (BinaryReader reader = new BinaryReader(streamToRead, System.Text.Encoding.UTF8, true)) { SectionHeader fileSignature = new SectionHeader(reader); ValidateFileSignatureHeader(fileSignature); TilesetHeader tilesetHeader = new TilesetHeader(reader); tilesetHeader.Validate(); PpalHeader ppalHeader = new PpalHeader(reader); ppalHeader.Validate(); SectionHeader paletteHeader = new SectionHeader(reader); ValidatePaletteHeader(paletteHeader); BitmapFile bitmapFile = new BitmapFile((ushort)tilesetHeader.bitDepth, tilesetHeader.pixelWidth, (int)tilesetHeader.pixelHeight * -1); for (int i = 0; i < bitmapFile.palette.Length; ++i) { bitmapFile.palette[i] = new Color(reader); } SectionHeader pixelHeader = new SectionHeader(reader); ValidatePixelHeader(pixelHeader, tilesetHeader.pixelHeight); reader.Read(bitmapFile.pixels, 0, bitmapFile.pixels.Length); // Tilesets store red and blue Color values swapped from standard Bitmap file format bitmapFile.SwapRedAndBlue(); ValidateTileset(bitmapFile); return(bitmapFile); } }
// Write tileset in Outpost 2's custom bitmap format. // To write tileset in standard bitmap format, use BitmapFile::WriteIndexed public static void WriteCustomTileset(Stream streamToWrite, BitmapFile tileset) { tileset = tileset.Clone(); ValidateTileset(tileset); // OP2 Custom Tileset assumes a positive height and TopDown Scan Line (Contradicts Windows Bitmap File Format) if (tileset.GetScanLineOrientation() == ScanLineOrientation.BottomUp) { tileset.InvertScanLines(); } uint absoluteHeight = (uint)tileset.AbsoluteHeight(); SectionHeader fileSignature = new SectionHeader(TagFileSignature, CalculatePbmpSectionSize(absoluteHeight)); TilesetHeader tilesetHeader = TilesetHeader.Create(absoluteHeight / TilesetHeader.DefaultPixelHeightMultiple); PpalHeader ppalHeader = PpalHeader.Create(); SectionHeader paletteHeader = new SectionHeader(TilesetCommon.DefaultTagData, TilesetCommon.DefaultPaletteHeaderSize); SwapPaletteRedAndBlue(tileset.palette); SectionHeader pixelHeader = new SectionHeader(TilesetCommon.DefaultTagData, CalculatePixelHeaderLength(absoluteHeight)); using (BinaryWriter writer = new BinaryWriter(streamToWrite, System.Text.Encoding.UTF8, true)) { fileSignature.Serialize(writer); tilesetHeader.Serialize(writer); ppalHeader.Serialize(writer); paletteHeader.Serialize(writer); for (int i = 0; i < tileset.palette.Length; ++i) { tileset.palette[i].Serialize(writer); } pixelHeader.Serialize(writer); writer.Write(tileset.pixels); } }