summary refs log tree commit diff
diff options
context:
space:
mode:
authorNicolas Werner <nicolas.werner@hotmail.de>2023-10-09 04:18:16 +0200
committerNicolas Werner <nicolas.werner@hotmail.de>2023-10-09 04:18:16 +0200
commitb03bfa53e46215d49e658f226a8eb6acd7993aab (patch)
tree84637485798eab8f5b843528d21b0518066eb0ee
parentStart working on bubble delegate (diff)
downloadnheko-b03bfa53e46215d49e658f226a8eb6acd7993aab.tar.xz
Fix CPU usage from out of frame animated images
-rw-r--r--src/ui/MxcAnimatedImage.cpp9
-rw-r--r--src/ui/MxcAnimatedImage.h11
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: