00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "ko_cmyk_widget.h"
00024
00025 #include <qlayout.h>
00026 #include <qhbox.h>
00027 #include <qlabel.h>
00028 #include <qspinbox.h>
00029 #include <qtooltip.h>
00030 #include <qcolor.h>
00031
00032 #include <kdebug.h>
00033 #include <kglobal.h>
00034 #include <klocale.h>
00035
00036 #include <koFrameButton.h>
00037 #include <koColorSlider.h>
00038 #include <kcolordialog.h>
00039 #include <kdualcolorbutton.h>
00040
00041 KoCMYKWidget::KoCMYKWidget(QWidget *parent, const char *name) : super(parent, name)
00042 {
00043 m_ColorButton = new KDualColorButton(this);
00044 m_ColorButton -> setFixedSize(m_ColorButton->sizeHint());
00045 QGridLayout *mGrid = new QGridLayout(this, 4, 5, 5, 2);
00046
00047
00048 mCSlider = new KoColorSlider(this);
00049 mCSlider->setMaximumHeight(20);
00050 mCSlider->slotSetRange(0, 255);
00051 mCSlider->setFocusPolicy( QWidget::ClickFocus );
00052
00053 mMSlider = new KoColorSlider(this);
00054 mMSlider->setMaximumHeight(20);
00055 mMSlider->slotSetRange(0, 255);
00056 mMSlider->setFocusPolicy( QWidget::ClickFocus );
00057
00058 mYSlider = new KoColorSlider(this);
00059 mYSlider->setMaximumHeight(20);
00060 mYSlider->slotSetRange(0, 255);
00061 mYSlider->setFocusPolicy( QWidget::ClickFocus );
00062
00063 mKSlider = new KoColorSlider(this);
00064 mKSlider->setMaximumHeight(20);
00065 mKSlider->slotSetRange(0, 255);
00066 mKSlider->setFocusPolicy( QWidget::ClickFocus );
00067
00068
00069 mCLabel = new QLabel("C", this);
00070 mCLabel->setFixedWidth(12);
00071 mCLabel->setFixedHeight(20);
00072 mMLabel = new QLabel("M", this);
00073 mMLabel->setFixedWidth(12);
00074 mMLabel->setFixedHeight(20);
00075 mYLabel = new QLabel("Y", this);
00076 mYLabel->setFixedWidth(12);
00077 mYLabel->setFixedHeight(20);
00078 mKLabel = new QLabel("K", this);
00079 mKLabel->setFixedWidth(12);
00080 mKLabel->setFixedHeight(20);
00081
00082
00083 mCIn = new QSpinBox(0, 255, 1, this);
00084 mCIn->setFixedWidth(50);
00085 mCIn->setFixedHeight(20);
00086 mCIn->setFocusPolicy( QWidget::ClickFocus );
00087 QToolTip::add( mCIn, i18n( "Cyan" ) );
00088
00089 mMIn = new QSpinBox(0, 255, 1, this);
00090 mMIn->setFixedWidth(50);
00091 mMIn->setFixedHeight(20);
00092 mMIn->setFocusPolicy( QWidget::ClickFocus );
00093 QToolTip::add( mMIn, i18n( "Magenta" ) );
00094
00095 mYIn = new QSpinBox(0, 255, 1, this);
00096 mYIn->setFixedWidth(50);
00097 mYIn->setFixedHeight(20);
00098 mYIn->setFocusPolicy( QWidget::ClickFocus );
00099 QToolTip::add( mYIn, i18n( "Yellow" ) );
00100
00101 mKIn = new QSpinBox(0, 255, 1, this);
00102 mKIn->setFixedWidth(50);
00103 mKIn->setFixedHeight(20);
00104 mKIn->setFocusPolicy( QWidget::ClickFocus );
00105 QToolTip::add( mKIn, i18n( "Black" ) );
00106
00107 mGrid->addMultiCellWidget(m_ColorButton, 0, 4, 0, 0, Qt::AlignTop);
00108 mGrid->addWidget(mCLabel, 0, 1);
00109 mGrid->addWidget(mMLabel, 1, 1);
00110 mGrid->addWidget(mYLabel, 2, 1);
00111 mGrid->addWidget(mKLabel, 3, 1);
00112 mGrid->addMultiCellWidget(mCSlider, 0, 0, 2, 3);
00113 mGrid->addMultiCellWidget(mMSlider, 1, 1, 2, 3);
00114 mGrid->addMultiCellWidget(mYSlider, 2, 2, 2, 3);
00115 mGrid->addMultiCellWidget(mKSlider, 3, 3, 2, 3);
00116 mGrid->addWidget(mCIn, 0, 4);
00117 mGrid->addWidget(mMIn, 1, 4);
00118 mGrid->addWidget(mYIn, 2, 4);
00119 mGrid->addWidget(mKIn, 3, 4);
00120
00121 connect(m_ColorButton, SIGNAL(fgChanged(const QColor &)), this, SLOT(slotFGColorSelected(const QColor &)));
00122 connect(m_ColorButton, SIGNAL(bgChanged(const QColor &)), this, SLOT(slotBGColorSelected(const QColor &)));
00123
00124
00125 connect(mCSlider, SIGNAL(valueChanged(int)), this, SLOT(slotCChanged(int)));
00126 connect(mMSlider, SIGNAL(valueChanged(int)), this, SLOT(slotMChanged(int)));
00127 connect(mYSlider, SIGNAL(valueChanged(int)), this, SLOT(slotYChanged(int)));
00128 connect(mKSlider, SIGNAL(valueChanged(int)), this, SLOT(slotKChanged(int)));
00129
00130
00131 connect(mCIn, SIGNAL(valueChanged(int)), this, SLOT(slotCChanged(int)));
00132 connect(mMIn, SIGNAL(valueChanged(int)), this, SLOT(slotMChanged(int)));
00133 connect(mYIn, SIGNAL(valueChanged(int)), this, SLOT(slotYChanged(int)));
00134 connect(mKIn, SIGNAL(valueChanged(int)), this, SLOT(slotKChanged(int)));
00135 }
00136
00137 void KoCMYKWidget::slotCChanged(int c)
00138 {
00139 if (m_ColorButton->current() == KDualColorButton::Foreground){
00140 CMYKColor col = RgbToCmyk(m_fgColor);
00141 col.C = c / 255.0;
00142 m_fgColor = CmykToRgb(col);
00143 m_ColorButton->setCurrent(KDualColorButton::Foreground);
00144 emit sigFgColorChanged(m_fgColor);
00145 }
00146 else{
00147 CMYKColor col = RgbToCmyk(m_bgColor);
00148 col.C = c / 255.0;
00149 m_bgColor = CmykToRgb(col);
00150 m_ColorButton->setCurrent(KDualColorButton::Background);
00151 emit sigBgColorChanged(m_bgColor);
00152 }
00153 }
00154
00155 void KoCMYKWidget::slotMChanged(int m)
00156 {
00157 if (m_ColorButton->current() == KDualColorButton::Foreground){
00158 CMYKColor col = RgbToCmyk(m_fgColor);
00159 col.M = m / 255.0;
00160 m_fgColor = CmykToRgb(col);
00161 m_ColorButton->setCurrent(KDualColorButton::Foreground);
00162 emit sigFgColorChanged(m_fgColor);
00163 }
00164 else{
00165 CMYKColor col = RgbToCmyk(m_bgColor);
00166 col.M = m / 255.0;
00167 m_bgColor = CmykToRgb(col);
00168 m_ColorButton->setCurrent(KDualColorButton::Background);
00169 emit sigBgColorChanged(m_bgColor);
00170 }
00171 }
00172
00173 void KoCMYKWidget::slotYChanged(int y)
00174 {
00175 if (m_ColorButton->current() == KDualColorButton::Foreground){
00176 CMYKColor col = RgbToCmyk(m_fgColor);
00177 col.Y = y / 255.0;
00178 m_fgColor = CmykToRgb(col);
00179 m_ColorButton->setCurrent(KDualColorButton::Foreground);
00180 emit sigFgColorChanged(m_fgColor);
00181 }
00182 else{
00183 CMYKColor col = RgbToCmyk(m_bgColor);
00184 col.Y = y / 255.0;
00185 m_bgColor = CmykToRgb(col);
00186 m_ColorButton->setCurrent(KDualColorButton::Background);
00187 emit sigBgColorChanged(m_bgColor);
00188 }
00189 }
00190
00191 void KoCMYKWidget::slotKChanged(int k)
00192 {
00193 if (m_ColorButton->current() == KDualColorButton::Foreground){
00194 CMYKColor col = RgbToCmyk(m_fgColor);
00195 col.K = k / 255.0;
00196 m_fgColor = CmykToRgb(col);
00197 m_ColorButton->setCurrent(KDualColorButton::Foreground);
00198 emit sigFgColorChanged(m_fgColor);
00199 }
00200 else{
00201 CMYKColor col = RgbToCmyk(m_bgColor);
00202 col.K = k / 255.0;
00203 m_bgColor = CmykToRgb(col);
00204 m_ColorButton->setCurrent(KDualColorButton::Background);
00205 emit sigBgColorChanged(m_bgColor);
00206 }
00207 }
00208
00209 void KoCMYKWidget::setFgColor(const QColor & c)
00210 {
00211 update(c, m_bgColor);
00212 }
00213
00214 void KoCMYKWidget::setBgColor(const QColor & c)
00215 {
00216 update(m_fgColor, c);
00217 }
00218
00219 void KoCMYKWidget::update(const QColor fgColor, const QColor bgColor)
00220 {
00221 m_fgColor = fgColor;
00222 m_bgColor = bgColor;
00223
00224 QColor color = (m_ColorButton->current() == KDualColorButton::Foreground)? m_fgColor : m_bgColor;
00225
00226 CMYKColor col = RgbToCmyk(color);
00227
00228 disconnect(m_ColorButton, SIGNAL(fgChanged(const QColor &)), this, SLOT(slotFGColorSelected(const QColor &)));
00229 disconnect(m_ColorButton, SIGNAL(bgChanged(const QColor &)), this, SLOT(slotBGColorSelected(const QColor &)));
00230
00231 m_ColorButton->setForeground( m_fgColor );
00232 m_ColorButton->setBackground( m_bgColor );
00233
00234 connect(m_ColorButton, SIGNAL(fgChanged(const QColor &)), this, SLOT(slotFGColorSelected(const QColor &)));
00235 connect(m_ColorButton, SIGNAL(bgChanged(const QColor &)), this, SLOT(slotBGColorSelected(const QColor &)));
00236
00237 mCSlider->blockSignals(true);
00238 mCIn->blockSignals(true);
00239 mMSlider->blockSignals(true);
00240 mMIn->blockSignals(true);
00241 mYSlider->blockSignals(true);
00242 mYIn->blockSignals(true);
00243 mKSlider->blockSignals(true);
00244 mKIn->blockSignals(true);
00245
00246 CMYKColor minC = col;
00247 minC.C = 0.0;
00248 CMYKColor maxC = col;
00249 maxC.C = 1.0;
00250
00251 mCSlider->slotSetColor1(CmykToRgb(minC));
00252 mCSlider->slotSetColor2(CmykToRgb(maxC));
00253 mCSlider->slotSetValue(int(col.C * 255));
00254 mCIn->setValue(int(col.C * 255));
00255
00256 CMYKColor minM = col;
00257 minM.M = 0.0;
00258 CMYKColor maxM = col;
00259 maxM.M = 1.0;
00260
00261 mMSlider->slotSetColor1(CmykToRgb(minM));
00262 mMSlider->slotSetColor2(CmykToRgb(maxM));
00263 mMSlider->slotSetValue(int(col.M * 255));
00264 mMIn->setValue(int(col.M * 255));
00265
00266 CMYKColor minY = col;
00267 minY.Y = 0.0;
00268 CMYKColor maxY = col;
00269 maxY.Y = 1.0;
00270
00271 mYSlider->slotSetColor1(CmykToRgb(minY));
00272 mYSlider->slotSetColor2(CmykToRgb(maxY));
00273 mYSlider->slotSetValue(int(col.Y * 255));
00274 mYIn->setValue(int(col.Y * 255));
00275
00276 CMYKColor minK = col;
00277 minK.K = 0.0;
00278 CMYKColor maxK = col;
00279 maxK.K = 1.0;
00280
00281 mKSlider->slotSetColor1(CmykToRgb(minK));
00282 mKSlider->slotSetColor2(CmykToRgb(maxK));
00283 mKSlider->slotSetValue(int(col.K * 255));
00284 mKIn->setValue(int(col.K * 255));
00285
00286 mCSlider->blockSignals(false);
00287 mCIn->blockSignals(false);
00288 mMSlider->blockSignals(false);
00289 mMIn->blockSignals(false);
00290 mYSlider->blockSignals(false);
00291 mYIn->blockSignals(false);
00292 mKSlider->blockSignals(false);
00293 mKIn->blockSignals(false);
00294 }
00295
00296 void KoCMYKWidget::slotFGColorSelected(const QColor& c)
00297 {
00298 m_fgColor = QColor(c);
00299 emit sigFgColorChanged(m_fgColor);
00300 }
00301
00302 void KoCMYKWidget::slotBGColorSelected(const QColor& c)
00303 {
00304 m_bgColor = QColor(c);
00305 emit sigBgColorChanged(m_bgColor);
00306 }
00307
00308 CMYKColor KoCMYKWidget::RgbToCmyk(const QColor& col)
00309 {
00310 kdDebug() << "--[ KoCMYKWidget::RgbToCmyk ]--------------------------------------" << endl;
00311 kdDebug() << endl;
00312
00313
00314 float r = col.red() / 255.0;
00315 float g = col.green() / 255.0;
00316 float b = col.blue() / 255.0;
00317
00318 kdDebug() << "float r = col.red() / 255.0;" << endl;
00319 kdDebug() << " r = " << col.red() << " / 255.0 = " << r << endl;
00320 kdDebug() << "float g = col.green() / 255.0;" << endl;
00321 kdDebug() << " g = " << col.green() << " / 255.0 = " << g << endl;
00322 kdDebug() << "float b = col.blue() / 255.0;" << endl;
00323 kdDebug() << " b = " << col.blue() << " / 255.0 = " << b << endl;
00324 kdDebug() << endl;
00325
00326 float ac = 1.0 - r;
00327 float am = 1.0 - g;
00328 float ay = 1.0 - b;
00329
00330 kdDebug() << "float ac = 1.0 - r;" << endl;
00331 kdDebug() << " ac = 1.0 - " << r << " = " << ac << endl;
00332 kdDebug() << "float am = 1.0 - g;" << endl;
00333 kdDebug() << " am = 1.0 - " << g << " = " << am << endl;
00334 kdDebug() << "float ay = 1.0 - b;" << endl;
00335 kdDebug() << " ay = 1.0 - " << b << " = " << ay << endl;
00336 kdDebug() << endl;
00337
00338
00339 float c = 0.0;
00340 float m = 0.0;
00341 float y = 0.0;
00342 float k = 0.0;
00343
00344 if ((r == 0.0) && (g == 0.0) && (b == 0.0))
00345 {
00346 kdDebug() << "r = g = b = 0.0: Therefor k = 1.0" << endl;
00347 k = 1.0;
00348 }
00349 else
00350 {
00351 kdDebug() << "r = g = b != 0.0: Therefor k = min(ac,am,ay)" << endl;
00352
00353 if (kMin(ac,am) == ac)
00354 k = kMin(ac,ay);
00355 else
00356 k = kMin(am,ay);
00357
00358 c = (ac - k) / (1.0 - k);
00359 m = (am - k) / (1.0 - k);
00360 y = (ay - k) / (1.0 - k);
00361 }
00362
00363 kdDebug() << "float k = " << k << endl;
00364 kdDebug() << endl;
00365
00366 kdDebug() << "float c = (ac - k) / (1.0 - k);" << endl;
00367 kdDebug() << " c = (" << ac << " - " << k << ") / (1.0 - " << k << ") = " << c << endl;
00368 kdDebug() << "float m = (am - k) / (1.0 - k);" << endl;
00369 kdDebug() << " m = (" << am << " - " << k << ") / (1.0 - " << k << ") = " << m << endl;
00370 kdDebug() << "float y = (ay - k) / (1.0 - k);" << endl;
00371 kdDebug() << " y = (" << ay << " - " << k << ") / (1.0 - " << k << ") = " << y << endl;
00372 kdDebug() << endl;
00373
00374 CMYKColor color;
00375 color.C = c;
00376 color.M = m;
00377 color.Y = y;
00378 color.K = k;
00379
00380 kdDebug() << "===================================================================" << endl;
00381
00382 return color;
00383 }
00384
00385 QColor KoCMYKWidget::CmykToRgb(const CMYKColor& c)
00386 {
00387
00388 float ac = kMin(1.0, c.C * (1.0 - c.K) + c.K);
00389 float am = kMin(1.0, c.M * (1.0 - c.K) + c.K);
00390 float ay = kMin(1.0, c.Y * (1.0 - c.K) + c.K);
00391
00392
00393 int r = int((1.0 - ac) * 255.0);
00394 int g = int((1.0 - am) * 255.0);
00395 int b = int((1.0 - ay) * 255.0);
00396
00397 QColor color;
00398 color.setRgb(r,g,b);
00399
00400 return color;
00401 }
00402
00403 #include "ko_cmyk_widget.moc"