Use design metrics when adding text to QPainterPath

When we add text to QPainterPath, we will add the design metrics
(unhinted glyphs) and scale these down to match the target font size.
But the glyph positions we pass in are based on the hinted metrics,
samples at the target font size. Thus, on fonts/systems with hinting,
these do not match the scaled design metrics outlines.

To fix this issue, we make sure the text layout uses design metrics
when determining the glyph positions.

[ChangeLog][QtGui][Text] Fixed an issue where QPainterPath::addText()
would get inconsistent kerning for smaller font sizes when hinting is
enabled.

Fixes: QTBUG-20900
Change-Id: I651997d1a6a86e6271557438afa2cdad078a83ca
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
(cherry picked from commit 6a3f8cbc3ad47d8585aac25d3775ed2350afe20c)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Eskil Abrahamsen Blomfeldt 2021-01-12 08:39:14 +01:00 committed by Qt Cherry-pick Bot
parent 0b758a57c8
commit 9e278ec1f5

View File

@ -1219,6 +1219,11 @@ void QPainterPath::addText(const QPointF &point, const QFont &f, const QString &
QTextLayout layout(text, f); QTextLayout layout(text, f);
layout.setCacheEnabled(true); layout.setCacheEnabled(true);
QTextOption opt = layout.textOption();
opt.setUseDesignMetrics(true);
layout.setTextOption(opt);
QTextEngine *eng = layout.engine(); QTextEngine *eng = layout.engine();
layout.beginLayout(); layout.beginLayout();
QTextLine line = layout.createLine(); QTextLine line = layout.createLine();