File 0003-Fix-SoftwareRectangleNode-creating-QSGImageNode-s-wi.patch of Package kf6-kirigami

From f3f1298ead568f266f353a9549e1d7af928e60f8 Mon Sep 17 00:00:00 2001
From: Vlad Zahorodnii <vlad.zahorodnii@kde.org>
Date: Mon, 14 Jul 2025 14:23:39 +0300
Subject: [PATCH 3/3] Fix SoftwareRectangleNode creating QSGImageNode's without
 texture

If the texture provider has no texture, the QSGImageNode should be
removed from the scene graph, otherwise the renderer will crash.

BUG: 506991
(cherry picked from commit 371d9160db5b0e8b87ff9f5c9d7d63911717c0a0)
---
 .../scenegraph/softwarerectanglenode.cpp      | 52 +++++++++++--------
 1 file changed, 31 insertions(+), 21 deletions(-)

diff --git a/src/primitives/scenegraph/softwarerectanglenode.cpp b/src/primitives/scenegraph/softwarerectanglenode.cpp
index 13371029..eee8efce 100644
--- a/src/primitives/scenegraph/softwarerectanglenode.cpp
+++ b/src/primitives/scenegraph/softwarerectanglenode.cpp
@@ -56,15 +56,9 @@ void SoftwareRectangleNode::setImage(const QImage &image)
     if (m_imageNode) {
         removeChildNode(m_imageNode);
         delete m_imageNode;
+        m_imageNode = nullptr;
     }
 
-    m_imageNode = m_window->createImageNode();
-    if (!m_imageNode) {
-        return;
-    }
-
-    m_imageNode->setFiltering(QSGTexture::Filtering::Linear);
-
     m_textureInfo = ShaderNode::TextureInfo{
         .channel = 0,
         .options = {},
@@ -73,8 +67,16 @@ void SoftwareRectangleNode::setImage(const QImage &image)
         .providerConnection = {},
     };
 
-    m_imageNode->setTexture(m_textureInfo.texture.get());
-    appendChildNode(m_imageNode);
+    if (!m_textureInfo.texture) {
+        return;
+    }
+
+    m_imageNode = m_window->createImageNode();
+    if (m_imageNode) {
+        m_imageNode->setTexture(m_textureInfo.texture.get());
+        m_imageNode->setFiltering(QSGTexture::Filtering::Linear);
+        appendChildNode(m_imageNode);
+    }
 }
 
 void SoftwareRectangleNode::setTextureProvider(QSGTextureProvider *provider)
@@ -86,15 +88,9 @@ void SoftwareRectangleNode::setTextureProvider(QSGTextureProvider *provider)
     if (m_imageNode) {
         removeChildNode(m_imageNode);
         delete m_imageNode;
+        m_imageNode = nullptr;
     }
 
-    m_imageNode = m_window->createImageNode();
-    if (!m_imageNode) {
-        return;
-    }
-
-    m_imageNode->setFiltering(QSGTexture::Filtering::Linear);
-
     m_textureInfo = ShaderNode::TextureInfo{
         .channel = 0,
         .options = {},
@@ -103,8 +99,7 @@ void SoftwareRectangleNode::setTextureProvider(QSGTextureProvider *provider)
         .providerConnection = {},
     };
 
-    m_imageNode->setTexture(m_textureInfo.provider->texture());
-    appendChildNode(m_imageNode);
+    // The render node will be created in preprocess().
 }
 
 void SoftwareRectangleNode::setRadius(qreal radius)
@@ -145,11 +140,26 @@ QSGRenderNode::RenderingFlags SoftwareRectangleNode::flags() const
 void SoftwareRectangleNode::preprocess()
 {
     auto provider = m_textureInfo.provider;
-    if (provider && m_imageNode) {
-        m_imageNode->setTexture(provider->texture());
-        if (QSGDynamicTexture *dynamic_texture = qobject_cast<QSGDynamicTexture *>(provider->texture())) {
+    if (provider) {
+        QSGTexture *texture = provider->texture();
+        if (QSGDynamicTexture *dynamic_texture = qobject_cast<QSGDynamicTexture *>(texture)) {
             dynamic_texture->updateTexture();
         }
+
+        if (texture) {
+            if (!m_imageNode) {
+                m_imageNode = m_window->createImageNode();
+                m_imageNode->setTexture(texture);
+                m_imageNode->setFiltering(QSGTexture::Filtering::Linear);
+                appendChildNode(m_imageNode);
+            } else {
+                m_imageNode->setTexture(texture);
+            }
+        } else if (m_imageNode) {
+            removeChildNode(m_imageNode);
+            delete m_imageNode;
+            m_imageNode = nullptr;
+        }
     }
 }
 
-- 
2.50.0

openSUSE Build Service is sponsored by