diff options
author | Andrew den Exter <andrew.den-exter@nokia.com> | 2012-06-25 15:20:53 +1000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-06-27 11:28:41 +0200 |
commit | ab5eb33495baa253bd1d7ccf567f71a58c39f700 (patch) | |
tree | 9f6ee90bc84965c9c54ec076709d5fde073dc6d2 /src/quick/scenegraph | |
parent | 589d39ec6c35edc1ba195474be30dfcf8c31598d (diff) |
Use resolved font name for key in distance field cache.
On windows at least multiple QRawFonts can share a family name but
have different font engines. Prefer the faceId information when
constructing a key for the distance field cache to avoid a conflict.
Task-number: QTBUG-26201
Change-Id: I9111f22045eb35e6535039117ec4184075e778a4
Reviewed-by: Yoann Lopes <yoann.lopes@nokia.com>
Diffstat (limited to 'src/quick/scenegraph')
-rw-r--r-- | src/quick/scenegraph/util/qsgdistancefieldutil.cpp | 26 | ||||
-rw-r--r-- | src/quick/scenegraph/util/qsgdistancefieldutil_p.h | 2 |
2 files changed, 20 insertions, 8 deletions
diff --git a/src/quick/scenegraph/util/qsgdistancefieldutil.cpp b/src/quick/scenegraph/util/qsgdistancefieldutil.cpp index ecfdf9b03c..8bd2ecad0a 100644 --- a/src/quick/scenegraph/util/qsgdistancefieldutil.cpp +++ b/src/quick/scenegraph/util/qsgdistancefieldutil.cpp @@ -75,22 +75,32 @@ QSGDistanceFieldGlyphCacheManager::~QSGDistanceFieldGlyphCacheManager() QSGDistanceFieldGlyphCache *QSGDistanceFieldGlyphCacheManager::cache(const QRawFont &font) { - QString key = QString::fromLatin1("%1_%2_%3_%4") - .arg(font.familyName()) - .arg(font.styleName()) - .arg(font.weight()) - .arg(font.style()); - return m_caches.value(key, 0); + return m_caches.value(fontKey(font), 0); } void QSGDistanceFieldGlyphCacheManager::insertCache(const QRawFont &font, QSGDistanceFieldGlyphCache *cache) { - QString key = QString::fromLatin1("%1_%2_%3_%4") + m_caches.insert(fontKey(font), cache); +} + +QString QSGDistanceFieldGlyphCacheManager::fontKey(const QRawFont &font) +{ + QFontEngine *fe = QRawFontPrivate::get(font)->fontEngine; + if (!fe->faceId().filename.isEmpty()) { + QByteArray keyName = fe->faceId().filename; + if (font.style() != QFont::StyleNormal) + keyName += QByteArray(" I"); + if (font.weight() != QFont::Normal) + keyName += ' ' + QByteArray::number(font.weight()); + keyName += QByteArray(" DF"); + return QString::fromUtf8(keyName); + } else { + return QString::fromLatin1("%1_%2_%3_%4") .arg(font.familyName()) .arg(font.styleName()) .arg(font.weight()) .arg(font.style()); - m_caches.insert(key, cache); + } } QT_END_NAMESPACE diff --git a/src/quick/scenegraph/util/qsgdistancefieldutil_p.h b/src/quick/scenegraph/util/qsgdistancefieldutil_p.h index 329df98a34..ba46670b71 100644 --- a/src/quick/scenegraph/util/qsgdistancefieldutil_p.h +++ b/src/quick/scenegraph/util/qsgdistancefieldutil_p.h @@ -71,6 +71,8 @@ public: void setAntialiasingSpreadFunc(AntialiasingSpreadFunc func) { m_antialiasingSpread_func = func; } private: + static QString fontKey(const QRawFont &font); + QHash<QString, QSGDistanceFieldGlyphCache *> m_caches; QSGGlyphNode::AntialiasingMode m_defaultAntialiasingMode; |