예제 #1
0
        public void Read(BinaryReader br, int offset)
        {
            location = offset;
            br.BaseStream.Position = offset;

            version       = br.ReadInt16();
            charCount     = br.ReadInt16();
            charTableSize = br.ReadInt16();
            charDataSize  = br.ReadInt16();

            //read in table
            for (int i = 0; i < charCount; i++)
            {
                var _charindex = br.ReadUInt16();
                var _fontindex = br.ReadInt16();
                int _offset    = br.ReadInt32();

                charDatum datum = new charDatum()
                {
                    characterCode = _charindex, fontIndex = _fontindex
                };

                BlockCharEntry Index = new BlockCharEntry()
                {
                    index = datum, dataOffset = _offset
                };

                charTable.Add(Index);
            }

            //read in data
            for (int i = 0; i < charTable.Count; i++)
            {
                CharacterData charinfo = new CharacterData();
                charinfo.Read(br, (location + charTable[i].dataOffset));

                charData.Add(charinfo);
            }
        }
예제 #2
0
        private int LoadFile(string filename)
        {
            List <int>           CharacterPointers = new List <int>();
            List <CharacterData> CharacterEntries  = new List <CharacterData>();

            List <int> kernlist = new List <int>();

            FileStream   fs = new FileStream(filename, FileMode.Open);
            BinaryReader br = new BinaryReader(fs);

            ms = new MemoryStream(br.ReadBytes((int)br.BaseStream.Length));
            fs.Close();
            br = new BinaryReader(ms);

            br.BaseStream.Position = 0x200;

            //Make sure this is a font file
            var fileMagic = br.ReadUInt32();

            if (fileMagic != 0xF0000001)
            {
                ms.Close();
                br.Close();
                return(1);
            }

            PackageFont tempfont = new PackageFont();

            tempfont.Name = filename.Substring(filename.LastIndexOf("\\") + 1);

            tempfont.HeaderVersion = (int)fileMagic;
            tempfont.ReadH2Header(br);

            br.BaseStream.Position = 0x3AC;

            int unk7 = br.ReadInt32();
            int unk8 = br.ReadInt32();

            int characterdataoffset = 0x40400 + (tempfont.CharacterCount * 0x10);

            //read characters
            for (int i = 0; i < tempfont.CharacterCount; i++)
            {
                CharacterData tempchar = new CharacterData();
                tempchar.Read(br, 0x40400 + (i * 0x10), true);

                br.BaseStream.Position = tempchar.OffsetH2;

                tempchar.compressedData = br.ReadBytes(tempchar.dataSize);

                CharacterEntries.Add(tempchar);
            }

            //read character indexes and match things up
            for (int i = 0; i < 65536; i++)
            {
                br.BaseStream.Position = 0x400 + (i * 4);

                int charindex = br.ReadInt32();

                FontCharacter tempfchar = new FontCharacter((ushort)i, CharacterEntries[charindex]);

                if (CharacterPointers.Contains(charindex))
                {
                    tempfchar.isdupe = true;
                }
                else
                {
                    CharacterPointers.Add(charindex);
                }

                tempfont.Characters.Add(tempfchar);
                tempfchar = null;
            }

            tempfont.H2File = filename;
            Fonts.Add(tempfont);


            br.Close();
            ms.Close();
            return(0);
        }