diff options
author | Yoann Lopes <yoann.lopes@nokia.com> | 2011-12-15 14:17:33 +0100 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2011-12-21 12:16:25 +0100 |
commit | 3d8986d7475ef6fdd04ea1286d840d2b570133a0 (patch) | |
tree | 66cec7e44c432c904b0e33dec4ce34ef622c7b67 /src/quick/scenegraph/qsgdefaultdistancefieldglyphcache.cpp | |
parent | 0febfa03b62a4449c42ad1e675777b7b099ebaa3 (diff) |
Reference count glyphs in QSGDistanceFieldGlyphCache.
This was previously done only in the default cache implementation. It
has been moved to the base class.
releaseGlyphs() is called when a glyph is not referenced anymore by any
node.
Added a virtual function referenceGlyphs() that is called everytime glyphs
are being used in a node. This function is called just before
requestGlyphs().
Change-Id: If90f86c328c18ae2a5977847a6adf50b99ea1241
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@nokia.com>
Diffstat (limited to 'src/quick/scenegraph/qsgdefaultdistancefieldglyphcache.cpp')
-rw-r--r-- | src/quick/scenegraph/qsgdefaultdistancefieldglyphcache.cpp | 36 |
1 files changed, 12 insertions, 24 deletions
diff --git a/src/quick/scenegraph/qsgdefaultdistancefieldglyphcache.cpp b/src/quick/scenegraph/qsgdefaultdistancefieldglyphcache.cpp index 4f69ad8c44..57a9a8741c 100644 --- a/src/quick/scenegraph/qsgdefaultdistancefieldglyphcache.cpp +++ b/src/quick/scenegraph/qsgdefaultdistancefieldglyphcache.cpp @@ -65,31 +65,19 @@ QSGDefaultDistanceFieldGlyphCache::QSGDefaultDistanceFieldGlyphCache(QSGDistance m_textureData = textureData(c); } -void QSGDefaultDistanceFieldGlyphCache::requestGlyphs(const QVector<glyph_t> &glyphs) +void QSGDefaultDistanceFieldGlyphCache::requestGlyphs(const QSet<glyph_t> &glyphs) { - int count = glyphs.count(); - - // Avoid useless and costly glyph re-generation - if (cacheIsFull() && !m_textureData->unusedGlyphs.isEmpty()) { - for (int i = 0; i < count; ++i) { - glyph_t glyphIndex = glyphs.at(i); - if (containsGlyph(glyphIndex) && m_textureData->unusedGlyphs.contains(glyphIndex)) - m_textureData->unusedGlyphs.remove(glyphIndex); - } - } - QList<GlyphPosition> glyphPositions; QVector<glyph_t> glyphsToRender; - for (int i = 0; i < count; ++i) { - glyph_t glyphIndex = glyphs.at(i); - - if (++m_textureData->glyphRefCount[glyphIndex] == 1) - m_textureData->unusedGlyphs.remove(glyphIndex); + for (QSet<glyph_t>::const_iterator it = glyphs.constBegin(); it != glyphs.constEnd() ; ++it) { + glyph_t glyphIndex = *it; if (cacheIsFull() && m_textureData->unusedGlyphs.isEmpty()) continue; + m_textureData->unusedGlyphs.remove(glyphIndex); + GlyphPosition p; p.glyph = glyphIndex; p.position = QPointF(m_textureData->currX, m_textureData->currY); @@ -162,14 +150,14 @@ void QSGDefaultDistanceFieldGlyphCache::storeGlyphs(const QHash<glyph_t, QImage> setGlyphsTexture(glyphTextures, t); } -void QSGDefaultDistanceFieldGlyphCache::releaseGlyphs(const QVector<glyph_t> &glyphs) +void QSGDefaultDistanceFieldGlyphCache::referenceGlyphs(const QSet<glyph_t> &glyphs) { - int count = glyphs.count(); - for (int i = 0; i < count; ++i) { - glyph_t glyphIndex = glyphs.at(i); - if (--m_textureData->glyphRefCount[glyphIndex] == 0 && !glyphTexCoord(glyphIndex).isNull()) - m_textureData->unusedGlyphs.insert(glyphIndex); - } + m_textureData->unusedGlyphs -= glyphs; +} + +void QSGDefaultDistanceFieldGlyphCache::releaseGlyphs(const QSet<glyph_t> &glyphs) +{ + m_textureData->unusedGlyphs += glyphs; } void QSGDefaultDistanceFieldGlyphCache::createTexture(int width, int height) |