public override void Read(BigEndianReader reader) { byte tableFlags = 0; uint origLen = 0; byte preprocess = 0; string tag; tableFlags = reader.ReadByte(); //First 7 bits for a known table KnownTableIndex known = (KnownTableIndex)(tableFlags & 0x1F); if (known < KnownTableIndex.UNKN) { tag = GetKnownTable(known); } else //not known so read the next tag. { tag = reader.ReadString(4); } //Get the pre-processing transformation value //from bits 6 and 7 to versions 0-3. preprocess = (byte)((tableFlags >> 5) & 0x3); origLen = reader.ReadUIntBase128(); if (IsTransformedTable(tag) && preprocess == 0) { this.HasTransformation = true; this.TransformedLength = reader.ReadUIntBase128(); } this.Tag = tag; this.Length = origLen; }
private string GetKnownTable(KnownTableIndex known) { var found = ""; switch (known) { case KnownTableIndex.Cmap: found = TrueTypeTableNames.CharacterMapping; break; case KnownTableIndex.Head: found = TrueTypeTableNames.FontHeader; break; case KnownTableIndex.HHead: found = TrueTypeTableNames.HorizontalHeader; break; case KnownTableIndex.HMtx: found = TrueTypeTableNames.HorizontalMetrics; break; case KnownTableIndex.MaxP: found = TrueTypeTableNames.MaximumProfile; break; case KnownTableIndex.Name: found = TrueTypeTableNames.NamingTable; break; case KnownTableIndex.OS2: found = TrueTypeTableNames.WindowsMetrics; break; case KnownTableIndex.Post: found = TrueTypeTableNames.PostscriptInformation; break; case KnownTableIndex.Cvt: found = TrueTypeTableNames.ControlValue; break; case KnownTableIndex.Fpgm: found = TrueTypeTableNames.FontProgram; break; case KnownTableIndex.Glyf: found = TrueTypeTableNames.GlyphData; break; case KnownTableIndex.Loca: found = TrueTypeTableNames.LocationIndex; break; case KnownTableIndex.Prep: found = TrueTypeTableNames.CVTProgram; break; case KnownTableIndex.CFF: found = TrueTypeTableNames.PostscriptProgram; break; case KnownTableIndex.Vorg: found = TrueTypeTableNames.VerticalOrigin; break; case KnownTableIndex.EBDT: found = TrueTypeTableNames.EmbeddedBitmapData; break; case KnownTableIndex.EBLC: found = TrueTypeTableNames.EmbeddedBitmapLocationData; break; case KnownTableIndex.Gasp: found = TrueTypeTableNames.GridFittingAndScanConversion; break; case KnownTableIndex.HDmx: found = TrueTypeTableNames.HorizontalDeviceMetrics; break; case KnownTableIndex.Kern: found = TrueTypeTableNames.Kerning; break; case KnownTableIndex.LTSH: found = TrueTypeTableNames.LinearThresholdData; break; case KnownTableIndex.PCLT: found = TrueTypeTableNames.PCL5Data; break; case KnownTableIndex.VDmx: found = TrueTypeTableNames.VerticalDeviceMetrics; break; case KnownTableIndex.VHea: found = TrueTypeTableNames.VerticalMetricsHeader; break; case KnownTableIndex.VMtx: found = TrueTypeTableNames.VerticalMetrics; break; case KnownTableIndex.BASE: found = TrueTypeTableNames.BaseLineData; break; case KnownTableIndex.GDEF: found = TrueTypeTableNames.GlyphDefinitionData; break; case KnownTableIndex.GPos: found = TrueTypeTableNames.GlyphPositionData; break; case KnownTableIndex.GSub: found = TrueTypeTableNames.GlyphSubstitutionData; break; case KnownTableIndex.EBSC: found = TrueTypeTableNames.EmbeddedBitmapScanningData; break; case KnownTableIndex.JSTF: found = TrueTypeTableNames.JustificationData; break; case KnownTableIndex.MATH: case KnownTableIndex.CBDT: case KnownTableIndex.CBLC: case KnownTableIndex.COLR: case KnownTableIndex.CPAL: case KnownTableIndex.SVG_: case KnownTableIndex.sbix: case KnownTableIndex.acnt: case KnownTableIndex.avar: case KnownTableIndex.bdat: case KnownTableIndex.bloc: case KnownTableIndex.bsln: case KnownTableIndex.cvar: case KnownTableIndex.fdsc: case KnownTableIndex.feat: case KnownTableIndex.fmtx: case KnownTableIndex.fvar: case KnownTableIndex.gvar: case KnownTableIndex.hsty: case KnownTableIndex.just: case KnownTableIndex.lcar: case KnownTableIndex.mort: case KnownTableIndex.morx: case KnownTableIndex.opbd: case KnownTableIndex.prop: case KnownTableIndex.trak: case KnownTableIndex.Zapf: case KnownTableIndex.Silf: case KnownTableIndex.Glat: case KnownTableIndex.Gloc: case KnownTableIndex.Feat: case KnownTableIndex.Sill: found = known.ToString().Replace('_', ' '); break; default: throw new ArgumentOutOfRangeException(nameof(known)); } return(found); }