aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/items/qquickspriteengine.cpp
diff options
context:
space:
mode:
authorAlan Alpert <alan.alpert@nokia.com>2012-01-25 19:18:25 +1000
committerQt by Nokia <qt-info@nokia.com>2012-02-09 07:32:07 +0100
commit298b86b95bd42d12e15e8d8a137cd9bee21d6094 (patch)
tree6ac8ee1d463f419966d64756452849d36913a885 /src/quick/items/qquickspriteengine.cpp
parent3233e8052d2d25fd36567f67f9cd314cf0eaef92 (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.cpp76
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;