[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 ¤tColor, const QColor &baseColor);
void paintCircle(QPainter &gc, const QRectF &viewRectF, const QColor ¤tColor, 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