关于字体绘制的baseline (QT 和 D2D)

常规字体绘制API调用:

QT:QPainter::drawText

D2D: ID2D1RenderTarget::DrawText

以上字体绘制某些特殊效果无法达到, 我们可以用Path绘制字体:

QPainterPath::addText(qreal x, qreal y, const QFont &f, const QString &text);

D2D:

将字用指定字体属性绘制好,获取他的TextGeometry,然后操作这个Geometry(等价于QT的QPainterPath)

    m_pTextRender->StartDraw(CD2DHelp::Factory(), rect);
    hr = ptrTextLyout->Draw(0, m_pTextRender, 0, 0);
    if (hr != S_OK)
        return false;
    m_ptrGeo = m_pTextRender->TextGeometry();

 

但是以上得到的Path如何移动到和drawtext的本体重合, 不仅仅要计算字体宽高还要计算一个重要的值baseline, 因为字体绘制的时候有各种间距,样式,也就是上下左右对齐,所产生的字的位置是不一样的.先放解决方法:

QT:

    QFontMetrics metrics(f);
    int py = (layoutRect.Height() - metrics.height()) / 2 + metrics.ascent();

D2D:

    DWRITE_LINE_METRICS baseLineMetrics;
    unsigned int actualLineCount = 2;
    ptrTextLyout->GetLineMetrics(&baseLineMetrics, 100, &actualLineCount);

    int py  = baseLineMetrics.baseline;

 

py就是baseline的位置.微软太坑文档不好找,  qt 官网介绍的非常详细对于baseline, 请看下图红线.

绿色为背景框,空填充的紫色字体为使用path绘制的字体, 如果直接使用整个字体的位置绘制path就是上图效果. 这说明字体上下还存在一定距离,这个距离绞尽脑汁个人是计算不出来的,除非去解析字体文件,  所有QT和D2D 都封装好了baseline的概念,只要绘制的的时候计算一下位置即可, d2d的x位置也会有问题,  各种对齐属性不一样这个位置将不一样,这个要万分注意.

绘制好的结果如下:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章