Ejemplo n.º 1
0
        public override async Task <ISprite> ReadAsync(BinaryReader binaryReader, string signature, string version)
        {
            var paletteReader = NegumContainer.Resolve <IPaletteReader>();
            var pcxReader     = NegumContainer.Resolve <IPcxReader>();

            var sprite = new SffSpriteV1
            {
                Signature             = signature,
                Version               = version,
                GroupCount            = binaryReader.ReadUInt32(),
                ImageCount            = binaryReader.ReadUInt32(),
                PosFirstSubFileOffset = binaryReader.ReadUInt32(), // Next Sub File Offset
                Length      = binaryReader.ReadUInt32(),           // Sub-Header Size
                PaletteType = binaryReader.ReadByte(),             // Shared Palette Byte; 0 - individual, 1 - shared
                Blank       = binaryReader.ReadBytes(3).ToUtf8String(),
                Comments    = binaryReader.ReadBytes(476).ToUtf8String()
            };

            for (var i = 0; i < sprite.ImageCount; ++i)
            {
                var subFile = await ReadSubFileAsync(pcxReader, binaryReader, i, paletteReader, sprite);

                sprite.AddSubFile(subFile);
            }

            return(sprite);
        }
Ejemplo n.º 2
0
        protected virtual async Task <ISpriteSubFile> ReadSubFileAsync(IPcxReader pcxReader, BinaryReader binaryReader,
                                                                       int index, IPaletteReader paletteReader, SffSpriteV1 sprite)
        {
            var subFile = new SpriteSubFileSffV1
            {
                DataOffset        = binaryReader.ReadUInt32(),
                DataLength        = binaryReader.ReadUInt32(),
                SpriteImageXAxis  = binaryReader.ReadUInt16(),
                SpriteImageYAxis  = binaryReader.ReadUInt16(),
                SpriteGroup       = binaryReader.ReadUInt16(),
                SpriteNumber      = binaryReader.ReadUInt16(),
                SpriteLinkedIndex = binaryReader.ReadUInt16(),
                SamePalette       = binaryReader.ReadByte(), // 1 - if the palette is the same as in previous sprite, 0 - new
                Comment           = binaryReader.ReadBytes(14).ToUtf8String()
            };

            if (subFile.SpriteLinkedIndex == 0)
            {
                binaryReader.BaseStream.Position -= 1;
                var count = (int)(subFile.DataOffset - binaryReader.BaseStream.Position);
                subFile.RawImage = binaryReader.ReadBytes(count);
            }

            if (index == 0) // TODO: Load only if palette available
            {
                var paletteData = binaryReader.ReadBytes(768);
                var palette     = await paletteReader.ReadAsync(paletteData);

                sprite.Palette = palette.Reverse();
            }

            if (subFile.RawImage != null)
            {
                var pcxDetails = new PcxDetails
                {
                    Stream  = new MemoryStream(subFile.RawImage),
                    Palette = subFile.SamePalette == 1 ? sprite.SpriteSubFiles.ElementAt(0).Palette : null
                };

                subFile.PcxImage = await pcxReader.ReadAsync(pcxDetails);
            }

            binaryReader.BaseStream.Position = subFile.DataOffset;

            return(subFile);
        }