417bool QFontMetrics::inFontUcs4(uint ucs4)
const
419 constexpr auto Ignore = QFontPrivate::EngineQueryOption::IgnoreSmallCapsEngine;
420 QFontEngine *engine = d->engineForCharacter(ucs4, Ignore);
421 if (engine->type() == QFontEngine::Box)
423 return engine->canRender(ucs4);
438int QFontMetrics::leftBearing(QChar ch)
const
440 QFontEngine *engine = d->engineForCharacter(ch.unicode());
441 if (engine->type() == QFontEngine::Box)
444 d->alterCharForCapitalization(ch);
446 glyph_t glyph = engine->glyphIndex(ch.unicode());
449 engine->getGlyphBearings(glyph, &lb);
465int QFontMetrics::rightBearing(QChar ch)
const
467 QFontEngine *engine = d->engineForCharacter(ch.unicode());
468 Q_ASSERT(engine !=
nullptr);
469 if (engine->type() == QFontEngine::Box)
472 d->alterCharForCapitalization(ch);
474 glyph_t glyph = engine->glyphIndex(ch.unicode());
477 engine->getGlyphBearings(glyph,
nullptr, &rb);
496int QFontMetrics::horizontalAdvance(
const QString &text,
int len)
const
499 ? QStringView(text).left(len).indexOf(s_variableLengthStringSeparator)
500 : text.indexOf(s_variableLengthStringSeparator);
503 }
else if (len < 0) {
509 Q_DECL_UNINITIALIZED QStackTextEngine layout(text, QFont(d.data()));
510 return qRound(layout.width(0, len));
523int QFontMetrics::horizontalAdvance(
const QString &text,
const QTextOption &option)
const
525 int pos = text.indexOf(s_variableLengthStringSeparator);
535 Q_DECL_UNINITIALIZED QStackTextEngine layout(text, QFont(d.data()));
536 layout.option = option;
537 return qRound(layout.width(0, len));
566int QFontMetrics::horizontalAdvance(QChar ch)
const
568 if (QChar::category(ch.unicode()) == QChar::Mark_NonSpacing)
571 QFontEngine *engine = d->engineForCharacter(ch.unicode());
573 d->alterCharForCapitalization(ch);
575 glyph_t glyph = engine->glyphIndex(ch.unicode());
579 glyphs.numGlyphs = 1;
580 glyphs.glyphs = &glyph;
581 glyphs.advances = &advance;
582 engine->recalcAdvances(&glyphs, { });
584 return qRound(advance);
609QRect QFontMetrics::boundingRect(
const QString &text)
const
611 if (text.size() == 0)
614 Q_DECL_UNINITIALIZED QStackTextEngine layout(text, QFont(d.data()));
616 glyph_metrics_t gm = layout.boundingBox(0, text.size());
617 return QRect(qRound(gm.x), qRound(gm.y), qRound(gm.width), qRound(gm.height));
644QRect QFontMetrics::boundingRect(
const QString &text,
const QTextOption &option)
const
646 if (text.size() == 0)
649 Q_DECL_UNINITIALIZED QStackTextEngine layout(text, QFont(d.data()));
650 layout.option = option;
652 glyph_metrics_t gm = layout.boundingBox(0, text.size());
653 return QRect(qRound(gm.x), qRound(gm.y), qRound(gm.width), qRound(gm.height));
673QRect QFontMetrics::boundingRect(QChar ch)
const
675 QFontEngine *engine = d->engineForCharacter(ch.unicode());
677 d->alterCharForCapitalization(ch);
679 glyph_t glyph = engine->glyphIndex(ch.unicode());
681 glyph_metrics_t gm = engine->boundingBox(glyph);
682 return QRect(qRound(gm.x), qRound(gm.y), qRound(gm.width), qRound(gm.height));
733QRect QFontMetrics::boundingRect(
const QRect &rect,
int flags,
const QString &text,
int tabStops,
738 while (tabArray[tabArrayLen])
743 qt_format_text(QFont(d.data()), rr, flags | Qt::TextDontPrint, text, &rb, tabStops, tabArray,
744 tabArrayLen,
nullptr);
746 return rb.toAlignedRect();
772QSize QFontMetrics::size(
int flags,
const QString &text,
int tabStops,
int *tabArray)
const
774 return boundingRect(QRect(0,0,0,0), flags | Qt::TextLongestVariant, text, tabStops, tabArray).size();
798QRect QFontMetrics::tightBoundingRect(
const QString &text)
const
800 if (text.size() == 0)
803 Q_DECL_UNINITIALIZED QStackTextEngine layout(text, QFont(d.data()));
805 glyph_metrics_t gm = layout.tightBoundingBox(0, text.size());
806 return QRect(qRound(gm.x), qRound(gm.y), qRound(gm.width), qRound(gm.height));
830QRect QFontMetrics::tightBoundingRect(
const QString &text,
const QTextOption &option)
const
832 if (text.size() == 0)
835 Q_DECL_UNINITIALIZED QStackTextEngine layout(text, QFont(d.data()));
836 layout.option = option;
838 glyph_metrics_t gm = layout.tightBoundingBox(0, text.size());
839 return QRect(qRound(gm.x), qRound(gm.y), qRound(gm.width), qRound(gm.height));
864QString QFontMetrics::elidedText(
const QString &text, Qt::TextElideMode mode,
int width,
int flags)
const
866 QString _text = text;
867 if (!(flags & Qt::TextLongestVariant)) {
869 int posB = _text.indexOf(s_variableLengthStringSeparator);
871 QString portion = _text.mid(posA, posB - posA);
872 if (size(flags, portion).width() <= width)
875 posB = _text.indexOf(s_variableLengthStringSeparator, posA);
877 _text = _text.mid(posA);
879 Q_DECL_UNINITIALIZED QStackTextEngine engine(_text, QFont(d.data()));
880 return engine.elidedText(mode, width, flags);
1268qreal QFontMetricsF::xHeight()
const
1270 QFontEngine *engine = d->engineForScript(QChar::Script_Common);
1271 Q_ASSERT(engine !=
nullptr);
1272 if (d->capital == QFont::SmallCaps)
1273 return d->smallCapsFontPrivate()->engineForScript(QChar::Script_Common)->ascent().toReal();
1274 return engine->xHeight().toReal();
1326qreal QFontMetricsF::leftBearing(QChar ch)
const
1328 QFontEngine *engine = d->engineForCharacter(ch.unicode());
1329 if (engine->type() == QFontEngine::Box)
1332 d->alterCharForCapitalization(ch);
1334 glyph_t glyph = engine->glyphIndex(ch.unicode());
1337 engine->getGlyphBearings(glyph, &lb);
1353qreal QFontMetricsF::rightBearing(QChar ch)
const
1355 const int script = ch.script();
1356 QFontEngine *engine;
1357 if (d->capital == QFont::SmallCaps && ch.isLower())
1358 engine = d->smallCapsFontPrivate()->engineForScript(script);
1360 engine = d->engineForScript(script);
1361 Q_ASSERT(engine !=
nullptr);
1362 if (engine->type() == QFontEngine::Box)
1365 d->alterCharForCapitalization(ch);
1367 glyph_t glyph = engine->glyphIndex(ch.unicode());
1370 engine->getGlyphBearings(glyph,
nullptr, &rb);
1388qreal QFontMetricsF::horizontalAdvance(
const QString &text,
int length)
const
1390 int pos = (length >= 0)
1391 ? QStringView(text).left(length).indexOf(s_variableLengthStringSeparator)
1392 : text.indexOf(s_variableLengthStringSeparator);
1395 else if (length < 0)
1396 length = text.size();
1401 Q_DECL_UNINITIALIZED QStackTextEngine layout(text, QFont(d.data()));
1403 return layout.width(0, length).toReal();
1416qreal QFontMetricsF::horizontalAdvance(
const QString &text,
const QTextOption &option)
const
1418 int pos = text.indexOf(s_variableLengthStringSeparator);
1423 length = text.size();
1428 Q_DECL_UNINITIALIZED QStackTextEngine layout(text, QFont(d.data()));
1429 layout.option = option;
1431 return layout.width(0, length).toReal();
1460qreal QFontMetricsF::horizontalAdvance(QChar ch)
const
1462 if (ch.category() == QChar::Mark_NonSpacing)
1465 const int script = ch.script();
1466 QFontEngine *engine;
1467 if (d->capital == QFont::SmallCaps && ch.isLower())
1468 engine = d->smallCapsFontPrivate()->engineForScript(script);
1470 engine = d->engineForScript(script);
1471 Q_ASSERT(engine !=
nullptr);
1473 d->alterCharForCapitalization(ch);
1475 glyph_t glyph = engine->glyphIndex(ch.unicode());
1478 QGlyphLayout glyphs;
1479 glyphs.numGlyphs = 1;
1480 glyphs.glyphs = &glyph;
1481 glyphs.advances = &advance;
1482 engine->recalcAdvances(&glyphs, { });
1484 return advance.toReal();
1508QRectF QFontMetricsF::boundingRect(
const QString &text)
const
1510 int len = text.size();
1514 Q_DECL_UNINITIALIZED QStackTextEngine layout(text, QFont(d.data()));
1516 glyph_metrics_t gm = layout.boundingBox(0, len);
1517 return QRectF(gm.x.toReal(), gm.y.toReal(),
1518 gm.width.toReal(), gm.height.toReal());
1543QRectF QFontMetricsF::boundingRect(
const QString &text,
const QTextOption &option)
const
1545 if (text.size() == 0)
1548 Q_DECL_UNINITIALIZED QStackTextEngine layout(text, QFont(d.data()));
1549 layout.option = option;
1551 glyph_metrics_t gm = layout.boundingBox(0, text.size());
1552 return QRectF(gm.x.toReal(), gm.y.toReal(),
1553 gm.width.toReal(), gm.height.toReal());
1570QRectF QFontMetricsF::boundingRect(QChar ch)
const
1572 const int script = ch.script();
1573 QFontEngine *engine;
1574 if (d->capital == QFont::SmallCaps && ch.isLower())
1575 engine = d->smallCapsFontPrivate()->engineForScript(script);
1577 engine = d->engineForScript(script);
1578 Q_ASSERT(engine !=
nullptr);
1580 d->alterCharForCapitalization(ch);
1582 glyph_t glyph = engine->glyphIndex(ch.unicode());
1584 glyph_metrics_t gm = engine->boundingBox(glyph);
1585 return QRectF(gm.x.toReal(), gm.y.toReal(), gm.width.toReal(), gm.height.toReal());
1649QRectF QFontMetricsF::boundingRect(
const QRectF &rect,
int flags,
const QString& text,
1650 int tabStops,
int *tabArray)
const
1652 int tabArrayLen = 0;
1654 while (tabArray[tabArrayLen])
1658 qt_format_text(QFont(d.data()), rect, flags | Qt::TextDontPrint, text, &rb, tabStops, tabArray,
1659 tabArrayLen,
nullptr);
1717QRectF QFontMetricsF::tightBoundingRect(
const QString &text)
const
1719 if (text.size() == 0)
1722 Q_DECL_UNINITIALIZED QStackTextEngine layout(text, QFont(d.data()));
1724 glyph_metrics_t gm = layout.tightBoundingBox(0, text.size());
1725 return QRectF(gm.x.toReal(), gm.y.toReal(), gm.width.toReal(), gm.height.toReal());
1749QRectF QFontMetricsF::tightBoundingRect(
const QString &text,
const QTextOption &option)
const
1751 if (text.size() == 0)
1754 Q_DECL_UNINITIALIZED QStackTextEngine layout(text, QFont(d.data()));
1755 layout.option = option;
1757 glyph_metrics_t gm = layout.tightBoundingBox(0, text.size());
1758 return QRectF(gm.x.toReal(), gm.y.toReal(), gm.width.toReal(), gm.height.toReal());
1782QString QFontMetricsF::elidedText(
const QString &text, Qt::TextElideMode mode, qreal width,
int flags)
const
1784 QString _text = text;
1785 if (!(flags & Qt::TextLongestVariant)) {
1787 int posB = _text.indexOf(s_variableLengthStringSeparator);
1789 QString portion = _text.mid(posA, posB - posA);
1790 if (size(flags, portion).width() <= width)
1793 posB = _text.indexOf(s_variableLengthStringSeparator, posA);
1795 _text = _text.mid(posA);
1797 Q_DECL_UNINITIALIZED QStackTextEngine engine(_text, QFont(d.data()));
1798 return engine.elidedText(mode, QFixed::fromReal(width), flags);
QT_BEGIN_NAMESPACE void qt_format_text(const QFont &font, const QRectF &_r, int tf, const QString &text, QRectF *brect, int tabStops, int *tabArray, int tabArrayLen, QPainter *painter)