aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYoann Lopes <yoann.lopes@nokia.com>2011-04-29 14:26:08 +0200
committerYoann Lopes <yoann.lopes@nokia.com>2011-04-29 14:26:08 +0200
commitade28f1bbd22d726ceba80a42abf33731b6d731f (patch)
treee801ce1b52beb167f499156180f4c21faa96978f
parentc0d8a352b84db4899f2714382739728183ea9c30 (diff)
Use a proper hash key for distance-field cache.
-rw-r--r--src/declarative/scenegraph/qsgdistancefieldglyphcache.cpp32
-rw-r--r--src/declarative/scenegraph/qsgdistancefieldglyphcache_p.h5
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;