aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/items/qquickspriteengine.cpp
diff options
context:
space:
mode:
authorAlan Alpert <alan.alpert@nokia.com>2012-05-01 16:08:54 +1000
committerQt by Nokia <qt-info@nokia.com>2012-05-14 05:36:33 +0200
commit1ae19b476f4675dff954ce8dac71c1625a96c0c0 (patch)
treedeb762e9bda5a8eed6eb08d190023c0f453b25ff /src/quick/items/qquickspriteengine.cpp
parent4119405660d84e651abf2dd7ecabfb997be25640 (diff)
Avoid accessing sprites until they finish loading
Because sprite properties are not valid until image assembly finishes, some features of the sprite engine cannot work until sprite assembly is finished. In these circumstances, we shouldn't crash. Task-number: QTBUG-24797 Change-Id: I2701f9302620c2cfd5b7bc5ce1cb9f31be4d4e19 Reviewed-by: Alan Alpert <alan.alpert@nokia.com>
Diffstat (limited to 'src/quick/items/qquickspriteengine.cpp')
-rw-r--r--src/quick/items/qquickspriteengine.cpp26
1 files changed, 21 insertions, 5 deletions
diff --git a/src/quick/items/qquickspriteengine.cpp b/src/quick/items/qquickspriteengine.cpp
index 60d6eddb3d..1763d7acab 100644
--- a/src/quick/items/qquickspriteengine.cpp
+++ b/src/quick/items/qquickspriteengine.cpp
@@ -107,12 +107,12 @@ QQuickStochasticEngine::~QQuickStochasticEngine()
}
QQuickSpriteEngine::QQuickSpriteEngine(QObject *parent)
- : QQuickStochasticEngine(parent), m_startedImageAssembly(false)
+ : QQuickStochasticEngine(parent), m_startedImageAssembly(false), m_loaded(false)
{
}
QQuickSpriteEngine::QQuickSpriteEngine(QList<QQuickSprite*> sprites, QObject *parent)
- : QQuickStochasticEngine(parent), m_startedImageAssembly(false)
+ : QQuickStochasticEngine(parent), m_startedImageAssembly(false), m_loaded(false)
{
foreach (QQuickSprite* sprite, sprites)
m_states << (QQuickStochasticState*)sprite;
@@ -156,6 +156,8 @@ int QQuickSpriteEngine::pseudospriteProgress(int sprite, int state, int* rowDura
int QQuickSpriteEngine::spriteState(int sprite)
{
+ if (!m_loaded)
+ return 0;
int state = m_things[sprite];
if (!m_sprites[state]->m_generatedCount)
return state;
@@ -175,7 +177,7 @@ int QQuickSpriteEngine::spriteState(int sprite)
int QQuickSpriteEngine::spriteStart(int sprite)
{
- if (!m_duration[sprite])
+ if (!m_duration[sprite] || !m_loaded)
return m_timeOffset;
int state = m_things[sprite];
if (!m_sprites[state]->m_generatedCount)
@@ -189,6 +191,8 @@ int QQuickSpriteEngine::spriteStart(int sprite)
int QQuickSpriteEngine::spriteFrames(int sprite)
{
+ if (!m_loaded)
+ return 1;
int state = m_things[sprite];
if (!m_sprites[state]->m_generatedCount)
return m_sprites[state]->frames();
@@ -212,7 +216,7 @@ int QQuickSpriteEngine::spriteFrames(int sprite)
int QQuickSpriteEngine::spriteDuration(int sprite)//Full duration, not per frame
{
- if (!m_duration[sprite])
+ if (!m_duration[sprite] || !m_loaded)
return m_duration[sprite];
int state = m_things[sprite];
if (!m_sprites[state]->m_generatedCount)
@@ -230,6 +234,8 @@ int QQuickSpriteEngine::spriteDuration(int sprite)//Full duration, not per frame
int QQuickSpriteEngine::spriteY(int sprite)
{
+ if (!m_loaded)
+ return 0;
int state = m_things[sprite];
if (!m_sprites[state]->m_generatedCount)
return m_sprites[state]->m_rowY;
@@ -250,6 +256,8 @@ int QQuickSpriteEngine::spriteY(int sprite)
int QQuickSpriteEngine::spriteX(int sprite)
{
+ if (!m_loaded)
+ return 0;
int state = m_things[sprite];
if (!m_sprites[state]->m_generatedCount)
return m_sprites[state]->m_rowStartX;
@@ -339,6 +347,7 @@ void QQuickSpriteEngine::startAssemblingImage()
{
if (m_startedImageAssembly)
return;
+ m_loaded = false;
//This could also trigger the start of the image loading in Sprites, however that currently happens in Sprite::setSource
@@ -477,6 +486,8 @@ QImage QQuickSpriteEngine::assembledImage()
qDebug() << "Assembled image output to: " << fPath.arg(acc);
#endif
+ m_loaded = true;
+ m_startedImageAssembly = false;
return image;
}
@@ -530,7 +541,7 @@ void QQuickStochasticEngine::restart(int index)
void QQuickSpriteEngine::restart(int index) //Reimplemented to recognize and handle pseudostates
{
bool randomStart = (m_startTimes[index] == NINF);
- if (m_sprites[m_things[index]]->frameSync()) {//Manually advanced
+ if (m_loaded && m_sprites[m_things[index]]->frameSync()) {//Manually advanced
m_startTimes[index] = 0;
if (randomStart && m_sprites[m_things[index]]->m_generatedCount)
m_startTimes[index] += qrand() % m_sprites[m_things[index]]->m_generatedCount;
@@ -567,6 +578,11 @@ void QQuickStochasticEngine::advance(int idx)
void QQuickSpriteEngine::advance(int idx) //Reimplemented to recognize and handle pseudostates
{
+ if (!m_loaded) {
+ qWarning() << QLatin1String("QQuickSpriteEngine: Trying to advance sprites before sprites finish loading. Ignoring directive");
+ return;
+ }
+
if (idx >= m_things.count())
return;//TODO: Proper fix(because this has happened and I just ignored it)
if (m_duration[idx] == 0) {