[graphics/krita] libs/ui/tool: Changed KisImageWSP to SP, don't pass KisCanvas2 to strategy, use cookie for task tracking instead

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

Changed KisImageWSP to SP, don't pass KisCanvas2 to strategy, use cookie for task tracking instead

M  +13   -13   libs/ui/tool/KisAsyncColorSamplerHelper.cpp
M  +1    -1    libs/ui/tool/KisAsyncColorSamplerHelper.h
M  +4    -6    libs/ui/tool/strokes/kis_color_sampler_stroke_strategy.cpp
M  +12   -5    libs/ui/tool/strokes/kis_color_sampler_stroke_strategy.h

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

diff --git a/libs/ui/tool/KisAsyncColorSamplerHelper.cpp b/libs/ui/tool/KisAsyncColorSamplerHelper.cpp
index e952c24fcab..71ce4bc522b 100644
--- a/libs/ui/tool/KisAsyncColorSamplerHelper.cpp
+++ b/libs/ui/tool/KisAsyncColorSamplerHelper.cpp
@@ -82,7 +82,7 @@ struct KisAsyncColorSamplerHelper::Private
     QImage cacheCanvasPreviewImage;
     QPainterPath cacheCrosshairPath;
     int cacheCirclePreviewDiameter;
-    bool canvasPreviewFetchingStarted {false};
+    QWeakPointer<boost::none_t> canvasPreviewFetchingCookie;
     bool zoomPreviewHasPainted {false};
 
     QColor currentColor;
@@ -413,7 +413,6 @@ void KisAsyncColorSamplerHelper::deactivate()
     // Reset the cached zoom preview image and rect
     m_d->cacheCanvasPreviewImage = QImage();
     m_d->cacheCanvasPreviewRect = QRect();
-    m_d->canvasPreviewFetchingStarted = false;
     m_d->zoomPreviewHasPainted = false;
 
     m_d->isActive = false;
@@ -721,19 +720,20 @@ void KisAsyncColorSamplerHelper::paintCircleCrosshair(QPainter &gc, const QRectF
     gc.restore();
 }
 
-QImage KisAsyncColorSamplerHelper::fetchCanvasPreview(QRect &canvasPixelRect) {
-    KisImageWSP canvasImage = m_d->canvas->image();
-
+QImage KisAsyncColorSamplerHelper::fetchCanvasPreview(QRect &canvasPixelRect, KisImageSP canvasImage) {
     if (!canvasImage->bounds().intersects(canvasPixelRect)) {
         canvasPixelRect = QRect(); // Make this a null rect to imply no need to draw canvas
         return QImage();
     }
 
     // If not already have a job fetching canvas image, then do it
-    if (!m_d->canvasPreviewFetchingStarted && m_d->cacheCanvasPreviewRect != canvasPixelRect) {
-        m_d->canvasPreviewFetchingStarted = true;
-        m_d->strokesFacade()->addJob(m_d->strokeId,
-            new KisColorSamplerStrokeStrategy::GenerateCanvasZoomPreviewData(m_d->canvas, canvasPixelRect));
+    if (!m_d->canvasPreviewFetchingCookie && m_d->cacheCanvasPreviewRect != canvasPixelRect) {
+        KisColorSamplerStrokeStrategy::GenerateCanvasZoomPreviewData *data =
+            new KisColorSamplerStrokeStrategy::GenerateCanvasZoomPreviewData(canvasImage->projection(), canvasPixelRect, m_d->canvas->displayColorConverter());
+
+        m_d->canvasPreviewFetchingCookie = data->cookie();
+
+        m_d->strokesFacade()->addJob(m_d->strokeId, data);
     }
 
     // Render the last frame if available
@@ -743,7 +743,9 @@ QImage KisAsyncColorSamplerHelper::fetchCanvasPreview(QRect &canvasPixelRect) {
 }
 
 bool KisAsyncColorSamplerHelper::paintCircleCanvasPreview(QPainter &gc, const QRectF &viewRectF, const QRectF &zoomDocRectF, const QPainterPath &clip) {
-    KisImageWSP image = m_d->canvas->image();
+    KisImageSP image = m_d->canvas->image();
+
+    if (!image) return false;
 
     QRectF canvasPixelRectF = image->documentToPixel(zoomDocRectF);
 
@@ -755,7 +757,7 @@ bool KisAsyncColorSamplerHelper::paintCircleCanvasPreview(QPainter &gc, const QR
     // Make sure the center is the pixel currently sampled because standardizing may change the shape
     canvasPixelRect.moveCenter(image->documentToImagePixelFloored(zoomDocRectF.center()));
 
-    QImage cachedImage = fetchCanvasPreview(canvasPixelRect);
+    QImage cachedImage = fetchCanvasPreview(canvasPixelRect, image);
     // If cachedImage and canvasPixelRect is null, painting is not needed
     // If cachedImage is null and canvasPixelRect is not null, painting was deferred
     if (cachedImage.isNull()) return canvasPixelRect.isNull();
@@ -833,8 +835,6 @@ void KisAsyncColorSamplerHelper::slotCanvasZoomPreviewUpdated(const QImage &canv
     m_d->cacheCanvasPreviewRect = canvasRect;
     m_d->cacheCanvasPreviewImage = canvasImage;
 
-    m_d->canvasPreviewFetchingStarted = false;
-
     Q_EMIT sigRequestUpdateOutline();
 }
 
diff --git a/libs/ui/tool/KisAsyncColorSamplerHelper.h b/libs/ui/tool/KisAsyncColorSamplerHelper.h
index 8f4ed364dfb..956f3403e67 100644
--- a/libs/ui/tool/KisAsyncColorSamplerHelper.h
+++ b/libs/ui/tool/KisAsyncColorSamplerHelper.h
@@ -87,7 +87,7 @@ private:
     bool paintCircleCanvasPreview(QPainter &gc, const QRectF &viewRectF, const QRectF &zoomDocRectF, const QPainterPath &clip);
     void paintCircleReferenceImagePreview(QPainter &gc, const QRectF &viewRectF, const QRectF &zoomDocRectF, const QPainterPath &clip);
 
-    QImage fetchCanvasPreview(QRect &canvasPixelRect);
+    QImage fetchCanvasPreview(QRect &canvasPixelRect, KisImageSP canvasImage);
 
     struct Private;
     QScopedPointer<Private> m_d;
diff --git a/libs/ui/tool/strokes/kis_color_sampler_stroke_strategy.cpp b/libs/ui/tool/strokes/kis_color_sampler_stroke_strategy.cpp
index 13a43057c3a..d29b24534e7 100644
--- a/libs/ui/tool/strokes/kis_color_sampler_stroke_strategy.cpp
+++ b/libs/ui/tool/strokes/kis_color_sampler_stroke_strategy.cpp
@@ -6,9 +6,8 @@
 
 #include "kis_color_sampler_stroke_strategy.h"
 
-#include "kis_canvas2.h"
-#include "kis_display_color_converter.h"
 #include "kis_tool_utils.h"
+#include "kis_display_color_converter.h"
 #include "kis_paint_device.h"
 
 struct KisColorSamplerStrokeStrategy::Private
@@ -58,12 +57,11 @@ void KisColorSamplerStrokeStrategy::doStrokeCallback(KisStrokeJobData *data)
             Q_EMIT sigFinalColorSelected(*m_d->lastSelectedColor);
         }
     } else if (previewData) {
-        KisPaintDeviceSP dev = previewData->canvas->image()->projection();
-        KisPaintDeviceSP tmpDev = new KisPaintDevice(dev->colorSpace());
+        KisPaintDeviceSP tmpDev = new KisPaintDevice(previewData->canvasDev->colorSpace());
 
-        tmpDev->makeCloneFrom(dev, previewData->canvasPixelRect);
+        tmpDev->makeCloneFrom(previewData->canvasDev, previewData->canvasPixelRect);
 
-        QImage image = previewData->canvas->displayColorConverter()->convertImageToDisplayColorSpace(tmpDev, previewData->canvasPixelRect, true);
+        QImage image = previewData->colorConverter->convertImageToDisplayColorSpace(tmpDev, previewData->canvasPixelRect, true);
 
         Q_EMIT sigCanvasZoomPreviewUpdated(image, previewData->canvasPixelRect);
     }
diff --git a/libs/ui/tool/strokes/kis_color_sampler_stroke_strategy.h b/libs/ui/tool/strokes/kis_color_sampler_stroke_strategy.h
index 4b4117e915d..811dcca8d48 100644
--- a/libs/ui/tool/strokes/kis_color_sampler_stroke_strategy.h
+++ b/libs/ui/tool/strokes/kis_color_sampler_stroke_strategy.h
@@ -12,7 +12,7 @@
 #include "kis_lod_transform.h"
 #include "KoColor.h"
 
-class KisCanvas2;
+class KisDisplayColorConverter;
 
 class KisColorSamplerStrokeStrategy : public QObject, public KisSimpleStrokeStrategy
 {
@@ -49,17 +49,24 @@ public:
 
     class GenerateCanvasZoomPreviewData : public KisStrokeJobData {
     public:
-        GenerateCanvasZoomPreviewData(KisCanvas2* _canvas, const QRect &_canvasPixelRect)
-            : canvas(_canvas), canvasPixelRect(_canvasPixelRect)
+        GenerateCanvasZoomPreviewData(KisPaintDeviceSP _canvasDev, const QRect &_canvasPixelRect, KisDisplayColorConverter *_colorConverter)
+            : canvasDev(_canvasDev), canvasPixelRect(_canvasPixelRect), colorConverter(_colorConverter)
         {}
 
         KisStrokeJobData* createLodClone(int levelOfDetail) override {
             Q_UNUSED(levelOfDetail);
-            return new GenerateCanvasZoomPreviewData(canvas, canvasPixelRect);
+            return new GenerateCanvasZoomPreviewData(canvasDev, canvasPixelRect, colorConverter);
         }
 
-        KisCanvas2 *canvas;
+        QWeakPointer<boost::none_t> cookie() {
+            fetchingCookie.reset(new boost::none_t(boost::none));
+            return fetchingCookie;
+        }
+
+        KisPaintDeviceSP canvasDev;
         QRect canvasPixelRect;
+        KisDisplayColorConverter *colorConverter;
+        QSharedPointer<boost::none_t> fetchingCookie;
     };
 public:
     KisColorSamplerStrokeStrategy(int radius, int blend, int lod = 0);
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.