Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_color_selector.h
Go to the documentation of this file.
1/*
2 SPDX-FileCopyrightText: 2011 Silvio Heinrich <plassy@web.de>
3
4 SPDX-License-Identifier: GPL-2.0-or-later
5*/
6
7#ifndef H_KIS_COLOR_SELECTOR_H
8#define H_KIS_COLOR_SELECTOR_H
9
10#include <QWidget>
11#include <QVector>
12#include <QImage>
13#include <QPainterPath>
14
15#include "kis_color.h"
16#include "kis_radian.h"
17#include "kis_acs_types.h"
19
21
22class QPainter;
24class QTransform;
25
26class KisColorSelector: public QWidget
27{
28 Q_OBJECT
29
31
32 struct ColorRing
33 {
35 : saturation(0)
36 , outerRadius(0)
37 , innerRadius(0)
38 { }
39
44 };
45
46public:
47 KisColorSelector(QWidget* parent, KisColor::Type type=KisColor::HSL);
48
50 void setColorConverter(KisDisplayColorConverter* colorConverter);
51 void setNumPieces(int num);
52 void setNumLightPieces(int num);
53 void setNumRings(int num);
54
55 void setLight(qreal light=0.0f);
56
57 void setLumaCoefficients(qreal lR, qreal lG, qreal lB, qreal lGamma);
58 inline qreal lumaR() const { return m_lumaR; }
59 inline qreal lumaG() const { return m_lumaG; }
60 inline qreal lumaB() const { return m_lumaB; }
61 inline qreal lumaGamma() const { return m_lumaGamma; }
62
63 void setInverseSaturation(bool inverse);
64 void selectColor(const KisColor& color);
65 void setFgColor(const KoColor& fgColor);
66 void setBgColor(const KoColor& bgColor);
67
68 void setDefaultHueSteps(int num);
69 void setDefaultSaturationSteps(int num);
70 void setDefaultValueScaleSteps(int num);
71 void setShowBgColor(bool value);
74 void setDirty();
75 bool gamutMaskOn();
76 void setGamutMaskOn(bool gamutMaskOn);
77 void setEnforceGamutMask(bool enforce);
79
80 void saveSettings();
81 void loadSettings();
82
84 qint32 getNumRings () const { return m_colorRings.size(); }
85 qint32 getNumPieces () const { return m_numPieces; }
86 qint32 getNumLightPieces () const { return m_numLightPieces; }
88
89 quint32 getDefaultHueSteps () const { return m_defaultHueSteps; }
92 bool getShowBgColor () const { return m_showBgColor; }
94 bool enforceGamutMask () const { return m_enforceGamutMask; }
95
96Q_SIGNALS:
97 void sigFgColorChanged(const KisColor& color);
98 void sigBgColorChanged(const KisColor& color);
99
100private:
101 void mousePressEvent(QMouseEvent* event) override;
102 void mouseMoveEvent(QMouseEvent* event) override;
103 void mouseReleaseEvent(QMouseEvent* event) override;
104 void resizeEvent(QResizeEvent* event) override;
105 void paintEvent(QPaintEvent* event) override;
106 void leaveEvent(QEvent* e) override;
107
108 bool colorIsClear(const KisColor &color);
109 bool colorIsClear(const QPointF &colorPoint);
111
112 void recalculateAreas(quint8 numLightPieces);
113 void recalculateRings(quint8 numRings, quint8 numPieces);
114 void createRing(ColorRing& wheel, quint8 numPieces, qreal innerRadius, qreal outerRadius);
115
116 void drawRing(QPainter& painter, ColorRing& wheel, const QRect& rect);
117 void drawOutline(QPainter& painter, const QRect& rect);
118 void drawBlip(QPainter& painter, const QRect& rect);
119 void drawLightStrip(QPainter& painter, const QRect& rect);
120 void drawGamutMaskShape(QPainter& painter, const QRect& rect);
121 void drawColorPreview(QPainter& painter, const QRect& rect);
122
123 qint8 getHueIndex(Radian hue) const;
124 qreal getHue(int hueIdx, Radian shift=0.0f) const;
125 qint8 getLightIndex(const QPointF& pt) const;
126 qint8 getLightIndex(qreal light) const;
127 qreal getLight(const QPointF& pt) const;
128 qint8 getSaturationIndex(const QPointF& pt) const;
129 qint8 getSaturationIndex(qreal saturation) const;
130 qreal getSaturation(int saturationIdx) const;
131
132 QPointF mapCoordToView(const QPointF& pt, const QRectF& viewRect) const;
133 QPointF mapCoordToUnit(const QPointF& pt, const QRectF& viewRect) const;
134 QPointF mapColorToUnit(const KisColor& color, bool invertSaturation = true) const;
135 Radian mapCoordToAngle(qreal x, qreal y) const;
136 QPointF mapHueToAngle(qreal hue) const;
137
138public:
139 // This is a private interface for signal compressor, don't use it.
140 // Use requestUpdateColorAndPreview() instead
141 void slotUpdateColorAndPreview(QPair<KisColor, Acs::ColorRole> color);
142
143private:
163 QPointF m_clickPos;
166 Qt::MouseButtons m_pressedButtons;
167
168 // docker settings
173 bool m_showBgColor {true};
174
178// QSize m_renderAreaSize;
180// KisGamutMaskViewConverter* m_viewConverter;
182
188
189 qreal m_lumaR;
190 qreal m_lumaG;
191 qreal m_lumaB;
193
195 QScopedPointer<ColorCompressorType> m_updateColorCompressor;
196};
197
198#endif // H_KIS_COLOR_SELECTOR_H
float value(const T *src, size_t ch)
qreal getLight(const QPointF &pt) const
void setColorConverter(KisDisplayColorConverter *colorConverter)
qint8 getLightIndex(const QPointF &pt) const
QPointF mapCoordToUnit(const QPointF &pt, const QRectF &viewRect) const
qint8 getSaturationIndex(const QPointF &pt) const
KisSignalCompressorWithParam< QPair< KisColor, Acs::ColorRole > > ColorCompressorType
void setDefaultSaturationSteps(int num)
void setNumLightPieces(int num)
void drawRing(QPainter &painter, ColorRing &wheel, const QRect &rect)
bool isSaturationInverted() const
Radian mapCoordToAngle(qreal x, qreal y) const
qint32 getNumLightPieces() const
void setColorSpace(KisColor::Type type)
QVector< ColorRing > m_colorRings
void drawBlip(QPainter &painter, const QRect &rect)
void mouseMoveEvent(QMouseEvent *event) override
bool getShowBgColor() const
QPointF mapCoordToView(const QPointF &pt, const QRectF &viewRect) const
qreal lumaGamma() const
void sigFgColorChanged(const KisColor &color)
void recalculateRings(quint8 numRings, quint8 numPieces)
void setInverseSaturation(bool inverse)
KoGamutMaskSP gamutMask()
KoGamutMaskSP m_currentGamutMask
quint32 getDefaultSaturationSteps() const
Qt::MouseButtons m_pressedButtons
qreal getSaturation(int saturationIdx) const
KisColorSelector(KisColorSelectorConfiguration conf, QWidget *parent=0)
void recalculateAreas(quint8 numLightPieces)
void mousePressEvent(QMouseEvent *event) override
void leaveEvent(QEvent *e) override
void setEnforceGamutMask(bool enforce)
void resizeEvent(QResizeEvent *event) override
void setGamutMaskOn(bool gamutMaskOn)
qreal getHue(int hueIdx, Radian shift=0.0f) const
QScopedPointer< ColorCompressorType > m_updateColorCompressor
void setDefaultHueSteps(int num)
void setDefaultValueScaleSteps(int num)
void requestUpdateColorAndPreview(const KisColor &color, Acs::ColorRole role)
QPointF mapHueToAngle(qreal hue) const
void sigBgColorChanged(const KisColor &color)
void paintEvent(QPaintEvent *event) override
KisColor::Type getColorSpace() const
bool enforceGamutMask() const
QTransform m_gamutMaskViewTransform
void setNumPieces(int num)
void setLumaCoefficients(qreal lR, qreal lG, qreal lB, qreal lGamma)
qint32 getNumRings() const
void mouseReleaseEvent(QMouseEvent *event) override
KisColor::Type m_colorSpace
quint32 getDefaultValueScaleSteps() const
bool colorIsClear(const KisColor &color)
void selectColor(const KisColor &color)
void setFgColor(const KoColor &fgColor)
void slotUpdateColorAndPreview(QPair< KisColor, Acs::ColorRole > color)
void drawGamutMaskShape(QPainter &painter, const QRect &rect)
QPointF mapColorToUnit(const KisColor &color, bool invertSaturation=true) const
void setBgColor(const KoColor &bgColor)
KisDisplayColorConverter * m_colorConverter
void setGamutMask(KoGamutMaskSP gamutMask)
void setShowValueScaleNumbers(bool value)
void drawOutline(QPainter &painter, const QRect &rect)
void setLight(qreal light=0.0f)
quint32 getDefaultHueSteps() const
void setShowBgColor(bool value)
void createRing(ColorRing &wheel, quint8 numPieces, qreal innerRadius, qreal outerRadius)
qint8 getHueIndex(Radian hue) const
void drawColorPreview(QPainter &painter, const QRect &rect)
void drawLightStrip(QPainter &painter, const QRect &rect)
bool getShowValueScaleNumbers() const
bool colorIsClear(const QPointF &colorPoint)
qint32 getNumPieces() const
KisRadian< qreal > Radian
QVector< QPainterPath > pieced