[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-kimageshop
Subject:    [graphics/krita] libs/ui: Fix scaling of file layers with transparent background
From:       Dmitry Kazakov <null () kde ! org>
Date:       2020-08-13 13:59:27
Message-ID: 20200813135927.D17DA124151B () leptone ! kde ! org
[Download RAW message or body]

Git commit ab91d8ee40021a5ce35d4da40191a545996f281e by Dmitry Kazakov.
Committed on 13/08/2020 at 13:59.
Pushed by dkazakov into branch 'master'.

Fix scaling of file layers with transparent background

For upscaling/downscaling the image we should use its physical
size saved in the original file, not just the bounding rect
calculated with exactBounds().

This patch may change the look of existing .kra files, but we
can consider this case inexistent, because the offset of
transparent file layers has always been calculated incorrectly.
I don't think anyone could use the feature for transparent
layers because of that.

BUG:396131
CC:kimageshop@kde.org

M  +9    -7    libs/ui/kis_file_layer.cpp
M  +1    -1    libs/ui/kis_file_layer.h
M  +4    -1    libs/ui/kis_safe_document_loader.cpp
M  +1    -1    libs/ui/kis_safe_document_loader.h

https://invent.kde.org/graphics/krita/commit/ab91d8ee40021a5ce35d4da40191a545996f281e

diff --git a/libs/ui/kis_file_layer.cpp b/libs/ui/kis_file_layer.cpp
index 843836d904..c12b1e32ec 100644
--- a/libs/ui/kis_file_layer.cpp
+++ b/libs/ui/kis_file_layer.cpp
@@ -45,7 +45,7 @@ KisFileLayer::KisFileLayer(KisImageWSP image, const QString &name, \
quint8 opacit  m_paintDevice = new KisPaintDevice(image->colorSpace());
     m_paintDevice->setDefaultBounds(new KisDefaultBounds(image));
 
-    connect(&m_loader, SIGNAL(loadingFinished(KisPaintDeviceSP,int,int)), \
SLOT(slotLoadingFinished(KisPaintDeviceSP,int,int))); +    connect(&m_loader, \
SIGNAL(loadingFinished(KisPaintDeviceSP,qreal,qreal,QSize)), \
SLOT(slotLoadingFinished(KisPaintDeviceSP,qreal,qreal,QSize)));  }
 
 KisFileLayer::KisFileLayer(KisImageWSP image, const QString &basePath, const QString \
&filename, ScalingMethod scaleToImageResolution, const QString &name, quint8 opacity) \
@@ -62,7 +62,7 @@ KisFileLayer::KisFileLayer(KisImageWSP image, const QString \
&basePath, const QSt  m_paintDevice = new KisPaintDevice(image->colorSpace());
     m_paintDevice->setDefaultBounds(new KisDefaultBounds(image));
 
-    connect(&m_loader, SIGNAL(loadingFinished(KisPaintDeviceSP,int,int)), \
SLOT(slotLoadingFinished(KisPaintDeviceSP,int,int))); +    connect(&m_loader, \
SIGNAL(loadingFinished(KisPaintDeviceSP,qreal,qreal,QSize)), \
SLOT(slotLoadingFinished(KisPaintDeviceSP,qreal,qreal,QSize)));  
     QFileInfo fi(path());
     if (fi.exists()) {
@@ -86,7 +86,7 @@ KisFileLayer::KisFileLayer(const KisFileLayer &rhs)
 
     m_paintDevice = new KisPaintDevice(*rhs.m_paintDevice);
 
-    connect(&m_loader, SIGNAL(loadingFinished(KisPaintDeviceSP,int,int)), \
SLOT(slotLoadingFinished(KisPaintDeviceSP,int,int))); +    connect(&m_loader, \
SIGNAL(loadingFinished(KisPaintDeviceSP,qreal,qreal,QSize)), \
SLOT(slotLoadingFinished(KisPaintDeviceSP,qreal,qreal,QSize)));  \
m_loader.setPath(path());  }
 
@@ -184,7 +184,9 @@ void KisFileLayer::setScalingMethod(ScalingMethod method)
     m_scalingMethod = method;
 }
 
-void KisFileLayer::slotLoadingFinished(KisPaintDeviceSP projection, int xRes, int \
yRes) +void KisFileLayer::slotLoadingFinished(KisPaintDeviceSP projection,
+                                       qreal xRes, qreal yRes,
+                                       const QSize &size)
 {
     qint32 oldX = x();
     qint32 oldY = y();
@@ -193,10 +195,10 @@ void KisFileLayer::slotLoadingFinished(KisPaintDeviceSP \
projection, int xRes, in  m_paintDevice->makeCloneFrom(projection, \
projection->extent());  m_paintDevice->setDefaultBounds(new \
KisDefaultBounds(image()));  
-    QSize size = projection->exactBounds().size();
+    if (m_scalingMethod == ToImagePPI &&
+            (!qFuzzyCompare(image()->xRes(), xRes) ||
+             !qFuzzyCompare(image()->yRes(), yRes))) {
 
-    if (m_scalingMethod == ToImagePPI && (image()->xRes() != xRes
-                                          || image()->yRes() != yRes)) {
         qreal xscale = image()->xRes() / xRes;
         qreal yscale = image()->yRes() / yRes;
 
diff --git a/libs/ui/kis_file_layer.h b/libs/ui/kis_file_layer.h
index 5a31c67eef..625a095359 100644
--- a/libs/ui/kis_file_layer.h
+++ b/libs/ui/kis_file_layer.h
@@ -87,7 +87,7 @@ public:
     void setImage(KisImageWSP image) override;
 
 public Q_SLOTS:
-    void slotLoadingFinished(KisPaintDeviceSP projection, int xRes, int yRes);
+    void slotLoadingFinished(KisPaintDeviceSP projection, qreal xRes, qreal yRes, \
const QSize &size);  
 private:
     QString m_basePath;
diff --git a/libs/ui/kis_safe_document_loader.cpp \
b/libs/ui/kis_safe_document_loader.cpp index 6e49742353..3f3a737461 100644
--- a/libs/ui/kis_safe_document_loader.cpp
+++ b/libs/ui/kis_safe_document_loader.cpp
@@ -316,7 +316,10 @@ void KisSafeDocumentLoader::delayedLoadStart()
         KisPaintDeviceSP paintDevice = new \
KisPaintDevice(m_d->doc->image()->colorSpace());  KisPaintDeviceSP projection = \
m_d->doc->image()->projection();  paintDevice->makeCloneFrom(projection, \
                projection->extent());
-        emit loadingFinished(paintDevice, m_d->doc->image()->xRes(), \
m_d->doc->image()->yRes()); +        emit loadingFinished(paintDevice,
+                             m_d->doc->image()->xRes(),
+                             m_d->doc->image()->yRes(),
+                             m_d->doc->image()->size());
     }
 
     m_d->doc.reset();
diff --git a/libs/ui/kis_safe_document_loader.h b/libs/ui/kis_safe_document_loader.h
index b955a4635f..a54a9e374e 100644
--- a/libs/ui/kis_safe_document_loader.h
+++ b/libs/ui/kis_safe_document_loader.h
@@ -39,7 +39,7 @@ private Q_SLOTS:
     void delayedLoadStart();
 
 Q_SIGNALS:
-    void loadingFinished(KisPaintDeviceSP paintDevice, int xRes, int yRes);
+    void loadingFinished(KisPaintDeviceSP paintDevice, qreal xRes, qreal yRes, const \
QSize &size);  
 private:
     struct Private;


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic