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