Esempio n. 1
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);
        }
Esempio n. 2
0
        public async Task <IFont> ReadAsync(BinaryReader binaryReader, string signature, string version)
        {
            var font = new FontV0
            {
                Signature        = signature,
                Version          = version,
                SpriteDataOffset = binaryReader.ReadUInt32(),
                SpriteDataLength = binaryReader.ReadInt32(),
                TextDataOffset   = binaryReader.ReadUInt32(),
                TextDataLength   = binaryReader.ReadInt32(),
                Comment          = binaryReader.ReadBytes(40).ToUtf8String()
            };

            if (font.SpriteDataLength > 0)
            {
                binaryReader.BaseStream.Seek(font.SpriteDataOffset, SeekOrigin.Begin);

                var imageData   = binaryReader.ReadBytes(font.SpriteDataLength);
                var imageStream = new MemoryStream(imageData);

                var ctx = new PcxDetails
                {
                    Stream = imageStream
                };

                font.Image = await NegumContainer.Resolve <IPcxReader>().ReadAsync(ctx);
            }

            if (font.TextDataLength > 0)
            {
                binaryReader.BaseStream.Seek(font.TextDataOffset, SeekOrigin.Begin);

                var configurationDefinitionBytes = binaryReader.ReadBytes(font.TextDataLength);
                var configurationText            = configurationDefinitionBytes.ToUtf8String();

                var stream  = new MemoryStream(configurationText.ToByteArray());
                var config  = NegumContainer.Resolve <IConfigurationReader>().ReadAsync(stream).Result;
                var manager = (IFontManager)NegumContainer.Resolve <IFontManager>().UseConfiguration(config);

                this.ProcessConfiguration(font, manager);
            }

            return(font);
        }