Subversion Repositories Scribus

Rev

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

Rev Author Line No. Line
6125 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
*/
7
/***************************************************************************
8
                          util.cpp  -  description
9
                             -------------------
10
    begin                : Fri Sep 14 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
 
12461 avox 24
#include <QDomDocument>
25
#include <QPainter>
10203 cbradney 26
#include "util_color.h"
6125 cbradney 27
#include "scconfig.h"
28
#include "scribusdoc.h"
29
#include "scpixmapcache.h"
6795 jghali 30
#include "commonstrings.h"
12461 avox 31
#include "sccolorengine.h"
12015 fschmid 32
#include "fileloader.h"
33
#include "plugins/formatidlist.h"
6125 cbradney 34
#include "util.h"
12015 fschmid 35
#include "util_formats.h"
12461 avox 36
#include "util_icon.h"
6125 cbradney 37
 
12461 avox 38
#include CMS_INC
6125 cbradney 39
 
6795 jghali 40
using namespace std;
6125 cbradney 41
 
6795 jghali 42
void handleOldColorShade(ScribusDoc* doc, QString& colName, int& shade)
43
{
44
        int r, g, b;
45
        bool found = false;
8164 avox 46
        if( colName.isEmpty() || colName == CommonStrings::None || !doc->PageColors.contains(colName))
6795 jghali 47
                return;
8164 avox 48
 
49
        const ScColor& scCol1(doc->PageColors[colName]);
50
 
6795 jghali 51
        if( (shade == 100) || (scCol1.getColorModel() != colorModelRGB) )
52
                return;
53
        scCol1.getRGB(&r, &g, &b);
54
        QColor col1 = getOldColorShade(r, g, b, shade), col2;
55
        ColorList::Iterator it, itEnd = doc->PageColors.end();
56
        for( it = doc->PageColors.begin(); it != itEnd; it++)
57
        {
10516 cbradney 58
                if ( it.value().getColorModel() == colorModelRGB )
6795 jghali 59
                {
10516 cbradney 60
                        it.value().getRGB(&r, &g, &b);
7576 jghali 61
                        col2.setRgb(r, g, b);
62
                        if( col1 == col2 )
63
                        {
64
                                found = true;
65
                                break;
66
                        }
6795 jghali 67
                }
68
        }
69
        if(!found)
70
        {
71
                ScColor tmp;
72
                tmp.fromQColor(col1);
73
                colName = QString("%1 %2%").arg(colName).arg(shade);
74
                doc->PageColors.insert(colName, tmp);
75
        }
76
        else
77
                colName = it.key();
78
        shade = 100;
79
}
6125 cbradney 80
 
6795 jghali 81
QColor getOldColorShade(const QColor& color, int shade)
82
{
83
        int r, g, b;
84
        color.getRgb(&r, &g, &b);
85
        return getOldColorShade(r, g, b, shade);
86
}
6125 cbradney 87
 
9920 fschmid 88
QColor getOldColorShade(uchar red, uchar green, uchar blue, int shade)
6795 jghali 89
{
90
        int h, s, v, snew;
9948 jghali 91
        QColor color(red, green, blue);
10592 fschmid 92
        color.getHsv(&h, &s, &v);
6795 jghali 93
        if (red == green && green == blue)
94
        {
95
                snew = 255 - ((255 - v) * shade / 100);
96
                color.setHsv(h, s, snew);
97
        }
98
        else
99
        {
100
                snew = s * shade / 100;
101
                color.setHsv(h, snew, v);
102
        }
103
        return color;
104
}
6125 cbradney 105
 
106
QImage ProofImage(QImage *Image, ScribusDoc* doc)
107
{
108
        QImage out = Image->copy();
109
        bool cmsUse = doc ? doc->HasCMS : false;
110
        bool softProofing = doc ? doc->SoftProofing : false;
111
        if (cmsUse && softProofing)
112
        {
113
                int outheight=out.height();
114
                for (int i=0; i < outheight; ++i)
115
                {
116
                        LPBYTE ptr = out.scanLine(i);
117
                        cmsDoTransform(doc->stdProofImg, ptr, ptr, out.width());
118
                }
119
        }
120
        else
121
        {
122
                if (cmsUse)
123
                {
124
                        int outheight=out.height();
125
                        for (int i=0; i < outheight; ++i)
126
                        {
127
                                LPBYTE ptr = out.scanLine(i);
128
                                cmsDoTransform(doc->stdTransImg, ptr, ptr, out.width());
129
                        }
130
                }
131
        }
132
        return out;
133
}
134
 
135
QColor SetColor(ScribusDoc *currentDoc, QString color, int shad)
136
{
7478 jghali 137
        const ScColor& col = currentDoc->PageColors[color];
138
        return ScColorEngine::getShadeColorProof(col, currentDoc, shad);
6125 cbradney 139
}
140
 
141
 
142
/**
143
 * QPixmaps are really slow with Qt/Mac 3.3.4. Really, *really*, slow.
144
 * So we better cache them.
145
 */
146
QPixmap * getSmallPixmap(QColor rgb)
147
{
148
        static ScPixmapCache<QRgb> pxCache;
149
 
150
        QRgb index=rgb.rgb();
151
        if (pxCache.contains(index))
152
                return pxCache[index];
153
 
154
        QPixmap *pm = new QPixmap(15, 15);
155
        pm->fill(rgb);
156
        QPainter p;
157
        p.begin(pm);
158
        p.setBrush(Qt::NoBrush);
159
        QPen b(Qt::black, 1);
160
        p.setPen(b);
161
        p.drawRect(0, 0, 15, 15);
162
        p.end();
163
        pxCache.insert(index, pm);
164
        return pm;
165
}
166
 
167
QPixmap * getWidePixmap(QColor rgb)
168
{
169
        static ScPixmapCache<QRgb> pxCache;
170
 
171
        QRgb index=rgb.rgb();
172
        if (pxCache.contains(index))
173
                return pxCache[index];
174
 
175
        QPixmap *pm = new QPixmap(30, 15);
176
        pm->fill(rgb);
177
        pxCache.insert(index, pm);
178
        return pm;
179
}
180
 
10592 fschmid 181
static quint64 code64(const ScColor & col) {
6125 cbradney 182
        int C, M, Y, K, R, G, B;
10592 fschmid 183
        quint64 result=0;
6125 cbradney 184
        col.getRGB( &R, &G, &B );
185
        col.getCMYK( &C, &M, &Y, &K );
186
        result |= col.getColorModel() == colorModelRGB ? 1 : 0;
7478 jghali 187
        result |= col.isSpotColor() ? 64 : 0;
188
        result |= col.isRegistrationColor() ? 32 : 0;
6125 cbradney 189
        result <<= 8;
190
        result |= C;
191
        result <<= 8;
192
        result |= M;
193
        result <<= 8;
194
        result |= Y;
195
        result <<= 8;
196
        result |= K;
197
        result <<= 8;
198
        result |= R;
199
        result <<= 8;
200
        result |= G;
201
        result <<= 8;
202
        result |= B;
203
        return result;
204
}
205
 
7478 jghali 206
QPixmap * getFancyPixmap(const ScColor& col, ScribusDoc* doc) {
10592 fschmid 207
        static ScPixmapCache<quint64> pxCache;
6125 cbradney 208
 
209
        static QPixmap alertIcon;
210
        static QPixmap cmykIcon;
211
        static QPixmap rgbIcon;
212
        static QPixmap spotIcon;
213
        static QPixmap regIcon;
214
        static bool iconsInitialized = false;
215
 
216
        if ( !iconsInitialized ) {
217
                alertIcon = loadIcon("alert.png");
218
                cmykIcon = loadIcon("cmyk.png");
219
                rgbIcon = loadIcon("rgb.png");
220
                spotIcon = loadIcon("spot.png");
221
                regIcon = loadIcon("register.png");
222
                iconsInitialized = true;
223
        }
224
 
10592 fschmid 225
        quint64 res=code64(col);
6125 cbradney 226
        if (pxCache.contains(res))
227
                return pxCache[res];
228
 
229
        QPixmap *pa=new QPixmap(60, 15);
230
        QPixmap *pm=getSmallPixmap(col.getRawRGBColor());
231
        pa->fill(Qt::white);
232
        paintAlert(*pm, *pa, 0, 0);
7478 jghali 233
        if (ScColorEngine::isOutOfGamut(col, doc))
6125 cbradney 234
                paintAlert(alertIcon, *pa, 15, 0);
235
        if ((col.getColorModel() == colorModelCMYK) || (col.isSpotColor()))
236
                paintAlert(cmykIcon, *pa, 30, 0);
237
        else
238
                paintAlert(rgbIcon, *pa, 30, 0);
239
        if (col.isSpotColor())
240
                paintAlert(spotIcon, *pa, 46, 2);
241
        if (col.isRegistrationColor())
242
                paintAlert(regIcon, *pa, 45, 0);
243
        pxCache.insert(res, pa);
244
        return pa;
245
}
246
 
247
 
248
void paintAlert(QPixmap &toPaint, QPixmap &target, int x, int y, bool useMask)
249
{
250
        // there is no alpha mask in the beginning
10592 fschmid 251
//      if (useMask)
252
//      {
253
//              if (target.mask().isNull())
254
//                      target.setMask(QBitmap(target.width(), target.height(), useMask));
255
//      }
6125 cbradney 256
        QPainter p;
257
        p.begin(&target);
258
        p.drawPixmap(x, y, toPaint);
259
        if (useMask)
260
        {
8538 subik 261
// Qt4 FIXME: Qt4 can use better alpha setting. see colorlistbox.cpp
262
//              QPainter alpha; // transparency handling
263
//              alpha.begin(target.mask());
264
//              alpha.setBrush(Qt::color1);
265
//              alpha.setPen(Qt::color1);
266
//              alpha.drawRect(x, y, 15, 15);
267
//              if (!toPaint.mask().isNull())
268
//                      alpha.drawPixmap(x, y, toPaint.mask());
269
//              alpha.end();
6125 cbradney 270
        }
271
        p.end();
272
}
273
 
274
unsigned char INT_MULT ( unsigned char a, unsigned char b )
275
{
276
        int c = a * b + 0x80;
277
        return (unsigned char)(( ( c >> 8 ) + c ) >> 8);
278
}
279
 
280
void RGBTOHSV ( uchar& red, uchar& green, uchar& blue )
281
{
282
        int r, g, b;
283
        double h, s, v;
284
        int min, max;
285
        h = 0.;
286
        r = red;
287
        g = green;
288
        b = blue;
289
        if ( r > g )
290
        {
8562 jghali 291
                max = qMax( r, b );
292
                min = qMin( g, b );
6125 cbradney 293
        }
294
        else
295
        {
8562 jghali 296
                max = qMax( g, b );
297
                min = qMin( r, b );
6125 cbradney 298
        }
299
        v = max;
300
        if ( max != 0 )
301
                s = ( ( max - min ) * 255 ) / (double)max;
302
        else
303
                s = 0;
304
        if ( s == 0 )
305
                h = 0;
306
        else
307
        {
308
                int delta = max - min;
309
                if ( r == max )
310
                        h = ( g - b ) / (double)delta;
311
                else if ( g == max )
312
                        h = 2 + ( b - r ) / (double)delta;
313
                else if ( b == max )
314
                        h = 4 + ( r - g ) / (double)delta;
315
                h *= 42.5;
316
                if ( h < 0 )
317
                        h += 255;
318
                if ( h > 255 )
319
                        h -= 255;
320
        }
321
        red   = (uchar)h;
322
        green = (uchar)s;
323
        blue  = (uchar)v;
324
}
325
 
326
void HSVTORGB ( uchar& hue, uchar& saturation, uchar& value )
327
{
328
        if ( saturation == 0 )
329
        {
330
                hue        = value;
331
                saturation = value;
332
                value      = value;
333
        }
334
        else
335
        {
336
                double h = hue * 6. / 255.;
337
                double s = saturation / 255.;
338
                double v = value / 255.;
339
 
340
                double f = h - (int)h;
341
                double p = v * ( 1. - s );
342
                double q = v * ( 1. - ( s * f ) );
343
                double t = v * ( 1. - ( s * ( 1. - f ) ) );
344
                // Worth a note here that gcc 2.96 will generate different results
345
                // depending on optimization mode on i386.
346
                switch ((int)h)
347
                {
348
                case 0:
349
                        hue        = (uchar)( v * 255 );
350
                        saturation = (uchar)( t * 255 );
351
                        value      = (uchar)( p * 255 );
352
                        break;
353
                case 1:
354
                        hue        = (uchar)( q * 255 );
355
                        saturation = (uchar)( v * 255 );
356
                        value      = (uchar)( p * 255 );
357
                        break;
358
                case 2:
359
                        hue        = (uchar)( p * 255 );
360
                        saturation = (uchar)( v * 255 );
361
                        value      = (uchar)( t * 255 );
362
                        break;
363
                case 3:
364
                        hue        = (uchar)( p * 255 );
365
                        saturation = (uchar)( q * 255 );
366
                        value      = (uchar)( v * 255 );
367
                        break;
368
                case 4:
369
                        hue        = (uchar)( t * 255 );
370
                        saturation = (uchar)( p * 255 );
371
                        value      = (uchar)( v * 255 );
372
                        break;
373
                case 5:
374
                        hue        = (uchar)( v * 255 );
375
                        saturation = (uchar)( p * 255 );
376
                        value      = (uchar)( q * 255 );
377
                }
378
        }
379
}
380
 
381
void RGBTOHLS ( uchar& red, uchar& green, uchar& blue )
382
{
8027 fschmid 383
        double var_R = ( red / 255.0 );
384
        double var_G = ( green / 255.0 );
385
        double var_B = ( blue / 255.0 );
8562 jghali 386
        double var_Min = qMin( var_R, qMin(var_G, var_B) );    //Min. value of RGB
387
        double var_Max = qMax( var_R, qMax(var_G, var_B) );    //Max. value of RGB
8027 fschmid 388
        double del_Max = var_Max - var_Min;             //Delta RGB value
389
        double L = ( var_Max + var_Min ) / 2.0;
390
        double H = 0;
391
        double S = 0;
392
        double del_R = 0;
393
        double del_G = 0;
394
        double del_B = 0;
395
        if ( del_Max == 0 )
6125 cbradney 396
        {
8027 fschmid 397
                H = 0;
398
                S = 0;
6125 cbradney 399
        }
400
        else
401
        {
8027 fschmid 402
                if ( L < 0.5 )
403
                        S = del_Max / ( var_Max + var_Min );
6125 cbradney 404
                else
8027 fschmid 405
                        S = del_Max / ( 2 - var_Max - var_Min );
406
                del_R = ( ( ( var_Max - var_R ) / 6.0 ) + ( del_Max / 2.0 ) ) / del_Max;
407
                del_G = ( ( ( var_Max - var_G ) / 6.0 ) + ( del_Max / 2.0 ) ) / del_Max;
408
                del_B = ( ( ( var_Max - var_B ) / 6.0 ) + ( del_Max / 2.0 ) ) / del_Max;
409
                if ( var_R == var_Max )
410
                        H = del_B - del_G;
411
           else if ( var_G == var_Max )
412
                        H = ( 1.0 / 3.0 ) + del_R - del_B;
413
                else if ( var_B == var_Max )
414
                        H = ( 2.0 / 3.0 ) + del_G - del_R;
415
                if ( H < 0 )
416
                        H += 1;
417
                if ( H > 1 )
418
                        H -= 1;
6125 cbradney 419
        }
8027 fschmid 420
        red = qRound(H * 255);
421
        green = qRound(L * 255);
422
        blue = qRound(S * 255);
6125 cbradney 423
}
424
 
8027 fschmid 425
double HLSVALUE ( double n1, double n2, double hue )
6125 cbradney 426
{
8027 fschmid 427
        if ( hue < 0 )
428
                hue += 1;
429
        if ( hue > 1 )
430
                hue -= 1;
431
        if ( ( 6 * hue ) < 1 )
432
                return n1 + ( n2 - n1 ) * 6 * hue;
433
        if ( ( 2 * hue ) < 1 )
434
                return n2;
435
        if ( ( 3 * hue ) < 2 )
436
                return n1 + ( n2 - n1 ) * ( ( 2.0 / 3.0 ) - hue ) * 6;
437
        return n1;
6125 cbradney 438
}
439
 
440
void HLSTORGB ( uchar& hue, uchar& lightness, uchar& saturation )
441
{
8027 fschmid 442
        double H = ( hue / 255.0 );
443
        double L = ( lightness / 255.0 );
444
        double S = ( saturation / 255.0 );
445
        if (S == 0)
6125 cbradney 446
        {
8027 fschmid 447
                hue = qRound(255 * L);
448
                saturation = qRound(255 * L);
449
                return;
6125 cbradney 450
        }
8027 fschmid 451
        double var_1 = 0;
452
        double var_2 = 0;
453
        if ( L < 0.5 )
454
                var_2 = L * ( 1 + S );
6125 cbradney 455
        else
8027 fschmid 456
                var_2 = ( L + S ) - ( S * L );
457
        var_1 = 2 * L - var_2;
458
        hue = qRound(255 * HLSVALUE( var_1, var_2, H + ( 1.0 / 3.0 ) ));
459
        lightness = qRound(255 * HLSVALUE( var_1, var_2, H ));
460
        saturation = qRound(255 * HLSVALUE( var_1, var_2, H - ( 1.0 / 3.0 ) ));
6125 cbradney 461
}
462
 
6193 fschmid 463
double getCurveYValue(FPointArray &curve, double x, bool linear)
6125 cbradney 464
{
465
    double t;
466
    FPoint p;
467
    FPoint p0,p1,p2,p3;
468
    double c0,c1,c2,c3;
469
    double val = 0.5;
470
    if(curve.size() == 0)
471
        return 0.5;
472
    // First find curve segment
473
    p = curve.point(0);
474
    if(x < p.x())
475
        return p.y();
476
    p = curve.point(curve.size()-1);
477
    if(x >= p.x())
478
        return p.y();
479
        uint cc = 0;
480
    // Find the four control points (two on each side of x)    
481
    p = curve.point(0);
482
    while(x >= p.x())
483
    {
484
                cc++;
485
        p = curve.point(cc);
486
    }
487
    if (cc > 1)
488
    {
489
        p0 = curve.point(cc-2);
490
        p1 = curve.point(cc-1);
491
    }
492
    else
493
        p1 = p0 = curve.point(0);
494
    p2 = p;
495
    if (cc < curve.size()-1)
496
        p3 = curve.point(cc+1);
497
    else
498
        p3 = p;
499
    // Calculate the value
6193 fschmid 500
        if (linear)
501
        {
502
                double mc;
503
                if (p1.x() - p2.x() != 0.0)
504
                        mc = (p1.y() - p2.y()) / (p1.x() - p2.x());
505
                else
506
                        mc = p2.y() / p2.x();
507
                val = (x - p1.x()) * mc + p1.y();
508
        }
509
        else
510
        {
511
                t = (x - p1.x()) / (p2.x() - p1.x());
512
                c2 = (p2.y() - p0.y()) * (p2.x()-p1.x()) / (p2.x()-p0.x());
513
                c3 = p1.y();
514
                c0 = -2*p2.y() + 2*c3 + c2 + (p3.y() - p1.y()) * (p2.x() - p1.x()) / (p3.x() - p1.x());
515
                c1 = p2.y() - c3 - c2 - c0;
516
                val = ((c0*t + c1)*t + c2)*t + c3;
517
        }
518
        if(val < 0.0)
519
                val = 0.0;
520
        if(val > 1.0)
521
                val = 1.0;
522
        return val;
6125 cbradney 523
}
524
 
8018 fschmid 525
double Lum(uchar red, uchar green, uchar blue)
526
{
527
        return 0.3 * (red / 255.0) + 0.59 * (green / 255.0) + 0.11 * (blue / 255.0);
528
}
529
 
530
double LumD(double red, double green, double blue)
531
{
532
        return 0.3 * red + 0.59 * green + 0.11 * blue;
533
}
534
 
535
void setLum(uchar& red, uchar& green, uchar& blue, double lum)
536
{
537
        double rP = (red / 255.0);
538
        double gP = (green / 255.0);
539
        double bP = (blue / 255.0);
540
        double d = lum - Lum(red, green, blue);
541
        rP += d;
542
        gP += d;
543
        bP += d;
544
        clipColor(rP, gP, bP);
545
        red = qRound(rP * 255);
546
        green = qRound(gP * 255);
547
        blue = qRound(bP * 255);
548
        return;
549
}
550
 
551
void clipColor(double& red, double& green, double& blue)
552
{
553
        double l = LumD(red, green, blue);
8562 jghali 554
        double n = qMin(red, qMin(green, blue));
555
        double x = qMax(red, qMax(green, blue));
8018 fschmid 556
        if (n < 0.0)
557
        {
558
                red = l + (((red - l) * l) / (l - n));
559
                green = l + (((green - l) * l) / (l - n));
560
                blue = l + (((blue - l) * l) / (l - n));
561
        }
562
        if (x > 1.0)
563
        {
564
                red = l + (((red - l) * (1.0 - l)) / (x - l));
565
                green = l + (((green - l) * (1.0 - l)) / (x - l));
566
                blue = l + (((blue - l) * (1.0 - l)) / (x - l));
567
        }
568
}
10121 cbradney 569
 
570
QString colorSpaceText(int cs)
571
{
572
        if (cs==0)
573
                return CommonStrings::trRGB;
574
        if (cs==1)
575
                return CommonStrings::trCMYK;
576
        if (cs==2)
577
                return CommonStrings::trGrayscale;
578
        if (cs==3)
579
                return CommonStrings::trDuotone;
580
        return CommonStrings::trUnknownCS;
581
}
12015 fschmid 582
 
583
bool importColorsFromFile(QString fileName, ColorList &EditColors)
584
{
585
        int oldCount = EditColors.count();
586
        if (!fileName.isEmpty())
587
        {
588
                QFileInfo fi = QFileInfo(fileName);
589
                QString ext = fi.suffix().toLower();
590
                if (extensionIndicatesEPSorPS(ext) || (ext == "ai"))
591
                {
592
                        QString tmp, tmp2, FarNam;
593
                        double c, m, y, k;
594
                        ScColor cc;
595
                        QFile f(fileName);
596
                        if (f.open(QIODevice::ReadOnly))
597
                        {
598
                                bool isAtend = false;
599
                                QDataStream ts(&f);
600
                                while (!ts.atEnd())
601
                                {
602
                                        tmp = readLinefromDataStream(ts);
603
                                        if ((tmp.startsWith("%%CMYKCustomColor")) || (tmp.startsWith("%%CMYKProcessColor")))
604
                                        {
605
                                                if (tmp.contains("(atend)"))
606
                                                        isAtend = true;
607
                                                else
608
                                                {
609
                                                        if (tmp.startsWith("%%CMYKCustomColor"))
610
                                                                tmp = tmp.remove(0,18);
611
                                                        else if (tmp.startsWith("%%CMYKProcessColor"))
612
                                                                tmp = tmp.remove(0,19);
613
                                                        QTextStream ts2(&tmp, QIODevice::ReadOnly);
614
                                                        ts2 >> c >> m >> y >> k;
615
                                                        FarNam = ts2.readAll();
616
                                                        FarNam = FarNam.trimmed();
617
                                                        FarNam = FarNam.remove(0,1);
618
                                                        FarNam = FarNam.remove(FarNam.length()-1,1);
619
                                                        FarNam = FarNam.simplified();
12086 fschmid 620
                                                        cc = ScColor(qRound(255 * c), qRound(255 * m), qRound(255 * y), qRound(255 * k));
12015 fschmid 621
                                                        cc.setSpotColor(true);
12172 fschmid 622
                                                        if ((!EditColors.contains(FarNam)) && (!FarNam.isEmpty()))
12015 fschmid 623
                                                                EditColors.insert(FarNam, cc);
624
                                                        while (!ts.atEnd())
625
                                                        {
626
                                                                quint64 oldPos = ts.device()->pos();
627
                                                                tmp = readLinefromDataStream(ts);
628
                                                                if (!tmp.startsWith("%%+"))
629
                                                                {
630
                                                                        ts.device()->seek(oldPos);
631
                                                                        break;
632
                                                                }
633
                                                                tmp = tmp.remove(0,3);
634
                                                                QTextStream ts2(&tmp, QIODevice::ReadOnly);
635
                                                                ts2 >> c >> m >> y >> k;
636
                                                                FarNam = ts2.readAll();
637
                                                                FarNam = FarNam.trimmed();
638
                                                                FarNam = FarNam.remove(0,1);
639
                                                                FarNam = FarNam.remove(FarNam.length()-1,1);
640
                                                                FarNam = FarNam.simplified();
12086 fschmid 641
                                                                cc = ScColor(qRound(255 * c), qRound(255 * m), qRound(255 * y), qRound(255 * k));
12015 fschmid 642
                                                                cc.setSpotColor(true);
12172 fschmid 643
                                                                if ((!EditColors.contains(FarNam)) && (!FarNam.isEmpty()))
12015 fschmid 644
                                                                        EditColors.insert(FarNam, cc);
645
                                                        }
646
                                                }
647
                                        }
648
                                        if (tmp.startsWith("%%RGBCustomColor"))
649
                                        {
650
                                                if (tmp.contains("(atend)"))
651
                                                        isAtend = true;
652
                                                else
653
                                                {
654
                                                        tmp = tmp.remove(0,17);
655
                                                        QTextStream ts2(&tmp, QIODevice::ReadOnly);
656
                                                        ts2 >> c >> m >> y;
657
                                                        FarNam = ts2.readAll();
658
                                                        FarNam = FarNam.trimmed();
659
                                                        FarNam = FarNam.remove(0,1);
660
                                                        FarNam = FarNam.remove(FarNam.length()-1,1);
661
                                                        FarNam = FarNam.simplified();
12086 fschmid 662
                                                        cc = ScColor(qRound(255 * c), qRound(255 * m), qRound(255 * y));
12172 fschmid 663
                                                        if ((!EditColors.contains(FarNam)) && (!FarNam.isEmpty()))
12015 fschmid 664
                                                                EditColors.insert(FarNam, cc);
665
                                                        while (!ts.atEnd())
666
                                                        {
667
                                                                quint64 oldPos = ts.device()->pos();
668
                                                                tmp = readLinefromDataStream(ts);
669
                                                                if (!tmp.startsWith("%%+"))
670
                                                                {
671
                                                                        ts.device()->seek(oldPos);
672
                                                                        break;
673
                                                                }
674
                                                                tmp = tmp.remove(0,3);
675
                                                                QTextStream ts2(&tmp, QIODevice::ReadOnly);
676
                                                                ts2 >> c >> m >> y;
677
                                                                FarNam = ts2.readAll();
678
                                                                FarNam = FarNam.trimmed();
679
                                                                FarNam = FarNam.remove(0,1);
680
                                                                FarNam = FarNam.remove(FarNam.length()-1,1);
681
                                                                FarNam = FarNam.simplified();
12086 fschmid 682
                                                                cc = ScColor(qRound(255 * c), qRound(255 * m), qRound(255 * y));
12172 fschmid 683
                                                                if ((!EditColors.contains(FarNam)) && (!FarNam.isEmpty()))
12015 fschmid 684
                                                                        EditColors.insert(FarNam, cc);
685
                                                        }
686
                                                }
687
                                        }
688
                                        if (tmp.startsWith("%%EndComments"))
689
                                        {
690
                                                if (ext == "ai")
691
                                                {
692
                                                        while (!ts.atEnd())
693
                                                        {
694
                                                                bool isX = false;
695
                                                                tmp = readLinefromDataStream(ts);
696
                                                                if ((tmp.endsWith("Xa") || tmp.endsWith(" k") || tmp.endsWith(" x")) && (tmp.length() > 4))
697
                                                                {
698
                                                                        QTextStream ts2(&tmp, QIODevice::ReadOnly);
699
                                                                        ts2 >> c >> m >> y >> k;
700
                                                                        if (tmp.endsWith(" x"))
701
                                                                        {
702
                                                                                isX = true;
703
                                                                                int an = tmp.indexOf("(");
704
                                                                                int en = tmp.lastIndexOf(")");
705
                                                                                FarNam = tmp.mid(an+1, en-an-1);
706
                                                                                FarNam = FarNam.simplified();
707
                                                                        }
708
                                                                        tmp = readLinefromDataStream(ts);
709
                                                                        if (tmp.endsWith("Pc"))
710
                                                                        {
711
                                                                                if (!isX)
712
                                                                                {
713
                                                                                        tmp = tmp.trimmed();
714
                                                                                        tmp = tmp.remove(0,1);
715
                                                                                        int en = tmp.indexOf(")");
716
                                                                                        FarNam = tmp.mid(0, en);
717
                                                                                        FarNam = FarNam.simplified();
718
                                                                                }
12086 fschmid 719
                                                                                cc = ScColor(qRound(255 * c), qRound(255 * m), qRound(255 * y), qRound(255 * k));
12015 fschmid 720
                                                                                cc.setSpotColor(true);
721
                                                                                if (!EditColors.contains(FarNam))
722
                                                                                        EditColors.insert(FarNam, cc);
723
                                                                        }
724
                                                                }
725
                                                        }
726
                                                }
727
                                                if (!isAtend)
728
                                                        break;
729
                                        }
730
                                }
731
                                f.close();
732
                        }
733
                }
734
                else
735
                {
736
                        FileLoader fl(fileName);
737
                        int test = fl.TestFile();
738
                        if ((test == FORMATID_SLA134IMPORT) || (test == FORMATID_SLA13XIMPORT) || (test == FORMATID_SLA12XIMPORT))
739
                        {
740
                                ColorList LColors;
741
                                if (fl.ReadColors(fileName, LColors))
742
                                {
743
                                        ColorList::Iterator it;
744
                                        for (it = LColors.begin(); it != LColors.end(); ++it)
745
                                        {
746
                                                if (!EditColors.contains(it.key()))
747
                                                        EditColors.insert(it.key(), it.value());
748
                                        }
749
                                }
750
                        }
751
                        else
752
                        {
753
                                QFile fiC(fileName);
754
                                if (fiC.open(QIODevice::ReadOnly))
755
                                {
756
                                        QString ColorEn, Cname;
757
                                        int Rval, Gval, Bval, Kval;
758
                                        QTextStream tsC(&fiC);
759
                                        ColorEn = tsC.readLine();
760
                                        bool cus = false;
761
                                        if (ColorEn.contains("OpenOffice"))
762
                                                cus = true;
763
                                        if (ColorEn.startsWith("<?xml version="))
764
                                        {
765
                                                QByteArray docBytes("");
766
                                                loadRawText(fileName, docBytes);
767
                                                QString docText("");
768
                                                docText = QString::fromUtf8(docBytes);
769
                                                QDomDocument docu("scridoc");
770
                                                docu.setContent(docText);
771
                                                ScColor lf = ScColor();
772
                                                QDomElement elem = docu.documentElement();
773
                                                QDomNode PAGE = elem.firstChild();
774
                                                while(!PAGE.isNull())
775
                                                {
776
                                                        QDomElement pg = PAGE.toElement();
777
                                                        if(pg.tagName()=="COLOR" && pg.attribute("NAME")!=CommonStrings::None)
778
                                                        {
779
                                                                if (pg.hasAttribute("CMYK"))
780
                                                                        lf.setNamedColor(pg.attribute("CMYK"));
781
                                                                else
782
                                                                        lf.fromQColor(QColor(pg.attribute("RGB")));
783
                                                                if (pg.hasAttribute("Spot"))
784
                                                                        lf.setSpotColor(static_cast<bool>(pg.attribute("Spot").toInt()));
785
                                                                else
786
                                                                        lf.setSpotColor(false);
787
                                                                if (pg.hasAttribute("Register"))
788
                                                                        lf.setRegistrationColor(static_cast<bool>(pg.attribute("Register").toInt()));
789
                                                                else
790
                                                                        lf.setRegistrationColor(false);
791
                                                                if (!EditColors.contains(pg.attribute("NAME")))
792
                                                                        EditColors.insert(pg.attribute("NAME"), lf);
793
                                                        }
12172 fschmid 794
                                                        else if (pg.tagName()=="draw:color" && pg.attribute("draw:name")!=CommonStrings::None)
795
                                                        {
796
                                                                if (pg.hasAttribute("draw:color"))
797
                                                                        lf.setNamedColor(pg.attribute("draw:color"));
798
                                                                lf.setSpotColor(false);
799
                                                                lf.setRegistrationColor(false);
800
                                                                QString nam = pg.attribute("draw:name");
801
                                                                if ((!EditColors.contains(nam)) && (!nam.isEmpty()))
802
                                                                        EditColors.insert(nam, lf);
803
                                                        }
12015 fschmid 804
                                                        PAGE=PAGE.nextSibling();
805
                                                }
806
                                        }
807
                                        else
808
                                        {
809
                                                while (!tsC.atEnd())
810
                                                {
811
                                                        ScColor tmp;
812
                                                        ColorEn = tsC.readLine();
813
                                                        if (ColorEn.length()>0 && ColorEn[0]==QChar('#'))
814
                                                                continue;
815
                                                        QTextStream CoE(&ColorEn, QIODevice::ReadOnly);
816
                                                        CoE >> Rval;
817
                                                        CoE >> Gval;
818
                                                        CoE >> Bval;
819
                                                        if (cus)
820
                                                        {
821
                                                                CoE >> Kval;
822
                                                                Cname = CoE.readAll().trimmed();
823
                                                                tmp.setColor(Rval, Gval, Bval, Kval);
824
                                                        }
825
                                                        else
826
                                                        {
827
                                                                Cname = CoE.readAll().trimmed();
828
                                                                tmp.setColorRGB(Rval, Gval, Bval);
829
                                                        }
830
 
831
                                                        if (Cname.length()==0)
832
                                                        {
833
                                                                if (!cus)
834
                                                                        Cname=QString("#%1%2%3").arg(Rval,2,16).arg(Gval,2,16).arg(Bval,2,16).toUpper();
835
                                                                else
836
                                                                        Cname=QString("#%1%2%3%4").arg(Rval,2,16).arg(Gval,2,16).arg(Bval,2,16).arg(Kval,2,16).toUpper();
837
                                                                Cname.replace(" ","0");
838
                                                        }
839
                                                        if (!EditColors.contains(Cname))
840
                                                                EditColors.insert(Cname, tmp);
841
                                                }
842
                                        }
843
                                        fiC.close();
844
                                }
845
                        }
846
                }
847
        }
848
        return (EditColors.count() != oldCount);
849
}