[graphics/krita] libs/ui/tool: Instant preview now working

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

Instant preview now working

M  +0    -5    libs/ui/tool/KisAsyncColorSamplerHelper.cpp
M  +6    -8    libs/ui/tool/strokes/kis_color_sampler_stroke_strategy.cpp
M  +6    -2    libs/ui/tool/strokes/kis_color_sampler_stroke_strategy.h

https://invent.kde.org/graphics/krita/-/commit/356243d61cdb6f80669dd63ddb0a39b8ca7f8e27

diff --git a/libs/ui/tool/KisAsyncColorSamplerHelper.cpp b/libs/ui/tool/KisAsyncColorSamplerHelper.cpp
index 1d3cdffc675..70e33d193d4 100644
--- a/libs/ui/tool/KisAsyncColorSamplerHelper.cpp
+++ b/libs/ui/tool/KisAsyncColorSamplerHelper.cpp
@@ -729,7 +729,6 @@ QImage KisAsyncColorSamplerHelper::fetchCanvasPreview(QRect &canvasPixelRect, Ki
     // If not already have a job fetching canvas image, then do it
     // TODO: If LOD is involved, the cookie seems leaked. Also, Q_EMIT never trigger the slot?
     if (!m_d->canvasPreviewFetchingCookie && m_d->cacheCanvasPreviewRect != canvasPixelRect) {
-        qDebug() << "Original rect:" << canvasPixelRect;
 
         KisColorSamplerStrokeStrategy::GenerateCanvasZoomPreviewData *data =
             new KisColorSamplerStrokeStrategy::GenerateCanvasZoomPreviewData(canvasImage->projection(), canvasPixelRect, m_d->canvas->displayColorConverter());
@@ -739,8 +738,6 @@ QImage KisAsyncColorSamplerHelper::fetchCanvasPreview(QRect &canvasPixelRect, Ki
         m_d->strokesFacade()->addJob(m_d->strokeId, data);
     }
 
-    // qDebug() << "Has fetching finished: " << m_d->canvasPreviewFetchingCookie.isNull();
-
     // Render the last frame if available
     if (!m_d->cacheCanvasPreviewRect.isNull()) canvasPixelRect = QRect(QPoint(0,0), m_d->cacheCanvasPreviewRect.size());
 
@@ -840,8 +837,6 @@ void KisAsyncColorSamplerHelper::slotCanvasZoomPreviewUpdated(const QImage &canv
     m_d->cacheCanvasPreviewRect = canvasRect;
     m_d->cacheCanvasPreviewImage = canvasImage;
 
-    qDebug() << "Canvas fetching finished";
-
     Q_EMIT sigRequestUpdateOutline();
 }
 
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 97dc2191f09..f846bcdcb9a 100644
--- a/libs/ui/tool/strokes/kis_color_sampler_stroke_strategy.cpp
+++ b/libs/ui/tool/strokes/kis_color_sampler_stroke_strategy.cpp
@@ -19,6 +19,8 @@ struct KisColorSamplerStrokeStrategy::Private
     int blend = 100;
 
     boost::optional<KoColor> lastSelectedColor;
+
+    QSharedPointer<boost::none_t> strokeCookie = nullptr;
 };
 
 KisColorSamplerStrokeStrategy::KisColorSamplerStrokeStrategy(int radius, int blend, int lod)
@@ -61,24 +63,17 @@ void KisColorSamplerStrokeStrategy::doStrokeCallback(KisStrokeJobData *data)
         tmpDev->makeCloneFrom(previewData->canvasDev, previewData->canvasPixelRect);
 
         QImage image = previewData->colorConverter->convertImageToDisplayColorSpace(tmpDev, previewData->canvasPixelRect, true);
-        qDebug() << "Scaled image rect: " << image.rect();
 
         if (previewData->levelOfDetail > 0) {
-            qDebug() << previewData->levelOfDetail;
-            qDebug() << "Modified rect" << previewData->canvasPixelRect;
             KisLodTransform transform(previewData->levelOfDetail);
-
             qreal scale = transform.lodToInvScale(previewData->levelOfDetail);
-            qDebug() << "Lod to scale" << scale;
 
             image = image.scaled(QSize(scale * image.width(), scale * image.height()));
-            qDebug() << "Restored image rect: " << image.rect();
 
             previewData->canvasPixelRect = transform.mapInverted(previewData->canvasPixelRect);
-            qDebug() << "Restored rect: " << previewData->canvasPixelRect;
         }
 
-        Q_EMIT sigCanvasZoomPreviewUpdated(QImage(), QRect());
+        Q_EMIT sigCanvasZoomPreviewUpdated(image, previewData->canvasPixelRect);
     }
 }
 
@@ -90,5 +85,8 @@ KisStrokeStrategy* KisColorSamplerStrokeStrategy::createLodClone(int levelOfDeta
     connect(lodStrategy, &KisColorSamplerStrokeStrategy::sigColorUpdated,
             this, &KisColorSamplerStrokeStrategy::sigColorUpdated,
             Qt::DirectConnection);
+    connect(lodStrategy, &KisColorSamplerStrokeStrategy::sigCanvasZoomPreviewUpdated,
+            this, &KisColorSamplerStrokeStrategy::sigCanvasZoomPreviewUpdated,
+            Qt::DirectConnection);
     return lodStrategy;
 }
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 0681b580482..90280926a72 100644
--- a/libs/ui/tool/strokes/kis_color_sampler_stroke_strategy.h
+++ b/libs/ui/tool/strokes/kis_color_sampler_stroke_strategy.h
@@ -50,14 +50,18 @@ public:
     class GenerateCanvasZoomPreviewData : public KisStrokeJobData {
     public:
         GenerateCanvasZoomPreviewData(KisPaintDeviceSP _canvasDev, const QRect &_canvasPixelRect, KisDisplayColorConverter *_colorConverter,
-                                      int _levelOfDetail = -1, QSharedPointer<boost::none_t> _cookie = nullptr)
+                                      int _levelOfDetail = 0, QSharedPointer<boost::none_t> _cookie = nullptr)
             : canvasDev(_canvasDev), canvasPixelRect(_canvasPixelRect), colorConverter(_colorConverter), levelOfDetail(_levelOfDetail), fetchingCookie(_cookie)
         {}
 
         KisStrokeJobData* createLodClone(int levelOfDetail) override {
             KisLodTransform transform(levelOfDetail);
             QRect lodPixelRect = transform.map(canvasPixelRect);
-            return new GenerateCanvasZoomPreviewData(canvasDev, lodPixelRect, colorConverter, levelOfDetail, fetchingCookie);
+            GenerateCanvasZoomPreviewData *newData = new GenerateCanvasZoomPreviewData(canvasDev, lodPixelRect, colorConverter, levelOfDetail);
+            // When Lod is involved, swap the cookie to the new Lod clone to track execution, the original object seems to leaks
+            newData->fetchingCookie.swap(fetchingCookie);
+
+            return newData;
         }
 
         QWeakPointer<boost::none_t> cookie() {
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.