27 displayRenderer(_displayRenderer),
41 bool followHue {
true};
42 int sizeColorSelector {0};
43 qreal centerColorSelector {0.0};
44 qreal wheelWidthProportion {0.0};
45 qreal wheelWidth {0.0};
46 qreal wheelNormExt {0.0};
47 qreal wheelNormInt {0.0};
48 qreal wheelInnerRadius {0.0};
49 qreal triangleRadius {0.0};
50 qreal triangleLength {0.0};
51 qreal triangleHeight {0.0};
52 qreal triangleBottom {0.0};
53 qreal triangleTop {0.0};
56 bool updateAllowed {
true};
58 qreal triangleHandleSize {0.0};
59 bool invalidTriangle {
true};
67void KoTriangleColorSelector::Private::init()
69 q->setMinimumHeight( 100 );
70 q->setMinimumWidth( 100 );
71 q->setMouseTracking(
true );
72 q->updateTriangleCircleParameters();
73 updateTimer.setInterval(1);
74 updateTimer.setSingleShot(
true);
75 q->connect(&updateTimer, SIGNAL(timeout()), q, SLOT(update()));
87 d(new
Private(this, displayRenderer))
100 d->sizeColorSelector = qMin(width(), height());
101 d->centerColorSelector = 0.5 *
d->sizeColorSelector;
102 d->wheelWidthProportion = 0.25;
103 d->wheelWidth =
d->centerColorSelector *
d->wheelWidthProportion;
104 d->wheelNormExt = qAbs(
d->centerColorSelector );
105 d->wheelNormInt = qAbs(
d->centerColorSelector * (1.0 -
d->wheelWidthProportion));
106 d->wheelInnerRadius =
d->centerColorSelector * (1.0 -
d->wheelWidthProportion);
107 d->triangleRadius =
d->wheelInnerRadius * 0.9;
108 d->triangleLength = 3.0 / sqrt(3.0) *
d->triangleRadius;
109 d->triangleHeight =
d->triangleLength * sqrt(3.0) * 0.5;
110 d->triangleTop = 0.5 *
d->sizeColorSelector -
d->triangleRadius;
111 d->triangleBottom =
d->triangleHeight +
d->triangleTop;
112 d->triangleHandleSize = 10.0;
118 if(
d->invalidTriangle )
124 p.setRenderHint(QPainter::SmoothPixmapTransform);
125 p.setRenderHint(QPainter::Antialiasing);
126 QPointF pos(
d->centerColorSelector,
d->centerColorSelector);
127 p.translate(QPointF( 0.5*width(), 0.5*height() ) );
129 p.drawPixmap( -pos,
d->wheelPixmap );
136 p.drawPixmap( -pos ,
d->trianglePixmap );
142 qreal vs_selector_ypos_ =
value() / 255.0;
143 qreal ls_ = (vs_selector_ypos_) *
d->triangleLength;
144 qreal vs_selector_xpos_ = ls_ * (
saturation() / 255.0 - 0.5);
147 p.setPen( QPen( Qt::white, 1.0) );
151 p.setBrush(currentColor);
153 p.drawEllipse( QRectF( -
d->triangleHandleSize*0.5 + vs_selector_xpos_,
154 -
d->triangleHandleSize*0.5 - (
d->centerColorSelector -
d->triangleTop) + vs_selector_ypos_ *
d->triangleHeight,
155 d->triangleHandleSize ,
d->triangleHandleSize ));
160 p.setPen( QPen( Qt::white, 1.0) );
161 p.rotate(
hue() - 90 );
162 qreal hueSelectorWidth_ = 0.8;
163 qreal hueSelectorOffset_ = 0.5 *( 1.0 - hueSelectorWidth_) *
d->wheelWidth;
164 qreal hueSelectorSize_ = 0.8 *
d->wheelWidth;
165 p.drawRect( QRectF( -1.5, -
d->centerColorSelector + hueSelectorOffset_, 3.0, hueSelectorSize_ ));
172 if (
d->followHue)
return hue() + 150;
184 d->followHue = follow;
185 d->updateTimer.start();
203 h = qBound(0, h, 359);
206 d->invalidTriangle =
true;
207 d->updateTimer.start();
217 v = qBound(0,
v, 255);
220 d->invalidTriangle =
true;
221 d->updateTimer.start();
226 return d->saturation;
231 s = qBound(0, s, 255);
234 d->invalidTriangle =
true;
235 d->updateTimer.start();
240 d->invalidTriangle = (
hue() != h);
257 if(
d->updateAllowed) {
260 int valueRef =
value();
262 d->displayRenderer->getHsv(color, &hueRef, &saturationRef, &valueRef);
263 setHSV(hueRef, saturationRef, valueRef);
265 d->invalidTriangle =
true;
266 d->updateTimer.start();
272 QWidget::resizeEvent( event );
275 d->invalidTriangle =
true;
285 d->updateAllowed =
false;
288 d->updateAllowed =
true;
293 QSize size = QSize(1, 1)*
d->sizeColorSelector*devicePixelRatioF();
294 QImage image(size, QImage::Format_ARGB32);
295 image.setDevicePixelRatio(devicePixelRatioF());
303 for(
int y = 0; y < size.height(); ++y)
306 qreal
v = 255 * ynormalize;
307 qreal ls_ = (ynormalize) *
d->triangleLength*devicePixelRatioF();
308 qreal xStart =
d->centerColorSelector*devicePixelRatioF() - 0.5 * ls_;
309 qreal xEnd = xStart + ls_;
310 qreal xMin = xStart - 1.0;
311 qreal xMax = xEnd + 1.0;
312 uint* data =
reinterpret_cast<uint*
>(image.scanLine(y));
313 for(
int x = 0; x < size.width(); ++x, ++data)
315 if (v < -1.0 || v > 256.0 || x < xMin || x > xMax)
317 *data = qRgba(0,0,0,0);
320 qreal va = 1.0, sa = 1.0;
321 if(
v < 0.0) { va = 1.0 +
v;
v = 0; }
322 else if(
v > 255.0 ) { va = 256.0 -
v;
v = 255; }
326 }
else if (x > xEnd) {
332 else if (ls_ > 0.01) {
333 s = 255 * (x - xStart) / ls_;
335 qreal coeff = va * sa;
337 KoColor color =
d->displayRenderer->fromHsv(hue_, s,
v,
int(coeff * 255.0));
338 QColor qcolor =
d->displayRenderer->toQColor(color);
340 *data = qcolor.rgba();
345 d->trianglePixmap = QPixmap::fromImage(image);
346 d->invalidTriangle =
false;
351 QSize size = QSize(1, 1)*
d->sizeColorSelector*devicePixelRatioF();
352 QImage image(size, QImage::Format_ARGB32);
353 image.setDevicePixelRatio(devicePixelRatioF());
356 qreal center =
d->centerColorSelector*devicePixelRatioF() - 0.5;
357 qreal
wheelNormExt =
d->wheelNormExt*devicePixelRatioF() - 0.5;
358 qreal
wheelNormInt =
d->wheelNormInt*devicePixelRatioF() - 0.5;
361 for(
int y = 0; y < size.height(); y++)
363 qreal yc = y - center;
364 qreal y2 =
pow2( yc );
365 for(
int x = 0; x < size.width(); x++)
367 qreal xc = x - center;
368 qreal norm = sqrt(
pow2( xc ) + y2);
369 if( norm <= wheelNormExt + 1.0 && norm >=
wheelNormInt - 1.0 )
374 qreal angle = atan2(yc, xc);
375 int h = (int)((180 * angle /
M_PI) + 180) % 360;
377 KoColor color =
d->displayRenderer->fromHsv(h, 255, 255,
int(acoef * 255.0));
378 QColor qcolor =
d->displayRenderer->toQColor(color);
380 image.setPixel(x,y, qcolor.rgba());
382 image.setPixel(x,y, qRgba(0,0,0,0));
386 d->wheelPixmap = QPixmap::fromImage(image);
391 if(event->button() == Qt::LeftButton)
396 QWidget::mouseReleaseEvent( event );
402 if(event->button() == Qt::LeftButton)
407 QWidget::mousePressEvent( event );
413 if(event->buttons() & Qt::LeftButton)
417 QWidget::mouseMoveEvent( event);
423 Q_UNUSED( checkInWheel );
425 if (
d->lastX == _x &&
d->lastY == _y)
432 qreal x = _x - 0.5*width();
433 qreal y = _y - 0.5*height();
435 qreal norm = sqrt( x * x + y * y);
439 setHue( (
int)(atan2(y, x) * 180 /
M_PI ) + 180);
440 d->updateTimer.start();
447 qreal x1 = x * cr - y * sr;
448 qreal y1 = x * sr + y * cr;
449 y1 +=
d->wheelNormExt;
450 qreal ynormalize = (
d->triangleTop - y1 ) / (
d->triangleTop -
d->triangleBottom );
454 qreal ls_ = (ynormalize) *
d->triangleLength;
455 qreal sat = ( x1 / ls_ + 0.5) ;
458 setHSV(
hue(), sat * 255, ynormalize * 255);
461 d->updateTimer.start();
468 d->invalidTriangle =
true;
float value(const T *src, size_t ch)
PythonPluginManager * instance
void sigNewColor(const KoColor &c)
void setSaturation(int s)
Private(KoTriangleColorSelector *_q, const KoColorDisplayRendererInterface *_displayRenderer)
void setHSV(int h, int s, int v)
void mousePressEvent(QMouseEvent *event) override
KoColor getCurrentColor() const override
void updateTriangleCircleParameters()
void mouseMoveEvent(QMouseEvent *event) override
void slotSetColor(const KoColor &) override
void colorChanged(const QColor &)
void configurationChanged()
KoTriangleColorSelector(QWidget *parent)
void resizeEvent(QResizeEvent *event) override
void mouseReleaseEvent(QMouseEvent *event) override
void paintEvent(QPaintEvent *event) override
const KoColorDisplayRendererInterface * displayRenderer
void selectColorAt(int x, int y, bool checkInWheel=true)
void setRotation(int angle)
~KoTriangleColorSelector() override
void setFollowHue(bool follow)