protected override TrueTypeFontTable ReadTable(string tag, uint length, TrueTypeTableEntryList list, BigEndianReader reader) { if (tag == TrueTypeTableNames.GlyphData) { throw new NotImplementedException("Not done the transformation yet"); } else if (tag == TrueTypeTableNames.LocationIndex) { throw new NotImplementedException("Not done the transformation yet"); } else { return(base.ReadTable(tag, length, list, reader)); } }
protected override TrueTypeFontTable ReadTable(string tag, uint length, TrueTypeTableEntryList list, BigEndianReader reader) { var table = list[tag] as WoffTableEntry; if (table.CompressedLength == table.Length) { //just copy the data var pos = reader.Position; var data = reader.Read((int)length); table.SetDecompressedData(data); //and return to the original reader.Position = pos; return(base.ReadTable(tag, length, list, reader)); } if (table.DecompressedData == null) { using (var ms = new System.IO.MemoryStream()) { DecompressTable(ms, reader, table, length); table.SetDecompressedData(ms.ToArray()); ms.Position = 0; using (var newReader = new BigEndianReader(ms)) { var read = base.ReadTable(tag, length, list, newReader); table.SetTable(read); } } } else { using (var ms = new System.IO.MemoryStream(table.DecompressedData)) { using (var newReader = new BigEndianReader(ms)) { var read = base.ReadTable(tag, length, list, newReader); table.SetTable(read); } } } return(table.Table); }
/// <summary> /// Performs the actual reading and loading of the file with the BigEndian reader /// </summary> /// <param name="reader"></param> /// <param name="fullpath"></param> /// <returns></returns> private static TTFRef DoLoadRef(BigEndianReader reader, string fullpath) { TrueTypeHeader head; if (TrueTypeHeader.TryReadHeader(reader, out head) == false) { return(null); } TrueTypeTableEntryList list = new TrueTypeTableEntryList(); bool hasOs2 = false; bool hasFHead = false; bool hasName = false; for (int i = 0; i < head.NumberOfTables; i++) { TrueTypeTableEntry dir = new TrueTypeTableEntry(); dir.Read(reader); list.Add(dir); if (dir.Tag == TrueTypeTableNames.WindowsMetrics) { hasOs2 = true; } else if (dir.Tag == TrueTypeTableNames.FontHeader) { hasFHead = true; } else if (dir.Tag == TrueTypeTableNames.NamingTable) { hasName = true; } } TrueTypeTableFactory fact = (head.Version as TrueTypeVersionReader).GetTableFactory(); SubTables.NamingTable ntable = null; if (hasName) { ntable = fact.ReadTable(TrueTypeTableNames.NamingTable, list, reader) as SubTables.NamingTable; } else { throw new ArgumentNullException("The required '" + TrueTypeTableNames.NamingTable + "' is not present in this font file. The OpenType file is corrupt"); } //if (fhead == null) // throw new ArgumentNullException("The required '" + FontHeaderTable + "' is not present in this font file. The OpenType file is corrupt"); TTFRef ttfref = new TTFRef(fullpath); NameEntry entry; int FamilyNameID = 1; if (ntable.Names.TryGetEntry(FamilyNameID, out entry)) { ttfref.FamilyName = entry.ToString(); } if (hasOs2) { SubTables.OS2Table os2table = fact.ReadTable(TrueTypeTableNames.WindowsMetrics, list, reader) as SubTables.OS2Table; ttfref.FontRestrictions = os2table.FSType; ttfref.FontWidth = os2table.WidthClass; ttfref.FontWeight = os2table.WeightClass; ttfref.FontSelection = os2table.Selection; } else if (hasFHead) { SubTables.FontHeader fhead = fact.ReadTable(TrueTypeTableNames.FontHeader, list, reader) as SubTables.FontHeader; var mac = fhead.MacStyle; ttfref.FontRestrictions = FontRestrictions.InstallableEmbedding; ttfref.FontWeight = WeightClass.Normal; if ((mac & FontStyleFlags.Condensed) > 0) { ttfref.FontWidth = WidthClass.Condensed; } else if ((mac & FontStyleFlags.Extended) > 0) { ttfref.FontWidth = WidthClass.Expanded; } ttfref.FontSelection = 0; if ((mac & FontStyleFlags.Italic) > 0) { ttfref.FontSelection |= FontSelection.Italic; } if ((mac & FontStyleFlags.Bold) > 0) { ttfref.FontSelection |= FontSelection.Bold; ttfref.FontWeight = WeightClass.Bold; } if ((mac & FontStyleFlags.Outline) > 0) { ttfref.FontSelection |= FontSelection.Outlined; } if ((mac & FontStyleFlags.Underline) > 0) { ttfref.FontSelection |= FontSelection.Underscore; } } else { throw new ArgumentNullException("The required '" + TrueTypeTableNames.WindowsMetrics + "' or '" + TrueTypeTableNames.FontHeader + " are not present in this font file. The OpenType file is corrupt"); } return(ttfref); }