static T ReadTableIfExists <T>(TableEntryCollection tables, BinaryReader reader, T resultTable) where T : TableEntry { TableEntry found; if (tables.TryGetTable(resultTable.Name, out found)) { //found table name //check if we have read this table or not if (found is UnreadTableEntry) { //set header before actal read resultTable.Header = found.Header; resultTable.LoadDataFrom(reader); //then reaplce tables.ReplaceTable(resultTable); return(resultTable); } else { //we have read this table throw new NotSupportedException(); } } //not found return(null); }
internal PreviewFontInfo ReadPreviewFontInfo(TableEntryCollection tables, BinaryReader input) { var rd = new EntriesReaderHelper(tables, input); NameEntry nameEntry = rd.Read(new NameEntry()); OS2Table os2Table = rd.Read(new OS2Table()); //for preview, read ONLY script list from gsub and gpos (set OnlyScriptList). Meta metaTable = rd.Read(new Meta()); GSUB gsub = rd.Read(new GSUB() { OnlyScriptList = true }); GPOS gpos = rd.Read(new GPOS() { OnlyScriptList = true }); Cmap cmap = rd.Read(new Cmap()); //gsub and gpos contains actual script_list that are in the typeface Languages langs = new Languages(); langs.Update(os2Table, metaTable, cmap, gsub, gpos); return(new PreviewFontInfo( nameEntry, os2Table, langs)); }
/// <summary> /// read only name entry /// </summary> /// <param name="stream"></param> /// <returns></returns> public PreviewFontInfo ReadPreview(Stream stream) { var little = BitConverter.IsLittleEndian; using (var input = new ByteOrderSwappingBinaryReader(stream)) { ushort majorVersion = input.ReadUInt16(); ushort minorVersion = input.ReadUInt16(); ushort tableCount = input.ReadUInt16(); ushort searchRange = input.ReadUInt16(); ushort entrySelector = input.ReadUInt16(); ushort rangeShift = input.ReadUInt16(); var tables = new TableEntryCollection(); for (int i = 0; i < tableCount; i++) { tables.AddEntry(new UnreadTableEntry(ReadTableHeader(input))); } NameEntry nameEntry = ReadTableIfExists(tables, input, new NameEntry()); OS2Table os2Table = ReadTableIfExists(tables, input, new OS2Table()); return(new PreviewFontInfo( nameEntry.FontName, nameEntry.FontSubFamily, Extensions.TypefaceExtensions.TranslatedOS2FontStyle(os2Table) )); } }
internal Typeface Read(BinaryReader reader) { //WOFF File //WOFFHeader File header with basic font type and version, along with offsets to metadata and private data blocks. //TableDirectory Directory of font tables, indicating the original size, compressed size and location of each table within the WOFF file. //FontTables The font data tables from the input sfnt font, compressed to reduce bandwidth requirements. //ExtendedMetadata An optional block of extended metadata, represented in XML format and compressed for storage in the WOFF file. //PrivateData An optional block of private data for the font designer, foundry, or vendor to use. _header = ReadWOFFHeader(reader); if (_header == null) { #if DEBUG System.Diagnostics.Debug.WriteLine("can't read "); #endif return(null); //notify user too } // WoffTableDirectory[] woffTableDirs = ReadTableDirectories(reader); if (woffTableDirs == null) { return(null); } // //try read each compressed table if (DecompressHandler == null) { if (WoffDefaultZlibDecompressFunc.DecompressHandler != null) { DecompressHandler = WoffDefaultZlibDecompressFunc.DecompressHandler; } else { #if DEBUG System.Diagnostics.Debug.WriteLine("no Zlib DecompressHandler "); #endif return(null); //notify user too } } TableEntryCollection tableEntryCollection = CreateTableEntryCollection(woffTableDirs); using (MemoryStream decompressStream = new MemoryStream()) { if (Extract(reader, woffTableDirs, decompressStream)) { using (ByteOrderSwappingBinaryReader reader2 = new ByteOrderSwappingBinaryReader(decompressStream)) { decompressStream.Position = 0; OpenFontReader openFontReader = new OpenFontReader(); return(openFontReader.ReadTableEntryCollection(tableEntryCollection, reader2)); } } } return(null); }
internal PreviewFontInfo ReadPreviewFontInfo(TableEntryCollection tables, BinaryReader input) { NameEntry nameEntry = ReadTableIfExists(tables, input, new NameEntry()); OS2Table os2Table = ReadTableIfExists(tables, input, new OS2Table()); return(new PreviewFontInfo( nameEntry.TypographicFamilyName ?? nameEntry.FontName, nameEntry.TypographyicSubfamilyName ?? nameEntry.FontSubFamily, os2Table.usWeightClass, Extensions.TypefaceExtensions.TranslatedOS2FontStyle(os2Table))); }
public Typeface Read(Stream stream, int streamStartOffset = 0, ReadFlags readFlags = ReadFlags.Full) { //bool little = BitConverter.IsLittleEndian; if (streamStartOffset > 0) { //eg. for ttc stream.Seek(streamStartOffset, SeekOrigin.Begin); } using (var input = new ByteOrderSwappingBinaryReader(stream)) { ushort majorVersion = input.ReadUInt16(); ushort minorVersion = input.ReadUInt16(); if (KnownFontFiles.IsTtcf(majorVersion, minorVersion)) { //this font stream is 'The Font Collection' //To read content of ttc=> one must specific the offset //so use read preview first=> you will know that what are inside the ttc. return(null); } else if (KnownFontFiles.IsWoff(majorVersion, minorVersion)) { //check if we enable woff or not WebFont.WoffReader woffReader = new WebFont.WoffReader(); input.BaseStream.Position = 0; return(woffReader.Read(input)); } else if (KnownFontFiles.IsWoff2(majorVersion, minorVersion)) { //check if we enable woff2 or not WebFont.Woff2Reader woffReader = new WebFont.Woff2Reader(); input.BaseStream.Position = 0; return(woffReader.Read(input)); } //----------------------------------------------------------------- ushort tableCount = input.ReadUInt16(); ushort searchRange = input.ReadUInt16(); ushort entrySelector = input.ReadUInt16(); ushort rangeShift = input.ReadUInt16(); //------------------------------------------------------------------ var tables = new TableEntryCollection(); for (int i = 0; i < tableCount; i++) { tables.AddEntry(new UnreadTableEntry(ReadTableHeader(input))); } //------------------------------------------------------------------ return(ReadTableEntryCollection(tables, input)); } }
static TableEntryCollection CreateTableEntryCollection(WoffTableDirectory[] woffTableDirs) { TableEntryCollection tableEntryCollection = new TableEntryCollection(); for (int i = 0; i < woffTableDirs.Length; ++i) { WoffTableDirectory woffTableDir = woffTableDirs[i]; tableEntryCollection.AddEntry( new UnreadTableEntry( new TableHeader(woffTableDir.tag, woffTableDir.origChecksum, (uint)woffTableDir.ExpectedStartAt, woffTableDir.origLength))); } return(tableEntryCollection); }
PreviewFontInfo ReadActualFontPreview(ByteOrderSwappingBinaryReader input, bool skipVersionData) { if (!skipVersionData) { ushort majorVersion = input.ReadUInt16(); ushort minorVersion = input.ReadUInt16(); } ushort tableCount = input.ReadUInt16(); ushort searchRange = input.ReadUInt16(); ushort entrySelector = input.ReadUInt16(); ushort rangeShift = input.ReadUInt16(); var tables = new TableEntryCollection(); for (int i = 0; i < tableCount; i++) { tables.AddEntry(new UnreadTableEntry(ReadTableHeader(input))); } return(ReadPreviewFontInfo(tables, input)); }
internal PreviewFontInfo ReadPreviewFontInfo(TableEntryCollection tables, BinaryReader input) { NameEntry nameEntry = ReadTableIfExists(tables, input, new NameEntry()); OS2Table os2Table = ReadTableIfExists(tables, input, new OS2Table()); return(new PreviewFontInfo( nameEntry.FontName, nameEntry.FontSubFamily, nameEntry.TypographicFamilyName, nameEntry.TypographyicSubfamilyName, os2Table.usWeightClass, Extensions.TypefaceExtensions.TranslatedOS2FontStyle(os2Table)) { PostScriptName = nameEntry.PostScriptName, UniqueFontIden = nameEntry.UniqueFontIden, VersionString = nameEntry.VersionString, UnicodeRange1 = os2Table.ulUnicodeRange1, UnicodeRange2 = os2Table.ulUnicodeRange2, UnicodeRange3 = os2Table.ulUnicodeRange3, UnicodeRange4 = os2Table.ulUnicodeRange4, }); }
/// <summary> /// read only name entry /// </summary> /// <param name="stream"></param> /// <returns></returns> public InstalledFont ReadPreview(Stream stream) { var little = BitConverter.IsLittleEndian; using (var input = new ByteOrderSwappingBinaryReader(stream)) { ushort majorVersion = input.ReadUInt16(); ushort minorVersion = input.ReadUInt16(); ushort tableCount = input.ReadUInt16(); ushort searchRange = input.ReadUInt16(); ushort entrySelector = input.ReadUInt16(); ushort rangeShift = input.ReadUInt16(); var tables = new TableEntryCollection(); for (int i = 0; i < tableCount; i++) { tables.AddEntry(new UnreadTableEntry(ReadTableHeader(input))); } //translate... NameEntry nameEntry = ReadTableIfExists(tables, input, new NameEntry()); return(new InstalledFont(nameEntry.FontName, nameEntry.FontSubFamily)); } }
internal PreviewFontInfo ReadPreviewFontInfo(TableEntryCollection tables, BinaryReader input) { var rd = new EntriesReaderHelper(tables, input); NameEntry nameEntry = rd.Read(new NameEntry()); OS2Table os2Table = rd.Read(new OS2Table()); //for preview, read ONLY script list from gsub and gpos (set OnlyScriptList). Meta metaTable = rd.Read(new Meta()); GSUB gsub = rd.Read(new GSUB() { OnlyScriptList = true }); GPOS gpos = rd.Read(new GPOS() { OnlyScriptList = true }); //gsub and gpos contains actual script_list that are in the typeface Languages langs = new Languages(); langs.Update(os2Table, metaTable, gsub, gpos); return(new PreviewFontInfo( nameEntry.FontName, nameEntry.FontSubFamily, nameEntry.TypographicFamilyName, nameEntry.TypographyicSubfamilyName, os2Table.usWeightClass, langs, Extensions.TypefaceExtensions.TranslatedOS2FontStyle(os2Table)) { PostScriptName = nameEntry.PostScriptName, UniqueFontIden = nameEntry.UniqueFontIden, VersionString = nameEntry.VersionString }); }
internal Typeface ReadTableEntryCollection(TableEntryCollection tables, BinaryReader input) { OS2Table os2Table = ReadTableIfExists(tables, input, new OS2Table()); NameEntry nameEntry = ReadTableIfExists(tables, input, new NameEntry()); Head header = ReadTableIfExists(tables, input, new Head()); MaxProfile maximumProfile = ReadTableIfExists(tables, input, new MaxProfile()); HorizontalHeader horizontalHeader = ReadTableIfExists(tables, input, new HorizontalHeader()); HorizontalMetrics horizontalMetrics = ReadTableIfExists(tables, input, new HorizontalMetrics(horizontalHeader.HorizontalMetricsCount, maximumProfile.GlyphCount)); //--- PostTable postTable = ReadTableIfExists(tables, input, new PostTable()); CFFTable ccf = ReadTableIfExists(tables, input, new CFFTable()); //-------------- Cmap cmaps = ReadTableIfExists(tables, input, new Cmap()); GlyphLocations glyphLocations = ReadTableIfExists(tables, input, new GlyphLocations(maximumProfile.GlyphCount, header.WideGlyphLocations)); Glyf glyf = ReadTableIfExists(tables, input, new Glyf(glyphLocations)); //-------------- Gasp gaspTable = ReadTableIfExists(tables, input, new Gasp()); VerticalDeviceMetrics vdmx = ReadTableIfExists(tables, input, new VerticalDeviceMetrics()); //-------------- Kern kern = ReadTableIfExists(tables, input, new Kern()); //-------------- //advanced typography GDEF gdef = ReadTableIfExists(tables, input, new GDEF()); GSUB gsub = ReadTableIfExists(tables, input, new GSUB()); GPOS gpos = ReadTableIfExists(tables, input, new GPOS()); BASE baseTable = ReadTableIfExists(tables, input, new BASE()); COLR colr = ReadTableIfExists(tables, input, new COLR()); CPAL cpal = ReadTableIfExists(tables, input, new CPAL()); VerticalHeader vhea = ReadTableIfExists(tables, input, new VerticalHeader()); if (vhea != null) { VerticalMetrics vmtx = ReadTableIfExists(tables, input, new VerticalMetrics(vhea.NumOfLongVerMetrics)); } //test math table MathTable mathtable = ReadTableIfExists(tables, input, new MathTable()); EBLCTable fontBmpTable = ReadTableIfExists(tables, input, new EBLCTable()); //--------------------------------------------- //about truetype instruction init //--------------------------------------------- Typeface typeface = null; bool isPostScriptOutline = false; if (glyf == null) { //check if this is cff table ? if (ccf == null) { //TODO: review here throw new NotSupportedException(); } //... //PostScript outline font isPostScriptOutline = true; typeface = new Typeface( nameEntry, header.Bounds, header.UnitsPerEm, ccf, horizontalMetrics, os2Table); } else { typeface = new Typeface( nameEntry, header.Bounds, header.UnitsPerEm, glyf.Glyphs, horizontalMetrics, os2Table); } //---------------------------- typeface.CmapTable = cmaps; typeface.KernTable = kern; typeface.GaspTable = gaspTable; typeface.MaxProfile = maximumProfile; typeface.HheaTable = horizontalHeader; //---------------------------- if (!isPostScriptOutline) { FpgmTable fpgmTable = ReadTableIfExists(tables, input, new FpgmTable()); //control values table CvtTable cvtTable = ReadTableIfExists(tables, input, new CvtTable()); if (cvtTable != null) { typeface.ControlValues = cvtTable._controlValues; } if (fpgmTable != null) { typeface.FpgmProgramBuffer = fpgmTable._programBuffer; } PrepTable propProgramTable = ReadTableIfExists(tables, input, new PrepTable()); if (propProgramTable != null) { typeface.PrepProgramBuffer = propProgramTable._programBuffer; } } //------------------------- typeface.LoadOpenFontLayoutInfo( gdef, gsub, gpos, baseTable, colr, cpal); //------------ //test { SvgTable svgTable = ReadTableIfExists(tables, input, new SvgTable()); if (svgTable != null) { typeface._svgTable = svgTable; } } typeface.PostTable = postTable; if (mathtable != null) { var mathGlyphLoader = new MathGlyphLoader(); mathGlyphLoader.LoadMathGlyph(typeface, mathtable); } #if DEBUG //test //int found = typeface.GetGlyphIndexByName("Uacute"); if (typeface.IsCffFont) { //optional typeface.UpdateAllCffGlyphBounds(); } #endif return(typeface); }
public TtfTypeface Read(Stream stream, ReadFlags readFlags = ReadFlags.Full) { var little = BitConverter.IsLittleEndian; using (var input = new ByteOrderSwappingBinaryReader(stream)) { ushort majorVersion = input.ReadUInt16(); ushort minorVersion = input.ReadUInt16(); ushort tableCount = input.ReadUInt16(); ushort searchRange = input.ReadUInt16(); ushort entrySelector = input.ReadUInt16(); ushort rangeShift = input.ReadUInt16(); var tables = new TableEntryCollection(); for (int i = 0; i < tableCount; i++) { tables.AddEntry(new UnreadTableEntry(ReadTableHeader(input))); } //------------------------------------------------------------------ OS2Table os2Table = ReadTableIfExists(tables, input, new OS2Table()); NameEntry nameEntry = ReadTableIfExists(tables, input, new NameEntry()); Head header = ReadTableIfExists(tables, input, new Head()); MaxProfile maximumProfile = ReadTableIfExists(tables, input, new MaxProfile()); HorizontalHeader horizontalHeader = ReadTableIfExists(tables, input, new HorizontalHeader()); HorizontalMetrics horizontalMetrics = ReadTableIfExists(tables, input, new HorizontalMetrics(horizontalHeader.HorizontalMetricsCount, maximumProfile.GlyphCount)); //-------------- Cmap cmaps = ReadTableIfExists(tables, input, new Cmap()); GlyphLocations glyphLocations = ReadTableIfExists(tables, input, new GlyphLocations(maximumProfile.GlyphCount, header.WideGlyphLocations)); Glyf glyf = ReadTableIfExists(tables, input, new Glyf(glyphLocations)); //-------------- Gasp gaspTable = ReadTableIfExists(tables, input, new Gasp()); VerticalDeviceMetrics vdmx = ReadTableIfExists(tables, input, new VerticalDeviceMetrics()); //-------------- PostTable postTable = ReadTableIfExists(tables, input, new PostTable()); Kern kern = ReadTableIfExists(tables, input, new Kern()); //-------------- //advanced typography GDEF gdef = ReadTableIfExists(tables, input, new GDEF()); GSUB gsub = ReadTableIfExists(tables, input, new GSUB()); GPOS gpos = ReadTableIfExists(tables, input, new GPOS()); BASE baseTable = ReadTableIfExists(tables, input, new BASE()); COLR colr = ReadTableIfExists(tables, input, new COLR()); CPAL cpal = ReadTableIfExists(tables, input, new CPAL()); VerticalHeader vhea = ReadTableIfExists(tables, input, new VerticalHeader()); if (vhea != null) { VerticalMatric vmtx = ReadTableIfExists(tables, input, new VerticalMatric(vhea.NumOfLongVerMetrics)); } EBLCTable fontBmpTable = ReadTableIfExists(tables, input, new EBLCTable()); //--------------------------------------------- //about truetype instruction init //--------------------------------------------- var typeface = new TtfTypeface( nameEntry, header.Bounds, header.UnitsPerEm, glyf.Glyphs, horizontalMetrics, os2Table); //---------------------------- typeface.CmapTable = cmaps; typeface.KernTable = kern; typeface.GaspTable = gaspTable; typeface.MaxProfile = maximumProfile; typeface.HheaTable = horizontalHeader; //---------------------------- FpgmTable fpgmTable = ReadTableIfExists(tables, input, new FpgmTable()); //control values table CvtTable cvtTable = ReadTableIfExists(tables, input, new CvtTable()); if (cvtTable != null) { typeface.ControlValues = cvtTable.controlValues; } if (fpgmTable != null) { typeface.FpgmProgramBuffer = fpgmTable.programBuffer; } PrepTable propProgramTable = ReadTableIfExists(tables, input, new PrepTable()); if (propProgramTable != null) { typeface.PrepProgramBuffer = propProgramTable.programBuffer; } //------------------------- typeface.LoadOpenFontLayoutInfo( gdef, gsub, gpos, baseTable, colr, cpal); return(typeface); } }
internal bool ReadTableEntryCollection(Typeface typeface, RestoreTicket ticket, TableEntryCollection tables, BinaryReader input) { if (ticket != null) { return(ReadTableEntryCollectionOnRestoreMode(typeface, ticket, tables, input)); } typeface.SetTableEntryCollection(tables.CloneTableHeaders()); var rd = new EntriesReaderHelper(tables, input); //PART 1: basic information OS2Table os2Table = rd.Read(new OS2Table()); Meta meta = rd.Read(new Meta()); NameEntry nameEntry = rd.Read(new NameEntry()); Head head = rd.Read(new Head()); MaxProfile maxProfile = rd.Read(new MaxProfile()); HorizontalHeader horizontalHeader = rd.Read(new HorizontalHeader()); HorizontalMetrics horizontalMetrics = rd.Read(new HorizontalMetrics(horizontalHeader.NumberOfHMetrics, maxProfile.GlyphCount)); VerticalHeader vhea = rd.Read(new VerticalHeader()); if (vhea != null) { VerticalMetrics vmtx = rd.Read(new VerticalMetrics(vhea.NumOfLongVerMetrics)); } Cmap cmaps = rd.Read(new Cmap()); VerticalDeviceMetrics vdmx = rd.Read(new VerticalDeviceMetrics()); Kern kern = rd.Read(new Kern()); //------------------------------------ //PART 2: glyphs detail //2.1 True type font GlyphLocations glyphLocations = rd.Read(new GlyphLocations(maxProfile.GlyphCount, head.WideGlyphLocations)); Glyf glyf = rd.Read(new Glyf(glyphLocations)); Gasp gaspTable = rd.Read(new Gasp()); COLR colr = rd.Read(new COLR()); CPAL cpal = rd.Read(new CPAL()); //2.2 Cff font PostTable postTable = rd.Read(new PostTable()); CFFTable cff = rd.Read(new CFFTable()); //additional math table (if available) MathTable mathtable = rd.Read(new MathTable()); //------------------------------------ //PART 3: advanced typography GDEF gdef = rd.Read(new GDEF()); GSUB gsub = rd.Read(new GSUB()); GPOS gpos = rd.Read(new GPOS()); BASE baseTable = rd.Read(new BASE()); JSTF jstf = rd.Read(new JSTF()); STAT stat = rd.Read(new STAT()); if (stat != null) { //variable font FVar fvar = rd.Read(new FVar()); if (fvar != null) { GVar gvar = rd.Read(new GVar()); CVar cvar = rd.Read(new CVar()); HVar hvar = rd.Read(new HVar()); MVar mvar = rd.Read(new MVar()); AVar avar = rd.Read(new AVar()); } } bool isPostScriptOutline = false; bool isBitmapFont = false; typeface.SetBasicTypefaceTables(os2Table, nameEntry, head, horizontalMetrics); if (glyf == null) { //check if this is cff table ? if (cff == null) { //check cbdt/cblc ? CBLC cblcTable = rd.Read(new CBLC()); if (cblcTable != null) { CBDT cbdtTable = rd.Read(new CBDT()); //read cbdt //bitmap font BitmapFontGlyphSource bmpFontGlyphSrc = new BitmapFontGlyphSource(cblcTable); bmpFontGlyphSrc.LoadCBDT(cbdtTable); Glyph[] glyphs = bmpFontGlyphSrc.BuildGlyphList(); typeface.SetBitmapGlyphs(glyphs, bmpFontGlyphSrc); isBitmapFont = true; } else { //TODO: EBLC fontBmpTable = rd.Read(new EBLC()); throw new NotSupportedException(); } } else { isPostScriptOutline = true; typeface.SetCffFontSet(cff.Cff1FontSet); } } else { typeface.SetTtfGlyphs(glyf.Glyphs); } //---------------------------- typeface.CmapTable = cmaps; typeface.KernTable = kern; typeface.MaxProfile = maxProfile; typeface.HheaTable = horizontalHeader; //---------------------------- typeface.GaspTable = gaspTable; if (!isPostScriptOutline && !isBitmapFont) { //for true-type font outline FpgmTable fpgmTable = rd.Read(new FpgmTable()); //control values table CvtTable cvtTable = rd.Read(new CvtTable()); PrepTable propProgramTable = rd.Read(new PrepTable()); typeface.ControlValues = cvtTable?._controlValues; typeface.FpgmProgramBuffer = fpgmTable?._programBuffer; typeface.PrepProgramBuffer = propProgramTable?._programBuffer; } //------------------------- typeface.LoadOpenFontLayoutInfo( gdef, gsub, gpos, baseTable, colr, cpal); //------------ typeface.SetSvgTable(rd.Read(new SvgTable())); typeface.PostTable = postTable; if (mathtable != null) { MathGlyphLoader.LoadMathGlyph(typeface, mathtable); } #if DEBUG //test //int found = typeface.GetGlyphIndexByName("Uacute"); if (typeface.IsCffFont) { //optional typeface.UpdateAllCffGlyphBounds(); } #endif typeface.UpdateLangs(meta); typeface.UpdateFrequentlyUsedValues(); return(true); }
bool ReadTableEntryCollectionOnRestoreMode(Typeface typeface, RestoreTicket ticket, TableEntryCollection tables, BinaryReader input) { //RESTORE MODE //check header matches if (!typeface.IsTrimmed() || !typeface.CompareOriginalHeadersWithNewlyLoadOne(tables.CloneTableHeaders())) { return(false); } var rd = new EntriesReaderHelper(tables, input); //PART 1: basic information //.. //------------------------------------ //PART 2: glyphs detail //2.1 True type font GlyphLocations glyphLocations = ticket.HasTtf ? rd.Read(new GlyphLocations(typeface.MaxProfile.GlyphCount, typeface.Head.WideGlyphLocations)) : null; Glyf glyf = ticket.HasTtf ? rd.Read(new Glyf(glyphLocations)) : null; typeface.GaspTable = ticket.GaspTable ? rd.Read(new Gasp()) : null; typeface.SetColorAndPalTable( ticket.COLRTable ? rd.Read(new COLR()) : null, ticket.CPALTable ? rd.Read(new CPAL()) : null); //2.2 Cff font CFFTable cff = ticket.HasCff ? rd.Read(new CFFTable()) : null; bool isPostScriptOutline = false; bool isBitmapFont = false; if (glyf == null) { //check if this is cff table ? if (cff == null) { //check cbdt/cblc ? if (ticket.HasBitmapSource) { //reload only CBDT (embeded bitmap) CBDT cbdt = rd.Read(new CBDT()); typeface._bitmapFontGlyphSource.LoadCBDT(cbdt); //just clone existing glyph isBitmapFont = true; } else { //? throw new NotSupportedException(); } } else { isPostScriptOutline = true; typeface.SetCffFontSet(cff.Cff1FontSet); } } else { typeface.SetTtfGlyphs(glyf.Glyphs); } if (!isPostScriptOutline && !isBitmapFont) { //for true-type font outline FpgmTable fpgmTable = rd.Read(new FpgmTable()); //control values table CvtTable cvtTable = rd.Read(new CvtTable()); PrepTable propProgramTable = rd.Read(new PrepTable()); typeface.ControlValues = cvtTable?._controlValues; typeface.FpgmProgramBuffer = fpgmTable?._programBuffer; typeface.PrepProgramBuffer = propProgramTable?._programBuffer; } if (ticket.HasSvg) { typeface.SetSvgTable(rd.Read(new SvgTable())); } #if DEBUG //test //int found = typeface.GetGlyphIndexByName("Uacute"); if (typeface.IsCffFont) { //optional??? typeface.UpdateAllCffGlyphBounds(); } #endif typeface._typefaceTrimMode = TrimMode.Restored; return(true); }
public EntriesReaderHelper(TableEntryCollection tables, BinaryReader input) { _tables = tables; _input = input; }