Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_color_sampler_stroke_strategy.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2016 Dmitry Kazakov <dimula73@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
8
9#include "kis_tool_utils.h"
11#include "kis_paint_device.h"
12
14{
15 Private() : shouldSkipWork(false) {}
16
18 int radius = 1;
19 int blend = 100;
20
21 boost::optional<KoColor> lastSelectedColor;
22};
23
25 : KisSimpleStrokeStrategy(QLatin1String("KisColorSamplerStrokeStrategy")),
26 m_d(new Private)
27{
31
32 m_d->radius = qMax(1, qRound(radius * KisLodTransform::lodToScale(lod)));
33 m_d->blend = blend;
34}
35
39
41{
42 if (m_d->shouldSkipWork) return;
43
44 Data *d = dynamic_cast<Data*>(data);
45 FinalizeData *finalize = dynamic_cast<FinalizeData*>(data);
46 GenerateCanvasZoomPreviewData *previewData = dynamic_cast<GenerateCanvasZoomPreviewData*>(data);
47
48 if (d) {
49 KoColor color;
50 KoColor previous = d->currentColor;
51 if (KisToolUtils::sampleColor(color, d->dev, d->pt, &previous, m_d->radius, m_d->blend)) {
52 m_d->lastSelectedColor = color;
53 Q_EMIT sigColorUpdated(color);
54 }
55 } else if (finalize) {
56 if (m_d->lastSelectedColor) {
57 Q_EMIT sigFinalColorSelected(*m_d->lastSelectedColor);
58 }
59 } else if (previewData) {
60 bool oldWrapAroundModeSupport = previewData->canvasDev->supportsWraproundMode();
61 previewData->canvasDev->setSupportsWraparoundMode(true);
62
64 previewData->canvasPixelRect.width(), previewData->canvasPixelRect.height(), previewData->canvasPixelRect);
65
66 previewData->canvasDev->setSupportsWraparoundMode(oldWrapAroundModeSupport);
67
68 QRect effectiveRect = QRect(QPoint(0,0), previewData->canvasPixelRect.size());
69
70 QImage image = previewData->colorConverter->convertImageToDisplayColorSpace(tmpDev, effectiveRect, true);
71
72 if (previewData->outputSize.isValid()) {
73 image = image.scaled(previewData->outputSize);
74
75 effectiveRect = QRect(QPoint(0,0), previewData->outputSize);
76 }
77
78 Q_EMIT sigCanvasZoomPreviewUpdated(image, effectiveRect);
79 }
80}
81
83{
84 m_d->shouldSkipWork = true;
85
86 KisColorSamplerStrokeStrategy *lodStrategy = new KisColorSamplerStrokeStrategy(m_d->radius, m_d->blend, levelOfDetail);
89 Qt::DirectConnection);
92 Qt::DirectConnection);
93 return lodStrategy;
94}
void doStrokeCallback(KisStrokeJobData *data) override
void sigCanvasZoomPreviewUpdated(const QImage &canvasImage, const QRect &canvasRect)
KisStrokeStrategy * createLodClone(int levelOfDetail) override
KisColorSamplerStrokeStrategy(int radius, int blend, int lod=0)
void sigFinalColorSelected(const KoColor &color)
void sigColorUpdated(const KoColor &color)
QImage convertImageToDisplayColorSpace(KisPaintDeviceSP srcDevice, QRect source=QRect(), bool applyOcio=false) const
convertImageToDisplayColorSpace Same as convertColorToDisplayColorSpace, but then for a KisPaintDevic...
static qreal lodToScale(int levelOfDetail)
bool supportsWraproundMode() const
KisPaintDeviceSP createThumbnailDevice(qint32 w, qint32 h, QRect rect=QRect(), QRect outputRect=QRect()) const
void setSupportsWraparoundMode(bool value)
void enableJob(JobType type, bool enable=true, KisStrokeJobData::Sequentiality sequentiality=KisStrokeJobData::SEQUENTIAL, KisStrokeJobData::Exclusivity exclusivity=KisStrokeJobData::NORMAL)
void setClearsRedoOnStart(bool value)
void setSupportsWrapAroundMode(bool value)
bool sampleColor(KoColor &out_color, KisPaintDeviceSP dev, const QPoint &pos, KoColor const *const blendColor, int radius, int blend, bool pure)