From bd74b624d53ce076a8b6a90a66da0a19da1ec17c Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Thu, 25 Jan 2018 11:13:19 +0100 Subject: [PATCH] Improve bounding rect of QStaticText with Qt::PlainText The bounding rect was not including positive leading of the last line. This patch solves it by changing using QTextLine's setLeadingIncluded, and adds handling of negative leading to keep rendering unchanged in that case. Change-Id: I4d18b81892184bb85cd7949a5dc3fb9cfa270a26 Reviewed-by: Eskil Abrahamsen Blomfeldt --- src/gui/text/qstatictext.cpp | 9 +-- .../gui/text/qstatictext/tst_qstatictext.cpp | 67 +++++++++++++++++++ 2 files changed, 72 insertions(+), 4 deletions(-) diff --git a/src/gui/text/qstatictext.cpp b/src/gui/text/qstatictext.cpp index 2f90754274..0026e3edfb 100644 --- a/src/gui/text/qstatictext.cpp +++ b/src/gui/text/qstatictext.cpp @@ -39,6 +39,7 @@ #include "qstatictext.h" #include "qstatictext_p.h" +#include #include #include #include @@ -611,22 +612,22 @@ void QStaticTextPrivate::paintText(const QPointF &topLeftPosition, QPainter *p, textLayout.setTextOption(textOption); textLayout.setCacheEnabled(true); - qreal leading = QFontMetricsF(font).leading(); - qreal height = -leading; - + qreal height = 0; textLayout.beginLayout(); while (1) { QTextLine line = textLayout.createLine(); if (!line.isValid()) break; + line.setLeadingIncluded(true); if (textWidth >= 0.0) line.setLineWidth(textWidth); else line.setLineWidth(QFIXED_MAX); - height += leading; line.setPosition(QPointF(0.0, height)); height += line.height(); + if (line.leading() < 0) + height += qCeil(line.leading()); } textLayout.endLayout(); diff --git a/tests/auto/gui/text/qstatictext/tst_qstatictext.cpp b/tests/auto/gui/text/qstatictext/tst_qstatictext.cpp index 45cc94afad..83e9390d25 100644 --- a/tests/auto/gui/text/qstatictext/tst_qstatictext.cpp +++ b/tests/auto/gui/text/qstatictext/tst_qstatictext.cpp @@ -61,6 +61,8 @@ private slots: void drawToPoint(); void drawToRect_data(); void drawToRect(); + void compareToDrawText_data(); + void compareToDrawText(); void setFont(); void setTextWidth(); void prepareToCorrectData(); @@ -212,6 +214,71 @@ void tst_QStaticText::drawToRect() QCOMPARE(imageDrawStaticText, imageDrawText); } +void tst_QStaticText::compareToDrawText_data() +{ + QTest::addColumn("font"); + + QTest::newRow("default") << QFont(); + QFont sansserif; sansserif.setStyleHint(QFont::SansSerif); + QFont serif; serif.setStyleHint(QFont::Serif); + QFont monospace; monospace.setStyleHint(QFont::Monospace); + QTest::newRow("sans-serif") << QFont(sansserif.defaultFamily()); + QTest::newRow("serif") << QFont(serif.defaultFamily()); + QTest::newRow("monospace") << QFont(monospace.defaultFamily()); +} + +void tst_QStaticText::compareToDrawText() +{ + QFETCH(QFont, font); + + QPixmap imageDrawText(1000, 1000); + imageDrawText.fill(Qt::white); + { + QPainter p(&imageDrawText); + p.setFont(font); + p.drawText(QRectF(11, 12, 30, 500), "Lorem ipsum dolor sit amet, consectetur adipiscing elit."); + } + + QPixmap imageDrawStaticPlainText(1000, 1000); + imageDrawStaticPlainText.fill(Qt::white); + { + QPainter p(&imageDrawStaticPlainText); + p.setFont(font); + QStaticText text("Lorem ipsum dolor sit amet, consectetur adipiscing elit."); + text.setTextWidth(30), + p.setClipRect(QRectF(11, 12, 30, 500)); + text.setTextFormat(Qt::PlainText); + p.drawStaticText(QPointF(11, 12), text); + } + +#if defined(DEBUG_SAVE_IMAGE) + imageDrawText.save("compareToDrawText_imageDrawText.png"); + imageDrawStaticPlainText.save("compareToDrawText_imageDrawStaticPlainText.png"); +#endif + + QVERIFY(imageDrawText.toImage() != m_whiteSquare); + QCOMPARE(imageDrawStaticPlainText, imageDrawText); + + // Rich text rendering does not take negative leading into account. +#if 0 + QPixmap imageDrawStaticRichText(1000, 1000); + imageDrawStaticRichText.fill(Qt::white); + { + QPainter p(&imageDrawStaticRichText); + p.setFont(font); + QStaticText text("Lorem ipsum dolor sit amet, consectetur adipiscing elit."); + text.setTextWidth(30), + p.setClipRect(QRectF(11, 12, 30, 500)); + text.setTextFormat(Qt::RichText); + p.drawStaticText(QPointF(11, 12), text); + } +#if defined(DEBUG_SAVE_IMAGE) + imageDrawStaticRichText.save("compareToDrawText_imageDrawStaticRichText.png"); +#endif + QCOMPARE(imageDrawStaticRichText, imageDrawText); +#endif +} + void tst_QStaticText::prepareToCorrectData() { QTransform transform;