Don't round Text dimensions.
authorAndrew den Exter <andrew.den-exter@nokia.com>
Thu, 23 Feb 2012 03:25:58 +0000 (13:25 +1000)
committerQt by Nokia <qt-info@nokia.com>
Wed, 29 Feb 2012 04:22:53 +0000 (05:22 +0100)
Painting issues in QtQuick1 meant drawing had to be aligned to pixel
boundaries, since this is no longer a problem we should use qreal
everywhere.

Change-Id: I58e88e10270fa603170f1cedf471bfb53bd89b73
Reviewed-by: Yann Bodson <yann.bodson@nokia.com>
src/quick/items/qquicktext.cpp
src/quick/items/qquicktext_p_p.h
tests/auto/qtquick2/qquicktext/data/multilengthStrings.qml
tests/auto/qtquick2/qquicktext/data/multilengthStringsWrapped.qml
tests/auto/qtquick2/qquicktext/tst_qquicktext.cpp

index fd8ffe5..656440f 100644 (file)
@@ -386,7 +386,7 @@ void QQuickTextPrivate::updateSize()
             return;
     }
 
-    QFontMetrics fm(font);
+    QFontMetricsF fm(font);
     if (text.isEmpty()) {
         qreal fontHeight = fm.height();
         q->setImplicitSize(0, fontHeight);
@@ -399,16 +399,16 @@ void QQuickTextPrivate::updateSize()
 
     qreal naturalWidth = 0;
 
-    int dy = q->height();
-    QSize size(0, 0);
-    QSize previousSize = layedOutTextRect.size();
+    qreal dy = q->height();
+    QSizeF size(0, 0);
+    QSizeF previousSize = layedOutTextRect.size();
 #if defined(Q_OS_MAC)
     layoutThread = QThread::currentThread();
 #endif
 
     //setup instance of QTextLayout for all cases other than richtext
     if (!richText) {
-        QRect textRect = setupTextLayout(&naturalWidth);
+        QRectF textRect = setupTextLayout(&naturalWidth);
         layedOutTextRect = textRect;
         size = textRect.size();
         dy -= size.height();
@@ -436,12 +436,12 @@ void QQuickTextPrivate::updateSize()
             doc->setTextWidth(q->width());
         else
             doc->setTextWidth(doc->idealWidth()); // ### Text does not align if width is not set (QTextDoc bug)
-        dy -= (int)doc->size().height();
-        QSize dsize = doc->size().toSize();
-        layedOutTextRect = QRect(QPoint(0,0), dsize);
-        size = QSize(int(doc->idealWidth()),dsize.height());
+        dy -= doc->size().height();
+        QSizeF dsize = doc->size();
+        layedOutTextRect = QRectF(QPointF(0,0), dsize);
+        size = QSizeF(doc->idealWidth(),dsize.height());
     }
-    int yoff = 0;
+    qreal yoff = 0;
 
     if (q->heightValid()) {
         if (vAlign == QQuickText::AlignBottom)
@@ -601,13 +601,13 @@ void QQuickTextPrivate::setupCustomLineGeometry(QTextLine &line, qreal &height,
 #endif
 }
 
-QString QQuickTextPrivate::elidedText(int lineWidth, const QTextLine &line, QTextLine *nextLine) const
+QString QQuickTextPrivate::elidedText(qreal lineWidth, const QTextLine &line, QTextLine *nextLine) const
 {
     if (nextLine) {
         nextLine->setLineWidth(INT_MAX);
         return layout.engine()->elidedText(
                 Qt::TextElideMode(elideMode),
-                lineWidth,
+                QFixed::fromReal(lineWidth),
                 0,
                 line.textStart(),
                 line.textLength() + nextLine->textLength());
@@ -630,7 +630,7 @@ QString QQuickTextPrivate::elidedText(int lineWidth, const QTextLine &line, QTex
     already absolutely positioned horizontally).
 */
 
-QRect QQuickTextPrivate::setupTextLayout(qreal *const naturalWidth)
+QRectF QQuickTextPrivate::setupTextLayout(qreal *const naturalWidth)
 {
     Q_Q(QQuickText);
     layout.setCacheEnabled(true);
@@ -673,8 +673,9 @@ QRect QQuickTextPrivate::setupTextLayout(qreal *const naturalWidth)
         return QRect(0, 0, 0, height);
     }
 
-    const int lineWidth = q->widthValid() ? q->width() : INT_MAX;
+    const qreal lineWidth = q->widthValid() ? q->width() : FLT_MAX;
     const qreal maxHeight = q->heightValid() ? q->height() : FLT_MAX;
+
     const bool customLayout = isLineLaidOutConnected();
     const bool wasTruncated = truncated;
 
@@ -783,7 +784,7 @@ QRect QQuickTextPrivate::setupTextLayout(qreal *const naturalWidth)
                     height = preLayoutHeight;
                     elideText = layout.engine()->elidedText(
                             Qt::TextElideMode(elideMode),
-                            lineWidth,
+                            QFixed::fromReal(lineWidth),
                             0,
                             line.textStart(),
                             line.textLength());
@@ -941,7 +942,7 @@ QRect QQuickTextPrivate::setupTextLayout(qreal *const naturalWidth)
     if (truncated != wasTruncated)
         emit q->truncatedChanged();
 
-    return QRect(qRound(br.x()), qRound(br.y()), qCeil(br.width()), qCeil(br.height()));
+    return br;
 }
 
 void QQuickTextPrivate::setLineGeometry(QTextLine &line, qreal lineWidth, qreal &height)
@@ -1897,7 +1898,7 @@ QRectF QQuickText::boundingRect() const
 {
     Q_D(const QQuickText);
 
-    QRect rect = d->layedOutTextRect;
+    QRectF rect = d->layedOutTextRect;
     if (d->style != Normal)
         rect.adjust(-1, 0, 1, 2);
 
@@ -1915,7 +1916,7 @@ QRectF QQuickText::boundingRect() const
         break;
     }
 
-    return QRectF(rect);
+    return rect;
 }
 
 /*! \internal */
index e060cc1..d0770e6 100644 (file)
@@ -82,9 +82,9 @@ public:
     QTextDocument *textDocument();
     bool isLineLaidOutConnected();
     void setLineGeometry(QTextLine &line, qreal lineWidth, qreal &height);
-    QString elidedText(int lineWidth, const QTextLine &line, QTextLine *nextLine = 0) const;
+    QString elidedText(qreal lineWidth, const QTextLine &line, QTextLine *nextLine = 0) const;
 
-    QRect layedOutTextRect;
+    QRectF layedOutTextRect;
 
     qreal lineHeight;
 
@@ -156,7 +156,7 @@ public:
 
     void ensureDoc();
 
-    QRect setupTextLayout(qreal *const naturalWidth);
+    QRectF setupTextLayout(qreal *const naturalWidth);
     void setupCustomLineGeometry(QTextLine &line, qreal &height, int lineOffset = 0);
     bool isLinkActivatedConnected();
     QString anchorAt(const QPointF &pos);
index d26576e..6b9dc71 100644 (file)
@@ -7,7 +7,7 @@ Item {
     Text {
         id: myText
         objectName: "myText"
-        width: 100
+        width: 60
         font.pixelSize: 15
         font.family: "Helvetica"
     }
index 0da9bc3..21f1b20 100644 (file)
@@ -7,7 +7,7 @@ Item {
     Text {
         id: myText
         objectName: "myText"
-        width: 100
+        width: 60
         height: 36
         font.pixelSize: 15
         font.family: "Helvetica"
index c28de8b..5f13f62 100644 (file)
@@ -295,11 +295,10 @@ void tst_qquicktext::width()
 
             layout.endLayout();
 
-            metricWidth = qCeil(layout.boundingRect().width());
+            metricWidth = layout.boundingRect().width();
         } else {
             QFontMetricsF fm(f);
-            qreal metricWidth = fm.size(Qt::TextExpandTabs && Qt::TextShowMnemonic, standard.at(i)).width();
-            metricWidth = qCeil(metricWidth);
+            metricWidth = fm.size(Qt::TextExpandTabs && Qt::TextShowMnemonic, standard.at(i)).width();
         }
 
         QString componentStr = "import QtQuick 2.0\nText { text: \"" + standard.at(i) + "\" }";
@@ -2422,9 +2421,6 @@ void tst_qquicktext::multilengthStrings()
 
     QCOMPARE(myText->contentWidth(), mediumWidth);
     QCOMPARE(myText->contentHeight(), mediumHeight);
-#ifdef Q_OS_MAC
-    QEXPECT_FAIL("Wrap", "QTBUG-24310", Continue);
-#endif
     QCOMPARE(myText->truncated(), true);
 
     myText->setSize(QSizeF(shortWidth, shortHeight));