lib

ko_cmyk_widget.cpp
1/*
2 * This file is part of KOffice
3 *
4 * Copyright (c) 1999 Matthias Elter (me@kde.org)
5 * Copyright (c) 2001-2002 Igor Jansen (rm@kde.org)
6 * Copyright (c) 2005 Tim Beaulen (tbscope@gmail.com)
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
21*/
22
23#include "ko_cmyk_widget.h"
24
25#include <tqlayout.h>
26#include <tqhbox.h>
27#include <tqlabel.h>
28#include <tqspinbox.h>
29#include <tqtooltip.h>
30#include <tqcolor.h>
31
32#include <kdebug.h>
33#include <tdeglobal.h>
34#include <tdelocale.h>
35
36#include <koFrameButton.h>
37#include <koColorSlider.h>
38#include <kcolordialog.h>
39#include <kdualcolorbutton.h>
40
41KoCMYKWidget::KoCMYKWidget(TQWidget *parent, const char *name) : super(parent, name)
42{
43 m_ColorButton = new KDualColorButton(this);
44 m_ColorButton -> setFixedSize(m_ColorButton->sizeHint());
45 TQGridLayout *mGrid = new TQGridLayout(this, 4, 5, 5, 2);
46
47 /* setup color sliders */
48 mCSlider = new KoColorSlider(this);
49 mCSlider->setMaximumHeight(20);
50 mCSlider->slotSetRange(0, 255);
51 mCSlider->setFocusPolicy( TQWidget::ClickFocus );
52
53 mMSlider = new KoColorSlider(this);
54 mMSlider->setMaximumHeight(20);
55 mMSlider->slotSetRange(0, 255);
56 mMSlider->setFocusPolicy( TQWidget::ClickFocus );
57
58 mYSlider = new KoColorSlider(this);
59 mYSlider->setMaximumHeight(20);
60 mYSlider->slotSetRange(0, 255);
61 mYSlider->setFocusPolicy( TQWidget::ClickFocus );
62
63 mKSlider = new KoColorSlider(this);
64 mKSlider->setMaximumHeight(20);
65 mKSlider->slotSetRange(0, 255);
66 mKSlider->setFocusPolicy( TQWidget::ClickFocus );
67
68 /* setup slider labels */
69 mCLabel = new TQLabel("C", this);
70 mCLabel->setFixedWidth(12);
71 mCLabel->setFixedHeight(20);
72 mMLabel = new TQLabel("M", this);
73 mMLabel->setFixedWidth(12);
74 mMLabel->setFixedHeight(20);
75 mYLabel = new TQLabel("Y", this);
76 mYLabel->setFixedWidth(12);
77 mYLabel->setFixedHeight(20);
78 mKLabel = new TQLabel("K", this);
79 mKLabel->setFixedWidth(12);
80 mKLabel->setFixedHeight(20);
81
82 /* setup spin box */
83 mCIn = new TQSpinBox(0, 255, 1, this);
84 mCIn->setFixedWidth(50);
85 mCIn->setFixedHeight(20);
86 mCIn->setFocusPolicy( TQWidget::ClickFocus );
87 TQToolTip::add( mCIn, i18n( "Cyan" ) );
88
89 mMIn = new TQSpinBox(0, 255, 1, this);
90 mMIn->setFixedWidth(50);
91 mMIn->setFixedHeight(20);
92 mMIn->setFocusPolicy( TQWidget::ClickFocus );
93 TQToolTip::add( mMIn, i18n( "Magenta" ) );
94
95 mYIn = new TQSpinBox(0, 255, 1, this);
96 mYIn->setFixedWidth(50);
97 mYIn->setFixedHeight(20);
98 mYIn->setFocusPolicy( TQWidget::ClickFocus );
99 TQToolTip::add( mYIn, i18n( "Yellow" ) );
100
101 mKIn = new TQSpinBox(0, 255, 1, this);
102 mKIn->setFixedWidth(50);
103 mKIn->setFixedHeight(20);
104 mKIn->setFocusPolicy( TQWidget::ClickFocus );
105 TQToolTip::add( mKIn, i18n( "Black" ) );
106
107 mGrid->addMultiCellWidget(m_ColorButton, 0, 4, 0, 0, TQt::AlignTop);
108 mGrid->addWidget(mCLabel, 0, 1);
109 mGrid->addWidget(mMLabel, 1, 1);
110 mGrid->addWidget(mYLabel, 2, 1);
111 mGrid->addWidget(mKLabel, 3, 1);
112 mGrid->addMultiCellWidget(mCSlider, 0, 0, 2, 3);
113 mGrid->addMultiCellWidget(mMSlider, 1, 1, 2, 3);
114 mGrid->addMultiCellWidget(mYSlider, 2, 2, 2, 3);
115 mGrid->addMultiCellWidget(mKSlider, 3, 3, 2, 3);
116 mGrid->addWidget(mCIn, 0, 4);
117 mGrid->addWidget(mMIn, 1, 4);
118 mGrid->addWidget(mYIn, 2, 4);
119 mGrid->addWidget(mKIn, 3, 4);
120
121 connect(m_ColorButton, TQ_SIGNAL(fgChanged(const TQColor &)), this, TQ_SLOT(slotFGColorSelected(const TQColor &)));
122 connect(m_ColorButton, TQ_SIGNAL(bgChanged(const TQColor &)), this, TQ_SLOT(slotBGColorSelected(const TQColor &)));
123
124 /* connect color sliders */
125 connect(mCSlider, TQ_SIGNAL(valueChanged(int)), this, TQ_SLOT(slotCChanged(int)));
126 connect(mMSlider, TQ_SIGNAL(valueChanged(int)), this, TQ_SLOT(slotMChanged(int)));
127 connect(mYSlider, TQ_SIGNAL(valueChanged(int)), this, TQ_SLOT(slotYChanged(int)));
128 connect(mKSlider, TQ_SIGNAL(valueChanged(int)), this, TQ_SLOT(slotKChanged(int)));
129
130 /* connect spin box */
131 connect(mCIn, TQ_SIGNAL(valueChanged(int)), this, TQ_SLOT(slotCChanged(int)));
132 connect(mMIn, TQ_SIGNAL(valueChanged(int)), this, TQ_SLOT(slotMChanged(int)));
133 connect(mYIn, TQ_SIGNAL(valueChanged(int)), this, TQ_SLOT(slotYChanged(int)));
134 connect(mKIn, TQ_SIGNAL(valueChanged(int)), this, TQ_SLOT(slotKChanged(int)));
135}
136
137void KoCMYKWidget::slotCChanged(int c)
138{
139 if (m_ColorButton->current() == KDualColorButton::Foreground){
140 CMYKColor col = RgbToCmyk(m_fgColor);
141 col.C = c / 255.0;
142 m_fgColor = CmykToRgb(col);
143 m_ColorButton->setCurrent(KDualColorButton::Foreground);
144 emit sigFgColorChanged(m_fgColor);
145 }
146 else{
147 CMYKColor col = RgbToCmyk(m_bgColor);
148 col.C = c / 255.0;
149 m_bgColor = CmykToRgb(col);
150 m_ColorButton->setCurrent(KDualColorButton::Background);
151 emit sigBgColorChanged(m_bgColor);
152 }
153}
154
155void KoCMYKWidget::slotMChanged(int m)
156{
157 if (m_ColorButton->current() == KDualColorButton::Foreground){
158 CMYKColor col = RgbToCmyk(m_fgColor);
159 col.M = m / 255.0;
160 m_fgColor = CmykToRgb(col);
161 m_ColorButton->setCurrent(KDualColorButton::Foreground);
162 emit sigFgColorChanged(m_fgColor);
163 }
164 else{
165 CMYKColor col = RgbToCmyk(m_bgColor);
166 col.M = m / 255.0;
167 m_bgColor = CmykToRgb(col);
168 m_ColorButton->setCurrent(KDualColorButton::Background);
169 emit sigBgColorChanged(m_bgColor);
170 }
171}
172
173void KoCMYKWidget::slotYChanged(int y)
174{
175 if (m_ColorButton->current() == KDualColorButton::Foreground){
176 CMYKColor col = RgbToCmyk(m_fgColor);
177 col.Y = y / 255.0;
178 m_fgColor = CmykToRgb(col);
179 m_ColorButton->setCurrent(KDualColorButton::Foreground);
180 emit sigFgColorChanged(m_fgColor);
181 }
182 else{
183 CMYKColor col = RgbToCmyk(m_bgColor);
184 col.Y = y / 255.0;
185 m_bgColor = CmykToRgb(col);
186 m_ColorButton->setCurrent(KDualColorButton::Background);
187 emit sigBgColorChanged(m_bgColor);
188 }
189}
190
191void KoCMYKWidget::slotKChanged(int k)
192{
193 if (m_ColorButton->current() == KDualColorButton::Foreground){
194 CMYKColor col = RgbToCmyk(m_fgColor);
195 col.K = k / 255.0;
196 m_fgColor = CmykToRgb(col);
197 m_ColorButton->setCurrent(KDualColorButton::Foreground);
198 emit sigFgColorChanged(m_fgColor);
199 }
200 else{
201 CMYKColor col = RgbToCmyk(m_bgColor);
202 col.K = k / 255.0;
203 m_bgColor = CmykToRgb(col);
204 m_ColorButton->setCurrent(KDualColorButton::Background);
205 emit sigBgColorChanged(m_bgColor);
206 }
207}
208
209void KoCMYKWidget::setFgColor(const TQColor & c)
210{
211 update(c, m_bgColor);
212}
213
214void KoCMYKWidget::setBgColor(const TQColor & c)
215{
216 update(m_fgColor, c);
217}
218
219void KoCMYKWidget::update(const TQColor fgColor, const TQColor bgColor)
220{
221 m_fgColor = fgColor;
222 m_bgColor = bgColor;
223
224 TQColor color = (m_ColorButton->current() == KDualColorButton::Foreground)? m_fgColor : m_bgColor;
225
226 CMYKColor col = RgbToCmyk(color);
227
228 disconnect(m_ColorButton, TQ_SIGNAL(fgChanged(const TQColor &)), this, TQ_SLOT(slotFGColorSelected(const TQColor &)));
229 disconnect(m_ColorButton, TQ_SIGNAL(bgChanged(const TQColor &)), this, TQ_SLOT(slotBGColorSelected(const TQColor &)));
230
231 m_ColorButton->setForeground( m_fgColor );
232 m_ColorButton->setBackground( m_bgColor );
233
234 connect(m_ColorButton, TQ_SIGNAL(fgChanged(const TQColor &)), this, TQ_SLOT(slotFGColorSelected(const TQColor &)));
235 connect(m_ColorButton, TQ_SIGNAL(bgChanged(const TQColor &)), this, TQ_SLOT(slotBGColorSelected(const TQColor &)));
236
237 mCSlider->blockSignals(true);
238 mCIn->blockSignals(true);
239 mMSlider->blockSignals(true);
240 mMIn->blockSignals(true);
241 mYSlider->blockSignals(true);
242 mYIn->blockSignals(true);
243 mKSlider->blockSignals(true);
244 mKIn->blockSignals(true);
245
246 CMYKColor minC = col;
247 minC.C = 0.0;
248 CMYKColor maxC = col;
249 maxC.C = 1.0;
250
251 mCSlider->slotSetColor1(CmykToRgb(minC));
252 mCSlider->slotSetColor2(CmykToRgb(maxC));
253 mCSlider->slotSetValue(int(col.C * 255));
254 mCIn->setValue(int(col.C * 255));
255
256 CMYKColor minM = col;
257 minM.M = 0.0;
258 CMYKColor maxM = col;
259 maxM.M = 1.0;
260
261 mMSlider->slotSetColor1(CmykToRgb(minM));
262 mMSlider->slotSetColor2(CmykToRgb(maxM));
263 mMSlider->slotSetValue(int(col.M * 255));
264 mMIn->setValue(int(col.M * 255));
265
266 CMYKColor minY = col;
267 minY.Y = 0.0;
268 CMYKColor maxY = col;
269 maxY.Y = 1.0;
270
271 mYSlider->slotSetColor1(CmykToRgb(minY));
272 mYSlider->slotSetColor2(CmykToRgb(maxY));
273 mYSlider->slotSetValue(int(col.Y * 255));
274 mYIn->setValue(int(col.Y * 255));
275
276 CMYKColor minK = col;
277 minK.K = 0.0;
278 CMYKColor maxK = col;
279 maxK.K = 1.0;
280
281 mKSlider->slotSetColor1(CmykToRgb(minK));
282 mKSlider->slotSetColor2(CmykToRgb(maxK));
283 mKSlider->slotSetValue(int(col.K * 255));
284 mKIn->setValue(int(col.K * 255));
285
286 mCSlider->blockSignals(false);
287 mCIn->blockSignals(false);
288 mMSlider->blockSignals(false);
289 mMIn->blockSignals(false);
290 mYSlider->blockSignals(false);
291 mYIn->blockSignals(false);
292 mKSlider->blockSignals(false);
293 mKIn->blockSignals(false);
294}
295
296void KoCMYKWidget::slotFGColorSelected(const TQColor& c)
297{
298 m_fgColor = TQColor(c);
299 emit sigFgColorChanged(m_fgColor);
300}
301
302void KoCMYKWidget::slotBGColorSelected(const TQColor& c)
303{
304 m_bgColor = TQColor(c);
305 emit sigBgColorChanged(m_bgColor);
306}
307
308CMYKColor KoCMYKWidget::RgbToCmyk(const TQColor& col)
309{
310 kdDebug() << "--[ KoCMYKWidget::RgbToCmyk ]--------------------------------------" << endl;
311 kdDebug() << endl;
312
313 // RGB to CMY
314 float r = col.red() / 255.0;
315 float g = col.green() / 255.0;
316 float b = col.blue() / 255.0;
317
318 kdDebug() << "float r = col.red() / 255.0;" << endl;
319 kdDebug() << " r = " << col.red() << " / 255.0 = " << r << endl;
320 kdDebug() << "float g = col.green() / 255.0;" << endl;
321 kdDebug() << " g = " << col.green() << " / 255.0 = " << g << endl;
322 kdDebug() << "float b = col.blue() / 255.0;" << endl;
323 kdDebug() << " b = " << col.blue() << " / 255.0 = " << b << endl;
324 kdDebug() << endl;
325
326 float ac = 1.0 - r;
327 float am = 1.0 - g;
328 float ay = 1.0 - b;
329
330 kdDebug() << "float ac = 1.0 - r;" << endl;
331 kdDebug() << " ac = 1.0 - " << r << " = " << ac << endl;
332 kdDebug() << "float am = 1.0 - g;" << endl;
333 kdDebug() << " am = 1.0 - " << g << " = " << am << endl;
334 kdDebug() << "float ay = 1.0 - b;" << endl;
335 kdDebug() << " ay = 1.0 - " << b << " = " << ay << endl;
336 kdDebug() << endl;
337
338 // CMY to CMYK
339 float c = 0.0;
340 float m = 0.0;
341 float y = 0.0;
342 float k = 0.0;
343
344 if ((r == 0.0) && (g == 0.0) && (b == 0.0))
345 {
346 kdDebug() << "r = g = b = 0.0: Therefor k = 1.0" << endl;
347 k = 1.0;
348 }
349 else
350 {
351 kdDebug() << "r = g = b != 0.0: Therefor k = min(ac,am,ay)" << endl;
352
353 if (kMin(ac,am) == ac)
354 k = kMin(ac,ay);
355 else
356 k = kMin(am,ay);
357
358 c = (ac - k) / (1.0 - k);
359 m = (am - k) / (1.0 - k);
360 y = (ay - k) / (1.0 - k);
361 }
362
363 kdDebug() << "float k = " << k << endl;
364 kdDebug() << endl;
365
366 kdDebug() << "float c = (ac - k) / (1.0 - k);" << endl;
367 kdDebug() << " c = (" << ac << " - " << k << ") / (1.0 - " << k << ") = " << c << endl;
368 kdDebug() << "float m = (am - k) / (1.0 - k);" << endl;
369 kdDebug() << " m = (" << am << " - " << k << ") / (1.0 - " << k << ") = " << m << endl;
370 kdDebug() << "float y = (ay - k) / (1.0 - k);" << endl;
371 kdDebug() << " y = (" << ay << " - " << k << ") / (1.0 - " << k << ") = " << y << endl;
372 kdDebug() << endl;
373
374 CMYKColor color;
375 color.C = c;
376 color.M = m;
377 color.Y = y;
378 color.K = k;
379
380 kdDebug() << "===================================================================" << endl;
381
382 return color;
383}
384
385TQColor KoCMYKWidget::CmykToRgb(const CMYKColor& c)
386{
387 // CMYK to CMY
388 float ac = kMin(1.0, c.C * (1.0 - c.K) + c.K);
389 float am = kMin(1.0, c.M * (1.0 - c.K) + c.K);
390 float ay = kMin(1.0, c.Y * (1.0 - c.K) + c.K);
391
392 // CMY to RGB
393 int r = int((1.0 - ac) * 255.0);
394 int g = int((1.0 - am) * 255.0);
395 int b = int((1.0 - ay) * 255.0);
396
397 TQColor color;
398 color.setRgb(r,g,b);
399
400 return color;
401}
402
403#include "ko_cmyk_widget.moc"
const char * name(StdAction id)