diff options
Diffstat (limited to 'src/gui/text/qfontmetrics.cpp')
-rw-r--r-- | src/gui/text/qfontmetrics.cpp | 94 |
1 files changed, 55 insertions, 39 deletions
diff --git a/src/gui/text/qfontmetrics.cpp b/src/gui/text/qfontmetrics.cpp index 7997f643ab..f7e405f0b5 100644 --- a/src/gui/text/qfontmetrics.cpp +++ b/src/gui/text/qfontmetrics.cpp @@ -75,15 +75,23 @@ extern void qt_format_text(const QFont& font, const QRectF &_r, inFont(). You can also treat the character as a string, and use the string functions on it. - The string functions include horizontalAdvance(), to return the width of a - string in pixels (or points, for a printer), boundingRect(), to - return a rectangle large enough to contain the rendered string, + The string functions include horizontalAdvance(), to return the advance + width of a string in pixels (or points, for a printer), boundingRect(), + to return a rectangle large enough to contain the rendered string, and size(), to return the size of that rectangle. + \note The advance width can be different from the width of the actual + rendered text. It refers to the distance from the origin of the string to + where you would append additional characters. As text may have overhang + (in the case of an italic font for instance) or padding between + characters, the advance width can be either smaller or larger than the + actual rendering of the text. This is called the right bearing of the + text. + Example: \snippet code/src_gui_text_qfontmetrics.cpp 0 - \sa QFont, QFontInfo, QFontDatabase, {Character Map Example} + \sa QFont, QFontInfo, QFontDatabase */ /*! @@ -473,10 +481,13 @@ int QFontMetrics::rightBearing(QChar ch) const return qRound(rb); } +static constexpr QLatin1Char s_variableLengthStringSeparator('\x9c'); + /*! Returns the horizontal advance in pixels of the first \a len characters of \a text. If \a len is negative (the default), the entire string is - used. + used. The entire length of \a text is analysed even if \a len is substantially + shorter. This is the distance appropriate for drawing a subsequent character after \a text. @@ -487,11 +498,13 @@ int QFontMetrics::rightBearing(QChar ch) const */ int QFontMetrics::horizontalAdvance(const QString &text, int len) const { - int pos = text.indexOf(QLatin1Char('\x9c')); + int pos = (len >= 0) + ? QStringView(text).left(len).indexOf(s_variableLengthStringSeparator) + : text.indexOf(s_variableLengthStringSeparator); if (pos != -1) { - len = (len < 0) ? pos : qMin(pos, len); + len = pos; } else if (len < 0) { - len = text.length(); + len = text.size(); } if (len == 0) return 0; @@ -512,12 +525,12 @@ int QFontMetrics::horizontalAdvance(const QString &text, int len) const */ int QFontMetrics::horizontalAdvance(const QString &text, const QTextOption &option) const { - int pos = text.indexOf(QLatin1Char('\x9c')); + int pos = text.indexOf(s_variableLengthStringSeparator); int len = -1; if (pos != -1) { - len = (len < 0) ? pos : qMin(pos, len); - } else if (len < 0) { - len = text.length(); + len = pos; + } else { + len = text.size(); } if (len == 0) return 0; @@ -604,12 +617,12 @@ int QFontMetrics::horizontalAdvance(QChar ch) const */ QRect QFontMetrics::boundingRect(const QString &text) const { - if (text.length() == 0) + if (text.size() == 0) return QRect(); QStackTextEngine layout(text, QFont(d.data())); layout.itemize(); - glyph_metrics_t gm = layout.boundingBox(0, text.length()); + glyph_metrics_t gm = layout.boundingBox(0, text.size()); return QRect(qRound(gm.x), qRound(gm.y), qRound(gm.width), qRound(gm.height)); } @@ -639,13 +652,13 @@ QRect QFontMetrics::boundingRect(const QString &text) const */ QRect QFontMetrics::boundingRect(const QString &text, const QTextOption &option) const { - if (text.length() == 0) + if (text.size() == 0) return QRect(); QStackTextEngine layout(text, QFont(d.data())); layout.option = option; layout.itemize(); - glyph_metrics_t gm = layout.boundingBox(0, text.length()); + glyph_metrics_t gm = layout.boundingBox(0, text.size()); return QRect(qRound(gm.x), qRound(gm.y), qRound(gm.width), qRound(gm.height)); } @@ -807,12 +820,12 @@ QSize QFontMetrics::size(int flags, const QString &text, int tabStops, int *tabA */ QRect QFontMetrics::tightBoundingRect(const QString &text) const { - if (text.length() == 0) + if (text.size() == 0) return QRect(); QStackTextEngine layout(text, QFont(d.data())); layout.itemize(); - glyph_metrics_t gm = layout.tightBoundingBox(0, text.length()); + glyph_metrics_t gm = layout.tightBoundingBox(0, text.size()); return QRect(qRound(gm.x), qRound(gm.y), qRound(gm.width), qRound(gm.height)); } @@ -839,13 +852,13 @@ QRect QFontMetrics::tightBoundingRect(const QString &text) const */ QRect QFontMetrics::tightBoundingRect(const QString &text, const QTextOption &option) const { - if (text.length() == 0) + if (text.size() == 0) return QRect(); QStackTextEngine layout(text, QFont(d.data())); layout.option = option; layout.itemize(); - glyph_metrics_t gm = layout.tightBoundingBox(0, text.length()); + glyph_metrics_t gm = layout.tightBoundingBox(0, text.size()); return QRect(qRound(gm.x), qRound(gm.y), qRound(gm.width), qRound(gm.height)); } @@ -876,13 +889,13 @@ QString QFontMetrics::elidedText(const QString &text, Qt::TextElideMode mode, in QString _text = text; if (!(flags & Qt::TextLongestVariant)) { int posA = 0; - int posB = _text.indexOf(QLatin1Char('\x9c')); + int posB = _text.indexOf(s_variableLengthStringSeparator); while (posB >= 0) { QString portion = _text.mid(posA, posB - posA); if (size(flags, portion).width() <= width) return portion; posA = posB + 1; - posB = _text.indexOf(QLatin1Char('\x9c'), posA); + posB = _text.indexOf(s_variableLengthStringSeparator, posA); } _text = _text.mid(posA); } @@ -1387,7 +1400,8 @@ qreal QFontMetricsF::rightBearing(QChar ch) const /*! Returns the horizontal advance in pixels of the first \a length characters of \a text. If \a length is negative (the default), the entire string is - used. + used. The entire length of \a text is analysed even if \a length is substantially + shorter. The advance is the distance appropriate for drawing a subsequent character after \a text. @@ -1398,11 +1412,13 @@ qreal QFontMetricsF::rightBearing(QChar ch) const */ qreal QFontMetricsF::horizontalAdvance(const QString &text, int length) const { - int pos = text.indexOf(QLatin1Char('\x9c')); + int pos = (length >= 0) + ? QStringView(text).left(length).indexOf(s_variableLengthStringSeparator) + : text.indexOf(s_variableLengthStringSeparator); if (pos != -1) - length = (length < 0) ? pos : qMin(pos, length); + length = pos; else if (length < 0) - length = text.length(); + length = text.size(); if (length == 0) return 0; @@ -1424,12 +1440,12 @@ qreal QFontMetricsF::horizontalAdvance(const QString &text, int length) const */ qreal QFontMetricsF::horizontalAdvance(const QString &text, const QTextOption &option) const { - int pos = text.indexOf(QLatin1Char('\x9c')); + int pos = text.indexOf(s_variableLengthStringSeparator); int length = -1; if (pos != -1) - length = (length < 0) ? pos : qMin(pos, length); - else if (length < 0) - length = text.length(); + length = pos; + else + length = text.size(); if (length == 0) return 0; @@ -1516,7 +1532,7 @@ qreal QFontMetricsF::horizontalAdvance(QChar ch) const */ QRectF QFontMetricsF::boundingRect(const QString &text) const { - int len = text.length(); + int len = text.size(); if (len == 0) return QRectF(); @@ -1551,13 +1567,13 @@ QRectF QFontMetricsF::boundingRect(const QString &text) const */ QRectF QFontMetricsF::boundingRect(const QString &text, const QTextOption &option) const { - if (text.length() == 0) + if (text.size() == 0) return QRectF(); QStackTextEngine layout(text, QFont(d.data())); layout.option = option; layout.itemize(); - glyph_metrics_t gm = layout.boundingBox(0, text.length()); + glyph_metrics_t gm = layout.boundingBox(0, text.size()); return QRectF(gm.x.toReal(), gm.y.toReal(), gm.width.toReal(), gm.height.toReal()); } @@ -1725,12 +1741,12 @@ QSizeF QFontMetricsF::size(int flags, const QString &text, int tabStops, int *ta */ QRectF QFontMetricsF::tightBoundingRect(const QString &text) const { - if (text.length() == 0) + if (text.size() == 0) return QRectF(); QStackTextEngine layout(text, QFont(d.data())); layout.itemize(); - glyph_metrics_t gm = layout.tightBoundingBox(0, text.length()); + glyph_metrics_t gm = layout.tightBoundingBox(0, text.size()); return QRectF(gm.x.toReal(), gm.y.toReal(), gm.width.toReal(), gm.height.toReal()); } @@ -1757,13 +1773,13 @@ QRectF QFontMetricsF::tightBoundingRect(const QString &text) const */ QRectF QFontMetricsF::tightBoundingRect(const QString &text, const QTextOption &option) const { - if (text.length() == 0) + if (text.size() == 0) return QRectF(); QStackTextEngine layout(text, QFont(d.data())); layout.option = option; layout.itemize(); - glyph_metrics_t gm = layout.tightBoundingBox(0, text.length()); + glyph_metrics_t gm = layout.tightBoundingBox(0, text.size()); return QRectF(gm.x.toReal(), gm.y.toReal(), gm.width.toReal(), gm.height.toReal()); } @@ -1793,13 +1809,13 @@ QString QFontMetricsF::elidedText(const QString &text, Qt::TextElideMode mode, q QString _text = text; if (!(flags & Qt::TextLongestVariant)) { int posA = 0; - int posB = _text.indexOf(QLatin1Char('\x9c')); + int posB = _text.indexOf(s_variableLengthStringSeparator); while (posB >= 0) { QString portion = _text.mid(posA, posB - posA); if (size(flags, portion).width() <= width) return portion; posA = posB + 1; - posB = _text.indexOf(QLatin1Char('\x9c'), posA); + posB = _text.indexOf(s_variableLengthStringSeparator, posA); } _text = _text.mid(posA); } |