Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_painting_assistants_decoration.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2009 Cyrille Berger <cberger@cberger.net>
3 * SPDX-FileCopyrightText: 2017 Scott Petrovic <scottpetrovic@gmail.com>
4 *
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 */
7
9
10#include <cstdint>
11#include <limits>
12
13#include <QList>
14#include <QPointF>
15#include <klocalizedstring.h>
16#include <kactioncollection.h>
17#include <ktoggleaction.h>
18#include <kis_algebra_2d.h>
19#include "kis_debug.h"
20#include "KisDocument.h"
21#include "kis_canvas2.h"
23#include "kis_icon_utils.h"
24#include "KisViewManager.h"
26#include "kis_tool_proxy.h"
28
29#include <QPainter>
30#include <QPainterPath>
31#include <QApplication>
32
56
57
58
60 KisCanvasDecoration("paintingAssistantsDecoration", parent),
61 d(new Private)
62{
65 setPriority(95);
66 d->snapOnlyOneAssistant = true; //turn on by default.
67 d->snapEraser = false;
68
69 slotConfigChanged(); // load the initial config
70}
71
76
78{
79 const bool shouldBeVisible = !assistants().isEmpty();
80
81 if (visible() != shouldBeVisible) {
82 setVisible(shouldBeVisible);
83 }
84}
85
95
97{
98 QList<KisPaintingAssistantSP> assistants = view()->document()->assistants();
99 if (assistants.contains(assistant)) return;
100
101 assistants.append(assistant);
102 assistant->setAssistantGlobalColorCache(view()->document()->assistantsGlobalColor());
103
104 view()->document()->setAssistants(assistants);
105 setVisible(!assistants.isEmpty());
106 Q_EMIT assistantChanged();
107}
108
109// bring assistant to front of assistants list, effectively causing assistant to be rendered above the others
111{
112 QList<KisPaintingAssistantSP> assistants = view()->document()->assistants();
113 assistants.removeOne(assistant);
114
115 if (!assistant) return;
116 assistants.append(assistant);
117
118 view()->document()->setAssistants(assistants);
119 setVisible(!assistants.isEmpty());
120 Q_EMIT assistantChanged();
121
122}
123
125{
126 QList<KisPaintingAssistantSP> assistants = view()->document()->assistants();
127 KIS_ASSERT_RECOVER_NOOP(assistants.contains(assistant));
128
129 if (assistants.removeAll(assistant)) {
130 view()->document()->setAssistants(assistants);
131 setVisible(!assistants.isEmpty());
132 Q_EMIT assistantChanged();
133 }
134}
135
137{
138 QList<KisPaintingAssistantSP> assistants = view()->document()->assistants();
139 assistants.clear();
140 view()->document()->setAssistants(assistants);
141 setVisible(!assistants.isEmpty());
142
143 Q_EMIT assistantChanged();
144}
145
147{
148 Q_FOREACH (KisPaintingAssistantSP assistant, assistants) {
149 assistant->setAssistantGlobalColorCache(view()->document()->assistantsGlobalColor());
150 }
151 view()->document()->setAssistants(assistants);
152 setVisible(!assistants.isEmpty());
153
154 Q_EMIT assistantChanged();
155}
156
158{
159 if (!assistants().empty()) {
160 Q_FOREACH (KisPaintingAssistantSP assistant, assistants()) {
161 assistant->setAdjustedBrushPosition(position);
162 }
163 }
164}
165
166
167QPointF KisPaintingAssistantsDecoration::adjustPosition(const QPointF& point, const QPointF& strokeBegin)
168{
169
170 if (assistants().empty()) {
171 // No assistants, so no adjustment
172 return point;
173 }
174
175 if (!d->snapEraser
177 // No snapping if eraser snapping is disabled and brush is an eraser
178 return point;
179 }
180
181 KisImageSP image = d->m_canvas->image();
183
185 const qreal moveThresholdPt = 4.0 / (converter->effectiveZoom() * qMax(image->xRes(), image->yRes()));
186
187 QPointF best = point;
188 qreal minSquareDistance = std::numeric_limits<qreal>::max();
189 qreal secondSquareDistance = std::numeric_limits<qreal>::max();
190
192 // In these cases the best assistant needs to be determined.
193 int numSuitableAssistants = 0;
194 KisPaintingAssistantSP bestAssistant;
195
196 Q_FOREACH (KisPaintingAssistantSP assistant, assistants()) {
197 if (assistant->isSnappingActive() == true){ // the toggle button with eye icon to disable assistants
198 QPointF newpoint = assistant->adjustPosition(point, strokeBegin, true, moveThresholdPt);
199 // Assistants that can't or don't want to snap return NaN values (aside from possible numeric issues)
200 // NOTE: It would be safer to also reject points too far outside canvas (or widget?) area,
201 // because for example squashed concentric ellipses can currently shoot points far off.
202 if (qIsNaN(newpoint.x()) || qIsNaN(newpoint.y())) {
203 continue;
204 }
205 ++numSuitableAssistants;
206 qreal dist = kisSquareDistance(newpoint, point);
207 if (dist < minSquareDistance) {
208 best = newpoint;
209 secondSquareDistance = minSquareDistance;
210 minSquareDistance = dist;
211 bestAssistant = assistant;
212 } else if (dist < secondSquareDistance) {
213 secondSquareDistance = dist;
214 }
215 assistant->setFollowBrushPosition(true);
216 }
217 }
218
219 // When there are multiple choices within moveThresholdPt, delay the decision until movement leaves
220 // threshold to determine which curve follows cursor movement the closest. Assistants with multiple
221 // snapping curves also need this movement to decide the best choice.
222 // NOTE: It is currently not possible to tell painting tools that a decision is pending, or that
223 // the active snapping curve changed, so certain artifact lines from snapping changes are unavoidable.
224
225 if (numSuitableAssistants > 1 && KisAlgebra2D::norm(point - strokeBegin) <= moveThresholdPt
226 && (sqrt(secondSquareDistance) < moveThresholdPt)) {
227 return strokeBegin;
228 } else if (numSuitableAssistants > 0 && d->snapOnlyOneAssistant) {
229 // if only snapping to one assistant, register it
230 d->firstAssistant = bestAssistant;
231 }
232 } else {
233 // Make sure BUG:448187 doesn't crop up again
234 KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(d->firstAssistant->isSnappingActive(), point);
235 // there already is an assistant locked in, check if it can be used
236 QPointF newpoint = d->firstAssistant->adjustPosition(point, strokeBegin, false, moveThresholdPt);
237 // BUGFIX: 402535
238 // assistants might return (NaN,NaN), must always check for that
239 if (!(qIsNaN(newpoint.x()) || qIsNaN(newpoint.y()))) {
240 best = newpoint;
241 }
242 }
243
244 return best;
245}
246
247void KisPaintingAssistantsDecoration::adjustLine(QPointF &point, QPointF &strokeBegin)
248{
249 if (assistants().empty()) {
250 // No assistants, so no adjustment
251 return;
252 }
253
254 // TODO: figure it out
255 if (!d->snapEraser
257 // No snapping if eraser snapping is disabled and brush is an eraser
258 return;
259 }
260
261 QPointF originalPoint = point;
262 QPointF originalStrokeBegin = strokeBegin;
263
264 qreal minDistance = 10000.0;
265 bool minDistValid = false;
266 QPointF finalPoint = originalPoint;
267 QPointF finalStrokeBegin = originalStrokeBegin;
268 KisPaintingAssistantSP bestAssistant;
269 Q_FOREACH (KisPaintingAssistantSP assistant, assistants()) {
270 if(assistant->isSnappingActive() == true){//this checks if the assistant in question has it's snapping boolean turned on//
271 //QPointF pt = assistant->adjustPosition(point, strokeBegin, true);
272 QPointF p1 = originalPoint;
273 QPointF p2 = originalStrokeBegin;
274 assistant->adjustLine(p1, p2);
275 if (p1.isNull() || p2.isNull()) {
276 // possibly lines cannot snap to this assistant, or this line cannot, at least
277 continue;
278 }
279 qreal distance = kisSquareDistance(p1, originalPoint) + kisSquareDistance(p2, originalStrokeBegin);
280 if (distance < minDistance || !minDistValid) {
281 finalPoint = p1;
282 finalStrokeBegin = p2;
283 minDistValid = true;
284 bestAssistant = assistant;
285 }
286 }
287 }
288 if (bestAssistant) {
289 bestAssistant->setFollowBrushPosition(true);
290 }
291 point = finalPoint;
292 strokeBegin = finalStrokeBegin;
293}
294
296{
297 d->firstAssistant.clear();
298
299 Q_FOREACH (KisPaintingAssistantSP assistant, assistants()) {
300 assistant->endStroke();
301 }
302}
303
304void KisPaintingAssistantsDecoration::drawDecoration(QPainter& gc, const QRectF& updateRect, const KisCoordinatesConverter *converter, KisCanvas2* canvas)
305{
306 if(assistants().isEmpty()) {
307 return; // no assistants to worry about, ok to exit
308 }
309
310 if (!canvas) {
311 dbgFile<<"canvas does not exist in painting assistant decoration, you may have passed arguments incorrectly:"<<canvas;
312 } else {
313 d->m_canvas = canvas;
314 }
315
316 // the preview functionality for assistants. do not show while editing
317
318 KoToolProxy *proxy = view()->canvasBase()->toolProxy();
320 KisToolProxy *kritaProxy = dynamic_cast<KisToolProxy*>(proxy);
322
323 const bool outlineVisible =
326 kritaProxy->supportsPaintingAssistants();
327
328 Q_FOREACH (KisPaintingAssistantSP assistant, assistants()) {
329 assistant->drawAssistant(gc, updateRect, converter, canvas->displayRendererInterface(), d->useCache, canvas, assistantVisibility(), outlineVisible);
330
331 if (isEditingAssistants()) {
332 drawHandles(assistant, gc, converter, canvas->displayRendererInterface());
333 }
334 }
335
336 // draw editor controls on top of all assistant lines (why this code is last)
337 if (isEditingAssistants()) {
338 Q_FOREACH (KisPaintingAssistantSP assistant, assistants()) {
339 drawEditorWidget(assistant, gc, converter, canvas->displayRendererInterface());
340 }
341 }
342}
343
345{
346 QTransform initialTransform = converter->documentToWidgetTransform();
347
348 KoColor c;
349 c.fromQColor(assistant->effectiveAssistantColor());
350 QColor colorToPaint = renderInterface->convertColorToDisplayColorSpace(c);
351
352 Q_FOREACH (const KisPaintingAssistantHandleSP handle, assistant->handles()) {
353
354
355 QPointF transformedHandle = initialTransform.map(*handle);
356 QRectF ellipse(transformedHandle - QPointF(handleSize() * 0.5, handleSize() * 0.5), QSizeF(handleSize(), handleSize()));
357
358 QPainterPath path;
359 path.addEllipse(ellipse);
360
361 gc.save();
362 gc.setPen(Qt::NoPen);
363 gc.setBrush(colorToPaint);
364 gc.drawPath(path);
365 gc.restore();
366 }
367
368 // some assistants have side handles like the vanishing point assistant
369 Q_FOREACH (const KisPaintingAssistantHandleSP handle, assistant->sideHandles()) {
370 QPointF transformedHandle = initialTransform.map(*handle);
371 QRectF ellipse(transformedHandle - QPointF(handleSize() * 0.5, handleSize() * 0.5), QSizeF(handleSize(), handleSize()));
372
373 QPainterPath path;
374 path.addEllipse(ellipse);
375
376 gc.save();
377 gc.setPen(Qt::NoPen);
378 gc.setBrush(colorToPaint);
379 gc.drawPath(path);
380 gc.restore();
381 }
382}
383
388
393
395{
397 Q_FOREACH (KisPaintingAssistantSP assistant, assistants()) {
398 Q_FOREACH (const KisPaintingAssistantHandleSP handle, assistant->handles()) {
399 if (!hs.contains(handle)) {
400 hs.push_back(handle);
401 }
402 }
403 Q_FOREACH (const KisPaintingAssistantHandleSP handle, assistant->sideHandles()) {
404 if (!hs.contains(handle)) {
405 hs.push_back(handle);
406 }
407 }
408 }
409 return hs;
410}
411
413{
415 if (view()) {
416 if (view()->document()) {
417 assistants = view()->document()->assistants();
418 }
419 }
420 return assistants;
421}
422
424{
425 return !assistants().isEmpty();
426}
427
432
438
443
444
449
454
459
461{
462 d->snapEraser = assistant;
463}
464
474{
475 Q_FOREACH (KisPaintingAssistantSP assistant, assistants()) {
476 assistant->uncache();
477 }
478
479 // Redraw canvas decorations in case the change was made off canvas
480 if (d->m_canvas) {
482 }
483}
489
491{
492 // "outline" means assistant preview (line that depends on the mouse cursor)
494 uncache();
495}
496
498{
499 return view()->document()->assistantsGlobalColor();
500}
501
503{
504 // view()->document() is referenced multiple times in this class
505 // it is used to later store things in the KRA file when saving.
506 view()->document()->setAssistantsGlobalColor(color);
507
508 Q_FOREACH (KisPaintingAssistantSP assistant, assistants()) {
509 assistant->setAssistantGlobalColorCache(color);
510 }
511
512 uncache();
513}
514
516{
517 setVisible(true); // this turns on the decorations in general. we leave it on at this point
518 d->m_isEditingAssistants = true;
519 uncache(); // updates visuals when editing
520}
521
523{
524 if (!d->m_canvas) {
525 return;
526 }
527
528 d->m_isEditingAssistants = false; // some elements are hidden when we aren't editing
529 uncache(); // updates visuals when not editing
530}
531
536
537QPointF KisPaintingAssistantsDecoration::snapToGuide(KoPointerEvent *e, const QPointF &offset, bool useModifiers)
538{
539 if (!d->m_canvas || !d->m_canvas->currentImage()) {
540 return e->point;
541 }
542
543
544 KoSnapGuide *snapGuide = d->m_canvas->snapGuide();
545 QPointF pos = snapGuide->snap(e->point, offset, useModifiers ? e->modifiers() : Qt::NoModifier);
546
547 return pos;
548}
549
550QPointF KisPaintingAssistantsDecoration::snapToGuide(const QPointF& pt, const QPointF &offset)
551{
552 if (!d->m_canvas) {
553 return pt;
554 }
555
556
557 KoSnapGuide *snapGuide = d->m_canvas->snapGuide();
558 QPointF pos = snapGuide->snap(pt, offset, Qt::NoModifier);
559
560 return pos;
561}
562
563/*
564 * functions only used internally in this class
565 * we potentially could make some of these inline to speed up performance
566*/
567
568void drawSingleState(QPainter& gc, const QIcon &icon, const QSize &iconSize, QRect maxRect, const QPoint &position, const KoColorDisplayRendererInterface *renderInterface, QPoint additional = QPoint()) {
569 maxRect.moveTopLeft(position+additional);
570 const QMargins m(2, 2, 2, 2);
571
572#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
573 QRect target(QPoint(), iconSize);
574 target.moveCenter(maxRect.center());
575 target = target.marginsRemoved(m);
576 icon.paint(&gc, target);
577#else
578
579 QImage ic = icon.pixmap(iconSize.width(), iconSize.height()).toImage();
580 QRect target(QPoint(), (ic.size()/ic.devicePixelRatioF()));
581 target.moveCenter(maxRect.center());
582 target = target.marginsRemoved(m);
583 gc.drawImage(target.intersected(maxRect), renderInterface->convertImageToDisplayColorSpace(ic));
584#endif
585}
586
587void drawDoubleState(QPainter& gc, const QIcon &icon, const QSize &iconSize, const QIcon &icon2, QRect maxRect, const QPoint &position, const bool state, const KoColorDisplayRendererInterface *renderInterface) {
588 maxRect.moveTopLeft(position);
589 const QMargins m(2, 2, 2, 2);
590#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
591 QRect target(QPoint(), iconSize);
592 target.moveCenter(maxRect.center());
593 target = target.marginsRemoved(m);
594 if (state) {
595 icon.paint(&gc, target);
596 } else {
597 gc.save();
598 gc.setOpacity(0.35);
599 icon2.paint(&gc, target);
600 gc.restore();
601 }
602#else
603 QImage ic = state? icon.pixmap(iconSize.width(), iconSize.height()).toImage(): icon2.pixmap(iconSize.width(), iconSize.height()).toImage();
604 QRect target(QPoint(), (ic.size()/ic.devicePixelRatioF()));
605 target.moveCenter(maxRect.center());
606 target = target.marginsRemoved(m);
607 if (state) {
608 gc.drawImage(target.intersected(maxRect), renderInterface->convertImageToDisplayColorSpace(ic));
609 } else {
610 gc.save();
611 gc.setOpacity(0.35);
612 gc.drawImage(target.intersected(maxRect.marginsRemoved(m)), renderInterface->convertImageToDisplayColorSpace(ic));
613 gc.restore();
614 }
615#endif
616}
617
619{
620 if (!assistant->isAssistantComplete() || !globalEditorWidgetData.widgetActivated) {
621 return;
622 }
623
624 QTransform initialTransform = converter->documentToWidgetTransform();
625 QPointF actionsPosition = initialTransform.map(assistant->viewportConstrainedEditorPosition(converter, globalEditorWidgetData.boundingSize));
626
627 //draw editor widget background
628 QPalette sysPalette = renderInterface->systemPaletteForDisplayColorSpace();
629
630 QBrush backgroundColor = sysPalette.window();
631 QPointF actionsBGRectangle(actionsPosition + QPointF(globalEditorWidgetData.widgetOffset,globalEditorWidgetData.widgetOffset));
632 QPen stroke(sysPalette.window(), 2);
633
634
635 gc.setRenderHint(QPainter::Antialiasing);
636
637
638 QPainterPath bgPath;
639 QRectF bgRect(actionsBGRectangle.x(),
640 actionsBGRectangle.y(),
643 bgPath.addRoundedRect(bgRect, 6, 6);
644
645
646 // if the assistant is selected, make outline stroke fatter and use theme's highlight color
647 // for better visual feedback
648 if (selectedAssistant()) { // there might not be a selected assistant, so do not seg fault
649 if (assistant->getEditorPosition() == selectedAssistant()->getEditorPosition()) {
650 stroke.setWidth(6);
651 stroke.setColor(sysPalette.color(QPalette::Highlight));
652
653 }
654 }
655
656 gc.setPen(stroke);
657 gc.drawPath(bgPath);
658 gc.fillPath(bgPath, backgroundColor);
659
660 // If the assistant uses a custom color, draw a colored strip at the bottom
661 // of the editor rectangle so that the association is clear.
662 if (assistant->useCustomColor()) {
663 KoColor c;
664 c.fromQColor(assistant->effectiveAssistantColor());
665 QColor assistantColor = renderInterface->convertColorToDisplayColorSpace(c);
666 assistantColor.setAlpha(255); // No point in having transparency here.
667
668 gc.save();
669 gc.setClipPath(bgPath, Qt::IntersectClip);
670 gc.fillRect(QRectF(QPointF(bgRect.left(), bgRect.bottom() - 4.0), bgRect.bottomRight()), assistantColor);
671 gc.restore();
672 }
673
674 //draw drag handle
675 KoColor c;
676 c.fromQColor(QColor(150,150,150,255));
677 QColor dragDecorationColor = renderInterface->convertColorToDisplayColorSpace(c);
678
679 QPainterPath dragRect;
682
683 gc.fillPath(bgPath.intersected(dragRect),dragDecorationColor);
684
685 //draw dot decoration on handle
686 QPainterPath dragRectDots;
687 c.fromQColor(QColor(50,50,50,255));
688 QColor dragDecorationDotsColor = renderInterface->convertColorToDisplayColorSpace(c);
689 int dotSize = 2;
690 dragRectDots.addEllipse(3,2.5,dotSize,dotSize);
691 dragRectDots.addEllipse(3,7.5,dotSize,dotSize);
692 dragRectDots.addEllipse(3,-2.5,dotSize,dotSize);
693 dragRectDots.addEllipse(3,-7.5,dotSize,dotSize);
694 dragRectDots.addEllipse(-3,2.5,dotSize,dotSize);
695 dragRectDots.addEllipse(-3,7.5,dotSize,dotSize);
696 dragRectDots.addEllipse(-3,-2.5,dotSize,dotSize);
697 dragRectDots.addEllipse(-3,-7.5,dotSize,dotSize);
698 dragRectDots.translate((globalEditorWidgetData.dragDecorationWidth/2)+width,(globalEditorWidgetData.boundingSize.height()/2)+actionsPosition.y()+globalEditorWidgetData.widgetOffset);
699 gc.fillPath(dragRectDots,dragDecorationDotsColor);
700
701 QRect buttonRect(QPoint(0,0), QSize(globalEditorWidgetData.buttonSize, globalEditorWidgetData.buttonSize));
702 //loop over all visible buttons and render them
704 QPoint pos = QPointF(actionsPosition + globalEditorWidgetData.moveIconPosition).toPoint();
705 drawSingleState(gc, globalEditorWidgetData.m_iconMove, QSize(globalEditorWidgetData.buttonSize+10, globalEditorWidgetData.buttonSize+10), buttonRect, pos, renderInterface, QPoint(5, 5));
706 }
708 QPoint pos = QPointF(actionsPosition + globalEditorWidgetData.snapIconPosition).toPoint();
710 }
712 QPoint pos = QPointF(actionsPosition + globalEditorWidgetData.lockedIconPosition).toPoint();
714 }
716 QPoint pos = QPointF(actionsPosition + globalEditorWidgetData.duplicateIconPosition).toPoint();
718 }
720 QPoint pos = QPointF(actionsPosition + globalEditorWidgetData.deleteIconPosition).toPoint();
722 }
723}
QPointF p2
QPointF p1
KisMagneticGraph::vertex_descriptor target(typename KisMagneticGraph::edge_descriptor e, KisMagneticGraph g)
const QString COMPOSITE_ERASE
qreal distance(const QPointF &p1, const QPointF &p2)
int iconSize(qreal width, qreal height)
KoColorDisplayRendererInterface * displayRendererInterface() const override
displayRendererInterface The display renderer interface has a number of color conversion functions wh...
KisImageWSP currentImage() const
KisCoordinatesConverter * coordinatesConverter
KisImageWSP image() const
void updateCanvasDecorations()
QPointer< KisView > view() const
virtual void setVisible(bool v)
@ ASSISTANTS_DRAW_MODE_PIXMAP_CACHE
Definition kis_config.h:868
@ ASSISTANTS_DRAW_MODE_LARGE_PIXMAP_CACHE
Definition kis_config.h:869
AssistantsDrawMode assistantsDrawMode(bool defaultValue=false) const
double xRes() const
double yRes() const
void drawHandles(KisPaintingAssistantSP assistant, QPainter &gc, const KisCoordinatesConverter *converter, const KoColorDisplayRendererInterface *renderInterface)
QList< KisPaintingAssistantSP > assistants() const
void addAssistant(KisPaintingAssistantSP assistant)
QPointF snapToGuide(KoPointerEvent *e, const QPointF &offset, bool useModifiers)
void drawEditorWidget(KisPaintingAssistantSP assistant, QPainter &gc, const KisCoordinatesConverter *converter, const KoColorDisplayRendererInterface *renderInterface)
void setAssistantVisible(bool set)
sets whether the main assistant is visible
void toggleOutlineVisible()
toggles whether there will be a preview of the assistant result when painting
void setSelectedAssistant(KisPaintingAssistantSP assistant)
void toggleAssistantVisible()
toggles whether the assistant is active or not
void setOnlyOneAssistantSnap(bool assistant)
sets whether we snap to only one assistant
KisPaintingAssistantsDecoration(QPointer< KisView > parent)
void removeAssistant(KisPaintingAssistantSP assistant)
void raiseAssistant(KisPaintingAssistantSP assistant)
bool assistantVisibility()
returns assistant visibility
void setAssistants(const QList< KisPaintingAssistantSP > &assistants)
void drawDecoration(QPainter &gc, const QRectF &updateRect, const KisCoordinatesConverter *converter, KisCanvas2 *canvas) override
void setEraserSnap(bool assistant)
sets whether eraser brushes snap
void adjustLine(QPointF &point, QPointF &strokeBegin)
void setOutlineVisible(bool set)
sets whether the preview is visible
QList< KisPaintingAssistantHandleSP > handles()
QPointF adjustPosition(const QPointF &point, const QPointF &strokeBegin)
bool supportsPaintingAssistants() const
KoSnapGuide * snapGuide
QPointer< KoCanvasResourceProvider > resourceManager
virtual QColor convertColorToDisplayColorSpace(const KoColor color) const =0
convertColorToDisplayColorSpace
virtual QImage convertImageToDisplayColorSpace(const QImage source) const =0
convertImageToDisplayColorSpace
virtual QPalette systemPaletteForDisplayColorSpace() const =0
systemPaletteForDisplayColorSpace
void fromQColor(const QColor &c)
Convenient function for converting from a QColor.
Definition KoColor.cpp:213
Qt::KeyboardModifiers modifiers() const
QPointF point
The point in document coordinates.
QPointF snap(const QPointF &mousePosition, Qt::KeyboardModifiers modifiers)
snaps the mouse position, returns if mouse was snapped
#define KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(cond, val)
Definition kis_assert.h:129
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:128
#define KIS_ASSERT_RECOVER_NOOP(cond)
Definition kis_assert.h:97
#define dbgFile
Definition kis_debug.h:56
qreal kisSquareDistance(const QPointF &pt1, const QPointF &pt2)
Definition kis_global.h:194
void drawDoubleState(QPainter &gc, const QIcon &icon, const QSize &iconSize, const QIcon &icon2, QRect maxRect, const QPoint &position, const bool state, const KoColorDisplayRendererInterface *renderInterface)
void drawSingleState(QPainter &gc, const QIcon &icon, const QSize &iconSize, QRect maxRect, const QPoint &position, const KoColorDisplayRendererInterface *renderInterface, QPoint additional=QPoint())
qreal norm(const T &a)