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();