Fix CPU usage from out of frame animated images
2 files changed, 16 insertions, 4 deletions
diff --git a/src/ui/MxcAnimatedImage.cpp b/src/ui/MxcAnimatedImage.cpp
index 14f5dbd8..ffe54c71 100644
--- a/src/ui/MxcAnimatedImage.cpp
+++ b/src/ui/MxcAnimatedImage.cpp
@@ -102,10 +102,12 @@ MxcAnimatedImage::startDownload()
if (buffer.bytesAvailable() <
4LL * 1024 * 1024 * 1024) // cache images smaller than 4MB in RAM
movie.setCacheMode(QMovie::CacheAll);
- if (play_)
+ if (play_ && movie.frameCount() > 1)
movie.start();
- else
+ else {
movie.jumpToFrame(0);
+ movie.setPaused(true);
+ }
emit loadedChanged();
update();
});
@@ -173,6 +175,9 @@ MxcAnimatedImage::updatePaintNode(QSGNode *oldNode, QQuickItem::UpdatePaintNodeD
if (!imageDirty)
return oldNode;
+ if (clipRect().isEmpty())
+ return oldNode;
+
imageDirty = false;
QSGImageNode *n = static_cast<QSGImageNode *>(oldNode);
if (!n) {
diff --git a/src/ui/MxcAnimatedImage.h b/src/ui/MxcAnimatedImage.h
index c9f89764..1f2c0b74 100644
--- a/src/ui/MxcAnimatedImage.h
+++ b/src/ui/MxcAnimatedImage.h
@@ -29,6 +29,7 @@ public:
connect(this, &MxcAnimatedImage::roomChanged, &MxcAnimatedImage::startDownload);
connect(&movie, &QMovie::frameChanged, this, &MxcAnimatedImage::newFrame);
setFlag(QQuickItem::ItemHasContents);
+ setFlag(QQuickItem::ItemObservesViewport);
// setAcceptHoverEvents(true);
}
@@ -55,7 +56,12 @@ public:
{
if (play_ != newPlay) {
play_ = newPlay;
- movie.setPaused(!play_);
+ if (movie.frameCount() > 1)
+ movie.setPaused(!play_);
+ else {
+ movie.jumpToFrame(0);
+ movie.setPaused(true);
+ }
emit playChanged();
}
}
@@ -77,7 +83,8 @@ private slots:
{
currentFrame = frame;
imageDirty = true;
- update();
+ if (!clipRect().isEmpty())
+ update();
}
private:
|