lib

ko_cmyk_widget.cc

00001 /*
00002  * This file is part of KOffice
00003  *
00004  * Copyright (c) 1999 Matthias Elter (me@kde.org)
00005  * Copyright (c) 2001-2002 Igor Jansen (rm@kde.org)
00006  * Copyright (c) 2005 Tim Beaulen (tbscope@gmail.com)
00007  *
00008  *  This program is free software; you can redistribute it and/or modify
00009  *  it under the terms of the GNU General Public License as published by
00010  *  the Free Software Foundation; either version 2 of the License, or
00011  *  (at your option) any later version.
00012  *
00013  *  This program is distributed in the hope that it will be useful,
00014  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00015  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00016  *  GNU General Public License for more details.
00017  *
00018  *  You should have received a copy of the GNU General Public License
00019  *  along with this program; if not, write to the Free Software
00020  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
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     /* setup color sliders */
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     /* setup slider labels */
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     /* setup spin box */
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     /* connect color sliders */
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     /* connect spin box */
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     // RGB to CMY
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     // CMY to CMYK
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     // CMYK to CMY
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     // CMY to RGB
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"
KDE Home | KDE Accessibility Home | Description of Access Keys