private static TrueTypeFont ParseTables(decimal version, IReadOnlyDictionary <string, TrueTypeHeaderTable> tables, TrueTypeDataBytes data) { var isPostScript = tables.ContainsKey(TrueTypeHeaderTable.Cff); var tableRegister = new TableRegister(); if (!tables.TryGetValue(TrueTypeHeaderTable.Head, out var table)) { throw new InvalidOperationException($"The {TrueTypeHeaderTable.Head} table is required."); } // head tableRegister.HeaderTable = HeaderTable.Load(data, table); if (!tables.TryGetValue(TrueTypeHeaderTable.Hhea, out var hHead)) { throw new InvalidOperationException("The horizontal header table is required."); } // hhea tableRegister.HorizontalHeaderTable = HorizontalHeaderTable.Load(data, hHead); if (!tables.TryGetValue(TrueTypeHeaderTable.Maxp, out var maxHeaderTable)) { throw new InvalidOperationException("The maximum profile table is required."); } // maxp tableRegister.MaximumProfileTable = BasicMaximumProfileTable.Load(data, maxHeaderTable); // post if (tables.TryGetValue(TrueTypeHeaderTable.Post, out var postscriptHeaderTable)) { tableRegister.PostScriptTable = PostScriptTable.Load(data, table, tableRegister.MaximumProfileTable); } if (!isPostScript) { if (!tables.TryGetValue(TrueTypeHeaderTable.Loca, out var indexToLocationHeaderTable)) { throw new InvalidOperationException("The location to index table is required for non-PostScript fonts."); } // loca tableRegister.IndexToLocationTable = IndexToLocationTable.Load(data, indexToLocationHeaderTable, tableRegister); if (!tables.TryGetValue(TrueTypeHeaderTable.Glyf, out var glyphHeaderTable)) { throw new InvalidOperationException("The glpyh table is required for non-PostScript fonts."); } // glyf tableRegister.GlyphDataTable = GlyphDataTable.Load(data, glyphHeaderTable, tableRegister); OptionallyParseTables(tables, data, tableRegister); } return(new TrueTypeFont(version, tables, tableRegister)); }
private static void OptionallyParseTables(IReadOnlyDictionary <string, TrueTypeHeaderTable> tables, TrueTypeDataBytes data, TableRegister tableRegister) { // cmap if (tables.TryGetValue(TrueTypeHeaderTable.Cmap, out var cmap)) { tableRegister.CMapTable = CMapTable.Load(data, cmap, tableRegister); } // hmtx if (tables.TryGetValue(TrueTypeHeaderTable.Hmtx, out var hmtxHeaderTable)) { tableRegister.HorizontalMetricsTable = HorizontalMetricsTable.Load(data, hmtxHeaderTable, tableRegister); } // name if (tables.TryGetValue(TrueTypeHeaderTable.Name, out var nameHeaderTable)) { // TODO: Not important } // os2 // kern }