关于字体绘制的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位置也会有问题,  各种对齐属性不一样这个位置将不一样,这个要万分注意.

绘制好的结果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值