From ab5eb33495baa253bd1d7ccf567f71a58c39f700 Mon Sep 17 00:00:00 2001 From: Andrew den Exter Date: Mon, 25 Jun 2012 15:20:53 +1000 Subject: [PATCH] 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 --- src/quick/scenegraph/util/qsgdistancefieldutil.cpp | 26 +++++++++++++++------- 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 ecfdf9b..8bd2eca 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 329df98..ba46670 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 m_caches; QSGGlyphNode::AntialiasingMode m_defaultAntialiasingMode; -- 2.7.4