Exemplo n.º 1
0
        // 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);
            }
        }
Exemplo n.º 2
0
        // 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);
            }
        }