2
* Copyright (c) 2010 Adam Celarek <kdedev at xibo dot at>
4
* This program is free software; you can redistribute it and/or modify
5
* it under the terms of the GNU General Public License as published by
6
* the Free Software Foundation; either version 2 of the License, or
7
* (at your option) any later version.
9
* This program is distributed in the hope that it will be useful,
10
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
* GNU General Public License for more details.
14
* You should have received a copy of the GNU General Public License
15
* along with this program; if not, write to the Free Software
18
#include "kis_color_selector_simple.h"
27
KisColorSelectorSimple::KisColorSelectorSimple(KisColorSelector *parent) :
28
KisColorSelectorComponent(parent),
33
void KisColorSelectorSimple::setColor(const QColor &c)
35
switch (m_parameter) {
36
case KisColorSelector::SL:
37
m_lastClickPos.setX(c.hslSaturationF());
38
m_lastClickPos.setY(1.-c.lightnessF());
39
emit paramChanged(-1, -1, -1, c.hslSaturationF(), c.lightnessF());
41
case KisColorSelector::LH:
42
m_lastClickPos.setX(qBound(0., c.hueF(), 1.));
43
m_lastClickPos.setY(1.-c.lightnessF());
44
emit paramChanged(c.hueF(), -1, -1, -1, c.lightnessF());
46
case KisColorSelector::SV:
47
m_lastClickPos.setX(c.saturationF());
48
m_lastClickPos.setY(1-c.valueF());
49
emit paramChanged(-1, c.saturationF(), c.valueF(), -1, -1);
51
case KisColorSelector::VH:
52
m_lastClickPos.setX(qBound(0., c.hueF(), 1.));
53
m_lastClickPos.setY(c.valueF());
54
emit paramChanged(c.hueF(), -1, c.valueF(), -1, -1);
56
case KisColorSelector::hsvSH:
57
m_lastClickPos.setX(qBound(0., c.hueF(), 1.));
58
m_lastClickPos.setY(1-c.saturationF());
59
emit paramChanged(c.hueF(), c.saturationF(), -1, -1, -1);
61
case KisColorSelector::hslSH:
62
m_lastClickPos.setX(qBound(0., c.hueF(), 1.));
63
m_lastClickPos.setY(1-c.hslSaturationF());
64
emit paramChanged(c.hueF(), -1, -1, c.hslSaturationF(), -1);
66
case KisColorSelector::L:
67
m_lastClickPos.setX(1-c.lightnessF());
68
emit paramChanged(-1, -1, -1, -1, c.lightnessF());
70
case KisColorSelector::V:
71
m_lastClickPos.setX(c.valueF());
72
emit paramChanged(-1, -1, c.valueF(), -1, -1);
74
case KisColorSelector::hsvS:
75
m_lastClickPos.setX(c.saturationF());
76
emit paramChanged(-1, c.saturationF(), -1, -1, -1);
78
case KisColorSelector::hslS:
79
m_lastClickPos.setX(c.hslSaturationF());
80
emit paramChanged(-1, -1, -1, c.hslSaturationF(), -1);
82
case KisColorSelector::H:
83
m_lastClickPos.setX(1-qBound(0., c.hueF(), 1.));
84
emit paramChanged(c.hueF(), -1, -1, -1, -1);
93
QColor KisColorSelectorSimple::selectColor(int x, int y)
95
m_kocolor.convertTo(colorSpace());
97
m_lastClickPos.setX(x/qreal(width()));
98
m_lastClickPos.setY(y/qreal(height()));
100
qreal xRel = x/qreal(width());
101
qreal yRel = 1.-y/qreal(height());
104
relPos = 1.-y/qreal(height());
106
relPos = 1.-x/qreal(width());
108
switch (m_parameter) {
109
case KisColorSelector::H:
110
emit paramChanged(relPos, -1, -1, -1, -1);
112
case KisColorSelector::hsvS:
113
emit paramChanged(-1, relPos, -1, -1, -1);
115
case KisColorSelector::hslS:
116
emit paramChanged(-1, -1, -1, relPos, -1);
118
case KisColorSelector::V:
119
emit paramChanged(-1, -1, relPos, -1, -1);
121
case KisColorSelector::L:
122
emit paramChanged(-1, -1, -1, -1, relPos);
124
case KisColorSelector::SL:
125
emit paramChanged(-1, -1, -1, xRel, yRel);
127
case KisColorSelector::SV:
128
emit paramChanged(-1, xRel, yRel, -1, -1);
130
case KisColorSelector::hsvSH:
131
emit paramChanged(xRel, yRel, -1, -1, -1);
133
case KisColorSelector::hslSH:
134
emit paramChanged(xRel, -1, -1, yRel, -1);
136
case KisColorSelector::VH:
137
emit paramChanged(xRel, -1, yRel, -1, -1);
139
case KisColorSelector::LH:
140
emit paramChanged(xRel, -1, -1, -1, yRel);
146
// kDebug()<<"selectColor(x/y) y rel="<<yRel<<" value="<<QColor::fromRgb(colorAt(x, y)).valueF();
147
return colorAt(x, y);
150
void KisColorSelectorSimple::paint(QPainter* painter)
153
m_kocolor.convertTo(colorSpace());
155
m_pixelCache=QImage(width(), height(), QImage::Format_ARGB32_Premultiplied);
157
for(int x=0; x<width(); x++) {
158
for(int y=0; y<height(); y++) {
159
m_kocolor.fromQColor(colorAt(x, y));
160
m_kocolor.toQColor(&m_qcolor);
161
m_pixelCache.setPixel(x, y, m_qcolor.rgb());
166
painter->drawImage(0,0, m_pixelCache);
169
if(m_lastClickPos!=QPointF(-1,-1) && m_parent->displayBlip()) {
170
switch (m_parameter) {
171
case KisColorSelector::H:
172
case KisColorSelector::hsvS:
173
case KisColorSelector::hslS:
174
case KisColorSelector::V:
175
case KisColorSelector::L:
176
if(width()>height()) {
177
painter->setPen(QColor(0,0,0));
178
painter->drawLine(m_lastClickPos.x()*width()-1, 0, m_lastClickPos.x()*width()-1, height());
179
painter->setPen(QColor(255,255,255));
180
painter->drawLine(m_lastClickPos.x()*width()+1, 0, m_lastClickPos.x()*width()+1, height());
183
painter->setPen(QColor(0,0,0));
184
painter->drawLine(0, m_lastClickPos.x()*height()-1, width(), m_lastClickPos.x()*height()-1);
185
painter->setPen(QColor(255,255,255));
186
painter->drawLine(0, m_lastClickPos.x()*height()+1, width(), m_lastClickPos.x()*height()+1);
189
case KisColorSelector::SL:
190
case KisColorSelector::SV:
191
case KisColorSelector::hslSH:
192
case KisColorSelector::hsvSH:
193
case KisColorSelector::VH:
194
case KisColorSelector::LH:
195
painter->setPen(QColor(0,0,0));
196
painter->drawEllipse(m_lastClickPos.x()*width()-5, m_lastClickPos.y()*height()-5, 10, 10);
197
painter->setPen(QColor(255,255,255));
198
painter->drawEllipse(m_lastClickPos.x()*width()-4, m_lastClickPos.y()*height()-4, 8, 8);
205
const QColor& KisColorSelectorSimple::colorAt(int x, int y)
208
if (x > width()) x = width();
210
if (y > width()) y = height();
212
qreal xRel = x/qreal(width());
213
qreal yRel = 1.-y/qreal(height());
216
relPos = 1.-y/qreal(height());
218
relPos = 1.-x/qreal(width());
220
switch(m_parameter) {
221
case KisColorSelector::SL:
222
m_qcolor.setHslF(m_hue, xRel, yRel);
224
case KisColorSelector::SV:
225
m_qcolor.setHsvF(m_hue, xRel, yRel);
227
case KisColorSelector::hsvSH:
228
m_qcolor.setHsvF(xRel, yRel, m_value);
230
case KisColorSelector::hslSH:
231
m_qcolor.setHslF(xRel, yRel, m_lightness);
233
case KisColorSelector::VH:
234
m_qcolor.setHsvF(xRel, m_hsvSaturation, yRel);
236
case KisColorSelector::LH:
237
m_qcolor.setHslF(xRel, m_hslSaturation, yRel);
239
case KisColorSelector::H:
240
m_qcolor.setHsvF(relPos, 1, 1);
242
case KisColorSelector::hsvS:
243
m_qcolor.setHsvF(m_hue, relPos, m_value);
245
case KisColorSelector::hslS:
246
m_qcolor.setHslF(m_hue, relPos, m_lightness);
248
case KisColorSelector::V:
249
m_qcolor.setHsvF(m_hue, m_hsvSaturation, relPos);
251
case KisColorSelector::L:
252
m_qcolor.setHslF(m_hue, m_hslSaturation, relPos);