From: Yoann Lopes Date: Fri, 29 Apr 2011 12:26:08 +0000 (+0200) Subject: Use a proper hash key for distance-field cache. X-Git-Tag: qt-v5.0.0-alpha1~2170^2~170 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ade28f1bbd22d726ceba80a42abf33731b6d731f;p=profile%2Fivi%2Fqtdeclarative.git Use a proper hash key for distance-field cache. --- diff --git a/src/declarative/scenegraph/qsgdistancefieldglyphcache.cpp b/src/declarative/scenegraph/qsgdistancefieldglyphcache.cpp index c40df75..5801311 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 QSGDistanceFieldGlyphCache::m_caches; -QHash > 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, QSGDistanceFieldGlyphCache *> QSGDistanceFieldGlyphCache::m_caches; +QHash > QSGDistanceFieldGlyphCache::m_textures_data; QSGDistanceFieldGlyphCache *QSGDistanceFieldGlyphCache::get(const QGLContext *ctx, const QRawFont &font) { - QString key = QString::number(long(ctx), 16) + fontKey(font); - QHash::iterator atlas = m_caches.find(key); + QRawFontPrivate *fontD = QRawFontPrivate::get(font); + QPair key(ctx, fontD->fontEngine); + QHash, 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 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 60e5b59..5ee4395 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 m_caches; + static QHash, QSGDistanceFieldGlyphCache *> m_caches; QRawFont m_font; QRawFont m_referenceFont; - QString m_distanceFieldKey; int m_glyphCount; QHash m_metrics; mutable int m_maxTextureSize; @@ -145,7 +144,7 @@ private: }; DistanceFieldTextureData *textureData(); DistanceFieldTextureData *m_textureData; - static QHash > m_textures_data; + static QHash > m_textures_data; const QGLContext *ctx; QGLShaderProgram *m_blitProgram;