summaryrefslogtreecommitdiffstats
path: root/src/extras/text/qdistancefieldglyphcache.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/extras/text/qdistancefieldglyphcache.cpp')
-rw-r--r--src/extras/text/qdistancefieldglyphcache.cpp61
1 files changed, 34 insertions, 27 deletions
diff --git a/src/extras/text/qdistancefieldglyphcache.cpp b/src/extras/text/qdistancefieldglyphcache.cpp
index a65e7fc63..65db1089b 100644
--- a/src/extras/text/qdistancefieldglyphcache.cpp
+++ b/src/extras/text/qdistancefieldglyphcache.cpp
@@ -5,8 +5,7 @@
**
** This file is part of the Qt3D module of the Qt Toolkit.
**
-** $QT_BEGIN_LICENSE:COMM$
-**
+** $QT_BEGIN_LICENSE:LGPL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
@@ -15,25 +14,26 @@
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
-** $QT_END_LICENSE$
-**
-**
-**
-**
-**
-**
-**
-**
-**
-**
-**
-**
-**
-**
-**
-**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
**
+** $QT_END_LICENSE$
**
****************************************************************************/
@@ -161,6 +161,7 @@ DistanceFieldFont::DistanceFieldFont(const QRawFont &font, bool doubleRes, Qt3DC
, m_doubleGlyphResolution(doubleRes)
, m_parentNode(parent)
{
+ Q_ASSERT(m_parentNode);
}
DistanceFieldFont::~DistanceFieldFont()
@@ -197,13 +198,14 @@ StoredGlyph DistanceFieldFont::refGlyph(quint32 glyph)
// scenarios
const int size = m_doubleGlyphResolution ? 512 : 256;
- QTextureAtlas *atlas = new QTextureAtlas(m_parentNode);
+ QTextureAtlas *atlas = new QTextureAtlas();
atlas->setWidth(size);
atlas->setHeight(size);
atlas->setFormat(Qt3DRender::QAbstractTexture::R8_UNorm);
atlas->setPixelFormat(QOpenGLTexture::Red);
atlas->setMinificationFilter(Qt3DRender::QAbstractTexture::Linear);
atlas->setMagnificationFilter(Qt3DRender::QAbstractTexture::Linear);
+ atlas->setParent(m_parentNode);
m_atlasses << atlas;
if (!storedGlyph.addToTextureAtlas(atlas))
@@ -236,7 +238,12 @@ void DistanceFieldFont::derefGlyph(quint32 glyph)
Q_ASSERT(m_atlasses.contains(atlas));
m_atlasses.removeAll(atlas);
- delete atlas;
+
+ // This function might have been called as a result of destroying
+ // the scene root which traverses the entire scene tree. Calling
+ // delete on the atlas here could lead to dangling pointers in the
+ // least of children being traversed for destruction.
+ atlas->deleteLater();
}
m_glyphs.erase(it);
@@ -287,7 +294,8 @@ DistanceFieldFont* QDistanceFieldGlyphCache::getOrCreateDistanceFieldFont(const
// create new font cache
// we set the parent node to nullptr, since the parent node of QTextureAtlasses
// will be set when we pass them to QText2DMaterial later
- DistanceFieldFont *dff = new DistanceFieldFont(actualFont, useDoubleRes, nullptr);
+ Q_ASSERT(m_rootNode);
+ DistanceFieldFont *dff = new DistanceFieldFont(actualFont, useDoubleRes, m_rootNode);
m_fonts.insert(key, dff);
return dff;
}
@@ -324,11 +332,10 @@ QDistanceFieldGlyphCache::Glyph refAndGetGlyph(DistanceFieldFont *dff, quint32 g
if (dff) {
const auto entry = dff->refGlyph(glyph);
- if (entry.atlas()) {
- ret.glyphPathBoundingRect = entry.glyphPathBoundingRect();
- ret.texCoords = entry.texCoords();
- ret.texture = entry.atlas();
- }
+ Q_ASSERT(entry.atlas());
+ ret.glyphPathBoundingRect = entry.glyphPathBoundingRect();
+ ret.texCoords = entry.texCoords();
+ ret.texture = entry.atlas();
}
return ret;