diff options
author | Louis du Verdier <louis.du.verdier@free.fr> | 2014-06-05 08:44:16 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-06-05 14:09:31 +0200 |
commit | 468a65c89eebeeb8c02cb83fe8ffd37c3e8937d2 (patch) | |
tree | 5fb2ece74d4323b17a6500b74fe8573980f69b7e /src/quick/items/qquickanimatedimage.cpp | |
parent | 8a71e2bd031230777dcfbb482af40a03b8d91507 (diff) |
Optimize the way AnimatedImage display its content
Since QtQuick2, the AnimatedImage component is less efficient than it
was with QtQuick1, using more CPU and RAM.
This commit makes it upload when required each animation frame as a
cached texture (using QQuickPixmapCache) to speed up the component.
Task-number: QTBUG-38921
Change-Id: I7ab0b5f47ecec6cb3cdded0dd219d6acc1bc4148
Reviewed-by: Gunnar Sletta <gunnar.sletta@jollamobile.com>
Diffstat (limited to 'src/quick/items/qquickanimatedimage.cpp')
-rw-r--r-- | src/quick/items/qquickanimatedimage.cpp | 40 |
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(); } } |