[graphics/krita] libs/ui: Change scale config from % to x, disable zoom by default

Emmet O'Neill <[email protected]>
Newsgroups gmane.comp.kde.cvs
Message-ID <[email protected]>
Git commit a1e367849d7bf54808f2cc5afa5cf526ea594e37 by Emmet O'Neill, on behalf of Dat Le.
Committed on 13/08/2026 at 23:16.
Pushed by emmetoneill into branch 'master'.

Change scale config from % to x, disable zoom by default

M  +5    -4    libs/ui/KisReferenceImage.cpp
M  +2    -2    libs/ui/dialogs/kis_dlg_preferences.cc
M  +7    -4    libs/ui/forms/wdggeneralsettings.ui
M  +2    -2    libs/ui/kis_config.cc
M  +21   -26   libs/ui/tool/KisAsyncColorSamplerHelper.cpp
M  +2    -2    libs/ui/tool/KisAsyncColorSamplerHelper.h

https://invent.kde.org/graphics/krita/-/commit/a1e367849d7bf54808f2cc5afa5cf526ea594e37

diff --git a/libs/ui/KisReferenceImage.cpp b/libs/ui/KisReferenceImage.cpp
index 861c1b75456..6b7ad4551f9 100644
--- a/libs/ui/KisReferenceImage.cpp
+++ b/libs/ui/KisReferenceImage.cpp
@@ -99,14 +99,13 @@ struct KisReferenceImage::Private : public QSharedData
 #else
         image.convertToColorSpace(QColorSpace(QColorSpace::SRgb));
 #endif
-        // Need to convert ref image to ARGB to draw the zoom preview when color sampling
-        image.convertTo(QImage::Format_ARGB32);
 
         return (!image.isNull());
     }
 
     bool loadFromQImage(const QImage &img) {
-        image = img.convertToFormat(QImage::Format_ARGB32);
+        image = img;
+
         return !image.isNull();
     }
 
@@ -120,8 +119,10 @@ struct KisReferenceImage::Private : public QSharedData
                 gc2.drawImage(QPoint(), image);
             }
         } else {
+            // Need to convert ref image to ARGB to draw the zoom preview when color sampling
             // Convert here to make sure already loaded ref images are converted
-            cachedImage = image.convertToFormat(QImage::Format_ARGB32);
+            cachedImage = image;
+            cachedImage.convertTo(QImage::Format_ARGB32);
         }
 
         mipmap = KisQImagePyramid(cachedImage, false);
diff --git a/libs/ui/dialogs/kis_dlg_preferences.cc b/libs/ui/dialogs/kis_dlg_preferences.cc
index 37c2802f9e4..f060c1259f2 100644
--- a/libs/ui/dialogs/kis_dlg_preferences.cc
+++ b/libs/ui/dialogs/kis_dlg_preferences.cc
@@ -331,8 +331,8 @@ GeneralTab::GeneralTab(QWidget *_parent, const char *_name)
 
     m_grpColorSamplerZoomPreview->setChecked(cfg.colorSamplerZoomPreviewEnabled());
 
-    m_ssbColorSamplerZoomPreviewScale->setRange(100, 2000);
-    m_ssbColorSamplerZoomPreviewScale->setSingleStep(100);
+    m_ssbColorSamplerZoomPreviewScale->setRange(1, 20);
+    m_ssbColorSamplerZoomPreviewScale->setSingleStep(1);
     m_ssbColorSamplerZoomPreviewScale->setValue(cfg.colorSamplerZoomPreviewScale());
 
     m_cmbColorSamplerPreviewCirclePosition->addItem(i18n("Center"));
diff --git a/libs/ui/forms/wdggeneralsettings.ui b/libs/ui/forms/wdggeneralsettings.ui
index 53e216efe89..dea0942a449 100644
--- a/libs/ui/forms/wdggeneralsettings.ui
+++ b/libs/ui/forms/wdggeneralsettings.ui
@@ -1044,16 +1044,19 @@
                  <item row="0" column="1">
                   <widget class="KisSliderSpinBox" name="m_ssbColorSamplerZoomPreviewScale">
                    <property name="suffix">
-                    <string>%</string>
+                    <string>x</string>
                    </property>
                    <property name="minimum">
-                    <number>100</number>
+                    <number>1</number>
                    </property>
                    <property name="maximum">
-                    <number>1000</number>
+                    <number>20</number>
                    </property>
                    <property name="singleStep">
-                    <number>25</number>
+                    <number>1</number>
+                   </property>
+                   <property name="value">
+                    <number>1</number>
                    </property>
                   </widget>
                  </item>
diff --git a/libs/ui/kis_config.cc b/libs/ui/kis_config.cc
index 2e36a0c4943..d881e3389b0 100644
--- a/libs/ui/kis_config.cc
+++ b/libs/ui/kis_config.cc
@@ -598,7 +598,7 @@ void KisConfig::setColorSamplerPreviewCircleExtraCirclesEnabled(bool enabled)
 }
 
 bool KisConfig::colorSamplerZoomPreviewEnabled(bool defaultValue) const {
-    bool def = true;
+    bool def = false;
     if (!defaultValue) {
         return m_cfg.readEntry("colorSamplerZoomPreviewEnabled", def);
     }
@@ -609,7 +609,7 @@ void KisConfig::setColorSamplerZoomPreviewEnabled(bool enabled) {
 }
 
 qreal KisConfig::colorSamplerZoomPreviewScale(bool defaultValue) const {
-    qreal def = 500;
+    qreal def = 5;
     if (!defaultValue) {
         return m_cfg.readEntry("colorSamplerZoomPreviewScale", def);
     }
diff --git a/libs/ui/tool/KisAsyncColorSamplerHelper.cpp b/libs/ui/tool/KisAsyncColorSamplerHelper.cpp
index d9d58e52314..f7119a5c5e2 100644
--- a/libs/ui/tool/KisAsyncColorSamplerHelper.cpp
+++ b/libs/ui/tool/KisAsyncColorSamplerHelper.cpp
@@ -71,9 +71,9 @@ struct KisAsyncColorSamplerHelper::Private
     bool circlePreviewExtraCircles {true};
     QRectF previewDocRect;
 
-    bool circleZoomPreviewEnabled {true};
+    bool circleZoomPreviewEnabled {false};
     qreal circleZoomPreviewScale {5};
-    int circleZoomPreviewCrosshairSize {10};
+    int circleZoomPreviewCrosshairSize {15};
     KisConfig::ColorSamplerPreviewCirclePosition circlePreviewPosition = KisConfig::ColorSamplerPreviewCirclePosition::Center;
     QPointF sampleDocPoint;
 
@@ -226,7 +226,6 @@ struct KisAsyncColorSamplerHelper::Private
             return;
         }
 
-        // TODO: Perhaps use KoShapeManager->shapeAt(QRect)?
         cacheReferenceImageList = doc->referenceImagesLayer()->referenceImages();
         // Sort by zIndex to show correct order
         std::sort(cacheReferenceImageList.begin(), cacheReferenceImageList.end(), [](KisReferenceImage *a, KisReferenceImage *b){
@@ -247,7 +246,7 @@ struct KisAsyncColorSamplerHelper::Private
         }
 
         // Minimum sample size should be 3 to be meaningful
-        if (pixelRect.width() <= 2 || pixelRect.height() <= 2) pixelRect.setSize(QSize(3, 3));
+        if (pixelRect.width() < 3 || pixelRect.height() < 3) pixelRect.setSize(QSize(3, 3));
 
         return pixelRect;
     }
@@ -302,7 +301,7 @@ void KisAsyncColorSamplerHelper::activate(bool sampleCurrentLayer, bool pickFgCo
     m_d->circlePreviewOutlineEnabled = cfg.colorSamplerPreviewCircleOutlineEnabled();
     m_d->circlePreviewExtraCircles = cfg.colorSamplerPreviewCircleExtraCirclesEnabled();
     m_d->circleZoomPreviewEnabled = cfg.colorSamplerZoomPreviewEnabled();
-    m_d->circleZoomPreviewScale = cfg.colorSamplerZoomPreviewScale()/100.0; // saved in percentages
+    m_d->circleZoomPreviewScale = cfg.colorSamplerZoomPreviewScale();
     m_d->circlePreviewPosition = cfg.colorSamplerPreviewCirclePosition();
 
     // Update and sort the list of current reference images currently on canvas
@@ -651,15 +650,14 @@ void KisAsyncColorSamplerHelper::paintCircle(QPainter &gc,
 
     // Draw zoom preview
     if (m_d->circleZoomPreviewEnabled) {
-        QRectF sampleDocRectF = m_d->previewDocRect;
+        QRectF zoomDocRectF = m_d->previewDocRect;
 
-        // Sample a rect with size that is (zoomPreviewScale) times smaller than (previewDocRect size)
-        sampleDocRectF.setSize(sampleDocRectF.size() / m_d->circleZoomPreviewScale);
-        sampleDocRectF.moveCenter(m_d->sampleDocPoint);
+        zoomDocRectF.setSize(zoomDocRectF.size() / m_d->circleZoomPreviewScale);
+        zoomDocRectF.moveCenter(m_d->sampleDocPoint);
 
-        paintCircleCanvasPreview(cachePainter, cacheRect, sampleDocRectF, tf.map(m_d->cacheCircleInnerClip));
+        paintCircleCanvasPreview(cachePainter, cacheRect, zoomDocRectF, tf.map(m_d->cacheCircleInnerClip));
 
-        paintCircleReferenceImagePreview(cachePainter, cacheRect, sampleDocRectF, tf.map(m_d->cacheCircleInnerClip));
+        paintCircleReferenceImagePreview(cachePainter, cacheRect, zoomDocRectF, tf.map(m_d->cacheCircleInnerClip));
 
 
         // Draw crosshair if preview is offseted
@@ -692,16 +690,15 @@ QImage KisAsyncColorSamplerHelper::cacheCanvasImage(QRect &canvasPixelRect) {
 
     // If already cached the whole canvas, just use it from now on
     if (m_d->cacheCanvasPreviewRect == canvasImage->bounds()) {
-        dbgUI << "Using cached canvas image!";
         return m_d->cacheCanvasPreviewImage;
     }
 
     if (m_d->cacheCanvasPreviewRect.isEmpty() || !m_d->cacheCanvasPreviewRect.contains(canvasPixelRect)) {
         // Cache an area larger than the needed preview area to avoid rapid small dynamic allocations
         // Attempt to reduce cache size when sample size is big to reduce delay
-        qreal cacheScale = 4;
-        if (canvasPixelRect.width() > 1000) cacheScale = 2;
-        else if (canvasPixelRect.width() > 2000) cacheScale = 1;
+        qreal cacheScale = 1;
+        if (canvasPixelRect.width() < 250) cacheScale = 4;
+        else if (canvasPixelRect.width() < 500) cacheScale = 2;
 
         QRect cacheCanvasRect = canvasPixelRect;
         cacheCanvasRect.setSize(canvasPixelRect.size() * cacheScale);
@@ -712,10 +709,6 @@ QImage KisAsyncColorSamplerHelper::cacheCanvasImage(QRect &canvasPixelRect) {
             cacheCanvasRect = canvasImage->bounds();
         }
 
-        dbgUI << "Invalid cache. Copying canvas image";
-        dbgUI << "Canvas preview: " << canvasPixelRect;
-        dbgUI << "Canvas cache: " << cacheCanvasRect;
-
         m_d->cacheCanvasPreviewImage = canvasImage->convertToQImage(cacheCanvasRect, canvasImage->profile());
 
         m_d->cacheCanvasPreviewRect = cacheCanvasRect;
@@ -726,18 +719,20 @@ QImage KisAsyncColorSamplerHelper::cacheCanvasImage(QRect &canvasPixelRect) {
     return m_d->cacheCanvasPreviewImage;
 }
 
-void KisAsyncColorSamplerHelper::paintCircleCanvasPreview(QPainter &gc, const QRectF &viewRectF, const QRectF &sampleDocRectF, const QPainterPath &clip) {
+void KisAsyncColorSamplerHelper::paintCircleCanvasPreview(QPainter &gc, const QRectF &viewRectF, const QRectF &zoomDocRectF, const QPainterPath &clip) {
     gc.save();
 
     KisImageWSP image = m_d->canvas->image();
 
-    QRect canvasPixelRect = image->documentToPixel(sampleDocRectF).toRect();
+    QRect canvasPixelRect = image->documentToPixel(zoomDocRectF).toRect();
     canvasPixelRect = m_d->standardizeZoomPreviewPixelRect(canvasPixelRect);
 
     // Make sure the center is the pixel currently sampled (in case of rounding errors)
-    canvasPixelRect.moveCenter(image->documentToImagePixelFloored(sampleDocRectF.center()));
+    canvasPixelRect.moveCenter(image->documentToImagePixelFloored(zoomDocRectF.center()));
 
     QImage cachedImage = cacheCanvasImage(canvasPixelRect);
+    if (cachedImage.isNull()) return;
+
     gc.setCompositionMode(QPainter::CompositionMode_SourceOver);
 
     gc.setClipPath(clip);
@@ -752,7 +747,7 @@ void KisAsyncColorSamplerHelper::paintCircleCanvasPreview(QPainter &gc, const QR
 
 // Won't show opacity because the color sampled doesn't respect opacity either
 // TODO: Test if reference image still show when not visible, opacity = 0. Maybe we need to cover that too
-void KisAsyncColorSamplerHelper::paintCircleReferenceImagePreview(QPainter &gc, const QRectF &viewRectF, const QRectF &sampleDocRectF, const QPainterPath &clip) {
+void KisAsyncColorSamplerHelper::paintCircleReferenceImagePreview(QPainter &gc, const QRectF &viewRectF, const QRectF &zoomDocRectF, const QPainterPath &clip) {
     gc.save();
 
     gc.setCompositionMode(QPainter::CompositionMode_SourceOver);
@@ -761,20 +756,20 @@ void KisAsyncColorSamplerHelper::paintCircleReferenceImagePreview(QPainter &gc,
     Q_FOREACH(KisReferenceImage *refImage, m_d->cacheReferenceImageList) {
         // Check if sampleRect intersect with reference image
         QPolygonF outline = refImage->absoluteTransformation().map(refImage->outlineRect());
-        if (!outline.intersects(QPolygonF(sampleDocRectF))) continue;
+        if (!outline.intersects(QPolygonF(zoomDocRectF))) continue;
 
         gc.save();
 
         QImage image = refImage->getCachedImage();
 
-        QPoint refPixelPoint = refImage->documentToPixelFloored(sampleDocRectF.center());
+        QPoint refPixelPoint = refImage->documentToPixelFloored(zoomDocRectF.center());
 
         // Avoid using KisReferenceImage::documentToPixel because it use absoluteTransformation.invert()
         // Which will take rotation into account and cause some quirks
         qreal xScale = refImage->boundingRect().width() / image.width();
         qreal yScale = refImage->boundingRect().height() / image.height();
 
-        QRect refPixelRect = QRect(refPixelPoint, QSize(sampleDocRectF.width() / xScale, sampleDocRectF.height() / yScale));
+        QRect refPixelRect = QRect(refPixelPoint, QSize(zoomDocRectF.width() / xScale, zoomDocRectF.height() / yScale));
         refPixelRect = m_d->standardizeZoomPreviewPixelRect(refPixelRect);
 
         refPixelRect.moveCenter(refPixelPoint);
diff --git a/libs/ui/tool/KisAsyncColorSamplerHelper.h b/libs/ui/tool/KisAsyncColorSamplerHelper.h
index 7f97427fcb4..b16c909a57d 100644
--- a/libs/ui/tool/KisAsyncColorSamplerHelper.h
+++ b/libs/ui/tool/KisAsyncColorSamplerHelper.h
@@ -81,9 +81,9 @@ private:
     void paintRectangle(QPainter &gc, const QRectF &viewRectF, const QColor &currentColor, const QColor &baseColor);
     void paintCircle(QPainter &gc, const QRectF &viewRectF, const QColor &currentColor, const QColor &baseColor);
 
-    void paintCircleCanvasPreview(QPainter &gc, const QRectF &viewRectF, const QRectF &sampleDocRectF, const QPainterPath &clip);
+    void paintCircleCanvasPreview(QPainter &gc, const QRectF &viewRectF, const QRectF &zoomDocRectF, const QPainterPath &clip);
     // Return true if at least one reference image preview was drawn
-    void paintCircleReferenceImagePreview(QPainter &gc, const QRectF &viewRectF, const QRectF &sampleDocRectF, const QPainterPath &clip);
+    void paintCircleReferenceImagePreview(QPainter &gc, const QRectF &viewRectF, const QRectF &zoomDocRectF, const QPainterPath &clip);
 
     // Returns a QImage that should either contain the canvasPixelRectF, or the whole canvas if canvasPixelRectF > canvas size.
     // Also modify the input rect to point to the same position relative to the returned image
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.