Subversion Repositories Scribus

Rev

Rev 10469 | Rev 13818 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
4430 cbradney 1
/*
2
For general Scribus (>=1.3.2) copyright and licensing information please refer
3
to the COPYING file provided with the program. Following this notice may exist
4
a copyright and/or license notice that predates the release of Scribus 1.3.2
5
for which a new license (GPL+exception) is in place.
6
*/
2886 fschmid 7
/***************************************************************************
8
                          sccolor.cpp  -  description
9
                             -------------------
10
    begin                : Sun Sep 9 2001
11
    copyright            : (C) 2001 by Franz Schmid
12
    email                : Franz.Schmid@altmuehlnet.de
13
 ***************************************************************************/
14
 
15
/***************************************************************************
16
 *                                                                         *
17
 *   This program is free software; you can redistribute it and/or modify  *
18
 *   it under the terms of the GNU General Public License as published by  *
19
 *   the Free Software Foundation; either version 2 of the License, or     *
20
 *   (at your option) any later version.                                   *
21
 *                                                                         *
22
 ***************************************************************************/
23
 
7478 jghali 24
#include <assert.h>
2886 fschmid 25
 
10223 cbradney 26
#include "commonstrings.h"
2886 fschmid 27
#include "sccolor.h"
7857 jghali 28
#include "sccolorengine.h"
10223 cbradney 29
#include "scconfig.h"
5880 jghali 30
#include "scribuscore.h"
31
#include "scribusdoc.h"
2886 fschmid 32
 
7478 jghali 33
ScColor::ScColor(void)
2886 fschmid 34
{
7957 avox 35
//      Model = colorModelCMYK;
36
//      CR = MG = YB = K = 0;
37
        Model = colorModelRGB;
38
        CR = 150;
39
        MG = 100;
40
        YB = 50;
41
        K = 0;
2886 fschmid 42
        Spot = false;
3060 fschmid 43
        Regist = false;
2886 fschmid 44
}
45
 
7478 jghali 46
ScColor::ScColor(int c, int m, int y, int k)
2886 fschmid 47
{
48
        Spot = false;
3060 fschmid 49
        Regist = false;
7260 jghali 50
        setColor(c, m, y, k);
2886 fschmid 51
}
52
 
7478 jghali 53
ScColor::ScColor(int r, int g, int b)
2886 fschmid 54
{
55
        Spot = false;
3060 fschmid 56
        Regist = false;
7260 jghali 57
        setColorRGB(r, g, b);
2886 fschmid 58
}
59
 
7478 jghali 60
bool ScColor::operator==(const ScColor& other) const
5880 jghali 61
{
7478 jghali 62
        if (Model != other.Model)
4608 cbradney 63
                return false;
7478 jghali 64
        if (Spot != other.Spot)
4608 cbradney 65
                return false;
7478 jghali 66
        if (Regist != other.Regist)
4608 cbradney 67
                return false;
7478 jghali 68
        if (Model == colorModelRGB)
4608 cbradney 69
        {
7478 jghali 70
                return ((CR == other.CR) && (MG == other.MG) && (YB == other.YB));
4608 cbradney 71
        }
7478 jghali 72
        if (Model == colorModelCMYK)
4608 cbradney 73
        {
7478 jghali 74
                return ((CR == other.CR) && (MG == other.MG) && (YB == other.YB) && (K == other.K));
4608 cbradney 75
        }
76
        return false;
77
}
78
 
2886 fschmid 79
void ScColor::setColor(int c, int m, int y, int k)
80
{
7478 jghali 81
        CR = c;
82
        MG = m;
83
        YB = y;
2886 fschmid 84
        K = k;
85
        Model = colorModelCMYK;
86
}
87
 
88
void ScColor::setColorRGB(int r, int g, int b)
89
{
7478 jghali 90
        CR = r;
91
        MG = g;
92
        YB = b;
2886 fschmid 93
        Model = colorModelRGB;
94
}
95
 
7478 jghali 96
colorModel ScColor::getColorModel () const
2886 fschmid 97
{
98
        return Model;
7478 jghali 99
}
2886 fschmid 100
 
101
void ScColor::fromQColor(QColor color)
102
{
13391 jghali 103
        if (color.spec() == QColor::Cmyk)
104
        {
105
                int c, m, y, k;
106
                color.getCmyk(&c, &m, &y, &k);
107
                setColor(c, m, y, k);
108
        }
109
        else
110
        {
111
                int r, g, b;
112
                color.getRgb(&r, &g, &b);
113
                setColorRGB(r, g, b);
114
        }
2886 fschmid 115
}
116
 
5880 jghali 117
void ScColor::getRawRGBColor(int *r, int *g, int *b) const
2886 fschmid 118
{
7717 jghali 119
        if (Model == colorModelRGB)
120
        {
121
                *r = CR;
122
                *g = MG;
123
                *b = YB;
124
        }
125
        else
126
        {
8562 jghali 127
                *r = 255-qMin(255, CR + K);
128
                *g = 255-qMin(255, MG + K);
129
                *b = 255-qMin(255, YB + K);
7717 jghali 130
        }
2886 fschmid 131
}
132
 
5880 jghali 133
QColor ScColor::getRawRGBColor() const
3046 fschmid 134
{
7717 jghali 135
        if (Model == colorModelRGB)
136
                return QColor(CR, MG, YB);
8562 jghali 137
        return QColor(255-qMin(255, CR + K), 255-qMin(255, MG + K), 255 - qMin(255, YB + K));
3046 fschmid 138
}
139
 
5880 jghali 140
void ScColor::getRGB(int *r, int *g, int *b) const
2886 fschmid 141
{
7478 jghali 142
        if( Model != colorModelRGB )
143
                qDebug("calling getRGB with a cmyk color");
144
        *r = CR;
145
        *g = MG;
146
        *b = YB;
2886 fschmid 147
}
148
 
5880 jghali 149
void ScColor::getCMYK(int *c, int *m, int *y, int *k) const
2886 fschmid 150
{
7478 jghali 151
        if( Model != colorModelCMYK )
152
                qDebug("calling getCMYK with a rgb color");
153
        *c = CR;
154
        *m = MG;
155
        *y = YB;
2886 fschmid 156
        *k = K;
157
}
158
 
159
QString ScColor::name()
160
{
9873 avox 161
        QString tmp, name="#";
2886 fschmid 162
        switch (Model)
163
        {
164
        case colorModelCMYK:
7478 jghali 165
                tmp.setNum(CR, 16);
2886 fschmid 166
                if (tmp.length() < 2)
167
                        tmp.insert(0, "0");
168
                name += tmp;
7478 jghali 169
                tmp.setNum(MG, 16);
2886 fschmid 170
                if (tmp.length() < 2)
171
                        tmp.insert(0, "0");
172
                name += tmp;
7478 jghali 173
                tmp.setNum(YB, 16);
2886 fschmid 174
                if (tmp.length() < 2)
175
                        tmp.insert(0, "0");
176
                name += tmp;
177
                tmp.setNum(K, 16);
178
                if (tmp.length() < 2)
179
                        tmp.insert(0, "0");
180
                name += tmp;
181
                break;
182
        case colorModelRGB:
7478 jghali 183
                tmp.setNum(CR, 16);
2886 fschmid 184
                if (tmp.length() < 2)
185
                        tmp.insert(0, "0");
186
                name += tmp;
7478 jghali 187
                tmp.setNum(MG, 16);
2886 fschmid 188
                if (tmp.length() < 2)
189
                        tmp.insert(0, "0");
190
                name += tmp;
7478 jghali 191
                tmp.setNum(YB, 16);
2886 fschmid 192
                if (tmp.length() < 2)
193
                        tmp.insert(0, "0");
194
                name += tmp;
7478 jghali 195
                break;
9873 avox 196
        default:
197
                name = CommonStrings::None;
2886 fschmid 198
        }
7478 jghali 199
        return name;
2886 fschmid 200
}
201
 
7857 jghali 202
QString ScColor::nameCMYK(const ScribusDoc* doc)
4535 fschmid 203
{
7857 jghali 204
        if ((Model != colorModelCMYK) && (!doc))
205
                qDebug("calling nameCMYK with a rgb color");
206
        CMYKColor cmyk;
207
        int c, m, y, k;
7478 jghali 208
        QString tmp, name = CommonStrings::None;
7857 jghali 209
        ScColorEngine::getCMYKValues(*this, doc, cmyk);
210
        cmyk.getValues(c, m, y, k);
7478 jghali 211
        name="#";
7857 jghali 212
        tmp.setNum(c, 16);
4535 fschmid 213
        if (tmp.length() < 2)
214
                tmp.insert(0, "0");
215
        name += tmp;
7857 jghali 216
        tmp.setNum(m, 16);
4535 fschmid 217
        if (tmp.length() < 2)
218
                tmp.insert(0, "0");
219
        name += tmp;
7857 jghali 220
        tmp.setNum(y, 16);
4535 fschmid 221
        if (tmp.length() < 2)
222
                tmp.insert(0, "0");
223
        name += tmp;
7857 jghali 224
        tmp.setNum(k, 16);
4535 fschmid 225
        if (tmp.length() < 2)
226
                tmp.insert(0, "0");
227
        name += tmp;
228
        return name;
229
}
230
 
7857 jghali 231
QString ScColor::nameRGB(const ScribusDoc* doc)
4535 fschmid 232
{
7857 jghali 233
        if ((Model != colorModelRGB) && (!doc))
234
                qDebug("calling nameRGB with a cmyk color");
235
        int r, g, b;
236
        RGBColor rgb;
7478 jghali 237
        QString tmp, name = CommonStrings::None;
7857 jghali 238
        ScColorEngine::getRGBValues(*this, doc, rgb);
239
        rgb.getValues(r, g, b);
7478 jghali 240
        name="#";
7857 jghali 241
        tmp.setNum(r, 16);
4535 fschmid 242
        if (tmp.length() < 2)
243
                tmp.insert(0, "0");
244
        name += tmp;
7857 jghali 245
        tmp.setNum(g, 16);
4535 fschmid 246
        if (tmp.length() < 2)
247
                tmp.insert(0, "0");
248
        name += tmp;
7857 jghali 249
        tmp.setNum(b, 16);
4535 fschmid 250
        if (tmp.length() < 2)
251
                tmp.insert(0, "0");
252
        name += tmp;
253
        return name;
254
}
255
 
2886 fschmid 256
void ScColor::setNamedColor(QString name)
257
{
258
        bool ok;
259
        if (name.length () == 9)
260
        {
261
                int c = name.mid(1,2).toInt(&ok, 16);
262
                int m = name.mid(3,2).toInt(&ok, 16);
263
                int y = name.mid(5,2).toInt(&ok, 16);
264
                int k = name.mid(7,2).toInt(&ok, 16);
265
                setColor(c, m, y, k);
266
        }
267
        else if (name.length () == 7)
268
        {
269
                int r = name.mid(1,2).toInt(&ok, 16);
270
                int g = name.mid(3,2).toInt(&ok, 16);
271
                int b = name.mid(5,2).toInt(&ok, 16);
272
                setColorRGB(r, g, b);
273
        }
274
}
275
 
7478 jghali 276
bool ScColor::isRegistrationColor() const
3041 fschmid 277
{
3060 fschmid 278
        return Regist;
279
}
280
 
281
void ScColor::setRegistrationColor(bool s)
282
{
283
        Regist = s;
284
}
285
 
7478 jghali 286
bool ScColor::isSpotColor() const
3051 fschmid 287
{
288
        return Spot;
289
}
290
 
291
void ScColor::setSpotColor(bool s)
292
{
293
        Spot = s;
294
}
5880 jghali 295
 
296
ColorList::ColorList(ScribusDoc* doc, bool retainDoc) : QMap<QString,ScColor>()
297
{
298
        m_doc = doc;
299
        m_retainDoc = retainDoc;
300
}
301
 
7478 jghali 302
void ColorList::setDocument(ScribusDoc* doc)
303
{
304
        m_doc = doc;
305
}
306
 
5880 jghali 307
ColorList& ColorList::operator= (const ColorList& list)
308
{
309
        clear();
310
        if (!m_retainDoc)
311
                m_doc = list.m_doc;
312
        addColors(list);
313
        return *this;
314
}
315
 
316
void ColorList::addColors(const ColorList& colorList, bool overwrite)
317
{
318
        ColorList::ConstIterator it;
319
        ColorList::ConstIterator itend;
320
        itend = colorList.end();
7478 jghali 321
        for (it = colorList.begin(); it != itend; ++it)
10469 cbradney 322
        {
323
                if (overwrite || !contains(it.key()))
324
                        insert(it.key(), it.value());
325
        }
5880 jghali 326
}
327
 
328
void ColorList::copyColors(const ColorList& colorList, bool overwrite)
329
{
330
        clear();
331
        addColors(colorList, overwrite);
332
}
333
 
8521 cbradney 334
ScribusDoc* ColorList::document(void)
335
{
336
        return m_doc;
337
}
9296 jghali 338
 
339
void ColorList::ensureBlackAndWhite(void)
340
{
341
        ensureBlack();
342
        ensureWhite();
343
}
344
 
345
void ColorList::ensureBlack(void)
346
{
347
        bool addBlack = true;
348
        ColorList::Iterator itb = find("Black");
349
        if (itb != end())
350
        {
10469 cbradney 351
                ScColor& black = itb.value();
9296 jghali 352
                colorModel model = black.getColorModel();
9305 jghali 353
                if (model == colorModelCMYK)
9296 jghali 354
                {
355
                        int c, m, y, k;
356
                        black.getCMYK(&c, &m, &y, &k);
357
                        if (c == 0 && m == 0 && y == 0 && k == 255)
358
                                addBlack = false;
359
                }
360
        }
361
        if (addBlack)
9322 jghali 362
                insert("Black", ScColor(0, 0, 0, 255));
9296 jghali 363
}
364
 
365
void ColorList::ensureWhite(void)
366
{
367
        bool addWhite = true;
368
        ColorList::Iterator itw = find("White");
369
        if (itw != end())
370
        {
10469 cbradney 371
                ScColor& white = itw.value();
9296 jghali 372
                colorModel model = white.getColorModel();
9305 jghali 373
                if (model == colorModelCMYK)
9296 jghali 374
                {
375
                        int c, m, y, k;
376
                        white.getCMYK(&c, &m, &y, &k);
377
                        if (c == 0 && m == 0 && y == 0 && k == 0)
378
                                addWhite = false;
379
                }
380
        }
381
        if (addWhite)
382
                insert("White", ScColor(0, 0, 0, 0));
383
}