[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: