public static HorizontalMetricsTable Load(FontReader reader) { // you should load all dependent tables prior to manipulating the reader HoizontalHeadTable headTable = reader.GetTable <HoizontalHeadTable>(); MaximumProfileTable profileTable = reader.GetTable <MaximumProfileTable>(); // move to start of table using (BinaryReader binaryReader = reader.GetReaderAtTablePosition(TableName)) { return(Load(binaryReader, headTable.NumberOfHMetrics, profileTable.GlyphCount)); } }
public static void WriteHoizontalHeadTable(this BinaryWriter writer, HoizontalHeadTable table) { // Type | Name | Description // ----------|----------------------|---------------------------------------------------------------------------------------------------- // uint16 | majorVersion | Major version number of the horizontal header table — set to 1. // uint16 | minorVersion | Minor version number of the horizontal header table — set to 0. // FWORD | Ascender | Typographic ascent (Distance from baseline of highest ascender). // FWORD | Descender | Typographic descent (Distance from baseline of lowest descender). // FWORD | LineGap | Typographic line gap. - Negative LineGap values are treated as zero in Windows 3.1, and in Mac OS System 6 and System 7. // UFWORD | advanceWidthMax | Maximum advance width value in 'hmtx' table. // FWORD | minLeftSideBearing | Minimum left sidebearing value in 'hmtx' table. // FWORD | minRightSideBearing | Minimum right sidebearing value; calculated as Min(aw - lsb - (xMax - xMin)). // FWORD | xMaxExtent | Max(lsb + (xMax - xMin)). // int16 | caretSlopeRise | Used to calculate the slope of the cursor (rise/run); 1 for vertical. // int16 | caretSlopeRun | 0 for vertical. // int16 | caretOffset | The amount by which a slanted highlight on a glyph needs to be shifted to produce the best appearance. Set to 0 for non-slanted fonts // int16 | (reserved) | set to 0 // int16 | (reserved) | set to 0 // int16 | (reserved) | set to 0 // int16 | (reserved) | set to 0 // int16 | metricDataFormat | 0 for current format. // uint16 | numberOfHMetrics | Number of hMetric entries in 'hmtx' table writer.WriteUInt16(1); writer.WriteUInt16(1); writer.WriteFWORD(table.Ascender); writer.WriteFWORD(table.Descender); writer.WriteFWORD(table.LineGap); writer.WriteUFWORD(table.AdvanceWidthMax); writer.WriteFWORD(table.MinLeftSideBearing); writer.WriteFWORD(table.MinRightSideBearing); writer.WriteFWORD(table.XMaxExtent); writer.WriteInt16(table.CaretSlopeRise); writer.WriteInt16(table.CaretSlopeRun); writer.WriteInt16(table.CaretOffset); writer.WriteInt16(0); // reserved writer.WriteInt16(0); // reserved writer.WriteInt16(0); // reserved writer.WriteInt16(0); // reserved writer.WriteInt16(0); // metricDataFormat should be 0 writer.WriteUInt16(table.NumberOfHMetrics); }
public void LoadHoizontalHeadTable() { var writer = new BinaryWriter(); writer.WriteHoizontalHeadTable(new HoizontalHeadTable(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)); HoizontalHeadTable tbl = HoizontalHeadTable.Load(writer.GetReader()); Assert.Equal(1, tbl.Ascender); Assert.Equal(2, tbl.Descender); Assert.Equal(3, tbl.LineGap); Assert.Equal(4, tbl.AdvanceWidthMax); Assert.Equal(5, tbl.MinLeftSideBearing); Assert.Equal(6, tbl.MinRightSideBearing); Assert.Equal(7, tbl.XMaxExtent); Assert.Equal(8, tbl.CaretSlopeRise); Assert.Equal(9, tbl.CaretSlopeRun); Assert.Equal(10, tbl.CaretOffset); Assert.Equal(11, tbl.NumberOfHMetrics); }