29std::pair<QRectF,QRectF> colorPreviewDocRectImpl(
const QPointF &outlineDocPoint,
bool colorPreviewShowComparePlate,
const KoViewConverter *converter)
32 const QRectF colorPreviewViewRect = cfg.colorPreviewRect();
34 const QRectF colorPreviewBaseColorViewRect =
35 colorPreviewShowComparePlate ?
36 colorPreviewViewRect.translated(colorPreviewViewRect.width(), 0) :
39 const QRectF colorPreviewDocumentRect = converter->
viewToDocument(colorPreviewViewRect);
40 const QRectF colorPreviewBaseColorDocumentRect =
43 return std::make_pair(colorPreviewDocumentRect.translated(outlineDocPoint),
44 colorPreviewBaseColorDocumentRect.translated(outlineDocPoint));
89 using namespace std::placeholders;
90 std::function<
void(QPointF)> callback =
92 m_d->samplingCompressor.reset(
95 m_d->activationDelayTimer.setInterval(100);
96 m_d->activationDelayTimer.setSingleShot(
true);
107 return m_d->isActive;
113 m_d->isActive =
true;
115 m_d->sampleResourceId =
120 m_d->sampleCurrentLayer = sampleCurrentLayer;
121 m_d->showComparePlate =
false;
123 m_d->activationDelayTimer.start();
130 if (!
m_d->isActive)
return;
132 m_d->showPreview =
true;
135 m_d->canvas->resourceManager()->koColorResource(
m_d->sampleResourceId);
136 const QColor previewColor =
m_d->canvas->displayColorConverter()->
toQColor(currentColor);
138 m_d->currentColor = previewColor;
139 m_d->baseColor = previewColor;
148 const int sampleResourceId =
155 if (sampleCurrentLayer) {
179 return m_d->updateGlobalColor;
188 m_d->activationDelayTimer.stop();
190 m_d->showPreview =
false;
191 m_d->showComparePlate =
false;
193 m_d->currentColorDocRect = QRectF();
194 m_d->currentColor = QColor();
195 m_d->baseColor = QColor();
196 m_d->baseColorDocRect = QRectF();
198 m_d->isActive =
false;
212 m_d->strokeId =
m_d->strokesFacade()->startStroke(strategy);
213 m_d->samplingCompressor->start(docPoint);
219 m_d->samplingCompressor->start(docPoint);
226 m_d->strokesFacade()->addJob(
m_d->strokeId,
229 m_d->strokesFacade()->endStroke(
m_d->strokeId);
230 m_d->strokeId.clear();
235 if (!
m_d->showPreview)
return QRectF();
237 std::tie(
m_d->currentColorDocRect,
m_d->baseColorDocRect) =
238 colorPreviewDocRectImpl(docPoint,
m_d->showComparePlate, &
m_d->converter());
240 return m_d->currentColorDocRect |
m_d->baseColorDocRect;
245 if (!
m_d->showPreview)
return;
248 gc.fillRect(viewRect,
m_d->currentColor);
250 if (
m_d->showComparePlate) {
252 gc.fillRect(baseColorRect,
m_d->baseColor);
262 if (!
m_d->strokeId)
return;
268 if (!
m_d->sampleCurrentLayer) {
270 if (referencesLayer &&
m_d->canvas->referenceImagesDecoration()->visible()) {
271 QColor color = referencesLayer->getPixel(imagePoint);
272 if (color.isValid() && color.alpha() != 0) {
280 m_d->canvas->imageView()->currentNode()->colorSampleSourceDevice() :
286 m_d->canvas->resourceManager()->koColorResource(
m_d->sampleResourceId);
288 m_d->strokesFacade()->addJob(
m_d->strokeId,
291 QString message = i18n(
"Color sampler does not work on this layer.");
292 m_d->canvas->viewManager()->showFloatingMessage(message,
koIcon(
"object-locked"));
302 if (
m_d->updateGlobalColor) {
303 m_d->canvas->resourceManager()->setResource(
m_d->sampleResourceId, color);
309 if (!
m_d->showPreview)
return;
311 const QColor previewColor =
m_d->canvas->displayColorConverter()->toQColor(color);
313 m_d->showComparePlate =
true;
314 m_d->currentColor = previewColor;
float value(const T *src, size_t ch)
const quint8 OPACITY_OPAQUE_U8
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
~KisAsyncColorSamplerHelper() override
void slotColorSamplingFinished(const KoColor &rawColor)
KisAsyncColorSamplerHelper(KisCanvas2 *canvas)
void activate(bool sampleCurrentLayer, bool pickFgColor)
void setUpdateGlobalColor(bool value)
void sigFinalColorSelected(const KoColor &color)
void slotAddSamplingJob(const QPointF &docPoint)
void sigRequestCursor(const QCursor &cursor)
bool updateGlobalColor() const
void paint(QPainter &gc, const KoViewConverter &converter)
void sigRequestUpdateOutline()
void updateCursor(bool sampleCurrentLayer, bool pickFgColor)
void continueAction(const QPointF &docPoint)
void startAction(const QPointF &docPoint, int radius, int blend)
void sigColorSelected(const KoColor &color)
QScopedPointer< Private > m_d
void sigRawColorSelected(const KoColor &color)
void activateDelayedPreview()
QRectF colorPreviewDocRect(const QPointF &docPoint)
void sigRequestCursorReset()
KisImageWSP image() const
QPointer< KisView > imageView() const
void sigFinalColorSelected(const KoColor &color)
void sigColorUpdated(const KoColor &color)
static QCursor samplerImageBackgroundCursor()
static QCursor samplerLayerBackgroundCursor()
static QCursor samplerLayerForegroundCursor()
static QCursor samplerImageForegroundCursor()
const KoColorSpace * colorSpace() const
KisPaintDeviceSP projection() const
QPoint documentToImagePixelFloored(const QPointF &documentCoord) const
void setOpacity(quint8 alpha)
void toQColor(QColor *c) const
a convenience method for the above.
virtual QPointF viewToDocument(const QPointF &viewPoint) const
virtual QPointF documentToView(const QPointF &documentPoint) const
#define KIS_SAFE_ASSERT_RECOVER(cond)
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
#define KIS_SAFE_ASSERT_RECOVER_NOOP(cond)
#define koIcon(name)
Use these macros for icons without any issues.
typedef void(QOPENGLF_APIENTRYP PFNGLINVALIDATEBUFFERDATAPROC)(GLuint buffer)
@ BackgroundColor
The active background color selected for this canvas.
@ ForegroundColor
The active foreground color selected for this canvas.
Private(KisCanvas2 *_canvas)
QTimer activationDelayTimer
const KoViewConverter & converter() const
QRectF currentColorDocRect
QScopedPointer< SamplingCompressor > samplingCompressor
KisSignalCompressorWithParam< QPointF > SamplingCompressor
KisStrokesFacade * strokesFacade() const