Exemple #1
0
        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);
            }
        }
Exemple #2
0
        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
            }
        }