diff options
author | Konstantin Ritt <ritt.ks@gmail.com> | 2012-06-10 18:30:10 +0300 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-06-14 05:22:11 +0200 |
commit | 09bc8e2cb8238d8dee79a0f22b26efcc05ce6a52 (patch) | |
tree | 29f832231beca539fd6d03261f8e7c18938827db | |
parent | dd68e93de7eb1c50cc5b5779497e03f491c90373 (diff) |
QFontMetrics/QRawFont: Optimize SMP code points handling a bit
Calling QString::fromUcs4() for the single UCS-4 -encoded character is quite suboptimal
since the BOM detections and the resulting QString aren't really used;
all we need is to split the UCS-4 code point into the UCS-2 surrogate pair.
Change-Id: Ia5b68312909bf551cf2493d9e2752a7d7d837fb9
Reviewed-by: Lars Knoll <lars.knoll@nokia.com>
-rw-r--r-- | src/gui/text/qfontengine_p.h | 12 | ||||
-rw-r--r-- | src/gui/text/qfontmetrics.cpp | 6 | ||||
-rw-r--r-- | src/gui/text/qrawfont.cpp | 10 | ||||
-rw-r--r-- | src/gui/text/qrawfont.h | 2 |
4 files changed, 19 insertions, 11 deletions
diff --git a/src/gui/text/qfontengine_p.h b/src/gui/text/qfontengine_p.h index 4741de3000..bcf763d5d9 100644 --- a/src/gui/text/qfontengine_p.h +++ b/src/gui/text/qfontengine_p.h @@ -225,6 +225,18 @@ public: virtual const char *name() const = 0; virtual bool canRender(const QChar *string, int len) = 0; + inline bool canRender(uint ucs4) { + QChar utf16[2]; + int utf16len = 1; + if (QChar::requiresSurrogates(ucs4)) { + utf16[0] = QChar::highSurrogate(ucs4); + utf16[1] = QChar::lowSurrogate(ucs4); + ++utf16len; + } else { + utf16[0] = QChar(ucs4); + } + return canRender(utf16, utf16len); + } virtual Type type() const = 0; diff --git a/src/gui/text/qfontmetrics.cpp b/src/gui/text/qfontmetrics.cpp index 83d51e2e71..e5ddcb80d5 100644 --- a/src/gui/text/qfontmetrics.cpp +++ b/src/gui/text/qfontmetrics.cpp @@ -413,8 +413,7 @@ bool QFontMetrics::inFontUcs4(uint ucs4) const Q_ASSERT(engine != 0); if (engine->type() == QFontEngine::Box) return false; - QString utf16 = QString::fromUcs4(&ucs4, 1); - return engine->canRender(utf16.data(), utf16.length()); + return engine->canRender(ucs4); } /*! @@ -1274,8 +1273,7 @@ bool QFontMetricsF::inFontUcs4(uint ucs4) const Q_ASSERT(engine != 0); if (engine->type() == QFontEngine::Box) return false; - QString utf16 = QString::fromUcs4(&ucs4, 1); - return engine->canRender(utf16.data(), utf16.length()); + return engine->canRender(ucs4); } /*! diff --git a/src/gui/text/qrawfont.cpp b/src/gui/text/qrawfont.cpp index 3bd4d88872..ae14f1c798 100644 --- a/src/gui/text/qrawfont.cpp +++ b/src/gui/text/qrawfont.cpp @@ -620,17 +620,15 @@ bool QRawFont::supportsCharacter(QChar character) const } /*! + \overload + Returns true if the font has a glyph that corresponds to the UCS-4 encoded character \a ucs4. \sa supportedWritingSystems() */ -bool QRawFont::supportsCharacter(quint32 ucs4) const +bool QRawFont::supportsCharacter(uint ucs4) const { - if (!d->isValid()) - return false; - - QString str = QString::fromUcs4(&ucs4, 1); - return d->fontEngine->canRender(str.constData(), str.size()); + return d->isValid() && d->fontEngine->canRender(ucs4); } // qfontdatabase.cpp diff --git a/src/gui/text/qrawfont.h b/src/gui/text/qrawfont.h index bc5f6621c8..870e714340 100644 --- a/src/gui/text/qrawfont.h +++ b/src/gui/text/qrawfont.h @@ -126,7 +126,7 @@ public: qreal pixelSize, QFont::HintingPreference hintingPreference); - bool supportsCharacter(quint32 ucs4) const; + bool supportsCharacter(uint ucs4) const; bool supportsCharacter(QChar character) const; QList<QFontDatabase::WritingSystem> supportedWritingSystems() const; |