private static CmapTable ReadCmapTable(string path, FontReader reader, IReadOnlyDictionary <string, TableRecordEntry> entries) { if (entries.TryGetValue("cmap", out var cmapEntry)) { reader.Seek(cmapEntry.Offset); return(CmapTable.FromReader(reader)); } throw new Exception( $"Font {path} does not contain a Character To Glyph Index Mapping Table (cmap)"); }
internal Font(FontStreamReader reader, OffsetTable offsetTable) { this.reader = reader; this.offsetTable = offsetTable; HeadTable = HeadTable.Read(reader, offsetTable.Entries["head"]); if (offsetTable.Entries.ContainsKey("fpgm")) { fpgmTable = FpgmTable.Read(reader, offsetTable.Entries["fpgm"]); } cmapTable = CmapTable.Read(reader, offsetTable.Entries["cmap"]); locaTable = LocaTable.Read(this, reader, offsetTable.Entries["loca"]); glyfTable = GlyfTable.Read(reader, offsetTable.Entries["glyf"]); //TODO run fpgm }
/// <summary> /// look up glyph index from input codepoint /// </summary> /// <param name="codepoint"></param> /// <param name="nextCodepoint"></param> /// <returns></returns> public ushort LookupIndex(int codepoint, int nextCodepoint = 0) { return(CmapTable.LookupIndex(codepoint, nextCodepoint)); }
private TrueTypeFont(string source, OffsetTable offsetTable, IReadOnlyDictionary <string, TableRecordEntry> entries, CmapTable cmapTable, NameTable nameTable, KernTable kernTable) { this.Source = source; this.OffsetTable = offsetTable; this.TableRecordEntries = entries; this.CmapTable = cmapTable; this.NameTable = nameTable; this.KernTable = kernTable; }
public OpenTypeFont Deserialize(BinaryReader reader) { var font = new OpenTypeFont { SfntVersion = DataTypeConverter.ReadFixed(reader) }; if (!_supportedSfntVersions.Contains(font.SfntVersion)) { throw new NotSupportedException("Bad sfnt version."); } // Table directory var numberOfTables = DataTypeConverter.ReadUShort(reader); reader.BaseStream.Position += 3 * DataTypeLength.UShort; // searchRange, entrySelector, rangeShift var entryList = Enumerable.Range(0, numberOfTables).Select(i => { var entry = new TableDirectoryEntry { Tag = DataTypeConverter.ReadTag(reader) }; reader.BaseStream.Position += DataTypeLength.ULong; // checksum entry.Offset = DataTypeConverter.ReadULong(reader); entry.Length = DataTypeConverter.ReadULong(reader); return(entry); }).ToList(); // Tables font.Tables.AddRange( entryList.OrderBy(entry => entry.Priority).Select <TableDirectoryEntry, IOpenTypeFontTable>(entry => { switch (entry.Tag) { case "cmap": return(CmapTable.Deserialize(reader, entry.Offset)); case "head": return(HeadTable.Deserialize(reader, entry.Offset)); case "maxp": return(MaxpTable.Deserialize(reader, entry.Offset)); case "loca": return(LocaTable.Deserialize(reader, entry.Offset, font.Get <MaxpTable>().NumberOfGlyphs, font.Get <HeadTable>().LocaTableVersion)); case "glyf": return(GlyfTable.Deserialize(reader, entry.Offset, entry.Length, font.Get <LocaTable>())); case "hhea": return(HheaTable.Deserialize(reader, entry.Offset)); case "hmtx": return(HmtxTable.Deserialize(reader, entry.Offset, font.Get <HheaTable>().NumberOfHMetrics, font.Get <MaxpTable>().NumberOfGlyphs)); case "post": return(PostTable.Deserialize(reader, entry.Offset)); default: return(BinaryDataTable.Deserialize(reader, entry.Offset, entry.Length, entry.Tag)); } })); return(font); }
public void CollectUnicode(List <uint> unicodes) { CmapTable.CollectUnicode(unicodes); }
public ushort GetGlyphIndex(int codepoint) { return(CmapTable.GetGlyphIndex(codepoint, 0, out bool skipNextCodepoint)); }
// /// <summary> /// find glyph index by codepoint /// </summary> /// <param name="codepoint"></param> /// <param name="nextCodepoint"></param> /// <returns></returns> public ushort GetGlyphIndex(int codepoint, int nextCodepoint = 0) { return(CmapTable.GetGlyphIndex(codepoint, nextCodepoint)); }