diff options
author | Yoann Lopes <yoann.lopes@nokia.com> | 2011-04-29 14:26:08 +0200 |
---|---|---|
committer | Yoann Lopes <yoann.lopes@nokia.com> | 2011-04-29 14:26:08 +0200 |
commit | ade28f1bbd22d726ceba80a42abf33731b6d731f (patch) | |
tree | e801ce1b52beb167f499156180f4c21faa96978f | |
parent | c0d8a352b84db4899f2714382739728183ea9c30 (diff) |
Use a proper hash key for distance-field cache.
-rw-r--r-- | src/declarative/scenegraph/qsgdistancefieldglyphcache.cpp | 32 | ||||
-rw-r--r-- | src/declarative/scenegraph/qsgdistancefieldglyphcache_p.h | 5 |
2 files changed, 10 insertions, 27 deletions
diff --git a/src/declarative/scenegraph/qsgdistancefieldglyphcache.cpp b/src/declarative/scenegraph/qsgdistancefieldglyphcache.cpp index c40df75084..5801311be4 100644 --- a/src/declarative/scenegraph/qsgdistancefieldglyphcache.cpp +++ b/src/declarative/scenegraph/qsgdistancefieldglyphcache.cpp @@ -531,26 +531,14 @@ static bool fontHasNarrowOutlines(const QRawFont &f) DEFINE_BOOL_CONFIG_OPTION(disableDistanceField, QML_DISABLE_DISTANCEFIELD) -QHash<QString, QSGDistanceFieldGlyphCache *> QSGDistanceFieldGlyphCache::m_caches; -QHash<QString, QGLContextGroupResource<QSGDistanceFieldGlyphCache::DistanceFieldTextureData> > QSGDistanceFieldGlyphCache::m_textures_data; - -static QString fontKey(const QRawFont &font) -{ - QString key; - - key = font.familyName(); - key.remove(QLatin1String(" ")); - QString italic = font.style() == QFont::StyleItalic ? QLatin1String("i") : QLatin1String(""); - QString bold = font.weight() > QFont::Normal ? QLatin1String("b") : QLatin1String(""); - key += bold + italic + QString::number(qreal(font.pixelSize())); - - return key; -} +QHash<QPair<const QGLContext *, QFontEngine *>, QSGDistanceFieldGlyphCache *> QSGDistanceFieldGlyphCache::m_caches; +QHash<QFontEngine *, QGLContextGroupResource<QSGDistanceFieldGlyphCache::DistanceFieldTextureData> > QSGDistanceFieldGlyphCache::m_textures_data; QSGDistanceFieldGlyphCache *QSGDistanceFieldGlyphCache::get(const QGLContext *ctx, const QRawFont &font) { - QString key = QString::number(long(ctx), 16) + fontKey(font); - QHash<QString, QSGDistanceFieldGlyphCache *>::iterator atlas = m_caches.find(key); + QRawFontPrivate *fontD = QRawFontPrivate::get(font); + QPair<const QGLContext *, QFontEngine *> key(ctx, fontD->fontEngine); + QHash<QPair<const QGLContext *, QFontEngine *>, QSGDistanceFieldGlyphCache *>::iterator atlas = m_caches.find(key); if (atlas == m_caches.end()) atlas = m_caches.insert(key, new QSGDistanceFieldGlyphCache(ctx, font)); @@ -559,7 +547,7 @@ QSGDistanceFieldGlyphCache *QSGDistanceFieldGlyphCache::get(const QGLContext *ct QSGDistanceFieldGlyphCache::DistanceFieldTextureData *QSGDistanceFieldGlyphCache::textureData() { - return m_textures_data[m_distanceFieldKey].value(ctx); + return m_textures_data[QRawFontPrivate::get(m_font)->fontEngine].value(ctx); } QSGDistanceFieldGlyphCache::QSGDistanceFieldGlyphCache(const QGLContext *c, const QRawFont &font) @@ -571,11 +559,6 @@ QSGDistanceFieldGlyphCache::QSGDistanceFieldGlyphCache(const QGLContext *c, cons Q_ASSERT(font.isValid()); m_font = font; - QString basename = m_font.familyName(); - basename.remove(QLatin1String(" ")); - QString italic = m_font.style() == QFont::StyleItalic ? QLatin1String("i") : QLatin1String(""); - QString bold = m_font.weight() > QFont::Normal ? QLatin1String("b") : QLatin1String(""); - m_distanceFieldKey = basename + bold + italic; m_textureData = textureData(); QRawFontPrivate *fontD = QRawFontPrivate::get(m_font); @@ -619,7 +602,8 @@ void QSGDistanceFieldGlyphCache::onContextDestroyed(const QGLContext *context) if (context != ctx) return; - QString key = QString::number(long(context), 16) + fontKey(m_font); + QRawFontPrivate *fontD = QRawFontPrivate::get(m_font); + QPair<const QGLContext *, QFontEngine *> key(context, fontD->fontEngine); m_caches.remove(key); deleteLater(); } diff --git a/src/declarative/scenegraph/qsgdistancefieldglyphcache_p.h b/src/declarative/scenegraph/qsgdistancefieldglyphcache_p.h index 60e5b5921a..5ee439552a 100644 --- a/src/declarative/scenegraph/qsgdistancefieldglyphcache_p.h +++ b/src/declarative/scenegraph/qsgdistancefieldglyphcache_p.h @@ -112,12 +112,11 @@ private: void createTexture(int width, int height); void resizeTexture(int width, int height); - static QHash<QString, QSGDistanceFieldGlyphCache *> m_caches; + static QHash<QPair<const QGLContext *, QFontEngine *>, QSGDistanceFieldGlyphCache *> m_caches; QRawFont m_font; QRawFont m_referenceFont; - QString m_distanceFieldKey; int m_glyphCount; QHash<glyph_t, Metrics> m_metrics; mutable int m_maxTextureSize; @@ -145,7 +144,7 @@ private: }; DistanceFieldTextureData *textureData(); DistanceFieldTextureData *m_textureData; - static QHash<QString, QGLContextGroupResource<DistanceFieldTextureData> > m_textures_data; + static QHash<QFontEngine *, QGLContextGroupResource<DistanceFieldTextureData> > m_textures_data; const QGLContext *ctx; QGLShaderProgram *m_blitProgram; |