27 displayRenderer(_displayRenderer),
40 int sizeColorSelector {0};
41 qreal centerColorSelector {0.0};
42 qreal wheelWidthProportion {0.0};
43 qreal wheelWidth {0.0};
44 qreal wheelNormExt {0.0};
45 qreal wheelNormInt {0.0};
46 qreal wheelInnerRadius {0.0};
47 qreal triangleRadius {0.0};
48 qreal triangleLength {0.0};
49 qreal triangleHeight {0.0};
50 qreal triangleBottom {0.0};
51 qreal triangleTop {0.0};
54 bool updateAllowed {
true};
56 qreal triangleHandleSize {0.0};
57 bool invalidTriangle {
true};
65void KoTriangleColorSelector::Private::init()
67 q->setMinimumHeight( 100 );
68 q->setMinimumWidth( 100 );
69 q->setMouseTracking(
true );
70 q->updateTriangleCircleParameters();
71 updateTimer.setInterval(1);
72 updateTimer.setSingleShot(
true);
73 q->connect(&updateTimer, SIGNAL(timeout()), q, SLOT(update()));
85 d(new
Private(this, displayRenderer))
98 d->sizeColorSelector = qMin(width(), height());
99 d->centerColorSelector = 0.5 *
d->sizeColorSelector;
100 d->wheelWidthProportion = 0.25;
101 d->wheelWidth =
d->centerColorSelector *
d->wheelWidthProportion;
102 d->wheelNormExt = qAbs(
d->centerColorSelector );
103 d->wheelNormInt = qAbs(
d->centerColorSelector * (1.0 -
d->wheelWidthProportion));
104 d->wheelInnerRadius =
d->centerColorSelector * (1.0 -
d->wheelWidthProportion);
105 d->triangleRadius =
d->wheelInnerRadius * 0.9;
106 d->triangleLength = 3.0 / sqrt(3.0) *
d->triangleRadius;
107 d->triangleHeight =
d->triangleLength * sqrt(3.0) * 0.5;
108 d->triangleTop = 0.5 *
d->sizeColorSelector -
d->triangleRadius;
109 d->triangleBottom =
d->triangleHeight +
d->triangleTop;
110 d->triangleHandleSize = 10.0;
116 if(
d->invalidTriangle )
122 p.setRenderHint(QPainter::SmoothPixmapTransform);
123 p.setRenderHint(QPainter::Antialiasing);
124 QPointF pos(
d->centerColorSelector,
d->centerColorSelector);
125 p.translate(QPointF( 0.5*width(), 0.5*height() ) );
127 p.drawPixmap( -pos,
d->wheelPixmap );
131 p.rotate(
hue() + 150 );
134 p.drawPixmap( -pos ,
d->trianglePixmap );
140 qreal vs_selector_ypos_ =
value() / 255.0;
141 qreal ls_ = (vs_selector_ypos_) *
d->triangleLength;
142 qreal vs_selector_xpos_ = ls_ * (
saturation() / 255.0 - 0.5);
145 p.setPen( QPen( Qt::white, 1.0) );
149 p.setBrush(currentColor);
150 p.rotate(
hue() + 150 );
151 p.drawEllipse( QRectF( -
d->triangleHandleSize*0.5 + vs_selector_xpos_,
152 -
d->triangleHandleSize*0.5 - (
d->centerColorSelector -
d->triangleTop) + vs_selector_ypos_ *
d->triangleHeight,
153 d->triangleHandleSize ,
d->triangleHandleSize ));
158 p.setPen( QPen( Qt::white, 1.0) );
159 p.rotate(
hue() - 90 );
160 qreal hueSelectorWidth_ = 0.8;
161 qreal hueSelectorOffset_ = 0.5 *( 1.0 - hueSelectorWidth_) *
d->wheelWidth;
162 qreal hueSelectorSize_ = 0.8 *
d->wheelWidth;
163 p.drawRect( QRectF( -1.5, -
d->centerColorSelector + hueSelectorOffset_, 3.0, hueSelectorSize_ ));
184 h = qBound(0, h, 359);
187 d->invalidTriangle =
true;
188 d->updateTimer.start();
198 v = qBound(0,
v, 255);
201 d->invalidTriangle =
true;
202 d->updateTimer.start();
207 return d->saturation;
212 s = qBound(0, s, 255);
215 d->invalidTriangle =
true;
216 d->updateTimer.start();
221 d->invalidTriangle = (
hue() != h);
238 if(
d->updateAllowed) {
241 int valueRef =
value();
243 d->displayRenderer->getHsv(color, &hueRef, &saturationRef, &valueRef);
244 setHSV(hueRef, saturationRef, valueRef);
246 d->invalidTriangle =
true;
247 d->updateTimer.start();
253 QWidget::resizeEvent( event );
256 d->invalidTriangle =
true;
266 d->updateAllowed =
false;
269 d->updateAllowed =
true;
274 QSize size = QSize(1, 1)*
d->sizeColorSelector*devicePixelRatioF();
275 QImage image(size, QImage::Format_ARGB32);
276 image.setDevicePixelRatio(devicePixelRatioF());
284 for(
int y = 0; y < size.height(); ++y)
287 qreal
v = 255 * ynormalize;
288 qreal ls_ = (ynormalize) *
d->triangleLength*devicePixelRatioF();
289 qreal xStart =
d->centerColorSelector*devicePixelRatioF() - 0.5 * ls_;
290 qreal xEnd = xStart + ls_;
291 qreal xMin = xStart - 1.0;
292 qreal xMax = xEnd + 1.0;
293 uint* data =
reinterpret_cast<uint*
>(image.scanLine(y));
294 for(
int x = 0; x < size.width(); ++x, ++data)
296 if (v < -1.0 || v > 256.0 || x < xMin || x > xMax)
298 *data = qRgba(0,0,0,0);
301 qreal va = 1.0, sa = 1.0;
302 if(
v < 0.0) { va = 1.0 +
v;
v = 0; }
303 else if(
v > 255.0 ) { va = 256.0 -
v;
v = 255; }
307 }
else if (x > xEnd) {
313 else if (ls_ > 0.01) {
314 s = 255 * (x - xStart) / ls_;
316 qreal coeff = va * sa;
318 KoColor color =
d->displayRenderer->fromHsv(hue_, s,
v,
int(coeff * 255.0));
319 QColor qcolor =
d->displayRenderer->toQColor(color);
321 *data = qcolor.rgba();
326 d->trianglePixmap = QPixmap::fromImage(image);
327 d->invalidTriangle =
false;
332 QSize size = QSize(1, 1)*
d->sizeColorSelector*devicePixelRatioF();
333 QImage image(size, QImage::Format_ARGB32);
334 image.setDevicePixelRatio(devicePixelRatioF());
337 qreal center =
d->centerColorSelector*devicePixelRatioF() - 0.5;
338 qreal
wheelNormExt =
d->wheelNormExt*devicePixelRatioF() - 0.5;
339 qreal
wheelNormInt =
d->wheelNormInt*devicePixelRatioF() - 0.5;
342 for(
int y = 0; y < size.height(); y++)
344 qreal yc = y - center;
345 qreal y2 =
pow2( yc );
346 for(
int x = 0; x < size.width(); x++)
348 qreal xc = x - center;
349 qreal norm = sqrt(
pow2( xc ) + y2);
350 if( norm <= wheelNormExt + 1.0 && norm >=
wheelNormInt - 1.0 )
355 qreal angle = atan2(yc, xc);
356 int h = (int)((180 * angle /
M_PI) + 180) % 360;
358 KoColor color =
d->displayRenderer->fromHsv(h, 255, 255,
int(acoef * 255.0));
359 QColor qcolor =
d->displayRenderer->toQColor(color);
361 image.setPixel(x,y, qcolor.rgba());
363 image.setPixel(x,y, qRgba(0,0,0,0));
367 d->wheelPixmap = QPixmap::fromImage(image);
372 if(event->button() == Qt::LeftButton)
377 QWidget::mouseReleaseEvent( event );
383 if(event->button() == Qt::LeftButton)
388 QWidget::mousePressEvent( event );
394 if(event->buttons() & Qt::LeftButton)
398 QWidget::mouseMoveEvent( event);
404 Q_UNUSED( checkInWheel );
406 if (
d->lastX == _x &&
d->lastY == _y)
413 qreal x = _x - 0.5*width();
414 qreal y = _y - 0.5*height();
416 qreal norm = sqrt( x * x + y * y);
420 setHue( (
int)(atan2(y, x) * 180 /
M_PI ) + 180);
421 d->updateTimer.start();
425 qreal rotation = -(
hue() + 150) *
M_PI / 180;
426 qreal cr = cos(rotation);
427 qreal sr = sin(rotation);
428 qreal x1 = x * cr - y * sr;
429 qreal y1 = x * sr + y * cr;
430 y1 +=
d->wheelNormExt;
431 qreal ynormalize = (
d->triangleTop - y1 ) / (
d->triangleTop -
d->triangleBottom );
435 qreal ls_ = (ynormalize) *
d->triangleLength;
436 qreal sat = ( x1 / ls_ + 0.5) ;
439 setHSV(
hue(), sat * 255, ynormalize * 255);
442 d->updateTimer.start();
449 d->invalidTriangle =
true;
float value(const T *src, size_t ch)
PythonPluginManager * instance
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
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)
~KoTriangleColorSelector() override