關於字體繪製的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位置也會有問題,  各種對齊屬性不一樣這個位置將不一樣,這個要萬分注意.

繪製好的結果如下:

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