aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/items/qquickanimatedimage.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/quick/items/qquickanimatedimage.cpp')
-rw-r--r--src/quick/items/qquickanimatedimage.cpp40
1 files changed, 38 insertions, 2 deletions
diff --git a/src/quick/items/qquickanimatedimage.cpp b/src/quick/items/qquickanimatedimage.cpp
index 3f31884cd3..19c6d13b2a 100644
--- a/src/quick/items/qquickanimatedimage.cpp
+++ b/src/quick/items/qquickanimatedimage.cpp
@@ -52,6 +52,36 @@
#include <QtNetwork/qnetworkreply.h>
QT_BEGIN_NAMESPACE
+
+QQuickPixmap* QQuickAnimatedImagePrivate::infoForCurrentFrame(QQmlEngine *engine)
+{
+ if (!_movie)
+ return 0;
+
+ int current = _movie->currentFrameNumber();
+ if (!frameMap.contains(current)) {
+ QUrl requestedUrl;
+ QQuickPixmap *pixmap = 0;
+ if (engine && !_movie->fileName().isEmpty()) {
+ requestedUrl.setUrl(QString::fromUtf8("quickanimatedimage://%1#%2")
+ .arg(_movie->fileName())
+ .arg(current));
+ }
+ if (!requestedUrl.isEmpty()) {
+ if (QQuickPixmap::isCached(requestedUrl, QSize()))
+ pixmap = new QQuickPixmap(engine, requestedUrl);
+ else
+ pixmap = new QQuickPixmap(requestedUrl, _movie->currentImage());
+ } else {
+ pixmap = new QQuickPixmap;
+ pixmap->setImage(_movie->currentImage());
+ }
+ frameMap.insert(current, pixmap);
+ }
+
+ return frameMap.value(current);
+}
+
/*!
\qmltype AnimatedImage
\instantiates QQuickAnimatedImage
@@ -111,6 +141,8 @@ QQuickAnimatedImage::~QQuickAnimatedImage()
if (d->reply)
d->reply->deleteLater();
delete d->_movie;
+ qDeleteAll(d->frameMap);
+ d->frameMap.clear();
}
/*!
@@ -231,6 +263,10 @@ void QQuickAnimatedImage::setSource(const QUrl &url)
d->reply = 0;
}
+ d->setImage(QImage());
+ qDeleteAll(d->frameMap);
+ d->frameMap.clear();
+
d->oldPlaying = isPlaying();
if (d->_movie) {
delete d->_movie;
@@ -357,7 +393,7 @@ void QQuickAnimatedImage::movieRequestFinished()
d->_movie->jumpToFrame(d->preset_currentframe);
d->preset_currentframe = 0;
}
- d->setImage(d->_movie->currentPixmap().toImage());
+ d->setPixmap(*d->infoForCurrentFrame(qmlEngine(this)));
if (isPlaying() != d->oldPlaying)
emit playingChanged();
@@ -372,7 +408,7 @@ void QQuickAnimatedImage::movieUpdate()
Q_D(QQuickAnimatedImage);
if (d->_movie) {
- d->setImage(d->_movie->currentPixmap().toImage());
+ d->setPixmap(*d->infoForCurrentFrame(qmlEngine(this)));
emit frameChanged();
}
}