private FontTables[] readFontFile(string filePath) { using (BinaryReaderV binred = new BinaryReaderV(filePath)) { fileLength = (int)binred.BaseStream.Length; header = binred.ReadBigEndUInt32(); if (header != 0x4f54544f && header != 0x00010000) //cff or ttf { return(null); } numTables = binred.ReadBigEndUInt16(); searchRange = binred.ReadBigEndUInt16(); //? entrySelector = binred.ReadBigEndUInt16(); //? rangeShift = binred.ReadBigEndUInt16(); //? FontTables[] fontTables = new FontTables[numTables]; for (int i = 0; i < numTables; i++) { FontTables ft = new FontTables(); string tagName = Encoding.ASCII.GetString(binred.ReadBytes(4)); ft.tag = tagName; ft.checkSum = binred.ReadBigEndUInt32(); ft.offset = binred.ReadBigEndUInt32(); ft.length = binred.ReadBigEndUInt32(); long hold = binred.BaseStream.Position; binred.BaseStream.Position = ft.offset; byte[] bb = binred.ReadBytes((int)ft.length); ft.data = bb; binred.BaseStream.Position = hold; fontTables[i] = ft; fontDict.Add(ft.tag, ft); } //readCmap(binred, fontDict["cmap"]); return(fontTables);//.OrderBy(p => p.offset).ToArray(); } }
private void readCmap(BinaryReaderV binred, FontTables cmapTable) { binred.BaseStream.Position = cmapTable.offset; CMap cmap = new CMap(); cmap.version = binred.ReadBigEndUInt16(); cmap.numTables = binred.ReadBigEndUInt16(); cmap.encodingRecs = new EncodingRecord[cmap.numTables]; for (int i = 0; i < cmap.numTables; i++) { EncodingRecord er = new EncodingRecord(); er.platformID = binred.ReadBigEndUInt16(); er.encodingID = binred.ReadBigEndUInt16(); er.offset = binred.ReadBigEndUInt32(); } }