411bool QFontMetrics::inFontUcs4(uint ucs4)
const
413 constexpr auto Ignore = QFontPrivate::EngineQueryOption::IgnoreSmallCapsEngine;
414 QFontEngine *engine = d->engineForCharacter(ucs4, Ignore);
415 if (engine->type() == QFontEngine::Box)
417 return engine->canRender(ucs4);
432int QFontMetrics::leftBearing(QChar ch)
const
434 QFontEngine *engine = d->engineForCharacter(ch.unicode());
435 if (engine->type() == QFontEngine::Box)
438 d->alterCharForCapitalization(ch);
440 glyph_t glyph = engine->glyphIndex(ch.unicode());
443 engine->getGlyphBearings(glyph, &lb);
459int QFontMetrics::rightBearing(QChar ch)
const
461 QFontEngine *engine = d->engineForCharacter(ch.unicode());
462 Q_ASSERT(engine !=
nullptr);
463 if (engine->type() == QFontEngine::Box)
466 d->alterCharForCapitalization(ch);
468 glyph_t glyph = engine->glyphIndex(ch.unicode());
471 engine->getGlyphBearings(glyph,
nullptr, &rb);
490int QFontMetrics::horizontalAdvance(
const QString &text,
int len)
const
493 ? QStringView(text).left(len).indexOf(s_variableLengthStringSeparator)
494 : text.indexOf(s_variableLengthStringSeparator);
497 }
else if (len < 0) {
503 Q_DECL_UNINITIALIZED QStackTextEngine layout(text, QFont(d.data()));
504 return qRound(layout.width(0, len));
517int QFontMetrics::horizontalAdvance(
const QString &text,
const QTextOption &option)
const
519 int pos = text.indexOf(s_variableLengthStringSeparator);
529 Q_DECL_UNINITIALIZED QStackTextEngine layout(text, QFont(d.data()));
530 layout.option = option;
531 return qRound(layout.width(0, len));
560int QFontMetrics::horizontalAdvance(QChar ch)
const
562 if (QChar::category(ch.unicode()) == QChar::Mark_NonSpacing)
565 QFontEngine *engine = d->engineForCharacter(ch.unicode());
567 d->alterCharForCapitalization(ch);
569 glyph_t glyph = engine->glyphIndex(ch.unicode());
573 glyphs.numGlyphs = 1;
574 glyphs.glyphs = &glyph;
575 glyphs.advances = &advance;
576 engine->recalcAdvances(&glyphs, { });
578 return qRound(advance);
603QRect QFontMetrics::boundingRect(
const QString &text)
const
605 if (text.size() == 0)
608 Q_DECL_UNINITIALIZED QStackTextEngine layout(text, QFont(d.data()));
610 glyph_metrics_t gm = layout.boundingBox(0, text.size());
611 return QRect(qRound(gm.x), qRound(gm.y), qRound(gm.width), qRound(gm.height));
638QRect QFontMetrics::boundingRect(
const QString &text,
const QTextOption &option)
const
640 if (text.size() == 0)
643 Q_DECL_UNINITIALIZED QStackTextEngine layout(text, QFont(d.data()));
644 layout.option = option;
646 glyph_metrics_t gm = layout.boundingBox(0, text.size());
647 return QRect(qRound(gm.x), qRound(gm.y), qRound(gm.width), qRound(gm.height));
667QRect QFontMetrics::boundingRect(QChar ch)
const
669 QFontEngine *engine = d->engineForCharacter(ch.unicode());
671 d->alterCharForCapitalization(ch);
673 glyph_t glyph = engine->glyphIndex(ch.unicode());
675 glyph_metrics_t gm = engine->boundingBox(glyph);
676 return QRect(qRound(gm.x), qRound(gm.y), qRound(gm.width), qRound(gm.height));
735QRect QFontMetrics::boundingRect(
const QRect &rect,
int flags,
const QString &text,
int tabStops,
740 while (tabArray[tabArrayLen])
745 qt_format_text(QFont(d.data()), rr, flags | Qt::TextDontPrint, text, &rb, tabStops, tabArray,
746 tabArrayLen,
nullptr);
748 return rb.toAlignedRect();
774QSize QFontMetrics::size(
int flags,
const QString &text,
int tabStops,
int *tabArray)
const
776 return boundingRect(QRect(0,0,0,0), flags | Qt::TextLongestVariant, text, tabStops, tabArray).size();
800QRect QFontMetrics::tightBoundingRect(
const QString &text)
const
802 if (text.size() == 0)
805 Q_DECL_UNINITIALIZED QStackTextEngine layout(text, QFont(d.data()));
807 glyph_metrics_t gm = layout.tightBoundingBox(0, text.size());
808 return QRect(qRound(gm.x), qRound(gm.y), qRound(gm.width), qRound(gm.height));
832QRect QFontMetrics::tightBoundingRect(
const QString &text,
const QTextOption &option)
const
834 if (text.size() == 0)
837 Q_DECL_UNINITIALIZED QStackTextEngine layout(text, QFont(d.data()));
838 layout.option = option;
840 glyph_metrics_t gm = layout.tightBoundingBox(0, text.size());
841 return QRect(qRound(gm.x), qRound(gm.y), qRound(gm.width), qRound(gm.height));
866QString QFontMetrics::elidedText(
const QString &text, Qt::TextElideMode mode,
int width,
int flags)
const
868 QString _text = text;
869 if (!(flags & Qt::TextLongestVariant)) {
871 int posB = _text.indexOf(s_variableLengthStringSeparator);
873 QString portion = _text.mid(posA, posB - posA);
874 if (size(flags, portion).width() <= width)
877 posB = _text.indexOf(s_variableLengthStringSeparator, posA);
879 _text = _text.mid(posA);
881 Q_DECL_UNINITIALIZED QStackTextEngine engine(_text, QFont(d.data()));
882 return engine.elidedText(mode, width, flags);
1264qreal QFontMetricsF::xHeight()
const
1266 QFontEngine *engine = d->engineForScript(QChar::Script_Common);
1267 Q_ASSERT(engine !=
nullptr);
1268 if (d->capital == QFont::SmallCaps)
1269 return d->smallCapsFontPrivate()->engineForScript(QChar::Script_Common)->ascent().toReal();
1270 return engine->xHeight().toReal();
1322qreal QFontMetricsF::leftBearing(QChar ch)
const
1324 QFontEngine *engine = d->engineForCharacter(ch.unicode());
1325 if (engine->type() == QFontEngine::Box)
1328 d->alterCharForCapitalization(ch);
1330 glyph_t glyph = engine->glyphIndex(ch.unicode());
1333 engine->getGlyphBearings(glyph, &lb);
1349qreal QFontMetricsF::rightBearing(QChar ch)
const
1351 const int script = ch.script();
1352 QFontEngine *engine;
1353 if (d->capital == QFont::SmallCaps && ch.isLower())
1354 engine = d->smallCapsFontPrivate()->engineForScript(script);
1356 engine = d->engineForScript(script);
1357 Q_ASSERT(engine !=
nullptr);
1358 if (engine->type() == QFontEngine::Box)
1361 d->alterCharForCapitalization(ch);
1363 glyph_t glyph = engine->glyphIndex(ch.unicode());
1366 engine->getGlyphBearings(glyph,
nullptr, &rb);
1384qreal QFontMetricsF::horizontalAdvance(
const QString &text,
int length)
const
1386 int pos = (length >= 0)
1387 ? QStringView(text).left(length).indexOf(s_variableLengthStringSeparator)
1388 : text.indexOf(s_variableLengthStringSeparator);
1391 else if (length < 0)
1392 length = text.size();
1397 Q_DECL_UNINITIALIZED QStackTextEngine layout(text, QFont(d.data()));
1399 return layout.width(0, length).toReal();
1412qreal QFontMetricsF::horizontalAdvance(
const QString &text,
const QTextOption &option)
const
1414 int pos = text.indexOf(s_variableLengthStringSeparator);
1419 length = text.size();
1424 Q_DECL_UNINITIALIZED QStackTextEngine layout(text, QFont(d.data()));
1425 layout.option = option;
1427 return layout.width(0, length).toReal();
1456qreal QFontMetricsF::horizontalAdvance(QChar ch)
const
1458 if (ch.category() == QChar::Mark_NonSpacing)
1461 const int script = ch.script();
1462 QFontEngine *engine;
1463 if (d->capital == QFont::SmallCaps && ch.isLower())
1464 engine = d->smallCapsFontPrivate()->engineForScript(script);
1466 engine = d->engineForScript(script);
1467 Q_ASSERT(engine !=
nullptr);
1469 d->alterCharForCapitalization(ch);
1471 glyph_t glyph = engine->glyphIndex(ch.unicode());
1474 QGlyphLayout glyphs;
1475 glyphs.numGlyphs = 1;
1476 glyphs.glyphs = &glyph;
1477 glyphs.advances = &advance;
1478 engine->recalcAdvances(&glyphs, { });
1480 return advance.toReal();
1504QRectF QFontMetricsF::boundingRect(
const QString &text)
const
1506 int len = text.size();
1510 Q_DECL_UNINITIALIZED QStackTextEngine layout(text, QFont(d.data()));
1512 glyph_metrics_t gm = layout.boundingBox(0, len);
1513 return QRectF(gm.x.toReal(), gm.y.toReal(),
1514 gm.width.toReal(), gm.height.toReal());
1539QRectF QFontMetricsF::boundingRect(
const QString &text,
const QTextOption &option)
const
1541 if (text.size() == 0)
1544 Q_DECL_UNINITIALIZED QStackTextEngine layout(text, QFont(d.data()));
1545 layout.option = option;
1547 glyph_metrics_t gm = layout.boundingBox(0, text.size());
1548 return QRectF(gm.x.toReal(), gm.y.toReal(),
1549 gm.width.toReal(), gm.height.toReal());
1566QRectF QFontMetricsF::boundingRect(QChar ch)
const
1568 const int script = ch.script();
1569 QFontEngine *engine;
1570 if (d->capital == QFont::SmallCaps && ch.isLower())
1571 engine = d->smallCapsFontPrivate()->engineForScript(script);
1573 engine = d->engineForScript(script);
1574 Q_ASSERT(engine !=
nullptr);
1576 d->alterCharForCapitalization(ch);
1578 glyph_t glyph = engine->glyphIndex(ch.unicode());
1580 glyph_metrics_t gm = engine->boundingBox(glyph);
1581 return QRectF(gm.x.toReal(), gm.y.toReal(), gm.width.toReal(), gm.height.toReal());
1645QRectF QFontMetricsF::boundingRect(
const QRectF &rect,
int flags,
const QString& text,
1646 int tabStops,
int *tabArray)
const
1648 int tabArrayLen = 0;
1650 while (tabArray[tabArrayLen])
1654 qt_format_text(QFont(d.data()), rect, flags | Qt::TextDontPrint, text, &rb, tabStops, tabArray,
1655 tabArrayLen,
nullptr);
1713QRectF QFontMetricsF::tightBoundingRect(
const QString &text)
const
1715 if (text.size() == 0)
1718 Q_DECL_UNINITIALIZED QStackTextEngine layout(text, QFont(d.data()));
1720 glyph_metrics_t gm = layout.tightBoundingBox(0, text.size());
1721 return QRectF(gm.x.toReal(), gm.y.toReal(), gm.width.toReal(), gm.height.toReal());
1745QRectF QFontMetricsF::tightBoundingRect(
const QString &text,
const QTextOption &option)
const
1747 if (text.size() == 0)
1750 Q_DECL_UNINITIALIZED QStackTextEngine layout(text, QFont(d.data()));
1751 layout.option = option;
1753 glyph_metrics_t gm = layout.tightBoundingBox(0, text.size());
1754 return QRectF(gm.x.toReal(), gm.y.toReal(), gm.width.toReal(), gm.height.toReal());
1778QString QFontMetricsF::elidedText(
const QString &text, Qt::TextElideMode mode, qreal width,
int flags)
const
1780 QString _text = text;
1781 if (!(flags & Qt::TextLongestVariant)) {
1783 int posB = _text.indexOf(s_variableLengthStringSeparator);
1785 QString portion = _text.mid(posA, posB - posA);
1786 if (size(flags, portion).width() <= width)
1789 posB = _text.indexOf(s_variableLengthStringSeparator, posA);
1791 _text = _text.mid(posA);
1793 Q_DECL_UNINITIALIZED QStackTextEngine engine(_text, QFont(d.data()));
1794 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)