summaryrefslogtreecommitdiffstats
path: root/src/gui/text
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/text')
-rw-r--r--src/gui/text/qfont.cpp13
-rw-r--r--src/gui/text/qfont_p.h7
-rw-r--r--src/gui/text/qfontmetrics.cpp44
3 files changed, 27 insertions, 37 deletions
diff --git a/src/gui/text/qfont.cpp b/src/gui/text/qfont.cpp
index b50dc4a43bf..7bbc9cf63db 100644
--- a/src/gui/text/qfont.cpp
+++ b/src/gui/text/qfont.cpp
@@ -257,6 +257,19 @@ QFontEngine *QFontPrivate::engineForScript(int script) const
return QT_FONT_ENGINE_FROM_DATA(engineData, script);
}
+QFontEngine *QFontPrivate::engineForCharacter(char32_t c, EngineQueryOptions opt) const
+{
+ const bool smallCaps = !(opt & EngineQueryOption::IgnoreSmallCapsEngine);
+ const auto script = QChar::script(c);
+ QFontEngine *engine;
+ if (smallCaps && capital == QFont::SmallCaps && QChar::isLower(c))
+ engine = smallCapsFontPrivate()->engineForScript(script);
+ else
+ engine = engineForScript(script);
+ Q_ASSERT(engine != nullptr);
+ return engine;
+}
+
void QFontPrivate::alterCharForCapitalization(QChar &c) const {
switch (capital) {
case QFont::AllUppercase:
diff --git a/src/gui/text/qfont_p.h b/src/gui/text/qfont_p.h
index 75550439521..27bc2a6a7cc 100644
--- a/src/gui/text/qfont_p.h
+++ b/src/gui/text/qfont_p.h
@@ -163,6 +163,11 @@ private:
class Q_GUI_EXPORT QFontPrivate
{
public:
+ enum class EngineQueryOption {
+ Default = 0,
+ IgnoreSmallCapsEngine = 0x1,
+ };
+ Q_DECLARE_FLAGS(EngineQueryOptions, EngineQueryOption)
QFontPrivate();
QFontPrivate(const QFontPrivate &other);
@@ -170,6 +175,7 @@ public:
~QFontPrivate();
QFontEngine *engineForScript(int script) const;
+ QFontEngine *engineForCharacter(char32_t c, EngineQueryOptions opt = {}) const;
void alterCharForCapitalization(QChar &c) const;
QAtomicInt ref;
@@ -208,6 +214,7 @@ public:
void unsetVariableAxis(QFont::Tag tag);
bool hasVariableAxis(QFont::Tag tag, float value) const;
};
+Q_DECLARE_OPERATORS_FOR_FLAGS(QFontPrivate::EngineQueryOptions)
class Q_GUI_EXPORT QFontCache : public QObject
diff --git a/src/gui/text/qfontmetrics.cpp b/src/gui/text/qfontmetrics.cpp
index 4ea21c9f0f3..c4403a16c6d 100644
--- a/src/gui/text/qfontmetrics.cpp
+++ b/src/gui/text/qfontmetrics.cpp
@@ -410,9 +410,8 @@ bool QFontMetrics::inFont(QChar ch) const
*/
bool QFontMetrics::inFontUcs4(uint ucs4) const
{
- const int script = QChar::script(ucs4);
- QFontEngine *engine = d->engineForScript(script);
- Q_ASSERT(engine != nullptr);
+ constexpr auto Ignore = QFontPrivate::EngineQueryOption::IgnoreSmallCapsEngine;
+ QFontEngine *engine = d->engineForCharacter(ucs4, Ignore);
if (engine->type() == QFontEngine::Box)
return false;
return engine->canRender(ucs4);
@@ -432,13 +431,7 @@ bool QFontMetrics::inFontUcs4(uint ucs4) const
*/
int QFontMetrics::leftBearing(QChar ch) const
{
- const int script = ch.script();
- QFontEngine *engine;
- if (d->capital == QFont::SmallCaps && ch.isLower())
- engine = d->smallCapsFontPrivate()->engineForScript(script);
- else
- engine = d->engineForScript(script);
- Q_ASSERT(engine != nullptr);
+ QFontEngine *engine = d->engineForCharacter(ch.unicode());
if (engine->type() == QFontEngine::Box)
return 0;
@@ -465,12 +458,7 @@ int QFontMetrics::leftBearing(QChar ch) const
*/
int QFontMetrics::rightBearing(QChar ch) const
{
- const int script = ch.script();
- QFontEngine *engine;
- if (d->capital == QFont::SmallCaps && ch.isLower())
- engine = d->smallCapsFontPrivate()->engineForScript(script);
- else
- engine = d->engineForScript(script);
+ QFontEngine *engine = d->engineForCharacter(ch.unicode());
Q_ASSERT(engine != nullptr);
if (engine->type() == QFontEngine::Box)
return 0;
@@ -574,13 +562,7 @@ int QFontMetrics::horizontalAdvance(QChar ch) const
if (QChar::category(ch.unicode()) == QChar::Mark_NonSpacing)
return 0;
- const int script = ch.script();
- QFontEngine *engine;
- if (d->capital == QFont::SmallCaps && ch.isLower())
- engine = d->smallCapsFontPrivate()->engineForScript(script);
- else
- engine = d->engineForScript(script);
- Q_ASSERT(engine != nullptr);
+ QFontEngine *engine = d->engineForCharacter(ch.unicode());
d->alterCharForCapitalization(ch);
@@ -684,13 +666,7 @@ QRect QFontMetrics::boundingRect(const QString &text, const QTextOption &option)
*/
QRect QFontMetrics::boundingRect(QChar ch) const
{
- const int script = ch.script();
- QFontEngine *engine;
- if (d->capital == QFont::SmallCaps && ch.isLower())
- engine = d->smallCapsFontPrivate()->engineForScript(script);
- else
- engine = d->engineForScript(script);
- Q_ASSERT(engine != nullptr);
+ QFontEngine *engine = d->engineForCharacter(ch.unicode());
d->alterCharForCapitalization(ch);
@@ -1345,13 +1321,7 @@ bool QFontMetricsF::inFontUcs4(uint ucs4) const
*/
qreal QFontMetricsF::leftBearing(QChar ch) const
{
- const int script = ch.script();
- QFontEngine *engine;
- if (d->capital == QFont::SmallCaps && ch.isLower())
- engine = d->smallCapsFontPrivate()->engineForScript(script);
- else
- engine = d->engineForScript(script);
- Q_ASSERT(engine != nullptr);
+ QFontEngine *engine = d->engineForCharacter(ch.unicode());
if (engine->type() == QFontEngine::Box)
return 0;