From de58eb64bc564fcb8af61a45576783e432d2380c Mon Sep 17 00:00:00 2001 From: Eskil Abrahamsen Blomfeldt Date: Tue, 23 Oct 2012 13:14:27 +0200 Subject: Revert hacks in text rendering code path MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit There are a lot of hacks here and there in Qt trying to align the text in a correct way which caused regressions to appear once the default coordinate system changed. We need to remove these hacks to get a more consistent and maintainable base. This also fixes the regression introduced by changing the aliased coordinate system. Task-number: QTBUG-27667 Change-Id: I620db2ca23b7ff6c912f3a51e86e7e36bbef81f0 Reviewed-by: Samuel Rødal --- src/gui/opengl/qopenglpaintengine.cpp | 2 +- src/gui/painting/qpaintengine_raster.cpp | 5 ++-- src/gui/painting/qpainter.cpp | 43 ++++++++++++-------------------- src/gui/text/qtextengine.cpp | 15 ++++++++--- src/gui/text/qtextengine_p.h | 2 +- 5 files changed, 32 insertions(+), 35 deletions(-) (limited to 'src/gui') diff --git a/src/gui/opengl/qopenglpaintengine.cpp b/src/gui/opengl/qopenglpaintengine.cpp index 8e967207d4..624eeaffd9 100644 --- a/src/gui/opengl/qopenglpaintengine.cpp +++ b/src/gui/opengl/qopenglpaintengine.cpp @@ -1638,7 +1638,7 @@ void QOpenGL2PaintEngineExPrivate::drawCachedGlyphs(QFontEngineGlyphCache::Type continue; int x = qFloor(staticTextItem->glyphPositions[i].x) + c.baseLineX - margin; - int y = qFloor(staticTextItem->glyphPositions[i].y) - c.baseLineY - margin; + int y = qRound(staticTextItem->glyphPositions[i].y) - c.baseLineY - margin; vertexCoordinates->addQuad(QRectF(x, y, c.w, c.h)); textureCoordinates->addQuad(QRectF(c.x*dx, c.y*dy, c.w * dx, c.h * dy)); diff --git a/src/gui/painting/qpaintengine_raster.cpp b/src/gui/painting/qpaintengine_raster.cpp index 1a63ced897..fec01afdee 100644 --- a/src/gui/painting/qpaintengine_raster.cpp +++ b/src/gui/painting/qpaintengine_raster.cpp @@ -2787,7 +2787,7 @@ bool QRasterPaintEngine::drawCachedGlyphs(int numGlyphs, const glyph_t *glyphs, alphaPenBlt(alphaMap->bits(), alphaMap->bytesPerLine(), alphaMap->depth(), qFloor(positions[i].x) + offset.x(), - qFloor(positions[i].y) + offset.y(), + qRound(positions[i].y) + offset.y(), alphaMap->width(), alphaMap->height()); fontEngine->unlockAlphaMapForGlyph(); @@ -2818,7 +2818,6 @@ bool QRasterPaintEngine::drawCachedGlyphs(int numGlyphs, const glyph_t *glyphs, rightShift = 3; // divide by 8 int margin = fontEngine->glyphMargin(glyphType); - const QFixed offs = s->flags.legacy_rounding ? QFixed::fromReal(aliasedCoordinateDelta) : QFixed(); const uchar *bits = image.bits(); for (int i=0; irenderHints() + & QPainter::Qt4CompatiblePainting; + + if (wasCompatiblePainting) + painter->setRenderHint(QPainter::Qt4CompatiblePainting, false); + const qreal underlineOffset = fe->underlinePosition().toReal(); // deliberately ceil the offset to avoid the underline coming too close to // the text above it. - const qreal underlinePos = pos.y() + qCeil(underlineOffset); + const qreal underlinePos = pos.y() + qCeil(underlineOffset) + 0.5; if (underlineStyle == QTextCharFormat::SpellCheckUnderline) { QPlatformTheme *theme = QGuiApplicationPrivate::platformTheme(); @@ -6247,6 +6253,9 @@ static void drawTextItemDecoration(QPainter *painter, const QPointF &pos, const painter->setPen(oldPen); painter->setBrush(oldBrush); + + if (wasCompatiblePainting) + painter->setRenderHint(QPainter::Qt4CompatiblePainting); } Q_GUI_EXPORT void qt_draw_decoration_for_glyphs(QPainter *painter, const glyph_t *glyphArray, @@ -7500,36 +7509,16 @@ start_lengthVariant: qreal yoff = 0; qreal xoff = 0; - if (tf & Qt::AlignBottom) { + if (tf & Qt::AlignBottom) yoff = r.height() - height; - } else if (tf & Qt::AlignVCenter) { + else if (tf & Qt::AlignVCenter) yoff = (r.height() - height)/2; - if (painter) { - QTransform::TransformationType type = painter->transform().type(); - if (type <= QTransform::TxScale) { - // do the rounding manually to work around inconsistencies - // in the paint engines when drawing on floating point offsets - const qreal scale = painter->transform().m22(); - if (scale != 0) - yoff = -qRound(-yoff * scale) / scale; - } - } - } - if (tf & Qt::AlignRight) { + + if (tf & Qt::AlignRight) xoff = r.width() - width; - } else if (tf & Qt::AlignHCenter) { + else if (tf & Qt::AlignHCenter) xoff = (r.width() - width)/2; - if (painter) { - QTransform::TransformationType type = painter->transform().type(); - if (type <= QTransform::TxScale) { - // do the rounding manually to work around inconsistencies - // in the paint engines when drawing on floating point offsets - const qreal scale = painter->transform().m11(); - if (scale != 0) - xoff = qRound(xoff * scale) / scale; - } - } - } + QRectF bounds = QRectF(r.x() + xoff, r.y() + yoff, width, height); if (hasMoreLengthVariants && !(tf & Qt::TextLongestVariant) && !r.contains(bounds)) { diff --git a/src/gui/text/qtextengine.cpp b/src/gui/text/qtextengine.cpp index 38fe2f8140..025d4289aa 100644 --- a/src/gui/text/qtextengine.cpp +++ b/src/gui/text/qtextengine.cpp @@ -3060,8 +3060,7 @@ void QTextEngine::drawItemDecorationList(QPainter *painter, const ItemDecoration foreach (const ItemDecoration &decoration, decorationList) { painter->setPen(decoration.pen); - QLineF line(decoration.x1, decoration.y, decoration.x2, decoration.y); - painter->drawLine(line); + painter->drawLine(QLineF(decoration.x1, decoration.y, decoration.x2, decoration.y)); } } @@ -3069,13 +3068,23 @@ void QTextEngine::drawDecorations(QPainter *painter) { QPen oldPen = painter->pen(); + bool wasCompatiblePainting = painter->renderHints() + & QPainter::Qt4CompatiblePainting; + + if (wasCompatiblePainting) + painter->setRenderHint(QPainter::Qt4CompatiblePainting, false); + adjustUnderlines(); drawItemDecorationList(painter, underlineList); drawItemDecorationList(painter, strikeOutList); drawItemDecorationList(painter, overlineList); - painter->setPen(oldPen); clearDecorations(); + + if (wasCompatiblePainting) + painter->setRenderHint(QPainter::Qt4CompatiblePainting); + + painter->setPen(oldPen); } void QTextEngine::clearDecorations() diff --git a/src/gui/text/qtextengine_p.h b/src/gui/text/qtextengine_p.h index 82467229eb..aff5e1cb7f 100644 --- a/src/gui/text/qtextengine_p.h +++ b/src/gui/text/qtextengine_p.h @@ -390,7 +390,7 @@ struct Q_AUTOTEST_EXPORT QScriptLine mutable uint gridfitted : 1; uint hasTrailingSpaces : 1; uint leadingIncluded : 1; - QFixed height() const { return (ascent + descent).ceil() + QFixed height() const { return ascent + descent + (leadingIncluded? qMax(QFixed(),leading) : QFixed()); } QFixed base() const { return ascent + (leadingIncluded ? qMax(QFixed(),leading) : QFixed()); } -- cgit v1.2.3