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); }
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); }