diff options
author | Alan Alpert <alan.alpert@nokia.com> | 2012-01-25 19:18:25 +1000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-02-09 07:32:07 +0100 |
commit | 298b86b95bd42d12e15e8d8a137cd9bee21d6094 (patch) | |
tree | 6ac8ee1d463f419966d64756452849d36913a885 /src/quick/items/qquickspriteengine.cpp | |
parent | 3233e8052d2d25fd36567f67f9cd314cf0eaef92 (diff) |
Use QDeclarativePixmap in the Particle System
This allows for source URLs to come from network sources.
Change-Id: I416edca010e77e507598eaf4eead4291f044f379
Reviewed-by: Martin Jones <martin.jones@nokia.com>
Diffstat (limited to 'src/quick/items/qquickspriteengine.cpp')
-rw-r--r-- | src/quick/items/qquickspriteengine.cpp | 76 |
1 files changed, 57 insertions, 19 deletions
diff --git a/src/quick/items/qquickspriteengine.cpp b/src/quick/items/qquickspriteengine.cpp index a076a0cc61..c19a5e65c9 100644 --- a/src/quick/items/qquickspriteengine.cpp +++ b/src/quick/items/qquickspriteengine.cpp @@ -41,6 +41,8 @@ #include "qquickspriteengine_p.h" #include "qquicksprite_p.h" +#include <qdeclarativeinfo.h> +#include <qdeclarative.h> #include <QDebug> #include <QPainter> #include <QSet> @@ -100,12 +102,12 @@ QQuickStochasticEngine::~QQuickStochasticEngine() } QQuickSpriteEngine::QQuickSpriteEngine(QObject *parent) - : QQuickStochasticEngine(parent) + : QQuickStochasticEngine(parent), m_startedImageAssembly(false) { } QQuickSpriteEngine::QQuickSpriteEngine(QList<QQuickSprite*> sprites, QObject *parent) - : QQuickStochasticEngine(parent) + : QQuickStochasticEngine(parent), m_startedImageAssembly(false) { foreach (QQuickSprite* sprite, sprites) m_states << (QQuickStochasticState*)sprite; @@ -305,16 +307,35 @@ void QQuickStochasticEngine::setGoal(int state, int sprite, bool jump) return; } -QImage QQuickSpriteEngine::assembledImage() +QDeclarativePixmap::Status QQuickSpriteEngine::status()//Composed status of all Sprites { - int h = 0; - int w = 0; - m_maxFrames = 0; - m_imageStateCount = 0; - int maxSize = 0; + if (!m_startedImageAssembly) + return QDeclarativePixmap::Null; + int null, loading, ready; + null = loading = ready = 0; + foreach (QQuickSprite* s, m_sprites) { + switch (s->m_pix.status()) { + case QDeclarativePixmap::Null : null++; break; + case QDeclarativePixmap::Loading : loading++; break; + case QDeclarativePixmap::Error : return QDeclarativePixmap::Error; + case QDeclarativePixmap::Ready : ready++; break; + } + } + if (null) + return QDeclarativePixmap::Null; + if (loading) + return QDeclarativePixmap::Loading; + if (ready) + return QDeclarativePixmap::Ready; + return QDeclarativePixmap::Null; +} - glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxSize); - //qDebug() << "MAX TEXTURE SIZE" << maxSize; +void QQuickSpriteEngine::startAssemblingImage() +{ + if (m_startedImageAssembly) + return; + + //This could also trigger the start of the image loading in Sprites, however that currently happens in Sprite::setSource foreach (QQuickStochasticState* s, m_states){ QQuickSprite* sprite = qobject_cast<QQuickSprite*>(s); if (sprite) @@ -322,18 +343,35 @@ QImage QQuickSpriteEngine::assembledImage() else qDebug() << "Error: Non-sprite in QQuickSpriteEngine"; } + m_startedImageAssembly = true; +} +QImage QQuickSpriteEngine::assembledImage() +{ + QDeclarativePixmap::Status stat = status(); + if (stat == QDeclarativePixmap::Error) + foreach (QQuickSprite* s, m_sprites) + if (s->m_pix.isError()) + qmlInfo(s) << s->m_pix.error(); + + if (stat != QDeclarativePixmap::Ready) + return QImage(); + + int h = 0; + int w = 0; + m_maxFrames = 0; + m_imageStateCount = 0; + int maxSize = 0; + + glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxSize); + //qDebug() << "MAX TEXTURE SIZE" << maxSize; foreach (QQuickSprite* state, m_sprites){ if (state->frames() > m_maxFrames) m_maxFrames = state->frames(); - QImage img(state->source().toLocalFile()); - if (img.isNull()) { - qWarning() << "SpriteEngine: loading image failed..." << state->source().toLocalFile(); - return QImage(); - } + QImage img = state->m_pix.image(); - //Check that the frame sizes are the same within one engine + //Check that the frame sizes are the same within one sprite if (!state->m_frameWidth) state->m_frameWidth = img.width() / state->frames(); @@ -347,10 +385,10 @@ QImage QQuickSpriteEngine::assembledImage() int rowsNeeded = helper::divRoundUp(state->frames(), (maxSize / state->frameWidth())); if (h + rowsNeeded * state->frameHeight() > maxSize){ if (rowsNeeded * state->frameHeight() > maxSize) - qWarning() << "SpriteEngine: Animation too large to fit in one texture:" << state->source().toLocalFile(); + qmlInfo(state) << "SpriteEngine: Animation too large to fit in one texture:" << state->source().toLocalFile(); else - qWarning() << "SpriteEngine: Animations too large to fit in one texture, pushed over the edge by:" << state->source().toLocalFile(); - qWarning() << "SpriteEngine: Your texture max size today is " << maxSize; + qmlInfo(state) << "SpriteEngine: Animations too large to fit in one texture, pushed over the edge by:" << state->source().toLocalFile(); + qmlInfo(state) << "SpriteEngine: Your texture max size today is " << maxSize; } state->m_generatedCount = rowsNeeded; h += state->frameHeight() * rowsNeeded; |