Use resolved font name for key in distance field cache.
authorAndrew den Exter <andrew.den-exter@nokia.com>
Mon, 25 Jun 2012 05:20:53 +0000 (15:20 +1000)
committerQt by Nokia <qt-info@nokia.com>
Wed, 27 Jun 2012 09:28:41 +0000 (11:28 +0200)
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>
src/quick/scenegraph/util/qsgdistancefieldutil.cpp
src/quick/scenegraph/util/qsgdistancefieldutil_p.h

index ecfdf9b..8bd2eca 100644 (file)
@@ -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
index 329df98..ba46670 100644 (file)
@@ -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;