Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package kquickimageeditor for 
openSUSE:Factory checked in at 2026-06-23 17:35:26
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/kquickimageeditor (Old)
 and      /work/SRC/openSUSE:Factory/.kquickimageeditor.new.1956 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "kquickimageeditor"

Tue Jun 23 17:35:26 2026 rev:8 rq:1360702 version:0.6.2

Changes:
--------
--- /work/SRC/openSUSE:Factory/kquickimageeditor/kquickimageeditor.changes      
2026-03-19 17:26:48.847602160 +0100
+++ 
/work/SRC/openSUSE:Factory/.kquickimageeditor.new.1956/kquickimageeditor.changes
    2026-06-23 17:35:42.787501887 +0200
@@ -1,0 +2,14 @@
+Sat Jun 20 08:56:05 UTC 2026 - Christophe Marin <[email protected]>
+
+- Update to 0.6.2
+  * Fix blur cache being recreated every time
+  * Traits::ImageEffects::Blur::image: Remove unnecessary format
+    conversion
+  * Add alpha channel support with non-OpenCV stack blur
+    (kde#519107)
+  * Add option to build with OpenCV (kde#519107)
+  * Reset crop rectangle on canvasRectChanged
+  * {annotation/image}document: Use QImageReader to respect
+    image transformation (kde#516546)
+
+-------------------------------------------------------------------

Old:
----
  kquickimageeditor-0.6.1.tar.xz
  kquickimageeditor-0.6.1.tar.xz.sig

New:
----
  kquickimageeditor-0.6.2.tar.xz
  kquickimageeditor-0.6.2.tar.xz.sig

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ kquickimageeditor.spec ++++++
--- /var/tmp/diff_new_pack.TzjPzA/_old  2026-06-23 17:35:43.567529067 +0200
+++ /var/tmp/diff_new_pack.TzjPzA/_new  2026-06-23 17:35:43.571529206 +0200
@@ -21,16 +21,16 @@
 ExclusiveArch:  do_not_build
 %endif
 %if "%{flavor}" == "qt6"
-  %define qt6 1
-  %define pkg_suffix 6
-  %define kf6_version 6.13.0
-  %define qt6_version 6.8.0
+%define qt6 1
+%define pkg_suffix 6
+%define kf6_version 6.13.0
+%define qt6_version 6.8.0
 %endif
 %define rname kquickimageeditor
 
 %bcond_without released
 Name:           kquickimageeditor%{?pkg_suffix}
-Version:        0.6.1
+Version:        0.6.2
 Release:        0
 Summary:        A set of QtQuick components for image editing
 License:        LGPL-2.1-or-later

++++++ kquickimageeditor-0.6.1.tar.xz -> kquickimageeditor-0.6.2.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kquickimageeditor-0.6.1/CMakeLists.txt 
new/kquickimageeditor-0.6.2/CMakeLists.txt
--- old/kquickimageeditor-0.6.1/CMakeLists.txt  2026-03-16 20:06:41.000000000 
+0100
+++ new/kquickimageeditor-0.6.2/CMakeLists.txt  2026-06-19 18:44:44.000000000 
+0200
@@ -26,18 +26,15 @@
 include(ECMSetupVersion)
 include(ECMGenerateExportHeader)
 include(ECMGenerateHeaders)
-include(ECMGenerateQmlTypes)
 include(ECMQmlModule)
 include(ECMGenerateQDoc)
 
 find_package(Qt6 ${REQUIRED_QT_VERSION} COMPONENTS Core Qml Quick REQUIRED)
 find_package(KF6 ${REQUIRED_KF_VERSION} REQUIRED Config)
 
-if(NOT WIN32)
-    find_package(OpenCV 4.7 COMPONENTS core imgproc)
-    if (NOT OpenCV_DIR)
-        message("OpenCV is missing. Build with OpenCV to get better blur 
performance.")
-    endif()
+option(WITH_OPENCV "Build with OpenCV stack blur (recommended)" UNIX)
+if(WITH_OPENCV)
+    find_package(OpenCV 4.7 COMPONENTS core imgproc REQUIRED)
 endif()
 
 set(CMAKECONFIG_INSTALL_DIR "${KDE_INSTALL_CMAKEPACKAGEDIR}/KQuickImageEditor")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kquickimageeditor-0.6.1/src/annotations/CropTool.qml 
new/kquickimageeditor-0.6.2/src/annotations/CropTool.qml
--- old/kquickimageeditor-0.6.1/src/annotations/CropTool.qml    2026-03-16 
20:06:41.000000000 +0100
+++ new/kquickimageeditor-0.6.2/src/annotations/CropTool.qml    2026-06-19 
18:44:44.000000000 +0200
@@ -114,6 +114,12 @@
                 rect = Utils.rectClipped(rect, baseItem.maxRect())
                 baseItem.setItemRect(selectionItem, rect)
             }
+            function onCanvasRectChanged() {
+                // A canvasRectChanged signal would likely be caused by another
+                // canvas transformation that would invalidate whatever crop
+                // area the user previously set.
+                root.tool.geometry = undefined
+            }
         }
 
         component Overlay: Rectangle {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/kquickimageeditor-0.6.1/src/annotations/annotationdocument.cpp 
new/kquickimageeditor-0.6.2/src/annotations/annotationdocument.cpp
--- old/kquickimageeditor-0.6.1/src/annotations/annotationdocument.cpp  
2026-03-16 20:06:41.000000000 +0100
+++ new/kquickimageeditor-0.6.2/src/annotations/annotationdocument.cpp  
2026-06-19 18:44:44.000000000 +0200
@@ -8,6 +8,7 @@
 #include "utils.h"
 
 #include <QGuiApplication>
+#include <QImageReader>
 #include <QPainter>
 #include <QPainterPath>
 #include <QQuickItem>
@@ -179,12 +180,14 @@
 
 void AnnotationDocument::setBaseImage(const QString &path)
 {
-    setBaseImage(QImage(path));
+    QImageReader reader(path);
+    reader.setAutoTransform(true);
+    setBaseImage(reader.read());
 }
 
 void AnnotationDocument::setBaseImage(const QUrl &localFile)
 {
-    setBaseImage(QImage(localFile.toLocalFile()));
+    setBaseImage(localFile.toLocalFile());
 }
 
 void AnnotationDocument::cropCanvas(const QRectF &cropRect)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/kquickimageeditor-0.6.1/src/annotations/stackblur.cpp 
new/kquickimageeditor-0.6.2/src/annotations/stackblur.cpp
--- old/kquickimageeditor-0.6.1/src/annotations/stackblur.cpp   2026-03-16 
20:06:41.000000000 +0100
+++ new/kquickimageeditor-0.6.2/src/annotations/stackblur.cpp   2026-06-19 
18:44:44.000000000 +0200
@@ -40,15 +40,15 @@
         return;
     }
 
-    const int radiusX = kernelSize.width();
-    const int radiusY = kernelSize.height();
+    const int radiusX = kernelSize.width() / 2;
+    const int radiusY = kernelSize.height() / 2;
     const int w = image.width();
     const int h = image.height();
 
     const int wm = w - 1;
     const int hm = h - 1;
 
-    std::vector<int> r(w * h), g(w * h), b(w * h);
+    std::vector<int> r(w * h), g(w * h), b(w * h), a(w * h);
     std::vector<int> vmin(std::max(w, h));
 
     // Horizontal pass with radiusX
@@ -58,13 +58,13 @@
         divsumX *= divsumX;
 
         struct Pixel {
-            int r, g, b;
+            int r, g, b, a;
         };
         std::vector<Pixel> stack(divX);
 
         for (int y = 0; y < h; y++) {
-            int rinsum = 0, ginsum = 0, binsum = 0, routsum = 0, goutsum = 0, 
boutsum = 0;
-            int rsum = 0, gsum = 0, bsum = 0;
+            int rinsum = 0, ginsum = 0, binsum = 0, ainsum = 0, routsum = 0, 
goutsum = 0, boutsum = 0, aoutsum = 0;
+            int rsum = 0, gsum = 0, bsum = 0, asum = 0;
             int yi = y * w;
 
             for (int i = -radiusX; i <= radiusX; i++) {
@@ -74,20 +74,24 @@
                 sir.r = qRed(p);
                 sir.g = qGreen(p);
                 sir.b = qBlue(p);
+                sir.a = qAlpha(p);
 
                 int rbs = radiusX + 1 - abs(i);
                 rsum += sir.r * rbs;
                 gsum += sir.g * rbs;
                 bsum += sir.b * rbs;
+                asum += sir.a * rbs;
 
                 if (i > 0) {
                     rinsum += sir.r;
                     ginsum += sir.g;
                     binsum += sir.b;
+                    ainsum += sir.a;
                 } else {
                     routsum += sir.r;
                     goutsum += sir.g;
                     boutsum += sir.b;
+                    aoutsum += sir.a;
                 }
             }
 
@@ -96,10 +100,12 @@
                 r[yi] = (rsum * mulTable[radiusX]) >> shgTable[radiusX];
                 g[yi] = (gsum * mulTable[radiusX]) >> shgTable[radiusX];
                 b[yi] = (bsum * mulTable[radiusX]) >> shgTable[radiusX];
+                a[yi] = (asum * mulTable[radiusX]) >> shgTable[radiusX];
 
                 rsum -= routsum;
                 gsum -= goutsum;
                 bsum -= boutsum;
+                asum -= aoutsum;
 
                 int stackstart = (stackpointer - radiusX + divX) % divX;
                 Pixel &sir = stack[stackstart];
@@ -107,6 +113,7 @@
                 routsum -= sir.r;
                 goutsum -= sir.g;
                 boutsum -= sir.b;
+                aoutsum -= sir.a;
 
                 if (y == 0)
                     vmin[x] = std::clamp(x + radiusX + 1, 0, wm);
@@ -115,13 +122,16 @@
                 sir.r = qRed(p);
                 sir.g = qGreen(p);
                 sir.b = qBlue(p);
+                sir.a = qAlpha(p);
 
                 rinsum += sir.r;
                 ginsum += sir.g;
                 binsum += sir.b;
+                ainsum += sir.a;
                 rsum += rinsum;
                 gsum += ginsum;
                 bsum += binsum;
+                asum += ainsum;
 
                 stackpointer = (stackpointer + 1) % divX;
 
@@ -129,9 +139,11 @@
                 routsum += sir2.r;
                 goutsum += sir2.g;
                 boutsum += sir2.b;
+                aoutsum += sir2.a;
                 rinsum -= sir2.r;
                 ginsum -= sir2.g;
                 binsum -= sir2.b;
+                ainsum -= sir2.a;
 
                 yi++;
             }
@@ -145,6 +157,7 @@
                 r[yi] = qRed(p);
                 g[yi] = qGreen(p);
                 b[yi] = qBlue(p);
+                a[yi] = qAlpha(p);
             }
         }
     }
@@ -156,13 +169,13 @@
         divsumY *= divsumY;
 
         struct Pixel {
-            int r, g, b;
+            int r, g, b, a;
         };
         std::vector<Pixel> stack(divY);
 
         for (int x = 0; x < w; x++) {
-            int rinsum = 0, ginsum = 0, binsum = 0, routsum = 0, goutsum = 0, 
boutsum = 0;
-            int rsum = 0, gsum = 0, bsum = 0;
+            int rinsum = 0, ginsum = 0, binsum = 0, ainsum = 0, routsum = 0, 
goutsum = 0, boutsum = 0, aoutsum = 0;
+            int rsum = 0, gsum = 0, bsum = 0, asum = 0;
             int yi = x;
 
             for (int i = -radiusY; i <= radiusY; i++) {
@@ -172,19 +185,23 @@
                 sir.r = r[p];
                 sir.g = g[p];
                 sir.b = b[p];
+                sir.a = a[p];
                 int rbs = radiusY + 1 - abs(i);
                 rsum += r[p] * rbs;
                 gsum += g[p] * rbs;
                 bsum += b[p] * rbs;
+                asum += a[p] * rbs;
 
                 if (i > 0) {
                     rinsum += sir.r;
                     ginsum += sir.g;
                     binsum += sir.b;
+                    ainsum += sir.a;
                 } else {
                     routsum += sir.r;
                     goutsum += sir.g;
                     boutsum += sir.b;
+                    aoutsum += sir.a;
                 }
             }
 
@@ -192,19 +209,22 @@
             for (int y = 0; y < h; y++) {
                 image.setPixel(x,
                                y,
-                               qRgb((rsum * mulTable[radiusY]) >> 
shgTable[radiusY],
+                               qRgba((rsum * mulTable[radiusY]) >> 
shgTable[radiusY],
                                     (gsum * mulTable[radiusY]) >> 
shgTable[radiusY],
-                                    (bsum * mulTable[radiusY]) >> 
shgTable[radiusY]));
+                                    (bsum * mulTable[radiusY]) >> 
shgTable[radiusY],
+                                    (asum * mulTable[radiusY]) >> 
shgTable[radiusY]));
 
                 rsum -= routsum;
                 gsum -= goutsum;
                 bsum -= boutsum;
+                asum -= aoutsum;
 
                 int stackstart = (stackpointer - radiusY + divY) % divY;
                 Pixel &sir = stack[stackstart];
                 routsum -= sir.r;
                 goutsum -= sir.g;
                 boutsum -= sir.b;
+                aoutsum -= sir.a;
 
                 if (x == 0)
                     vmin[y] = std::clamp(y + radiusY + 1, 0, hm) * w;
@@ -213,13 +233,16 @@
                 sir.r = r[p];
                 sir.g = g[p];
                 sir.b = b[p];
+                sir.a = a[p];
 
                 rinsum += sir.r;
                 ginsum += sir.g;
                 binsum += sir.b;
+                ainsum += sir.a;
                 rsum += rinsum;
                 gsum += ginsum;
                 bsum += binsum;
+                asum += ainsum;
 
                 stackpointer = (stackpointer + 1) % divY;
 
@@ -227,9 +250,11 @@
                 routsum += sir2.r;
                 goutsum += sir2.g;
                 boutsum += sir2.b;
+                aoutsum += sir2.a;
                 rinsum -= sir2.r;
                 ginsum -= sir2.g;
                 binsum -= sir2.b;
+                ainsum -= sir2.a;
 
                 yi += w;
             }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kquickimageeditor-0.6.1/src/annotations/traits.cpp 
new/kquickimageeditor-0.6.2/src/annotations/traits.cpp
--- old/kquickimageeditor-0.6.1/src/annotations/traits.cpp      2026-03-16 
20:06:41.000000000 +0100
+++ new/kquickimageeditor-0.6.2/src/annotations/traits.cpp      2026-06-19 
18:44:44.000000000 +0200
@@ -138,16 +138,11 @@
 
 QImage Traits::ImageEffects::Blur::image(const std::function<QImage()> 
&getImage, const QRectF &rect, qreal dpr) const
 {
-    if ((m_backingStoreCache.isNull() //
-         || m_backingStoreCache.devicePixelRatio() != dpr //
-         || m_backingStoreCache.text(strengthKey).toDouble() != m_strength)
-        && getImage) {
+    if (getImage && (m_backingStoreCache.isNull() || 
m_backingStoreCache.devicePixelRatio() != dpr)) {
         m_backingStoreCache = getImage();
         if (m_backingStoreCache.isNull()) {
             return m_backingStoreCache;
         }
-        // RGBA is better for use with stackblur
-        m_backingStoreCache.convertTo(QImage::Format_RGBA8888_Premultiplied);
         // Below this, the effect is nearly invisible.
         static const qreal min = 0.5;
         // Above this, glitches with color splotches happen.
@@ -159,7 +154,6 @@
         const int kernelSize = (int)std::round(sigma + 1) | 1;
         StackBlur::blur(m_backingStoreCache, {kernelSize, kernelSize});
         m_backingStoreCache.setDevicePixelRatio(dpr);
-        m_backingStoreCache.setText(strengthKey, strengthString(m_strength));
     }
     QRect copyRect = Utils::rectScaled(rect, 
m_backingStoreCache.devicePixelRatio()).toAlignedRect();
     if (copyRect.size() != m_backingStoreCache.size()) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kquickimageeditor-0.6.1/src/imagedocument.cpp 
new/kquickimageeditor-0.6.2/src/imagedocument.cpp
--- old/kquickimageeditor-0.6.1/src/imagedocument.cpp   2026-03-16 
20:06:41.000000000 +0100
+++ new/kquickimageeditor-0.6.2/src/imagedocument.cpp   2026-06-19 
18:44:44.000000000 +0200
@@ -4,6 +4,8 @@
  * SPDX-License-Identifier: LGPL-2.1-or-later
  */
 
+#include <QImageReader>
+
 #include "imagedocument.h"
 
 #include "commands/cropcommand.h"
@@ -15,7 +17,9 @@
     : QObject(parent)
 {
     connect(this, &ImageDocument::pathChanged, this, [this](const QUrl &url) {
-        m_image = QImage(url.isLocalFile() ? url.toLocalFile() : 
url.toString());
+        QImageReader reader(url.isLocalFile() ? url.toLocalFile() : 
url.toString());
+        reader.setAutoTransform(true);
+        m_image = reader.read();
         m_edited = false;
         Q_EMIT editedChanged();
         Q_EMIT imageChanged();

Reply via email to