フォントのアセントの値をベースラインから引いたところを原点とし、ベースラインにディセントの値を足したところ高さとしたら解決しました
public Result DrawGlyphRun(object clientDrawingContext, float baselineOriginX, float baselineOriginY, MeasuringMode measuringMode, GlyphRun glyphRun, GlyphRunDescription glyphRunDescription, ComObject clientDrawingEffect)
{
var brushColor = new Color4(1,0,0,0);
Color4 backColor = new Color4();
if (clientDrawingEffect != null && clientDrawingEffect is ColorDrawingEffect)
{
brushColor = (clientDrawingEffect as ColorDrawingEffect).Color;
backColor = (clientDrawingEffect as ColorDrawingEffect).backColor;
}
var brush = new SolidColorBrush(_renderTarget, backColor);
float[] advance;
GlyphOffset[] offests;
short[] indics = glyphRun.ToArrays(out advance,out offests);
GlyphMetrics[] metrics= glyphRun.FontFace.GetDesignGlyphMetrics(indics, glyphRun.IsSideways);
RectangleF rect = new RectangleF(baselineOriginX,
baselineOriginY - glyphRun.FontSize * glyphRun.FontFace.Metrics.Ascent / glyphRun.FontFace.Metrics.DesignUnitsPerEm,
baselineOriginX,
baselineOriginY + glyphRun.FontSize * glyphRun.FontFace.Metrics.Descent / glyphRun.FontFace.Metrics.DesignUnitsPerEm);
for (int i = 0; i < glyphRun.Items.Length; i++)
{
rect.Right = rect.Left + advance[i];
_renderTarget.FillRectangle(rect, brush);
rect.Left += advance[i];
}
brush.Dispose();
brush = new SolidColorBrush(_renderTarget, brushColor);
_renderTarget.DrawGlyphRun(new System.Drawing.PointF(baselineOriginX, baselineOriginY), ref glyphRun, brush, measuringMode);
brush.Dispose();
return SharpDX.Result.Ok;
}