[graphics/krita] libs/ui/tool: LOD support WIP

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

LOD support WIP

M  +7    -0    libs/ui/tool/KisAsyncColorSamplerHelper.cpp
M  +17   -2    libs/ui/tool/strokes/kis_color_sampler_stroke_strategy.cpp
M  +7    -4    libs/ui/tool/strokes/kis_color_sampler_stroke_strategy.h

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

diff --git a/libs/ui/tool/KisAsyncColorSamplerHelper.cpp b/libs/ui/tool/KisAsyncColorSamplerHelper.cpp
index 71ce4bc522b..1d3cdffc675 100644
--- a/libs/ui/tool/KisAsyncColorSamplerHelper.cpp
+++ b/libs/ui/tool/KisAsyncColorSamplerHelper.cpp
@@ -727,7 +727,10 @@ 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());
 
@@ -736,6 +739,8 @@ 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());
 
@@ -835,6 +840,8 @@ 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 d29b24534e7..97dc2191f09 100644
--- a/libs/ui/tool/strokes/kis_color_sampler_stroke_strategy.cpp
+++ b/libs/ui/tool/strokes/kis_color_sampler_stroke_strategy.cpp
@@ -58,12 +58,27 @@ void KisColorSamplerStrokeStrategy::doStrokeCallback(KisStrokeJobData *data)
         }
     } else if (previewData) {
         KisPaintDeviceSP tmpDev = new KisPaintDevice(previewData->canvasDev->colorSpace());
-
         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(image, previewData->canvasPixelRect);
+        Q_EMIT sigCanvasZoomPreviewUpdated(QImage(), QRect());
     }
 }
 
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 811dcca8d48..0681b580482 100644
--- a/libs/ui/tool/strokes/kis_color_sampler_stroke_strategy.h
+++ b/libs/ui/tool/strokes/kis_color_sampler_stroke_strategy.h
@@ -49,13 +49,15 @@ public:
 
     class GenerateCanvasZoomPreviewData : public KisStrokeJobData {
     public:
-        GenerateCanvasZoomPreviewData(KisPaintDeviceSP _canvasDev, const QRect &_canvasPixelRect, KisDisplayColorConverter *_colorConverter)
-            : canvasDev(_canvasDev), canvasPixelRect(_canvasPixelRect), colorConverter(_colorConverter)
+        GenerateCanvasZoomPreviewData(KisPaintDeviceSP _canvasDev, const QRect &_canvasPixelRect, KisDisplayColorConverter *_colorConverter,
+                                      int _levelOfDetail = -1, QSharedPointer<boost::none_t> _cookie = nullptr)
+            : canvasDev(_canvasDev), canvasPixelRect(_canvasPixelRect), colorConverter(_colorConverter), levelOfDetail(_levelOfDetail), fetchingCookie(_cookie)
         {}
 
         KisStrokeJobData* createLodClone(int levelOfDetail) override {
-            Q_UNUSED(levelOfDetail);
-            return new GenerateCanvasZoomPreviewData(canvasDev, canvasPixelRect, colorConverter);
+            KisLodTransform transform(levelOfDetail);
+            QRect lodPixelRect = transform.map(canvasPixelRect);
+            return new GenerateCanvasZoomPreviewData(canvasDev, lodPixelRect, colorConverter, levelOfDetail, fetchingCookie);
         }
 
         QWeakPointer<boost::none_t> cookie() {
@@ -66,6 +68,7 @@ public:
         KisPaintDeviceSP canvasDev;
         QRect canvasPixelRect;
         KisDisplayColorConverter *colorConverter;
+        int levelOfDetail;
         QSharedPointer<boost::none_t> fetchingCookie;
     };
 public:
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.