~ubuntu-branches/ubuntu/maverick/scribus-ng/maverick-backports

« back to all changes in this revision

Viewing changes to scribus/sccolorengine.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Oleksandr Moskalenko
  • Date: 2009-02-09 09:25:18 UTC
  • mfrom: (5.1.4 sid)
  • Revision ID: james.westby@ubuntu.com-20090209092518-iqsxmh3pjspgrdyd
Tags: 1.3.5.dfsg~svn20090208-2
debian/control: Use "type-handling -n arm,armel,armeb any" to generate the
list of architectures to build on.

Show diffs side-by-side

added added

removed removed

Lines of Context:
55
55
 
56
56
void ScColorEngine::getRGBValues(const ScColor& color, const ScribusDoc* doc, RGBColor& rgb)
57
57
{
58
 
        bool cmsUse = doc ? doc->HasCMS : false;
59
 
        colorModel model = color.getColorModel();
60
 
        if (ScCore->haveCMS() && cmsUse)
 
58
        colorModel    model = color.getColorModel();
 
59
        cmsHTRANSFORM transRGB = doc ? doc->stdTransRGB : ScCore->defaultCMYKToRGBTrans;
 
60
        if (ScCore->haveCMS() && transRGB)
61
61
        {
62
62
                if (model == colorModelRGB)
63
63
                {
73
73
                        inC[1] = color.MG * 257;
74
74
                        inC[2] = color.YB * 257;
75
75
                        inC[3] = color.K * 257;
76
 
                        cmsDoTransform(doc->stdTransRGB, inC, outC, 1);
 
76
                        cmsDoTransform(transRGB, inC, outC, 1);
77
77
                        rgb.r = outC[0] / 257;
78
78
                        rgb.g = outC[1] / 257;
79
79
                        rgb.b = outC[2] / 257;
81
81
        }
82
82
        else if (model == colorModelCMYK)
83
83
        {
84
 
                rgb.r = 255 - QMIN(255, color.CR + color.K);
85
 
                rgb.g = 255 - QMIN(255, color.MG + color.K);
86
 
                rgb.b = 255 - QMIN(255, color.YB + color.K);
 
84
                rgb.r = 255 - qMin(255, color.CR + color.K);
 
85
                rgb.g = 255 - qMin(255, color.MG + color.K);
 
86
                rgb.b = 255 - qMin(255, color.YB + color.K);
87
87
        }
88
88
        else
89
89
        {
97
97
{
98
98
        WORD inC[4];
99
99
        WORD outC[4];
100
 
        bool cmsUse = doc ? doc->HasCMS : false;
101
100
        colorModel model = color.getColorModel();
102
 
        if (ScCore->haveCMS() && cmsUse)
 
101
        cmsHTRANSFORM transCMYK = doc ? doc->stdTransCMYK : ScCore->defaultRGBToCMYKTrans;
 
102
        if (ScCore->haveCMS() && transCMYK)
103
103
        {
104
104
                if (model == colorModelRGB)
105
105
                {
114
114
                                inC[0] = color.CR * 257;
115
115
                                inC[1] = color.MG * 257;
116
116
                                inC[2] = color.YB * 257;
117
 
                                cmsDoTransform(doc->stdTransCMYK, inC, outC, 1);
 
117
                                cmsDoTransform(transCMYK, inC, outC, 1);
118
118
                                cmyk.c = outC[0] / 257;
119
119
                                cmyk.m = outC[1] / 257;
120
120
                                cmyk.y = outC[2] / 257;
131
131
        }
132
132
        else if (model == colorModelRGB)
133
133
        {
134
 
                cmyk.k = QMIN(QMIN(255 - color.CR, 255 - color.MG), 255 - color.YB);
 
134
                cmyk.k = qMin(qMin(255 - color.CR, 255 - color.MG), 255 - color.YB);
135
135
                cmyk.c = 255 - color.CR - cmyk.k;
136
136
                cmyk.m = 255 - color.MG - cmyk.k;
137
137
                cmyk.y = 255 - color.YB - cmyk.k;
146
146
}
147
147
 
148
148
void ScColorEngine::getShadeColorCMYK(const ScColor& color, const ScribusDoc* doc, 
149
 
                                                                                  CMYKColor& cmyk, int level)
 
149
                                                                                  CMYKColor& cmyk, double level)
150
150
{
151
151
        if (color.getColorModel() == colorModelRGB)
152
152
        {
157
157
        }
158
158
        else
159
159
        {
160
 
                cmyk.c = color.CR * level / 100;
161
 
                cmyk.m = color.MG * level / 100;
162
 
                cmyk.y = color.YB * level / 100;
163
 
                cmyk.k = color.K * level / 100;
 
160
                cmyk.c = qRound(color.CR * level / 100.0);
 
161
                cmyk.m = qRound(color.MG * level / 100.0);
 
162
                cmyk.y = qRound(color.YB * level / 100.0);
 
163
                cmyk.k = qRound(color.K * level / 100.0);
164
164
        }
165
165
}
166
166
 
167
 
void ScColorEngine::getShadeColorRGB(const ScColor& color, const ScribusDoc* doc, RGBColor& rgb, int level)
 
167
void ScColorEngine::getShadeColorRGB(const ScColor& color, const ScribusDoc* doc, RGBColor& rgb, double level)
168
168
{
169
169
        if (color.getColorModel() == colorModelCMYK)
170
170
        {
177
177
        {
178
178
                int h, s, v, snew, vnew;
179
179
                QColor tmpR(color.CR, color.MG, color.YB);
180
 
                tmpR.hsv(&h, &s, &v);
181
 
                snew = s * level / 100;
182
 
                vnew = 255 - ((255 - v) * level / 100);
 
180
                tmpR.getHsv(&h, &s, &v);
 
181
                snew = qRound(s * level / 100.0);
 
182
                vnew = 255 - qRound(((255 - v) * level / 100.0));
183
183
                tmpR.setHsv(h, snew, vnew);
184
184
                tmpR.getRgb(&rgb.r, &rgb.g, &rgb.b);
185
185
                //We could also compute rgb shade using rgb directly
212
212
        return tmp;
213
213
}
214
214
 
215
 
QColor ScColorEngine::getDisplayColor(const ScColor& color, const ScribusDoc* doc, int level)
 
215
QColor ScColorEngine::getDisplayColor(const ScColor& color, const ScribusDoc* doc, double level)
216
216
{
217
217
        QColor tmp;
218
218
        if (color.getColorModel() == colorModelRGB)
241
241
{
242
242
        QColor tmp;
243
243
        bool doSoftProofing = doc ? doc->SoftProofing : false;
244
 
        bool doGamutCheck = doc ? doc->Gamut : false;
 
244
        bool doGamutCheck   = doc ? doc->Gamut : false;
245
245
        if ( doSoftProofing && doGamutCheck )
246
246
        {
247
247
                bool outOfGamutFlag = isOutOfGamut(color, doc);
280
280
        return tmp;
281
281
}
282
282
 
283
 
QColor ScColorEngine::getShadeColor(const ScColor& color, const ScribusDoc* doc, int level)
 
283
QColor ScColorEngine::getShadeColor(const ScColor& color, const ScribusDoc* doc, double level)
284
284
{
285
285
        RGBColor rgb;
286
286
        rgb.r = color.CR;
290
290
        return QColor(rgb.r, rgb.g, rgb.b);
291
291
}
292
292
 
293
 
QColor ScColorEngine::getShadeColorProof(const ScColor& color, const ScribusDoc* doc, int level)
 
293
QColor ScColorEngine::getShadeColorProof(const ScColor& color, const ScribusDoc* doc, double level)
294
294
{
295
295
        QColor tmp;
296
296
        bool doGC = false;
307
307
                // Match 133x behavior for rgb grey until we are able to make rgb profiled output
308
308
                // (RGB greys map to cmyk greys)
309
309
                if ( rgb.r == rgb.g && rgb.g == rgb.b )
 
310
                {
310
311
                        doGC = false;
311
 
                tmp = getColorProof(rgb, doc, color.isSpotColor(), doGC);
 
312
                        CMYKColor cmyk;
 
313
                        cmyk.c = cmyk.m = cmyk.y = 0;
 
314
                        cmyk.k = 255 - rgb.g;
 
315
                        tmp = getColorProof(cmyk, doc, color.isSpotColor(), doGC);
 
316
                }
 
317
                else
 
318
                        tmp = getColorProof(rgb, doc, color.isSpotColor(), doGC);
312
319
        }
313
320
        else
314
321
        {
329
336
        WORD inC[4];
330
337
        WORD outC[4];
331
338
        int  r = rgb.r, g = rgb.g, b = rgb.b;
332
 
//      bool alert = true;
333
 
        bool cmsUse = doc ? doc->HasCMS : false;
334
 
        if (ScCore->haveCMS() && cmsUse)
 
339
        cmsHTRANSFORM transRGBMon  = doc ? doc->stdTransRGBMon : ScCore->defaultRGBToScreenSolidTrans;
 
340
        cmsHTRANSFORM transProof   = doc ? doc->stdProof   : ScCore->defaultRGBToScreenSolidTrans;
 
341
        cmsHTRANSFORM transProofGC = doc ? doc->stdProofGC : ScCore->defaultRGBToScreenSolidTrans;
 
342
        bool cmsUse   = doc ? doc->HasCMS : false;
 
343
        bool cmsTrans = (transRGBMon && transProof && transProofGC); 
 
344
        if (ScCore->haveCMS() && cmsTrans)
335
345
        {
336
346
                inC[0] = rgb.r * 257;
337
347
                inC[1] = rgb.g * 257;
338
348
                inC[2] = rgb.b * 257;
339
 
                if (!spot && doc->SoftProofing)
 
349
                if (cmsUse && !spot && doc->SoftProofing)
340
350
                {
341
 
                        cmsHTRANSFORM xform = gamutCkeck ? doc->stdProofGC : doc->stdProof;
 
351
                        cmsHTRANSFORM xform = gamutCkeck ? transProofGC : transProof;
342
352
                        cmsDoTransform(xform, inC, outC, 1);
343
353
                        r = outC[0] / 257;
344
354
                        g = outC[1] / 257;
346
356
                }
347
357
                else
348
358
                {
349
 
                        cmsDoTransform(doc->stdTransRGBMon, inC, outC, 1);
 
359
                        cmsDoTransform(transRGBMon, inC, outC, 1);
350
360
                        r = outC[0] / 257;
351
361
                        g = outC[1] / 257;
352
362
                        b = outC[2] / 257;
360
370
        int  r = 0, g = 0, b = 0;
361
371
        WORD inC[4];
362
372
        WORD outC[4];
363
 
//      bool alert = true;
364
 
        bool cmsUse = doc ? doc->HasCMS : false;
365
 
        if (ScCore->haveCMS() && cmsUse)
 
373
        cmsHTRANSFORM transCMYKMon     = doc ? doc->stdTransCMYKMon : ScCore->defaultCMYKToRGBTrans;
 
374
        cmsHTRANSFORM transProofCMYK   = doc ? doc->stdProofCMYK   : ScCore->defaultCMYKToRGBTrans;
 
375
        cmsHTRANSFORM transProofCMYKGC = doc ? doc->stdProofCMYKGC : ScCore->defaultCMYKToRGBTrans;
 
376
        bool cmsUse   = doc ? doc->HasCMS : false;
 
377
        bool cmsTrans = (transCMYKMon && transProofCMYK && transProofCMYKGC); 
 
378
        if (ScCore->haveCMS() && cmsTrans)
366
379
        {
367
380
                inC[0] = cmyk.c * 257;
368
381
                inC[1] = cmyk.m * 257;
369
382
                inC[2] = cmyk.y * 257;
370
383
                inC[3] = cmyk.k * 257;
371
 
                if (!spot && doc->SoftProofing)
 
384
                if (cmsUse && !spot && doc->SoftProofing)
372
385
                {
373
 
                        cmsHTRANSFORM xform = gamutCkeck ? doc->stdProofCMYKGC : doc->stdProofCMYK;
 
386
                        cmsHTRANSFORM xform = gamutCkeck ? transProofCMYKGC : transProofCMYK;
374
387
                        cmsDoTransform(xform, inC, outC, 1);
375
388
                        r = outC[0] / 257;
376
389
                        g = outC[1] / 257;
378
391
                }
379
392
                else
380
393
                {
381
 
                        cmsDoTransform(doc->stdTransCMYKMon, inC, outC, 1);
 
394
                        cmsDoTransform(transCMYKMon, inC, outC, 1);
382
395
                        r = outC[0] / 257;
383
396
                        g = outC[1] / 257;
384
397
                        b = outC[2] / 257;
386
399
        }
387
400
        else
388
401
        {
389
 
                r = 255 - QMIN(255, cmyk.c + cmyk.k);
390
 
                g = 255 - QMIN(255, cmyk.m + cmyk.k);
391
 
                b = 255 - QMIN(255, cmyk.y + cmyk.k);
 
402
                r = 255 - qMin(255, cmyk.c + cmyk.k);
 
403
                g = 255 - qMin(255, cmyk.m + cmyk.k);
 
404
                b = 255 - qMin(255, cmyk.y + cmyk.k);
392
405
        }
393
406
        return QColor(r, g, b);
394
407
}
400
413
        int r = rgb.r;
401
414
        int g = rgb.g;
402
415
        int b = rgb.b; 
403
 
//      bool alert = true;
404
 
        bool cmsUse = doc ? doc->HasCMS : false;
405
 
        if (ScCore->haveCMS() && cmsUse)
 
416
        cmsHTRANSFORM transRGBMon = doc ? doc->stdTransRGBMon : ScCore->defaultRGBToScreenSolidTrans;
 
417
        if (ScCore->haveCMS() && transRGBMon)
406
418
        {
407
419
                inC[0] = r * 257;
408
420
                inC[1] = g * 257;
409
421
                inC[2] = b * 257;
410
 
                cmsDoTransform(doc->stdTransRGBMon, inC, outC, 1);
 
422
                cmsDoTransform(transRGBMon, inC, outC, 1);
411
423
                r = outC[0] / 257;
412
424
                g = outC[1] / 257;
413
425
                b = outC[2] / 257;
420
432
        int  r = 0, g = 0, b = 0;
421
433
        WORD inC[4];
422
434
        WORD outC[4];
423
 
//      bool alert = true;
424
 
        bool cmsUse = doc ? doc->HasCMS : false;
425
 
        if (ScCore->haveCMS() && cmsUse)
 
435
        cmsHTRANSFORM transCMYKMon = doc ? doc->stdTransCMYKMon : ScCore->defaultCMYKToRGBTrans;
 
436
        if (ScCore->haveCMS() && transCMYKMon)
426
437
        {
427
438
                inC[0] = cmyk.c * 257;
428
439
                inC[1] = cmyk.m * 257;
429
440
                inC[2] = cmyk.y * 257;
430
441
                inC[3] = cmyk.k * 257;
431
 
                cmsDoTransform(doc->stdTransCMYKMon, inC, outC, 1);
 
442
                cmsDoTransform(transCMYKMon, inC, outC, 1);
432
443
                r = outC[0] / 257;
433
444
                g = outC[1] / 257;
434
445
                b = outC[2] / 257;
435
446
        }
436
447
        else
437
448
        {
438
 
                r = 255 - QMIN(255, cmyk.c + cmyk.k);
439
 
                g = 255 - QMIN(255, cmyk.m + cmyk.k);
440
 
                b = 255 - QMIN(255, cmyk.y + cmyk.k);
 
449
                r = 255 - qMin(255, cmyk.c + cmyk.k);
 
450
                g = 255 - qMin(255, cmyk.m + cmyk.k);
 
451
                b = 255 - qMin(255, cmyk.y + cmyk.k);
441
452
        }
442
453
        return QColor(r, g, b);
443
454
}
496
507
        {
497
508
                CMYKColor cmyk;
498
509
                getCMYKValues(color, doc, cmyk);
499
 
                int k = QMIN(QMIN(cmyk.c, cmyk.m), cmyk.y);
 
510
                int k = qMin(qMin(cmyk.c, cmyk.m), cmyk.y);
500
511
                color.CR = cmyk.c - k;
501
512
                color.MG = cmyk.m - k;
502
513
                color.YB = cmyk.y - k;
503
 
                color.K = QMIN((cmyk.k + k), 255);
 
514
                color.K = qMin((cmyk.k + k), 255);
504
515
        }
505
516
}