aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick
diff options
context:
space:
mode:
authorEskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>2020-05-05 11:36:24 +0200
committerVolker Hilsheimer <volker.hilsheimer@qt.io>2020-05-19 06:20:12 +0200
commit706918472f01a0fea51ea450953d878a1f3f003f (patch)
tree5c7406de0683c59d162f4283a346738799ffe1bb /src/quick
parentf703881b8176dfcc85b8d1cb3b8449722bb0ebf8 (diff)
Fix subpixel positioned text with Text.NativeRendering
We would be generating subpixel positioned glyphs based on the relative positions of the glyphs, ignoring the fractional part contributed by the origin of the text. So if the text origin was inside a pixel, the subpixel antialiasing would be wrong and we would see kerning errors. This was especially visible when using AlignHCenter on text with hinting disabled and resizing the item it was aligning to. Task-number: QTBUG-49646 Change-Id: I0e709ba2b5d2440e34c94c6f819befe0a65a113a Reviewed-by: Lars Knoll <lars.knoll@qt.io> Reviewed-by: Konstantin Ritt <ritt.ks@gmail.com> (cherry picked from commit e807f9d1d80559b8ff91f1c3cfdd755b3da56a6d)
Diffstat (limited to 'src/quick')
-rw-r--r--src/quick/scenegraph/qsgdefaultglyphnode_p.cpp9
1 files changed, 4 insertions, 5 deletions
diff --git a/src/quick/scenegraph/qsgdefaultglyphnode_p.cpp b/src/quick/scenegraph/qsgdefaultglyphnode_p.cpp
index be6ef25feb..831586cbf6 100644
--- a/src/quick/scenegraph/qsgdefaultglyphnode_p.cpp
+++ b/src/quick/scenegraph/qsgdefaultglyphnode_p.cpp
@@ -789,11 +789,12 @@ void QSGTextMaskMaterial::populate(const QPointF &p,
const QMargins &margins)
{
Q_ASSERT(m_font.isValid());
+ QPointF position(p.x(), p.y() - m_font.ascent());
QVector<QFixedPoint> fixedPointPositions;
const int glyphPositionsSize = glyphPositions.size();
fixedPointPositions.reserve(glyphPositionsSize);
for (int i=0; i < glyphPositionsSize; ++i)
- fixedPointPositions.append(QFixedPoint::fromPointF(glyphPositions.at(i)));
+ fixedPointPositions.append(QFixedPoint::fromPointF(position + glyphPositions.at(i)));
QTextureGlyphCache *cache = glyphCache();
@@ -815,18 +816,16 @@ void QSGTextMaskMaterial::populate(const QPointF &p,
Q_ASSERT(geometry->sizeOfVertex() == sizeof(QVector4D));
ushort *ip = geometry->indexDataAsUShort();
- QPointF position(p.x(), p.y() - m_font.ascent());
bool supportsSubPixelPositions = fontD->fontEngine->supportsSubPixelPositions();
for (int i=0; i<glyphIndexes.size(); ++i) {
+ QPointF glyphPosition = glyphPositions.at(i) + position;
QFixed subPixelPosition;
if (supportsSubPixelPositions)
- subPixelPosition = fontD->fontEngine->subPixelPositionForX(QFixed::fromReal(glyphPositions.at(i).x()));
+ subPixelPosition = fontD->fontEngine->subPixelPositionForX(QFixed::fromReal(glyphPosition.x()));
QTextureGlyphCache::GlyphAndSubPixelPosition glyph(glyphIndexes.at(i), subPixelPosition);
const QTextureGlyphCache::Coord &c = cache->coords.value(glyph);
- QPointF glyphPosition = glyphPositions.at(i) + position;
-
// On a retina screen the glyph positions are not pre-scaled (as opposed to
// eg. the raster paint engine). To ensure that we get the same behavior as
// the raster engine (and CoreText itself) when it comes to rounding of the