/// <summary> /// Return glyph advance distances along the X axis to layout text /// </summary> /// <param name="text">Text to layout</param> /// <returns>Advance distances for each glyph in pixel units</returns> public MeasurementInfo GetMeasurementInfoForString(string text) { var layout = new GlyphLayout(); layout.Typeface = typeface; var measure = layout.LayoutAndMeasureString(text.ToCharArray(), 0, text.Length, FontSizeInPoints); var lineHeight = typeface.CalculateLineSpacing(LineSpacingChoice.TypoMetric) * (FontSizeInPixels / typeface.UnitsPerEm); var glyphPositions = layout.ResultUnscaledGlyphPositions; var advanceWidths = new float[glyphPositions.Count]; var scale = FontSizeInPixels / TotalHeight; for (var i = 0; i < glyphPositions.Count; i++) { glyphPositions.GetGlyph(i, out var advanceW); advanceWidths[i] = advanceW * (FontSizeInPixels / typeface.UnitsPerEm) * scale; } return(new MeasurementInfo { Ascender = measure.AscendingInPx, Descender = measure.DescendingInPx, AdvanceWidths = advanceWidths, LineHeight = lineHeight }); }