public XF(Stream input) { using (var br = new BinaryReaderX(input)) { //parse Header var header = br.ReadStruct <XpckHeader>(); header.CorrectHeader(); //parse FileEntries fileEntries = new List <FileEntry>(); for (int i = 0; i < header.fileEntries; i++) { fileEntries.Add(br.ReadStruct <FileEntry>()); } //get xi image BinaryWriterX xi = new BinaryWriterX(new MemoryStream()); br.BaseStream.Position = header.dataOffset + fileEntries[0].offset; xi.Write(br.ReadBytes(fileEntries[0].fileSize)); xi.BaseStream.Position = 0; //convert xi image to bmp bmp = IMGC.Load(xi.BaseStream); //get fnt.bin BinaryWriterX fnt = new BinaryWriterX(new MemoryStream()); br.BaseStream.Position = header.dataOffset + fileEntries[0].fileSize + 4; fnt.Write(br.ReadBytes(fileEntries[1].fileSize)); fnt.BaseStream.Position = 0; //decompress fnt.bin BinaryReaderX fntR = new BinaryReaderX(fnt.BaseStream); fntR.BaseStream.Position = 0x28; byte[] buf1 = ImgcSupport.Decomp(fntR); while (fnt.BaseStream.Position % 4 != 0) { fntR.ReadByte(); } byte[] buf2 = ImgcSupport.Decomp(fntR); while (fnt.BaseStream.Position % 4 != 0) { fntR.ReadByte(); } byte[] buf3 = ImgcSupport.Decomp(fntR); using (BinaryReaderX br2 = new BinaryReaderX(new MemoryStream(buf1))) lstCharSizeInfo = Enumerable.Range(0, buf1.Length / 4).Select(_ => br2.ReadStruct <CharSizeInfo>()).ToList(); using (BinaryReaderX br2 = new BinaryReaderX(new MemoryStream(buf2))) dicGlyphLarge = Enumerable.Range(0, buf2.Length / 8).Select(i => br2.ReadStruct <CharacterMap>()).ToDictionary(x => x.code_point); using (BinaryReaderX br2 = new BinaryReaderX(new MemoryStream(buf3))) dicGlyphSmall = Enumerable.Range(0, buf3.Length / 8).Select(i => br2.ReadStruct <CharacterMap>()).ToDictionary(x => x.code_point); } }
public XF(Stream input) { using (var br = new BinaryReaderX(input)) { //load files xpck = new XPCK(input); //get xi image to bmp xi = new IMGC(xpck.Files[0].FileData); bmp = xi.Image; //decompress fnt.bin var tempCharSizeInfo = new List <CharSizeInfo>(); var largeChars = new List <CharacterMap>(); var smallChars = new List <CharacterMap>(); using (var fntR = new BinaryReaderX(xpck.Files[1].FileData, true)) { Header = fntR.ReadType <XFHeader>(); fntR.BaseStream.Position = Header.table0Offset << 2; t0Comp = (Level5.Method)(fntR.ReadInt32() & 0x7); fntR.BaseStream.Position -= 4; tempCharSizeInfo = new BinaryReaderX(new MemoryStream(Level5.Decompress(fntR.BaseStream))).ReadMultiple <CharSizeInfo>(Header.table0EntryCount); fntR.BaseStream.Position = Header.table1Offset << 2; t1Comp = (Level5.Method)(fntR.ReadInt32() & 0x7); fntR.BaseStream.Position -= 4; largeChars = new BinaryReaderX(new MemoryStream(Level5.Decompress(fntR.BaseStream))).ReadMultiple <CharacterMap>(Header.table1EntryCount); fntR.BaseStream.Position = Header.table2Offset << 2; t2Comp = (Level5.Method)(fntR.ReadInt32() & 0x7); fntR.BaseStream.Position -= 4; smallChars = new BinaryReaderX(new MemoryStream(Level5.Decompress(fntR.BaseStream))).ReadMultiple <CharacterMap>(Header.table2EntryCount); } Textures = new List <Bitmap>(); var bmpInfo = new BitmapInfo(bmp); Textures.Add(bmpInfo.CreateChannelBitmap(BitmapInfo.Channel.Red)); Textures.Add(bmpInfo.CreateChannelBitmap(BitmapInfo.Channel.Green)); Textures.Add(bmpInfo.CreateChannelBitmap(BitmapInfo.Channel.Blue)); //Add Characters Characters = new List <XFCharacter>(); foreach (var glyph in largeChars) { var newChar = new XFCharacter { Character = glyph.code_point, TextureID = (int)glyph.ColorChannel, GlyphX = (int)glyph.ImageOffsetX, GlyphY = (int)glyph.ImageOffsetY, GlyphWidth = tempCharSizeInfo[(int)glyph.CharSizeInfoIndex].glyph_width, GlyphHeight = tempCharSizeInfo[(int)glyph.CharSizeInfoIndex].glyph_height, CharacterWidth = (int)glyph.CharWidth, OffsetX = tempCharSizeInfo[(int)glyph.CharSizeInfoIndex].offset_x, OffsetY = tempCharSizeInfo[(int)glyph.CharSizeInfoIndex].offset_y, }; Characters.Add(newChar); } /*foreach (var glyph in smallChars) * Characters.Add(new XFCharacter * { * Character = glyph.code_point, * TextureID = (int)glyph.ColorChannel, * GlyphX = (int)glyph.ImageOffsetX, * GlyphY = (int)glyph.ImageOffsetY, * GlyphWidth = tempCharSizeInfo[(int)glyph.CharSizeInfoIndex].glyph_width, * GlyphHeight = tempCharSizeInfo[(int)glyph.CharSizeInfoIndex].glyph_height, * CharacterWidth = (int)glyph.CharWidth, * OffsetX = tempCharSizeInfo[(int)glyph.CharSizeInfoIndex].offset_x, * OffsetY = tempCharSizeInfo[(int)glyph.CharSizeInfoIndex].offset_y, * });*/ //Add Textures } }