Krita Source Code Documentation
Loading...
Searching...
No Matches
KisColorSelectorWheel Class Reference

#include <kis_color_selector_wheel.h>

+ Inheritance diagram for KisColorSelectorWheel:

Public Member Functions

 KisColorSelectorWheel (KisColorSelector *parent)
 
void setColor (const KoColor &color) override
 set the color, blibs etc
 
- Public Member Functions inherited from KisColorSelectorComponent
KoColor currentColor ()
 return the color, that was selected by calling mouseEvent
 
int height () const
 
 KisColorSelectorComponent (KisColorSelector *parent)
 
virtual void mouseEvent (int x, int y)
 saves the mouse position, so that a blip can be created.
 
void paintEvent (QPainter *)
 
void setConfiguration (Parameter param, Type type)
 setConfiguration can be ignored (for instance ring and triangle, as they can have only one config)
 
void setDirty ()
 force subsequent redraw of the component
 
void setGamutMask (KoGamutMaskSP gamutMask)
 
void setGeometry (int x, int y, int width, int height)
 
void toggleGamutMask (bool state)
 
void unsetGamutMask ()
 
void updateGamutMaskPreview ()
 
bool wantsGrab (int x, int y)
 returns true, if this component wants to grab the mouse (normally true, if containsPoint returns true)
 
int width () const
 

Protected Member Functions

void paint (QPainter *) override
 
KoColor selectColor (int x, int y) override
 this method must be overloaded to return the color at position x/y and draw a marker on that position
 
- Protected Member Functions inherited from KisColorSelectorComponent
const KoColorSpacecolorSpace () const
 
virtual bool containsPointInComponentCoords (int x, int y) const
 
bool isDirty () const
 returns true, if ether the color space, the size or the parameters have changed since the last paint event
 
void setLastMousePosition (int x, int y)
 

Private Member Functions

bool allowsColorSelectionAtPoint (const QPoint &pt) const override
 
KoColor colorAt (float x, float y, bool forceValid=false)
 

Private Attributes

qreal B {0.0}
 
qreal G {0.0}
 
qreal Gamma {0.0}
 
QPointF m_lastClickPos
 
QImage m_pixelCache
 
QPoint m_pixelCacheOffset
 
qreal m_renderAreaOffsetX {0.0}
 
qreal m_renderAreaOffsetY {0.0}
 
QSize m_renderAreaSize
 
QTransform m_toRenderArea
 
qreal R {0.0}
 

Friends

class Acs::PixelCacheRenderer
 

Additional Inherited Members

- Public Types inherited from KisColorSelectorComponent
typedef KisColorSelectorConfiguration::Parameters Parameter
 
typedef KisColorSelectorConfiguration::Type Type
 
- Public Slots inherited from KisColorSelectorComponent
void setParam (qreal hue, qreal hsvSaturation, qreal value, qreal hslSaturation, qreal lightness, qreal hsiSaturation, qreal intensity, qreal hsySaturation, qreal luma)
 
- Signals inherited from KisColorSelectorComponent
void paramChanged (qreal hue, qreal hsvSaturation, qreal value, qreal hslSaturation, qreal lightness, qreal hsiSaturation, qreal intensity, qreal hsySaturation, qreal luma)
 -1, if unaffected
 
void update ()
 request for repaint, for instance, if the hue changes.
 
- Protected Attributes inherited from KisColorSelectorComponent
KoGamutMaskSP m_currentGamutMask
 
bool m_gamutMaskOn {false}
 
qreal m_hsiSaturation {0.0}
 
qreal m_hslSaturation {0.0}
 
qreal m_hsvSaturation {0.0}
 
qreal m_hsySaturation {0.0}
 
qreal m_hue {0.0}
 
qreal m_intensity {0.0}
 
qreal m_lastX {0.0}
 
qreal m_lastY {0.0}
 
qreal m_lightness {0.0}
 
qreal m_luma {0.0}
 
bool m_maskPreviewActive {false}
 
Parameter m_parameter
 
KisColorSelectorm_parent {0}
 
Type m_type
 
qreal m_value {0.0}
 
int m_x {0}
 
int m_y {0}
 

Detailed Description

Definition at line 23 of file kis_color_selector_wheel.h.

Constructor & Destructor Documentation

◆ KisColorSelectorWheel()

KisColorSelectorWheel::KisColorSelectorWheel ( KisColorSelector * parent)
explicit

Member Function Documentation

◆ allowsColorSelectionAtPoint()

bool KisColorSelectorWheel::allowsColorSelectionAtPoint ( const QPoint & ) const
overrideprivatevirtual

a subclass can implement this method to note that the point, although it is in containsPointInComponentCoords area, still cannot be selected as a color (e.g. it is masked out). Default implementation always returns true.

Reimplemented from KisColorSelectorComponent.

Definition at line 307 of file kis_color_selector_wheel.cpp.

308{
310 return true;
311 }
312
313 QPointF colorCoord = m_toRenderArea.map(QPointF(pt));
314 QPointF translatedPoint = m_currentGamutMask->viewToMaskTransform(m_renderAreaSize.width()).map(colorCoord);
315 bool isClear = m_currentGamutMask->coordIsClear(translatedPoint, m_maskPreviewActive);
316
317 return isClear;
318}

References KisColorSelectorComponent::m_currentGamutMask, KisColorSelectorComponent::m_gamutMaskOn, KisColorSelectorComponent::m_maskPreviewActive, m_renderAreaSize, and m_toRenderArea.

◆ colorAt()

KoColor KisColorSelectorWheel::colorAt ( float x,
float y,
bool forceValid = false )
private

Definition at line 249 of file kis_color_selector_wheel.cpp.

250{
252
253 Q_ASSERT(x>=0 && x<=width());
254 Q_ASSERT(y>=0 && y<=height());
255
256 const qreal xRel = x - 0.5 * width();
257 const qreal yRel = y - 0.5 * height();
258 const qreal minDimension = qMin(width(), height());
259
260 qreal radius = sqrt(xRel*xRel+yRel*yRel);
261 if (radius > 0.5 * minDimension) {
262 if (!forceValid) {
263 return color;
264 } else {
265 radius = 0.5 * minDimension;
266 }
267 }
268 radius /= 0.5 * minDimension;
269
270 qreal angle = std::atan2(yRel, xRel);
271 angle += M_PI;
272 angle /= 2 * M_PI;
273
274 switch(m_parameter) {
276 color = m_parent->converter()->fromHsvF(angle, radius, m_value);
277 break;
279 color = m_parent->converter()->fromHslF(angle, radius, m_lightness);
280 break;
282 color = m_parent->converter()->fromHsiF(angle, radius, m_intensity);
283 break;
285 color = m_parent->converter()->fromHsyF(angle, radius, m_luma, R, G, B, Gamma);
286 break;
288 color = m_parent->converter()->fromHsvF(angle, m_hsvSaturation, radius);
289 break;
291 color = m_parent->converter()->fromHslF(angle, m_hslSaturation, radius);
292 break;
294 color = m_parent->converter()->fromHsiF(angle, m_hsiSaturation, radius);
295 break;
297 color = m_parent->converter()->fromHsyF(angle, m_hsySaturation, radius, R, G, B, Gamma);
298 break;
299 default:
300 Q_ASSERT(false);
301
302 return color;
303 }
304 return color;
305}
KisDisplayColorConverter * converter() const
const KoColorSpace * colorSpace() const
KoColor fromHsiF(qreal h, qreal s, qreal i)
KoColor fromHslF(qreal h, qreal s, qreal l, qreal a=1.0)
KoColor fromHsyF(qreal h, qreal s, qreal y, qreal R=0.2126, qreal G=0.7152, qreal B=0.0722, qreal gamma=2.2)
KoColor fromHsvF(qreal h, qreal s, qreal v, qreal a=1.0)
static KoColor createTransparent(const KoColorSpace *cs)
Definition KoColor.cpp:681
#define M_PI
Definition kis_global.h:111
auto minDimension(Size size) -> decltype(size.width())

References B, KisColorSelectorBase::colorSpace(), KisColorSelectorBase::converter(), KoColor::createTransparent(), KisDisplayColorConverter::fromHsiF(), KisDisplayColorConverter::fromHslF(), KisDisplayColorConverter::fromHsvF(), KisDisplayColorConverter::fromHsyF(), G, KisColorSelectorComponent::height(), KisColorSelectorConfiguration::hsiSH, KisColorSelectorConfiguration::hslSH, KisColorSelectorConfiguration::hsvSH, KisColorSelectorConfiguration::hsySH, KisColorSelectorConfiguration::IH, KisColorSelectorConfiguration::LH, KisColorSelectorComponent::m_hsiSaturation, KisColorSelectorComponent::m_hslSaturation, KisColorSelectorComponent::m_hsvSaturation, KisColorSelectorComponent::m_hsySaturation, KisColorSelectorComponent::m_intensity, KisColorSelectorComponent::m_lightness, KisColorSelectorComponent::m_luma, KisColorSelectorComponent::m_parameter, KisColorSelectorComponent::m_parent, M_PI, KisColorSelectorComponent::m_value, R, KisColorSelectorConfiguration::VH, KisColorSelectorComponent::width(), and KisColorSelectorConfiguration::YH.

◆ paint()

void KisColorSelectorWheel::paint ( QPainter * )
overrideprotectedvirtual

paint component using given painter the component should respect width() and height() (eg. scale to width and height), but doesn't have to care about x/y coordinates (top left corner)

Implements KisColorSelectorComponent.

Definition at line 173 of file kis_color_selector_wheel.cpp.

174{
175
176 if(isDirty()) {
177 KisPaintDeviceSP realPixelCache;
178 Acs::PixelCacheRenderer::render(this, m_parent->converter(), QRect(0, 0, width(), height()), realPixelCache,
179 m_pixelCache, m_pixelCacheOffset, painter->device()->devicePixelRatioF());
180
181 //antialiasing for wheel
182 QPainter tmpPainter(&m_pixelCache);
183 tmpPainter.setRenderHint(QPainter::Antialiasing);
184 tmpPainter.setPen(QPen(QColor(0,0,0,0), 2.5));
185 tmpPainter.setCompositionMode(QPainter::CompositionMode_Clear);
186 int size=qMin(width(), height());
187
188 m_renderAreaSize = QSize(size,size);
189 m_renderAreaOffsetX = ((qreal)width()-(qreal)m_renderAreaSize.width())*0.5;
190 m_renderAreaOffsetY = ((qreal)height()-(qreal)m_renderAreaSize.height())*0.5;
191 m_toRenderArea.reset();
193
194 QPoint ellipseCenter(width() / 2 - size / 2, height() / 2 - size / 2);
195 ellipseCenter -= m_pixelCacheOffset;
196
197 tmpPainter.drawEllipse(ellipseCenter.x(), ellipseCenter.y(), size, size);
198 }
199
200 painter->drawImage(m_pixelCacheOffset.x(),m_pixelCacheOffset.y(), m_pixelCache);
201
202 // draw gamut mask
204 QImage maskBuffer = QImage(m_renderAreaSize*painter->device()->devicePixelRatioF(), QImage::Format_ARGB32_Premultiplied);
205 maskBuffer.setDevicePixelRatio(painter->device()->devicePixelRatioF());
206 maskBuffer.fill(0);
207 QPainter maskPainter(&maskBuffer);
208
209 QRect rect = QRect(0, 0, m_renderAreaSize.width(), m_renderAreaSize.height());
210 maskPainter.setRenderHint(QPainter::Antialiasing, true);
211
212 maskPainter.resetTransform();
213 maskPainter.translate(rect.width()*0.5, rect.height()*0.5);
214 maskPainter.scale(rect.width()*0.5, rect.height()*0.5);
215
216 maskPainter.setPen(QPen(QBrush(Qt::white), 0.002));
217 maskPainter.setBrush(QColor(128,128,128,255)); // middle gray
218
219 maskPainter.drawEllipse(QPointF(0,0), 1.0, 1.0);
220
221 maskPainter.resetTransform();
222 maskPainter.setTransform(m_currentGamutMask->maskToViewTransform(m_renderAreaSize.width()));
223
224 maskPainter.setCompositionMode(QPainter::CompositionMode_DestinationIn);
225 m_currentGamutMask->paint(maskPainter, m_maskPreviewActive);
226
227 maskPainter.setCompositionMode(QPainter::CompositionMode_SourceOver);
228 m_currentGamutMask->paintStroke(maskPainter, m_maskPreviewActive);
229
230 painter->drawImage(m_renderAreaOffsetX, m_renderAreaOffsetY, maskBuffer);
231 }
232
233 // draw blips
234
235 if(m_lastClickPos!=QPoint(-1,-1) && m_parent->displayBlip()) {
236 QPoint pos = (m_lastClickPos*qMin(width(), height())).toPoint();
237 if(width()<height())
238 pos.setY(pos.y()+height()/2-width()/2);
239 else
240 pos.setX(pos.x()+width()/2-height()/2);
241
242 painter->setPen(QColor(0,0,0));
243 painter->drawEllipse(pos, 5, 5);
244 painter->setPen(QColor(255,255,255));
245 painter->drawEllipse(pos, 4, 4);
246 }
247}
static void render(Sampler *sampler, const KisDisplayColorConverter *converter, const QRect &sampleRect, KisPaintDeviceSP &realPixelCache, QImage &pixelCache, QPoint &pixelCacheOffset, qreal devicePixelRatioF)
bool isDirty() const
returns true, if ether the color space, the size or the parameters have changed since the last paint ...
bool displayBlip() const
int size(const Forest< T > &forest)
Definition KisForest.h:1232

References KisColorSelectorBase::converter(), KisColorSelector::displayBlip(), KisColorSelectorComponent::height(), KisColorSelectorComponent::isDirty(), KisColorSelectorComponent::m_currentGamutMask, KisColorSelectorComponent::m_gamutMaskOn, m_lastClickPos, KisColorSelectorComponent::m_maskPreviewActive, KisColorSelectorComponent::m_parent, m_pixelCache, m_pixelCacheOffset, m_renderAreaOffsetX, m_renderAreaOffsetY, m_renderAreaSize, m_toRenderArea, Acs::PixelCacheRenderer::render(), and KisColorSelectorComponent::width().

◆ selectColor()

KoColor KisColorSelectorWheel::selectColor ( int x,
int y )
overrideprotectedvirtual

this method must be overloaded to return the color at position x/y and draw a marker on that position

Implements KisColorSelectorComponent.

Definition at line 31 of file kis_color_selector_wheel.cpp.

32{
33 int xWheel = x-width()/2;
34 int yWheel = y-height()/2;
35
36 qreal radius = sqrt((double)xWheel*xWheel+yWheel*yWheel);
37 radius/=qMin(width(), height());
38 if(radius>0.5)
39 radius=0.5;
40
41 radius*=2.;
42
43 qreal angle = std::atan2((qreal)yWheel, (qreal)xWheel);
44 angle+=M_PI;
45 angle/=2*M_PI;
46
47 switch (m_parameter) {
49 Q_EMIT paramChanged(angle, radius, -1, -1, -1, -1, -1, -1, -1);
50 break;
52 Q_EMIT paramChanged(angle, -1, -1, radius, -1, -1, -1, -1, -1);
53 break;
55 Q_EMIT paramChanged(angle, -1, -1, -1, -1, radius, -1, -1, -1);
56 break;
58 Q_EMIT paramChanged(angle, -1, -1, -1, -1, -1, -1, radius, -1);
59 break;
61 Q_EMIT paramChanged(angle, -1, radius, -1, -1, -1, -1, -1, -1);
62 break;
64 Q_EMIT paramChanged(angle, -1, -1, -1, radius, -1, -1, -1, -1);
65 break;
67 Q_EMIT paramChanged(angle, -1, -1, -1, -1, -1, radius, -1, -1);
68 break;
70 Q_EMIT paramChanged(angle, -1, -1, -1, -1, -1, -1, -1, radius);
71 break;
72 default:
73 Q_ASSERT(false);
74 break;
75 }
76
77 Q_EMIT update();
78
79 angle *= 2. * M_PI;
80 angle -= M_PI;
81 radius*=0.5;
82 m_lastClickPos.setX(cos(angle)*radius+0.5);
83 m_lastClickPos.setY(sin(angle)*radius+0.5);
84
85 return colorAt(x, y, true);
86}
void update()
request for repaint, for instance, if the hue changes.
void paramChanged(qreal hue, qreal hsvSaturation, qreal value, qreal hslSaturation, qreal lightness, qreal hsiSaturation, qreal intensity, qreal hsySaturation, qreal luma)
-1, if unaffected
KoColor colorAt(float x, float y, bool forceValid=false)

References colorAt(), KisColorSelectorComponent::height(), KisColorSelectorConfiguration::hsiSH, KisColorSelectorConfiguration::hslSH, KisColorSelectorConfiguration::hsvSH, KisColorSelectorConfiguration::hsySH, KisColorSelectorConfiguration::IH, KisColorSelectorConfiguration::LH, m_lastClickPos, KisColorSelectorComponent::m_parameter, M_PI, KisColorSelectorComponent::paramChanged(), KisColorSelectorComponent::update(), KisColorSelectorConfiguration::VH, KisColorSelectorComponent::width(), and KisColorSelectorConfiguration::YH.

◆ setColor()

void KisColorSelectorWheel::setColor ( const KoColor & color)
overridevirtual

set the color, blibs etc

Reimplemented from KisColorSelectorComponent.

Definition at line 88 of file kis_color_selector_wheel.cpp.

89{
90 qreal hsvH, hsvS, hsvV;
91 qreal hslH, hslS, hslL;
92 qreal hsiH, hsiS, hsiI;
93 qreal hsyH, hsyS, hsyY;
94 KConfigGroup cfg = KSharedConfig::openConfig()->group("advancedColorSelector");
95 R = cfg.readEntry("lumaR", 0.2126);
96 G = cfg.readEntry("lumaG", 0.7152);
97 B = cfg.readEntry("lumaB", 0.0722);
98 Gamma = cfg.readEntry("gamma", 2.2);
99 m_parent->converter()->getHsvF(color, &hsvH, &hsvS, &hsvV);
100 m_parent->converter()->getHslF(color, &hslH, &hslS, &hslL);
101 m_parent->converter()->getHsiF(color, &hsiH, &hsiS, &hsiI);
102 m_parent->converter()->getHsyF(color, &hsyH, &hsyS, &hsyY, R, G, B, Gamma);
103
104 qreal angle = 0.0, radius = 0.0;
105 switch (m_parameter) {
107 Q_EMIT paramChanged(hslH, -1, -1, -1, hslL, -1, -1, -1, -1);
108 angle = hslH;
109 radius = hslL;
110 break;
112 Q_EMIT paramChanged(hsvH, -1, hsvV, -1, -1, -1, -1, -1, -1);
113 angle = hsvH;
114 radius = hsvV;
115 break;
117 Q_EMIT paramChanged(hslH, -1, -1, -1, -1, -1, hsiI, -1, -1);
118 angle = hsiH;
119 radius = hsiI;
120 break;
122 Q_EMIT paramChanged(hsyH, -1, -1, -1, -1, -1, -1, -1, hsyY);
123 angle = hsyH;
124 radius = hsyY;
125 break;
127 Q_EMIT paramChanged(hsvH, hsvS, -1, -1, -1, -1, -1, -1, -1);
128 angle = hsvH;
129 radius = hsvS;
130 break;
132 Q_EMIT paramChanged(hslH, -1, -1, hslS, -1, -1, -1, -1, -1);
133 angle = hslH;
134 radius = hslS;
135 break;
137 Q_EMIT paramChanged(hsiH, -1, -1, -1, -1, hsiS, -1, -1, -1);
138 angle = hsiH;
139 radius = hsiS;
140 break;
142 Q_EMIT paramChanged(hsyH, -1, -1, -1, -1, -1, -1, hsyS, -1);
143 angle = hsyH;
144 radius = hsyS;
145 break;
146 default:
147 Q_ASSERT(false);
148 break;
149 }
150 angle *= 2. * M_PI;
151 angle -= M_PI;
152 radius *= 0.5;
153
154 m_lastClickPos.setX(cos(angle)*radius+0.5);
155 m_lastClickPos.setY(sin(angle)*radius+0.5);
156
157 //workaround for bug 279500
158
159 if(m_lastClickPos!=QPoint(-1,-1) && m_parent->displayBlip()) {
160 QPoint pos = (m_lastClickPos*qMin(width(), height())).toPoint();
161 if(width() < height()) {
162 pos.setY(pos.y()+height()/2-width()/2);
163 } else {
164 pos.setX(pos.x()+width()/2-height()/2);
165 }
166
167 setLastMousePosition(pos.x(), pos.y());
168 }
169
171}
virtual void setColor(const KoColor &color)
set the color, blibs etc
void getHslF(const KoColor &srcColor, qreal *h, qreal *s, qreal *l, qreal *a=0)
void getHsiF(const KoColor &srcColor, qreal *h, qreal *s, qreal *i)
void getHsyF(const KoColor &srcColor, qreal *h, qreal *s, qreal *y, qreal R=0.2126, qreal G=0.7152, qreal B=0.0722, qreal gamma=2.2)
void getHsvF(const KoColor &srcColor, qreal *h, qreal *s, qreal *v, qreal *a=0)

References B, KisColorSelectorBase::converter(), KisColorSelector::displayBlip(), G, KisDisplayColorConverter::getHsiF(), KisDisplayColorConverter::getHslF(), KisDisplayColorConverter::getHsvF(), KisDisplayColorConverter::getHsyF(), KisColorSelectorComponent::height(), KisColorSelectorConfiguration::hsiSH, KisColorSelectorConfiguration::hslSH, KisColorSelectorConfiguration::hsvSH, KisColorSelectorConfiguration::hsySH, KisColorSelectorConfiguration::IH, KisColorSelectorConfiguration::LH, m_lastClickPos, KisColorSelectorComponent::m_parameter, KisColorSelectorComponent::m_parent, M_PI, KisColorSelectorComponent::paramChanged(), R, KisColorSelectorComponent::setColor(), KisColorSelectorComponent::setLastMousePosition(), KisColorSelectorConfiguration::VH, KisColorSelectorComponent::width(), and KisColorSelectorConfiguration::YH.

Friends And Related Symbol Documentation

◆ Acs::PixelCacheRenderer

friend class Acs::PixelCacheRenderer
friend

Definition at line 35 of file kis_color_selector_wheel.h.

Member Data Documentation

◆ B

qreal KisColorSelectorWheel::B {0.0}
private

Definition at line 45 of file kis_color_selector_wheel.h.

45{0.0};

◆ G

qreal KisColorSelectorWheel::G {0.0}
private

Definition at line 44 of file kis_color_selector_wheel.h.

44{0.0};

◆ Gamma

qreal KisColorSelectorWheel::Gamma {0.0}
private

Definition at line 46 of file kis_color_selector_wheel.h.

46{0.0};

◆ m_lastClickPos

QPointF KisColorSelectorWheel::m_lastClickPos
private

Definition at line 40 of file kis_color_selector_wheel.h.

◆ m_pixelCache

QImage KisColorSelectorWheel::m_pixelCache
private

Definition at line 41 of file kis_color_selector_wheel.h.

◆ m_pixelCacheOffset

QPoint KisColorSelectorWheel::m_pixelCacheOffset
private

Definition at line 42 of file kis_color_selector_wheel.h.

◆ m_renderAreaOffsetX

qreal KisColorSelectorWheel::m_renderAreaOffsetX {0.0}
private

Definition at line 49 of file kis_color_selector_wheel.h.

49{0.0};

◆ m_renderAreaOffsetY

qreal KisColorSelectorWheel::m_renderAreaOffsetY {0.0}
private

Definition at line 50 of file kis_color_selector_wheel.h.

50{0.0};

◆ m_renderAreaSize

QSize KisColorSelectorWheel::m_renderAreaSize
private

Definition at line 48 of file kis_color_selector_wheel.h.

◆ m_toRenderArea

QTransform KisColorSelectorWheel::m_toRenderArea
private

Definition at line 51 of file kis_color_selector_wheel.h.

◆ R

qreal KisColorSelectorWheel::R {0.0}
private

Definition at line 43 of file kis_color_selector_wheel.h.

43{0.0};

The documentation for this class was generated from the following files: