From a51e7963e9a5b2a35c982e77f636ac4ca9a8cbc4 Mon Sep 17 00:00:00 2001 From: Eskil Abrahamsen Blomfeldt Date: Mon, 24 Jul 2017 13:53:58 +0200 Subject: Ensure same glyph cache is used for same font at different sizes This was fixed in Qt 5.9.0 by 9921b48c83490b450241d6c172f1375ab4efb6b1, but refactoring caused this change to be lost. This is just porting the fix to the refactored class hierarchy. Task-number: QTBUG-60696 Change-Id: I4f95cc7bdd49580ae623a03a7f9cc5242599b6c2 Reviewed-by: Robin Burchell --- src/quick/scenegraph/qsgcontext_p.h | 2 +- src/quick/scenegraph/qsgdefaultrendercontext.cpp | 25 ++++++++++++++++++++++-- src/quick/scenegraph/qsgdefaultrendercontext_p.h | 2 ++ 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/quick/scenegraph/qsgcontext_p.h b/src/quick/scenegraph/qsgcontext_p.h index 6ff8f4a76e..84a2523f26 100644 --- a/src/quick/scenegraph/qsgcontext_p.h +++ b/src/quick/scenegraph/qsgcontext_p.h @@ -194,7 +194,7 @@ protected: QMutex m_mutex; QHash m_textures; QSet m_texturesToDelete; - QHash m_glyphCaches; + QHash m_glyphCaches; QSet m_fontEnginesToClean; }; diff --git a/src/quick/scenegraph/qsgdefaultrendercontext.cpp b/src/quick/scenegraph/qsgdefaultrendercontext.cpp index 29600ef0ca..34bb554db6 100644 --- a/src/quick/scenegraph/qsgdefaultrendercontext.cpp +++ b/src/quick/scenegraph/qsgdefaultrendercontext.cpp @@ -271,6 +271,26 @@ void QSGDefaultRenderContext::compileShader(QSGMaterialShader *shader, QSGMateri } } +QString QSGDefaultRenderContext::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()); + } +} + void QSGDefaultRenderContext::initializeShader(QSGMaterialShader *shader) { shader->program()->bind(); @@ -293,10 +313,11 @@ QT_END_NAMESPACE QSGDistanceFieldGlyphCache *QSGDefaultRenderContext::distanceFieldGlyphCache(const QRawFont &font) { - QSGDistanceFieldGlyphCache *cache = m_glyphCaches.value(font, 0); + QString key = fontKey(font); + QSGDistanceFieldGlyphCache *cache = m_glyphCaches.value(key, 0); if (!cache) { cache = new QSGDefaultDistanceFieldGlyphCache(openglContext(), font); - m_glyphCaches.insert(font, cache); + m_glyphCaches.insert(key, cache); } return cache; diff --git a/src/quick/scenegraph/qsgdefaultrendercontext_p.h b/src/quick/scenegraph/qsgdefaultrendercontext_p.h index 0aed46b658..2537a06988 100644 --- a/src/quick/scenegraph/qsgdefaultrendercontext_p.h +++ b/src/quick/scenegraph/qsgdefaultrendercontext_p.h @@ -96,6 +96,8 @@ public: int maxTextureSize() const override { return m_maxTextureSize; } protected: + static QString fontKey(const QRawFont &font); + QOpenGLContext *m_gl; QSGDepthStencilBufferManager *m_depthStencilManager; int m_maxTextureSize; -- cgit v1.2.3