Subversion Repositories Scribus

Rev

Rev 11287 | Rev 11331 | 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
*/
3136 fschmid 7
/***************************************************************************
8
                          pslib.cpp  -  description
9
                             -------------------
10
    begin                : Sat May 26 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
 ***************************************************************************/
4037 cbradney 23
 
24
#include "pslib.h"
25
 
10223 cbradney 26
#include <QFileInfo>
27
#include <QImage>
28
#include <QColor>
29
#include <QFontInfo>
9803 fschmid 30
#include <QList>
9967 fschmid 31
#include <QByteArray>
9856 fschmid 32
#include <QList>
3136 fschmid 33
#include <cstdlib>
10223 cbradney 34
#include <QRegExp>
35
#include <QBuffer>
9922 fschmid 36
#include <QStack>
3136 fschmid 37
 
10601 mrdocs 38
#include "cmsettings.h"
4037 cbradney 39
#include "commonstrings.h"
3136 fschmid 40
#include "scconfig.h"
41
#include "pluginapi.h"
3939 cbradney 42
#include "prefsmanager.h"
3136 fschmid 43
#include "scribusdoc.h"
4037 cbradney 44
#include "scribus.h"
5243 cbradney 45
#include "scribuscore.h"
3136 fschmid 46
#include "scfonts.h"
3934 cbradney 47
#include "selection.h"
3136 fschmid 48
#include <cmath>
49
#include "util.h"
10212 cbradney 50
#include "util_formats.h"
10203 cbradney 51
#include "util_math.h"
4037 cbradney 52
#include "multiprogressdialog.h"
53
#include "scribusapp.h"
6388 fschmid 54
#include "scpattern.h"
7478 jghali 55
#include "sccolorengine.h"
3136 fschmid 56
 
5184 avox 57
#include "text/nlsconfig.h"
58
 
6954 fschmid 59
PSLib::PSLib(PrintOptions &options, bool psart, SCFonts &AllFonts, QMap<QString, QMap<uint, FPointArray> > DocFonts, ColorList DocColors, bool pdf, bool spot)
3136 fschmid 60
{
6954 fschmid 61
        Options = options;
5243 cbradney 62
        usingGUI=ScCore->usingGUI();
4044 cbradney 63
        abortExport=false;
3136 fschmid 64
        QString tmp, tmp2, tmp3, tmp4, CHset;
65
        QStringList wt;
66
        Seiten = 0;
67
        User = "";
68
        Creator = "Scribus" + QString(VERSION);
69
        Titel = "";
70
        FillColor = "0.0 0.0 0.0 0.0";
71
        StrokeColor = "0.0 0.0 0.0 0.0";
72
        Header = psart ? "%!PS-Adobe-3.0\n" : "%!PS-Adobe-3.0 EPSF-3.0\n";
73
        BBox = "";
74
        BBoxH = "";
75
        Art = psart;
76
        isPDF = pdf;
77
        UsedFonts.clear();
78
        Fonts = "";
79
        FontDesc = "";
80
        GraySc = false;
81
        DoSep = false;
4046 fschmid 82
        abortExport = false;
3136 fschmid 83
        useSpotColors = spot;
84
        GrayCalc =  "/setcmykcolor {exch 0.11 mul add exch 0.59 mul add exch 0.3 mul add\n";
85
        GrayCalc += "               dup 1 gt {pop 1} if 1 exch sub oldsetgray} bind def\n";
86
        GrayCalc += "/setrgbcolor {0.11 mul exch 0.59 mul add exch 0.3 mul add\n";
87
        GrayCalc += "              oldsetgray} bind def\n";
6748 fschmid 88
        Farben = "";
89
        FNamen = "";
9619 jghali 90
        CMYKColor cmykValues;
3136 fschmid 91
        ColorList::Iterator itf;
92
        int c, m, y, k;
93
        bool erst = true;
94
        colorsToUse = DocColors;
95
        spotMap.clear();
96
        colorDesc = "";
97
        for (itf = DocColors.begin(); itf != DocColors.end(); ++itf)
98
        {
99
                if (((DocColors[itf.key()].isSpotColor()) || (DocColors[itf.key()].isRegistrationColor())) && (useSpotColors))
100
                {
9619 jghali 101
                        ScColorEngine::getCMYKValues(DocColors[itf.key()], DocColors.document(), cmykValues);
102
                        cmykValues.getValues(c, m, y, k);
3136 fschmid 103
                        colorDesc += "/Spot"+PSEncode(itf.key())+" { [ /Separation (";
104
                        if (DocColors[itf.key()].isRegistrationColor())
105
                                colorDesc += "All";
106
                        else
107
                                colorDesc += itf.key();
108
                        colorDesc += ")\n";
109
                        colorDesc += "/DeviceCMYK\n{\ndup "+ToStr(static_cast<double>(c) / 255)+"\nmul exch dup ";
110
                        colorDesc += ToStr(static_cast<double>(m) / 255)+"\nmul exch dup ";
111
                        colorDesc += ToStr(static_cast<double>(y) / 255)+"\nmul exch ";
112
                        colorDesc += ToStr(static_cast<double>(k) / 255)+" mul }] setcolorspace setcolor} bind def\n";
113
                        spotMap.insert(itf.key(), "Spot"+PSEncode(itf.key()));
114
                }
115
                if ((itf.key() != "Cyan") && (itf.key() != "Magenta") && (itf.key() != "Yellow") && (itf.key() != "Black") && DocColors[itf.key()].isSpotColor())
116
                {
9619 jghali 117
                        ScColorEngine::getCMYKValues(DocColors[itf.key()], DocColors.document(), cmykValues);
118
                        cmykValues.getValues(c, m, y, k);
3136 fschmid 119
                        if (!erst)
120
                        {
121
                                Farben += "%%+ ";
122
                                FNamen += "%%+ ";
123
                        }
124
                        Farben += ToStr(static_cast<double>(c) / 255) + " " + ToStr(static_cast<double>(m) / 255) + " ";
125
                        Farben += ToStr(static_cast<double>(y) / 255) + " " + ToStr(static_cast<double>(k) / 255) + " (" + itf.key() + ")\n";
126
                        FNamen += "(" + itf.key() + ")\n";
127
                        erst = false;
128
                }
129
        }
5387 avox 130
        QMap<QString, QMap<uint, FPointArray> >::Iterator it;
3136 fschmid 131
        int a = 0;
132
        for (it = DocFonts.begin(); it != DocFonts.end(); ++it)
133
        {
134
/* Subset all TTF Fonts until the bug in the TTF-Embedding Code is fixed */
5980 avox 135
                ScFace::FontType type = AllFonts[it.key()].type();
3136 fschmid 136
 
5980 avox 137
                if ((type == ScFace::TTF) || (AllFonts[it.key()].isOTF()) || (AllFonts[it.key()].subset()))
3136 fschmid 138
                {
10398 cbradney 139
                        QMap<uint, FPointArray>& RealGlyphs(it.value());
10394 cbradney 140
                        FontDesc += "/"+AllFonts[it.key()].psName().simplified().replace( QRegExp("[\\s\\/\\{\\[\\]\\}\\<\\>\\(\\)\\%]"), "_" )+
5387 avox 141
                                        " "+IToStr(RealGlyphs.count()+1)+" dict def\n";
10394 cbradney 142
                        FontDesc += AllFonts[it.key()].psName().simplified().replace( QRegExp("[\\s\\/\\{\\[\\]\\}\\<\\>\\(\\)\\%]"), "_" )+" begin\n";
3136 fschmid 143
                        QMap<uint,FPointArray>::Iterator ig;
5390 avox 144
                        for (ig = RealGlyphs.begin(); ig != RealGlyphs.end(); ++ig)
3136 fschmid 145
                        {
146
                                FontDesc += "/G"+IToStr(ig.key())+" { newpath\n";
147
                                FPoint np, np1, np2;
148
                                bool nPath = true;
10398 cbradney 149
                                if (ig.value().size() > 3)
3136 fschmid 150
                                {
10398 cbradney 151
                                        for (uint poi = 0; poi < ig.value().size()-3; poi += 4)
3136 fschmid 152
                                        {
10398 cbradney 153
                                                if (ig.value().point(poi).x() > 900000)
3136 fschmid 154
                                                {
155
                                                        FontDesc += "cl\n";
156
                                                        nPath = true;
157
                                                        continue;
158
                                                }
159
                                                if (nPath)
160
                                                {
10398 cbradney 161
                                                        np = ig.value().point(poi);
3136 fschmid 162
                                                        FontDesc += ToStr(np.x()) + " " + ToStr(-np.y()) + " m\n";
163
                                                        nPath = false;
164
                                                }
10398 cbradney 165
                                                np = ig.value().point(poi+1);
166
                                                np1 = ig.value().point(poi+3);
167
                                                np2 = ig.value().point(poi+2);
3136 fschmid 168
                                                FontDesc += ToStr(np.x()) + " " + ToStr(-np.y()) + " " +
169
                                                                ToStr(np1.x()) + " " + ToStr(-np1.y()) + " " +
170
                                                                ToStr(np2.x()) + " " + ToStr(-np2.y()) + " cu\n";
171
                                        }
172
                                }
173
                                FontDesc += "cl\n} bind def\n";
174
                        }
175
                        FontDesc += "end\n";
176
                }
177
                else
178
                {
179
                        UsedFonts.insert(it.key(), "/Fo"+IToStr(a));
10394 cbradney 180
                        Fonts += "/Fo"+IToStr(a)+" /"+AllFonts[it.key()].psName().simplified().replace( QRegExp("[\\s\\/\\{\\[\\]\\}\\<\\>\\(\\)\\%]"), "_" )+" findfont definefont pop\n";
5980 avox 181
                        if (AllFonts[it.key()].embedPs())
3136 fschmid 182
                        {
183
                                QString tmp;
5980 avox 184
                                if(AllFonts[it.key()].EmbedFont(tmp))
3136 fschmid 185
                                {
10394 cbradney 186
                                        FontDesc += "%%BeginFont: " + AllFonts[it.key()].psName().simplified().replace( QRegExp("[\\s\\/\\{\\[\\]\\}\\<\\>\\(\\)\\%]"), "_" ) + "\n";
3136 fschmid 187
                                        FontDesc += tmp + "\n%%EndFont\n";
188
                                }
189
                        }
190
                        GListe gl;
5980 avox 191
                        AllFonts[it.key()].glyphNames(gl);
3136 fschmid 192
                        GlyphsOfFont.insert(it.key(), gl);
193
                        a++;
194
                }
195
        }
196
        Prolog = "%%BeginProlog\n";
197
        Prolog += "/Scribusdict 100 dict def\n";
198
        Prolog += "Scribusdict begin\n";
199
        Prolog += "/sp {showpage} bind def\n";
200
        Prolog += "/oldsetgray /setgray load def\n";
201
        Prolog += "/cmyk {setcmykcolor} def\n";
202
        Prolog += "/m {moveto} bind def\n";
203
        Prolog += "/l {lineto} bind def\n";
204
        Prolog += "/li {lineto} bind def\n";
205
        Prolog += "/cu {curveto} bind def\n";
206
        Prolog += "/cl {closepath} bind def\n";
207
        Prolog += "/gs {gsave} bind def\n";
208
        Prolog += "/gr {grestore} bind def\n";
209
        Prolog += "/tr {translate} bind def\n";
210
        Prolog += "/ro {rotate} bind def\n";
211
        Prolog += "/sh {show} bind def\n";
212
        Prolog += "/shg {setcmykcolor moveto glyphshow} def\n";
3555 fschmid 213
        Prolog += "/shgsp {moveto glyphshow} def\n";
3136 fschmid 214
        Prolog += "/sc {scale} bind def\n";
215
        Prolog += "/se {selectfont} bind def\n";
216
        Prolog += "/sf {setfont} bind def\n";
217
        Prolog += "/sw {setlinewidth} bind def\n";
218
        Prolog += "/f  {findfont} bind def\n";
219
        Prolog += "/fi {fill} bind def\n";
220
        Prolog += "/st {stroke} bind def\n";
221
        Prolog += "/shgf {gs dup scale begin cvx exec fill end gr} bind def\n";
222
        Prolog += "/shgs {gs dup 1 exch div currentlinewidth mul sw dup scale\n";
223
        Prolog += "       begin cvx exec st end gr} bind def\n";
224
        Prolog += "/bEPS {\n";
225
        Prolog += "    /b4_Inc_state save def\n";
226
        Prolog += "    /dict_count countdictstack def\n";
227
        Prolog += "    /op_count count 1 sub def\n";
228
        Prolog += "    userdict begin\n";
229
        Prolog += "    /showpage { } def\n";
230
        Prolog += "    0 setgray 0 setlinecap\n";
231
        Prolog += "    1 setlinewidth 0 setlinejoin\n";
232
        Prolog += "    10 setmiterlimit [ ] 0 setdash newpath\n";
233
        Prolog += "    /languagelevel where\n";
234
        Prolog += "    {pop languagelevel\n";
235
        Prolog += "    1 ne\n";
236
        Prolog += "    {false setstrokeadjust false setoverprint\n";
237
        Prolog += "    } if } if } bind def\n";
238
        Prolog += "/eEPS { count op_count sub {pop} repeat\n";
239
        Prolog += "    countdictstack dict_count sub {end} repeat\n";
240
        Prolog += "    b4_Inc_state restore } bind def\n";
241
        Prolog += "    end\n";
6954 fschmid 242
        if ((Options.cropMarks) || (Options.bleedMarks) || (Options.registrationMarks) || (Options.colorMarks))
243
                Prolog += "/rb { [ /Separation (All)\n/DeviceCMYK { dup 0 mul exch dup 0 mul exch dup 0 mul exch 1 mul }\n] setcolorspace setcolor} bind def\n";
3136 fschmid 244
        Prolog += "%%EndProlog\n";
245
}
246
 
11280 jghali 247
void PSLib::PutStream(const QString& c)
3136 fschmid 248
{
10553 fschmid 249
        spoolStream.flush();
250
        spoolStream.device()->write(c.toUtf8().data(), c.length());
3136 fschmid 251
}
252
 
11280 jghali 253
void PSLib::PutStream(const QByteArray& array, bool hexEnc)
5234 fschmid 254
{
255
        if(hexEnc)
11107 jghali 256
                WriteASCII85Bytes(array);
5234 fschmid 257
        else
10553 fschmid 258
        {
259
                spoolStream.flush();
260
                spoolStream.device()->write(array.data(), array.size());
261
        }
5234 fschmid 262
}
263
 
11280 jghali 264
void PSLib::PutStream(const char* array, int length, bool hexEnc)
5234 fschmid 265
{
266
        if(hexEnc)
11107 jghali 267
                WriteASCII85Bytes((const unsigned char*) array, length);
5234 fschmid 268
        else
10553 fschmid 269
        {
270
                spoolStream.flush();
271
                spoolStream.device()->write(array, length);
272
        }
5234 fschmid 273
}
274
 
11107 jghali 275
void PSLib::WriteASCII85Bytes(const QByteArray& array)
276
{
277
        WriteASCII85Bytes((const unsigned char*) array.data(), array.size());
278
}
279
 
280
void PSLib::WriteASCII85Bytes(const unsigned char* array, int length)
281
{
282
        int  pending = 0;
283
        int  written = 0;
284
        bool allZero  = true;
285
        unsigned char  four_tuple[4];
286
        const unsigned char *ptr = array;
287
        const char* ascii85;
288
        quint32 value;
289
 
290
        while (length)
291
        {
292
                four_tuple[pending++] = *ptr++;
293
                length--;
294
                if (pending == 4)
5234 fschmid 295
                {
11107 jghali 296
                        value   = four_tuple[0] << 24 | four_tuple[1] << 16 | four_tuple[2] << 8 | four_tuple[3];
297
                        ascii85 = toAscii85(value, allZero);
298
                        if (allZero)
299
                                spoolStream << "z";
300
                        else
301
                                spoolStream << ascii85;
302
                        written += ((allZero) ? 1 : 5);
303
                        if (written > 75)
5234 fschmid 304
                        {
6388 fschmid 305
                                spoolStream << "\n";
11107 jghali 306
                                written = 0;
5234 fschmid 307
                        }
11107 jghali 308
                        pending = 0;
5234 fschmid 309
                }
310
        }
11107 jghali 311
 
312
        if (pending)
10553 fschmid 313
        {
11107 jghali 314
                unsigned char five_tuple[6];
315
                memset (four_tuple + pending, 0, 4 - pending);
316
                value   = four_tuple[0] << 24 | four_tuple[1] << 16 | four_tuple[2] << 8 | four_tuple[3];
317
                ascii85 = toAscii85(value, allZero);
318
                memcpy (five_tuple, ascii85, 5);
319
                five_tuple[pending + 1] = 0;
320
                spoolStream << (const char*) five_tuple;
10553 fschmid 321
        }
11107 jghali 322
        spoolStream << "~>\n";
5234 fschmid 323
}
324
 
11107 jghali 325
void PSLib::WriteASCIIHexBytes(const QByteArray& array)
326
{
327
        WriteASCIIHexBytes(array.data(), array.size());
328
}
329
 
330
void PSLib::WriteASCIIHexBytes(const char* array, int length)
331
{
332
        int len = 0;
333
        for (int i = 0; i < length; i++)
334
        {
335
                len++;
336
                spoolStream << toHex(array[i]);
337
                if ( len > 40 )
338
                {
339
                        spoolStream << "\n";
340
                        len = 0;
341
                }
342
        }
343
        spoolStream << "\n>\n";
344
}
345
 
3136 fschmid 346
QString PSLib::ToStr(double c)
347
{
348
        QString cc;
349
        return cc.setNum(c);
350
}
351
 
352
QString PSLib::IToStr(int c)
353
{
354
        QString cc;
355
        return cc.setNum(c);
356
}
357
 
358
void PSLib::PS_set_Info(QString art, QString was)
359
{
360
        if (art == "Author")
361
                User = was;
362
        if (art == "Creator")
363
                Creator = was;
364
        if (art == "Title")
365
                Titel = was;
366
}
367
 
368
bool PSLib::PS_set_file(QString fn)
369
{
10553 fschmid 370
        Spool.setFileName(fn);
9642 avox 371
        if (Spool.exists())
372
                Spool.remove();
8501 cbradney 373
        bool ret = Spool.open(QIODevice::WriteOnly);
6388 fschmid 374
        spoolStream.setDevice(&Spool);
375
        return ret;
3136 fschmid 376
}
377
 
11060 jghali 378
bool PSLib::PS_begin_doc(ScribusDoc *doc, double x, double y, double breite, double hoehe, int numpage, bool doDev, bool sep, bool farb, bool ic, bool gcr, bool over)
3136 fschmid 379
{
6388 fschmid 380
        m_Doc = doc;
11280 jghali 381
        PutStream(Header);
382
        PutStream("%%For: " + User + "\n");
383
        PutStream("%%Title: " + Titel + "\n");
384
        PutStream("%%Creator: " + Creator + "\n");
385
        PutStream("%%Pages: " + IToStr(numpage) + "\n");
3136 fschmid 386
        BBox = "%%BoundingBox: " + IToStr(qRound(x)) + " " + IToStr(qRound(y)) + " " + IToStr(qRound(breite)) + " " + IToStr(qRound(hoehe)) + "\n";
387
        BBoxH = "%%HiResBoundingBox: " + ToStr(x) + " " + ToStr(y) + " " + ToStr(breite) + " " + ToStr(hoehe) + "\n";
8447 fschmid 388
 //     if (!Art)
389
//      {
11280 jghali 390
                PutStream(BBox);
391
                PutStream(BBoxH);
8447 fschmid 392
//      }
6748 fschmid 393
        if (!FNamen.isEmpty())
11280 jghali 394
                PutStream("%%DocumentCustomColors: "+FNamen);
6748 fschmid 395
        if (!Farben.isEmpty())
11280 jghali 396
                PutStream("%%CMYKCustomColor: "+Farben);
397
        PutStream("%%LanguageLevel: 3\n");
398
        PutStream("%%EndComments\n");
399
        PutStream(Prolog);
400
        PutStream("%%BeginSetup\n");
401
        PutStream("/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse\n");
3136 fschmid 402
        if (!FontDesc.isEmpty())
11280 jghali 403
                PutStream(FontDesc);
3136 fschmid 404
        if ((!colorDesc.isEmpty()) && (!sep))
11280 jghali 405
                PutStream(colorDesc);
406
//      PutStream("Scribusdict begin\n");
407
        PutStream(Fonts);
3136 fschmid 408
        if (GraySc)
11280 jghali 409
                PutStream(GrayCalc);
5308 fschmid 410
        if (over)
5316 fschmid 411
        {
11280 jghali 412
                PutStream("true setoverprint\n");
413
                PutStream("true setoverprintmode\n");
5316 fschmid 414
        }
6400 fschmid 415
        QStringList patterns = m_Doc->getUsedPatterns();
8575 jghali 416
        for (int c = 0; c < patterns.count(); ++c)
6388 fschmid 417
        {
6400 fschmid 418
                ScPattern pa = m_Doc->docPatterns[patterns[c]];
9856 fschmid 419
                for (int em = 0; em < pa.items.count(); ++em)
6388 fschmid 420
                {
421
                        PageItem* item = pa.items.at(em);
422
                        if ((item->asImageFrame()) && (item->PicAvail) && (!item->Pfile.isEmpty()) && (item->printEnabled()) && (!sep) && (farb))
11060 jghali 423
                        {
424
                                if (!PS_ImageData(item, item->Pfile, item->itemName(), item->IProfile, item->UseEmbedded, ic))
425
                                        return false;
426
                        }
6388 fschmid 427
                }
11280 jghali 428
                PutStream("/Pattern"+patterns[c]+" 8 dict def\n");
429
                PutStream("Pattern"+patterns[c]+" begin\n");
430
                PutStream("/PatternType 1 def\n");
431
                PutStream("/PaintType 1 def\n");
432
                PutStream("/TilingType 1 def\n");
433
                PutStream("/BBox [ 0 0 "+ToStr(pa.width)+" "+ToStr(pa.height)+"] def\n");
434
                PutStream("/XStep "+ToStr(pa.width)+" def\n");
435
                PutStream("/YStep "+ToStr(pa.height)+" def\n");
436
                PutStream("/PaintProc {\n");
6388 fschmid 437
                QIODevice *spStream = spoolStream.device();
438
                QByteArray buf;
8619 subik 439
                // Qt4 QBuffer b(buf);
440
                QBuffer b(&buf);
8501 cbradney 441
                b.open( QIODevice::WriteOnly );
6388 fschmid 442
                spoolStream.setDevice(&b);
9922 fschmid 443
                QStack<PageItem*> groupStack;
9856 fschmid 444
                for (int em = 0; em < pa.items.count(); ++em)
6388 fschmid 445
                {
446
                        PageItem* item = pa.items.at(em);
6501 fschmid 447
                        if (item->isGroupControl)
448
                        {
449
                                PS_save();
450
                                FPointArray cl = item->PoLine.copy();
8501 cbradney 451
                                QMatrix mm;
9111 fschmid 452
                                mm.translate(item->gXpos, item->gYpos - pa.height);
7981 fschmid 453
                                mm.rotate(item->rotation());
6501 fschmid 454
                                cl.map( mm );
455
                                SetClipPath(&cl);
456
                                PS_closepath();
457
                                PS_clip(true);
458
                                groupStack.push(item->groupsLastItem);
459
                                continue;
460
                        }
11287 fschmid 461
                        PutStream("{\n");
6388 fschmid 462
                        PS_save();
9111 fschmid 463
                        PS_translate(item->gXpos, pa.height - item->gYpos);
6388 fschmid 464
                        ProcessItem(m_Doc, m_Doc->Pages->at(0), item, 0, sep, farb, ic, gcr, false, true, true);
465
                        PS_restore();
6501 fschmid 466
                        if (groupStack.count() != 0)
467
                        {
468
                                while (item == groupStack.top())
469
                                {
470
                                        PS_restore();
471
                                        groupStack.pop();
9827 fschmid 472
                                        if (groupStack.count() == 0)
473
                                                break;
6501 fschmid 474
                                }
475
                        }
11287 fschmid 476
                        PutStream("} exec\n");
6388 fschmid 477
                }
478
                spoolStream.setDevice(spStream);
11280 jghali 479
                PutStream(buf);
480
                PutStream("} def\n");
481
                PutStream("end\n");
6388 fschmid 482
        }
11280 jghali 483
//      PutStream("end\n");
484
//      PutStream("%%EndSetup\n");
3136 fschmid 485
        Prolog = "";
486
        FontDesc = "";
11060 jghali 487
        return true;
3136 fschmid 488
}
489
 
490
QString PSLib::PSEncode(QString in)
491
{
3622 avox 492
        static QRegExp badchars("[\\s\\/\\{\\[\\]\\}\\<\\>\\(\\)\\%]");
3136 fschmid 493
        QString tmp = "";
10394 cbradney 494
        tmp = in.simplified().replace( badchars, "_" );
3136 fschmid 495
        return tmp;
496
}
497
 
498
void PSLib::PS_TemplateStart(QString Name)
499
{
11280 jghali 500
        PutStream("/"+PSEncode(Name)+"\n{\n");
3136 fschmid 501
}
502
 
503
void PSLib::PS_UseTemplate(QString Name)
504
{
11280 jghali 505
        PutStream(PSEncode(Name)+"\n");
3136 fschmid 506
}
507
 
508
void PSLib::PS_TemplateEnd()
509
{
11280 jghali 510
        PutStream("} bind def\n");
3136 fschmid 511
}
512
 
7316 jghali 513
void PSLib::PS_begin_page(Page* pg, MarginStruct* Ma, bool Clipping)
3136 fschmid 514
{
6954 fschmid 515
        double bleedRight = 0.0;
516
        double bleedLeft = 0.0;
517
        double markOffs = 0.0;
518
        if ((Options.cropMarks) || (Options.bleedMarks) || (Options.registrationMarks) || (Options.colorMarks))
519
                markOffs = 20.0 + Options.markOffset;
7251 fschmid 520
        if (m_Doc->pageSets[m_Doc->currentPageLayout].Columns == 1)
3136 fschmid 521
        {
7225 cbradney 522
                bleedRight = Options.bleeds.Right;
523
                bleedLeft = Options.bleeds.Left;
3136 fschmid 524
        }
6954 fschmid 525
        else
526
        {
7251 fschmid 527
                if (m_Doc->locationOfPage(pg->pageNr()) == LeftPage)
528
                {
529
                        bleedRight = Options.bleeds.Right;
530
                        bleedLeft = Options.bleeds.Left;
531
                }
532
                else if (m_Doc->locationOfPage(pg->pageNr()) == RightPage)
533
                {
534
                        bleedRight = Options.bleeds.Left;
535
                        bleedLeft = Options.bleeds.Right;
536
                }
537
                else
538
                {
539
                        bleedRight = Options.bleeds.Left;
540
                        bleedLeft = Options.bleeds.Left;
541
                }
6954 fschmid 542
        }
543
        double maxBoxX = pg->width()+bleedLeft+bleedRight+markOffs*2.0;
7225 cbradney 544
        double maxBoxY = pg->height()+Options.bleeds.Bottom+Options.bleeds.Top+markOffs*2.0;
3136 fschmid 545
        Seiten++;
11280 jghali 546
        PutStream("%%Page: " + IToStr(Seiten) + " " + IToStr(Seiten) + "\n");
547
        PutStream("%%PageOrientation: ");
6748 fschmid 548
// when creating EPS files determine the orientation from the bounding box
549
        if (!Art)
550
        {
551
                if ((pg->width() - Ma->Left - Ma->Right) <= (pg->height() - Ma->Bottom - Ma->Top))
11280 jghali 552
                        PutStream("Portrait\n");
6748 fschmid 553
                else
11280 jghali 554
                        PutStream("Landscape\n");
6748 fschmid 555
        }
556
        else
557
        {
558
                if (pg->PageOri == 0)
11280 jghali 559
                        PutStream("Portrait\n");
6748 fschmid 560
                else
11280 jghali 561
                        PutStream("Landscape\n");
6748 fschmid 562
        }
11280 jghali 563
        PutStream("%%PageBoundingBox: 0 0 "+IToStr(qRound(maxBoxX))+" "+IToStr(qRound(maxBoxY))+"\n");
564
        PutStream("%%PageCropBox: "+ToStr(bleedLeft+markOffs)+" "+ToStr(Options.bleeds.Bottom+markOffs)+" "+ToStr(maxBoxX-bleedRight-markOffs*2.0)+" "+ToStr(maxBoxY-Options.bleeds.Top-markOffs*2.0)+"\n");
565
        PutStream("Scribusdict begin\n");
566
        PutStream("save\n");
3136 fschmid 567
        if (Clipping)
11280 jghali 568
                PutStream(PDev);
569
        PutStream("/DeviceCMYK setcolorspace\n");
6954 fschmid 570
        if ((Art) && (Options.setDevParam))
571
        {
11280 jghali 572
                PutStream("<< /PageSize [ "+ToStr(maxBoxX)+" "+ToStr(maxBoxY)+" ]\n");
573
                PutStream(">> setpagedevice\n");
6954 fschmid 574
        }
11280 jghali 575
        PutStream(ToStr(bleedLeft+markOffs)+" "+ToStr(Options.bleeds.Bottom+markOffs)+" tr\n");
6954 fschmid 576
        ActPage = pg;
577
        if (Clipping)
578
        {
579
                PDev = ToStr(Ma->Left) + " " + ToStr(Ma->Bottom) + " m\n";
580
                PDev += ToStr(pg->width() - Ma->Right) + " " + ToStr(Ma->Bottom) + " li\n";
581
                PDev += ToStr(pg->width() - Ma->Right) + " " + ToStr(pg->height() - Ma->Top) + " li\n";
582
                PDev += ToStr(Ma->Left) + " " + ToStr(pg->height() - Ma->Top) + " li cl clip newpath\n";
583
        }
3136 fschmid 584
}
585
 
586
void PSLib::PS_end_page()
587
{
11280 jghali 588
        PutStream("%%PageTrailer\nrestore\n");
6954 fschmid 589
        double markOffs = 0.0;
590
        if ((Options.cropMarks) || (Options.bleedMarks) || (Options.registrationMarks) || (Options.colorMarks))
591
                markOffs = 20.0 + Options.markOffset;
592
        double bleedRight;
593
        double bleedLeft;
7251 fschmid 594
        if (m_Doc->pageSets[m_Doc->currentPageLayout].Columns == 1)
6954 fschmid 595
        {
7225 cbradney 596
                bleedRight = Options.bleeds.Right;
597
                bleedLeft = Options.bleeds.Left;
6954 fschmid 598
        }
599
        else
600
        {
7251 fschmid 601
                if (m_Doc->locationOfPage(ActPage->pageNr()) == LeftPage)
602
                {
603
                        bleedRight = Options.bleeds.Right;
604
                        bleedLeft = Options.bleeds.Left;
605
                }
606
                else if (m_Doc->locationOfPage(ActPage->pageNr()) == RightPage)
607
                {
608
                        bleedRight = Options.bleeds.Left;
609
                        bleedLeft = Options.bleeds.Right;
610
                }
611
                else
612
                {
613
                        bleedRight = Options.bleeds.Left;
614
                        bleedLeft = Options.bleeds.Left;
615
                }
6954 fschmid 616
        }
617
        double maxBoxX = ActPage->width()+bleedLeft+bleedRight+markOffs*2.0;
7225 cbradney 618
        double maxBoxY = ActPage->height()+Options.bleeds.Bottom+Options.bleeds.Top+markOffs*2.0;
6954 fschmid 619
        if ((Options.cropMarks) || (Options.bleedMarks) || (Options.registrationMarks) || (Options.colorMarks))
620
        {
11280 jghali 621
                PutStream("gs\n");
6954 fschmid 622
                PS_setlinewidth(0.5);
11280 jghali 623
                PutStream("[] 0 setdash\n");
624
                PutStream("0 setlinecap\n");
625
                PutStream("0 setlinejoin\n");
626
                PutStream("1 rb\n");
6954 fschmid 627
                if (Options.cropMarks)
628
                {
629
                // Bottom Left
11280 jghali 630
                        PutStream("0 "+ToStr(markOffs+Options.bleeds.Bottom)+" m\n");
631
                        PutStream(ToStr(20.0)+" "+ToStr(markOffs+Options.bleeds.Bottom)+" li\n");
632
                        PutStream("st\n");
633
                        PutStream(ToStr(markOffs+bleedLeft)+" 0 m\n");
634
                        PutStream(ToStr(markOffs+bleedLeft)+" 20 li\n");
635
                        PutStream("st\n");
6954 fschmid 636
                // Top Left
11280 jghali 637
                        PutStream("0 "+ToStr(maxBoxY-Options.bleeds.Top-markOffs)+" m\n");
638
                        PutStream(ToStr(20.0)+" "+ToStr(maxBoxY-Options.bleeds.Top-markOffs)+" li\n");
639
                        PutStream("st\n");
640
                        PutStream(ToStr(markOffs+bleedLeft)+" "+ToStr(maxBoxY)+" m\n");
641
                        PutStream(ToStr(markOffs+bleedLeft)+" "+ToStr(maxBoxY-20.0)+" li\n");
642
                        PutStream("st\n");
6954 fschmid 643
                // Bottom Right
11280 jghali 644
                        PutStream(ToStr(maxBoxX)+" "+ToStr(markOffs+Options.bleeds.Bottom)+" m\n");
645
                        PutStream(ToStr(maxBoxX-20.0)+" "+ToStr(markOffs+Options.bleeds.Bottom)+" li\n");
646
                        PutStream("st\n");
647
                        PutStream(ToStr(maxBoxX-bleedRight-markOffs)+" "+ToStr(0.0)+" m\n");
648
                        PutStream(ToStr(maxBoxX-bleedRight-markOffs)+" "+ToStr(20.0)+" li\n");
649
                        PutStream("st\n");
6954 fschmid 650
                // Top Right
11280 jghali 651
                        PutStream(ToStr(maxBoxX)+" "+ToStr(maxBoxY-Options.bleeds.Top-markOffs)+" m\n");
652
                        PutStream(ToStr(maxBoxX-20.0)+" "+ToStr(maxBoxY-Options.bleeds.Top-markOffs)+" li\n");
653
                        PutStream("st\n");
654
                        PutStream(ToStr(maxBoxX-bleedRight-markOffs)+" "+ToStr(maxBoxY)+" m\n");
655
                        PutStream(ToStr(maxBoxX-bleedRight-markOffs)+" "+ToStr(maxBoxY-20.0)+" li\n");
656
                        PutStream("st\n");
6954 fschmid 657
                }
658
                if (Options.bleedMarks)
659
                {
11280 jghali 660
                        PutStream("gs\n");
661
                        PutStream("[3 1 1 1] 0 setdash\n");
6954 fschmid 662
                // Bottom Left
11280 jghali 663
                        PutStream("0 "+ToStr(markOffs)+" m\n");
664
                        PutStream(ToStr(20.0)+" "+ToStr(markOffs)+" li\n");
665
                        PutStream("st\n");
666
                        PutStream(ToStr(markOffs)+" 0 m\n");
667
                        PutStream(ToStr(markOffs)+" 20 l\n");
668
                        PutStream("st\n");
6954 fschmid 669
                // Top Left
11280 jghali 670
                        PutStream("0 "+ToStr(maxBoxY-markOffs)+" m\n");
671
                        PutStream(ToStr(20.0)+" "+ToStr(maxBoxY-markOffs)+" li\n");
672
                        PutStream("st\n");
673
                        PutStream(ToStr(markOffs)+" "+ToStr(maxBoxY)+" m\n");
674
                        PutStream(ToStr(markOffs)+" "+ToStr(maxBoxY-20.0)+" li\n");
675
                        PutStream("st\n");
6954 fschmid 676
                // Bottom Right
11280 jghali 677
                        PutStream(ToStr(maxBoxX)+" "+ToStr(markOffs)+" m\n");
678
                        PutStream(ToStr(maxBoxX-20.0)+" "+ToStr(markOffs)+" li\n");
679
                        PutStream("st\n");
680
                        PutStream(ToStr(maxBoxX-markOffs)+" "+ToStr(0.0)+" m\n");
681
                        PutStream(ToStr(maxBoxX-markOffs)+" "+ToStr(20.0)+" li\n");
682
                        PutStream("st\n");
6954 fschmid 683
                // Top Right
11280 jghali 684
                        PutStream(ToStr(maxBoxX)+" "+ToStr(maxBoxY-markOffs)+" m\n");
685
                        PutStream(ToStr(maxBoxX-20.0)+" "+ToStr(maxBoxY-markOffs)+" li\n");
686
                        PutStream("st\n");
687
                        PutStream(ToStr(maxBoxX-markOffs)+" "+ToStr(maxBoxY)+" m\n");
688
                        PutStream(ToStr(maxBoxX-markOffs)+" "+ToStr(maxBoxY-20.0)+" li\n");
689
                        PutStream("st\n");
690
                        PutStream("gr\n");
6954 fschmid 691
                }
692
                if (Options.registrationMarks)
693
                {
694
                        QString regCross = "0 7 m\n14 7 li\n7 0 m\n7 14 li\n13 7 m\n13 10.31383 10.31383 13 7 13 cu\n3.68629 13 1 10.31383 1 7 cu\n1 3.68629 3.68629 1 7 1 cu\n";
695
                        regCross += "10.31383 1 13 3.68629 13 7 cu\ncl\n10.5 7 m\n10.5 8.93307 8.93307 10.5 7 10.5 cu\n5.067 10.5 3.5 8.93307 3.5 7 cu\n";
696
                        regCross += "3.5 5.067 5.067 3.5 7 3.5 cu\n8.93307 3.5 10.5 5.067 10.5 7 cu\ncl\nst\n";
11280 jghali 697
                        PutStream("gs\n");
698
                        PutStream(ToStr(maxBoxX / 2.0 - 7.0)+" 3 tr\n");
699
                        PutStream(regCross);
700
                        PutStream("gr\n");
701
                        PutStream("gs\n");
702
                        PutStream("3 "+ToStr(maxBoxY / 2.0 - 7.0)+" tr\n");
703
                        PutStream(regCross);
704
                        PutStream("gr\n");
705
                        PutStream("gs\n");
706
                        PutStream(ToStr(maxBoxX / 2.0 - 7.0)+" "+ToStr(maxBoxY - 17.0)+" tr\n");
707
                        PutStream(regCross);
708
                        PutStream("gr\n");
709
                        PutStream("gs\n");
710
                        PutStream(ToStr(maxBoxX - 17.0)+" "+ToStr(maxBoxY / 2.0 - 7.0)+" tr\n");
711
                        PutStream(regCross);
712
                        PutStream("gr\n");
6954 fschmid 713
                }
714
                if (Options.colorMarks)
715
                {
716
                        double startX = markOffs+bleedLeft+6.0;
717
                        double startY = maxBoxY - 18.0;
11280 jghali 718
                        PutStream("0 0 0 1 cmyk\n");
6954 fschmid 719
                        double col = 1.0;
720
                        for (int bl = 0; bl < 11; bl++)
721
                        {
11280 jghali 722
                                PutStream("0 0 0 "+ToStr(col)+" cmyk\n");
723
                                PutStream(ToStr(startX+bl*14.0)+" "+ToStr(startY)+" 14 14 rectfill\n");
724
                                PutStream("0 0 0 1 cmyk\n");
725
                                PutStream(ToStr(startX+bl*14.0)+" "+ToStr(startY)+" 14 14 rectstroke\n");
6954 fschmid 726
                                col -= 0.1;
727
                        }
728
                        startX = maxBoxX-bleedRight-markOffs-20.0;
11280 jghali 729
                        PutStream("0 0 0 0.5 cmyk\n");
730
                        PutStream(ToStr(startX)+" "+ToStr(startY)+" 14 14 rectfill\n");
731
                        PutStream("0 0 0 1 cmyk\n");
732
                        PutStream(ToStr(startX)+" "+ToStr(startY)+" 14 14 rectstroke\n");
6954 fschmid 733
                        startX -= 14.0;
11280 jghali 734
                        PutStream("0 0 0.5 0 cmyk\n");
735
                        PutStream(ToStr(startX)+" "+ToStr(startY)+" 14 14 rectfill\n");
736
                        PutStream("0 0 0 1 cmyk\n");
737
                        PutStream(ToStr(startX)+" "+ToStr(startY)+" 14 14 rectstroke\n");
6954 fschmid 738
                        startX -= 14.0;
11280 jghali 739
                        PutStream("0 0.5 0 0 cmyk\n");
740
                        PutStream(ToStr(startX)+" "+ToStr(startY)+" 14 14 rectfill\n");
741
                        PutStream("0 0 0 1 cmyk\n");
742
                        PutStream(ToStr(startX)+" "+ToStr(startY)+" 14 14 rectstroke\n");
6954 fschmid 743
                        startX -= 14.0;
11280 jghali 744
                        PutStream("0.5 0 0 0 cmyk\n");
745
                        PutStream(ToStr(startX)+" "+ToStr(startY)+" 14 14 rectfill\n");
746
                        PutStream("0 0 0 1 cmyk\n");
747
                        PutStream(ToStr(startX)+" "+ToStr(startY)+" 14 14 rectstroke\n");
6954 fschmid 748
                        startX -= 14.0;
11280 jghali 749
                        PutStream("1 1 0 0 cmyk\n");
750
                        PutStream(ToStr(startX)+" "+ToStr(startY)+" 14 14 rectfill\n");
751
                        PutStream("0 0 0 1 cmyk\n");
752
                        PutStream(ToStr(startX)+" "+ToStr(startY)+" 14 14 rectstroke\n");
6954 fschmid 753
                        startX -= 14.0;
11280 jghali 754
                        PutStream("1 0 1 0 cmyk\n");
755
                        PutStream(ToStr(startX)+" "+ToStr(startY)+" 14 14 rectfill\n");
756
                        PutStream("0 0 0 1 cmyk\n");
757
                        PutStream(ToStr(startX)+" "+ToStr(startY)+" 14 14 rectstroke\n");
6954 fschmid 758
                        startX -= 14.0;
11280 jghali 759
                        PutStream("0 1 1 0 cmyk\n");
760
                        PutStream(ToStr(startX)+" "+ToStr(startY)+" 14 14 rectfill\n");
761
                        PutStream("0 0 0 1 cmyk\n");
762
                        PutStream(ToStr(startX)+" "+ToStr(startY)+" 14 14 rectstroke\n");
6954 fschmid 763
                        startX -= 14.0;
11280 jghali 764
                        PutStream("0 0 0 1 cmyk\n");
765
                        PutStream(ToStr(startX)+" "+ToStr(startY)+" 14 14 rectfill\n");
766
                        PutStream("0 0 0 1 cmyk\n");
767
                        PutStream(ToStr(startX)+" "+ToStr(startY)+" 14 14 rectstroke\n");
6954 fschmid 768
                        startX -= 14.0;
11280 jghali 769
                        PutStream("0 0 1 0 cmyk\n");
770
                        PutStream(ToStr(startX)+" "+ToStr(startY)+" 14 14 rectfill\n");
771
                        PutStream("0 0 0 1 cmyk\n");
772
                        PutStream(ToStr(startX)+" "+ToStr(startY)+" 14 14 rectstroke\n");
6954 fschmid 773
                        startX -= 14.0;
11280 jghali 774
                        PutStream("0 1 0 0 cmyk\n");
775
                        PutStream(ToStr(startX)+" "+ToStr(startY)+" 14 14 rectfill\n");
776
                        PutStream("0 0 0 1 cmyk\n");
777
                        PutStream(ToStr(startX)+" "+ToStr(startY)+" 14 14 rectstroke\n");
6954 fschmid 778
                        startX -= 14.0;
11280 jghali 779
                        PutStream("1 0 0 0 cmyk\n");
780
                        PutStream(ToStr(startX)+" "+ToStr(startY)+" 14 14 rectfill\n");
781
                        PutStream("0 0 0 1 cmyk\n");
782
                        PutStream(ToStr(startX)+" "+ToStr(startY)+" 14 14 rectstroke\n");
6954 fschmid 783
                }
11280 jghali 784
                PutStream("gr\n");
6954 fschmid 785
        }
11280 jghali 786
        PutStream("sp\n");
787
        PutStream("end\n");
3136 fschmid 788
}
789
 
790
void PSLib::PS_curve(double x1, double y1, double x2, double y2, double x3, double y3)
791
{
11280 jghali 792
        PutStream(ToStr(x1) + " " + ToStr(y1) + " " + ToStr(x2) + " " + ToStr(y2) + " " + ToStr(x3) + " " + ToStr(y3) + " cu\n");
3136 fschmid 793
}
794
 
795
void PSLib::PS_moveto(double x, double y)
796
{
11280 jghali 797
        PutStream(ToStr(x) + " " + ToStr(y) + " m\n");
3136 fschmid 798
}
799
 
800
void PSLib::PS_lineto(double x, double y)
801
{
11280 jghali 802
        PutStream(ToStr(x) + " " + ToStr(y) + " li\n");
3136 fschmid 803
}
804
 
805
void PSLib::PS_closepath()
806
{
11280 jghali 807
        PutStream("cl\n");
3136 fschmid 808
}
809
 
810
void PSLib::PS_translate(double x, double y)
811
{
11280 jghali 812
        PutStream(ToStr(x) + " " + ToStr(y) + " tr\n");
3136 fschmid 813
}
814
 
815
void PSLib::PS_scale(double x, double y)
816
{
11280 jghali 817
        PutStream(ToStr(x) + " " + ToStr(y) + " sc\n");
3136 fschmid 818
}
819
 
820
void PSLib::PS_rotate(double x)
821
{
11280 jghali 822
        PutStream(ToStr(x) + " ro\n");
3136 fschmid 823
}
824
 
825
void PSLib::PS_clip(bool mu)
826
{
11280 jghali 827
        PutStream( mu ? "eoclip newpath\n" : "clip newpath\n" );
3136 fschmid 828
}
829
 
830
void PSLib::PS_save()
831
{
11280 jghali 832
        PutStream("gs\n");
3136 fschmid 833
}
834
 
835
void PSLib::PS_restore()
836
{
11280 jghali 837
        PutStream("gr\n");
3136 fschmid 838
}
839
 
840
void PSLib::PS_setcmykcolor_fill(double c, double m, double y, double k)
841
{
842
        FillColor = ToStr(c) + " " + ToStr(m) + " " + ToStr(y) + " " + ToStr(k);
843
}
844
 
845
void PSLib::PS_setcmykcolor_dummy()
846
{
11280 jghali 847
        PutStream("0 0 0 0 cmyk\n");
3136 fschmid 848
}
849
 
850
void PSLib::PS_setcmykcolor_stroke(double c, double m, double y, double k)
851
{
852
        StrokeColor = ToStr(c) + " " + ToStr(m) + " " + ToStr(y) + " " + ToStr(k);
853
}
854
 
855
void PSLib::PS_setlinewidth(double w)
856
{
11280 jghali 857
        PutStream(ToStr(w) + " sw\n");
3136 fschmid 858
        LineW = w;
859
}
860
 
9797 avox 861
void PSLib::PS_setdash(Qt::PenStyle st, double offset, QList<double> dash)
3136 fschmid 862
{
863
        if (dash.count() != 0)
864
        {
11280 jghali 865
                PutStream("[ ");
9797 avox 866
                QList<double>::iterator it;
3136 fschmid 867
                for ( it = dash.begin(); it != dash.end(); ++it )
868
                {
11280 jghali 869
                        PutStream(ToStr(*it)+" ");
3136 fschmid 870
                }
11280 jghali 871
                PutStream("] "+ToStr(offset)+" setdash\n");
3136 fschmid 872
        }
873
        else
11280 jghali 874
                PutStream("["+getDashString(st, LineW)+"] 0 setdash\n");
3136 fschmid 875
}
6954 fschmid 876
 
3136 fschmid 877
void PSLib::PS_setcapjoin(Qt::PenCapStyle ca, Qt::PenJoinStyle jo)
878
{
879
        switch (ca)
880
                {
881
                case Qt::FlatCap:
11280 jghali 882
                        PutStream("0 setlinecap\n");
3136 fschmid 883
                        break;
884
                case Qt::SquareCap:
11280 jghali 885
                        PutStream("2 setlinecap\n");
3136 fschmid 886
                        break;
887
                case Qt::RoundCap:
11280 jghali 888
                        PutStream("1 setlinecap\n");
3136 fschmid 889
                        break;
890
                default:
11280 jghali 891
                        PutStream("0 setlinecap\n");
3136 fschmid 892
                        break;
893
                }
894
        switch (jo)
895
                {
896
                case Qt::MiterJoin:
11280 jghali 897
                        PutStream("0 setlinejoin\n");
3136 fschmid 898
                        break;
899
                case Qt::BevelJoin:
11280 jghali 900
                        PutStream("2 setlinejoin\n");
3136 fschmid 901
                        break;
902
                case Qt::RoundJoin:
11280 jghali 903
                        PutStream("1 setlinejoin\n");
3136 fschmid 904
                        break;
905
                default:
11280 jghali 906
                        PutStream("0 setlinejoin\n");
3136 fschmid 907
                        break;
908
                }
909
}
910
 
911
void PSLib::PS_selectfont(QString f, double s)
912
{
11280 jghali 913
        PutStream(UsedFonts[f] + " " + ToStr(s) + " se\n");
3136 fschmid 914
}
915
 
916
void PSLib::PS_fill()
917
{
4477 fschmid 918
        if (fillRule)
11280 jghali 919
                PutStream(FillColor + " cmyk eofill\n");
4477 fschmid 920
        else
11280 jghali 921
                PutStream(FillColor + " cmyk fill\n");
3136 fschmid 922
}
923
 
9920 fschmid 924
void PSLib::PS_fillspot(QString color, double shade)
3136 fschmid 925
{
4477 fschmid 926
        if (fillRule)
11280 jghali 927
                PutStream(ToStr(shade / 100.0)+" "+spotMap[color]+" eofill\n");
4477 fschmid 928
        else
11280 jghali 929
                PutStream(ToStr(shade / 100.0)+" "+spotMap[color]+" fill\n");
3136 fschmid 930
}
931
 
9920 fschmid 932
void PSLib::PS_strokespot(QString color, double shade)
3136 fschmid 933
{
11280 jghali 934
        PutStream(ToStr(shade / 100.0)+" "+spotMap[color]+" st\n");
3136 fschmid 935
}
936
 
937
void PSLib::PS_stroke()
938
{
11280 jghali 939
        PutStream(StrokeColor + " cmyk st\n");
3136 fschmid 940
}
941
 
942
void PSLib::PS_fill_stroke()
943
{
944
        PS_save();
945
        PS_fill();
946
        PS_restore();
947
        PS_stroke();
948
}
949
 
950
void PSLib::PS_newpath()
951
{
11280 jghali 952
        PutStream("newpath\n");
3136 fschmid 953
}
954
 
9803 fschmid 955
void PSLib::PS_MultiRadGradient(double w, double h, double x, double y, QList<double> Stops, QStringList Colors, QStringList colorNames, QList<int> colorShades)
3136 fschmid 956
{
957
        bool first = true;
6485 fschmid 958
        bool oneSpot1 = false;
959
        bool oneSpot2 = false;
960
        bool twoSpot = false;
9740 fschmid 961
        int cc = 0;
962
        int mc = 0;
963
        int yc = 0;
964
        int kc = 0;
9619 jghali 965
        CMYKColor cmykValues;
11280 jghali 966
        PutStream( "clipsave\n" );
967
        PutStream("eoclip\n");
8575 jghali 968
        for (int c = 0; c < Colors.count()-1; ++c)
3136 fschmid 969
        {
6485 fschmid 970
                oneSpot1 = false;
971
                oneSpot2 = false;
972
                twoSpot = false;
973
                QString spot1 = colorNames[c];
974
                QString spot2 = colorNames[c+1];
11280 jghali 975
                PutStream("<<\n");
976
                PutStream("/ShadingType 3\n");
6485 fschmid 977
                if (DoSep)
11280 jghali 978
                        PutStream("/ColorSpace /DeviceGray\n");
6485 fschmid 979
                else
980
                {
981
                        if (spotMap.contains(colorNames[c]))
982
                                oneSpot1 = true;
983
                        else if  (spotMap.contains(colorNames[c+1]))
984
                                oneSpot2 = true;
985
                        if ((spotMap.contains(colorNames[c])) && (spotMap.contains(colorNames[c+1])))
986
                        {
987
                                oneSpot1 = false;
988
                                oneSpot2 = false;
989
                                twoSpot = true;
990
                        }
6691 fschmid 991
                        if ((!oneSpot1) && (!oneSpot2) && (!twoSpot) || (!useSpotColors) || (GraySc))
992
                        {
993
                                if (GraySc)
11280 jghali 994
                                        PutStream("/ColorSpace /DeviceGray\n");
6691 fschmid 995
                                else
11280 jghali 996
                                        PutStream("/ColorSpace /DeviceCMYK\n");
6691 fschmid 997
                        }
6485 fschmid 998
                        else
999
                        {
11280 jghali 1000
                                PutStream("/ColorSpace [ /DeviceN [");
6485 fschmid 1001
                                if (oneSpot1)
1002
                                {
11280 jghali 1003
                                        PutStream(" /Cyan /Magenta /Yellow /Black ("+spot1+") ]\n");
9619 jghali 1004
                                        ScColorEngine::getCMYKValues(m_Doc->PageColors[colorNames[c]], m_Doc, cmykValues);
1005
                                        cmykValues.getValues(cc, mc, yc, kc);
6485 fschmid 1006
                                }
1007
                                else if (oneSpot2)
1008
                                {
11280 jghali 1009
                                        PutStream(" /Cyan /Magenta /Yellow /Black ("+spot2+") ]\n");
9619 jghali 1010
                                        ScColorEngine::getCMYKValues(m_Doc->PageColors[colorNames[c+1]], m_Doc, cmykValues);
1011
                                        cmykValues.getValues(cc, mc, yc, kc);
6485 fschmid 1012
                                }
1013
                                else if (twoSpot)
1014
                                {
11280 jghali 1015
                                        PutStream(" ("+spot1+") ("+spot2+") ]\n");
6485 fschmid 1016
                                }
11280 jghali 1017
                                PutStream("/DeviceCMYK\n");
1018
                                PutStream("{\n");
6485 fschmid 1019
                                if (twoSpot)
1020
                                {
9619 jghali 1021
                                        ScColorEngine::getCMYKValues(m_Doc->PageColors[colorNames[c]], m_Doc, cmykValues);
1022
                                        cmykValues.getValues(cc, mc, yc, kc);
11280 jghali 1023
                                        PutStream("exch\n");
1024
                                        PutStream("dup "+ToStr(static_cast<double>(cc) / 255.0)+" mul exch\n");
1025
                                        PutStream("dup "+ToStr(static_cast<double>(mc) / 255.0)+" mul exch\n");
1026
                                        PutStream("dup "+ToStr(static_cast<double>(yc) / 255.0)+" mul exch\n");
1027
                                        PutStream("dup "+ToStr(static_cast<double>(kc) / 255.0)+" mul exch pop 5 -1 roll\n");
9619 jghali 1028
                                        ScColorEngine::getCMYKValues(m_Doc->PageColors[colorNames[c+1]], m_Doc, cmykValues);
1029
                                        cmykValues.getValues(cc, mc, yc, kc);
11280 jghali 1030
                                        PutStream("dup "+ToStr(static_cast<double>(cc) / 255.0)+" mul 6 -1 roll add dup 1.0 gt {pop 1.0} if 5 1 roll\n");
1031
                                        PutStream("dup "+ToStr(static_cast<double>(mc) / 255.0)+" mul 5 -1 roll add dup 1.0 gt {pop 1.0} if 4 1 roll\n");
1032
                                        PutStream("dup "+ToStr(static_cast<double>(yc) / 255.0)+" mul 4 -1 roll add dup 1.0 gt {pop 1.0} if 3 1 roll\n");
1033
                                        PutStream("dup "+ToStr(static_cast<double>(kc) / 255.0)+" mul 3 -1 roll add dup 1.0 gt {pop 1.0} if 2 1 roll pop\n");
6485 fschmid 1034
                                }
1035
                                else
1036
                                {
11280 jghali 1037
                                        PutStream("dup "+ToStr(static_cast<double>(cc) / 255.0)+" mul 6 -1 roll add dup 1.0 gt {pop 1.0} if 5 1 roll\n");
1038
                                        PutStream("dup "+ToStr(static_cast<double>(mc) / 255.0)+" mul 5 -1 roll add dup 1.0 gt {pop 1.0} if 4 1 roll\n");
1039
                                        PutStream("dup "+ToStr(static_cast<double>(yc) / 255.0)+" mul 4 -1 roll add dup 1.0 gt {pop 1.0} if 3 1 roll\n");
1040
                                        PutStream("dup "+ToStr(static_cast<double>(kc) / 255.0)+" mul 3 -1 roll add dup 1.0 gt {pop 1.0} if 2 1 roll pop\n");
6485 fschmid 1041
                                }
11280 jghali 1042
                                PutStream("} ]\n");
6485 fschmid 1043
                        }
1044
                }
11280 jghali 1045
                PutStream("/BBox [0 "+ToStr(h)+" "+ToStr(w)+" 0]\n");
3136 fschmid 1046
                if (Colors.count() == 2)
11280 jghali 1047
                        PutStream("/Extend [true true]\n");
3136 fschmid 1048
                else
1049
                {
1050
                        if (first)
11280 jghali 1051
                                PutStream("/Extend [false true]\n");
3136 fschmid 1052
                        else
1053
                        {
1054
                                if (c == Colors.count()-2)
11280 jghali 1055
                                        PutStream("/Extend [true false]\n");
3136 fschmid 1056
                                else
11280 jghali 1057
                                        PutStream("/Extend [false false]\n");
3136 fschmid 1058
                        }
1059
                }
11280 jghali 1060
                PutStream("/Coords ["+ToStr(x)+" "+ToStr(y)+" "+ToStr(Stops.at(c+1))+" "+ToStr(x)+" "+ToStr(y)+" "+ToStr(Stops.at(c))+"]\n");
1061
                PutStream("/Function\n");
1062
                PutStream("<<\n");
1063
                PutStream("/FunctionType 2\n");
1064
                PutStream("/Domain [0 1]\n");
3136 fschmid 1065
                if (DoSep)
1066
                {
1067
                        int pla = Plate - 1 < 0 ? 3 : Plate - 1;
10603 fschmid 1068
                        QStringList cols1 = Colors[c+1].split(" ", QString::SkipEmptyParts);
1069
                        QStringList cols2 = Colors[c].split(" ", QString::SkipEmptyParts);
11280 jghali 1070
                        PutStream("/C1 ["+ToStr(1-cols1[pla].toDouble())+"]\n");
1071
                        PutStream("/C0 ["+ToStr(1-cols2[pla].toDouble())+"]\n");
3136 fschmid 1072
                }
1073
                else
1074
                {
6485 fschmid 1075
                        if (useSpotColors)
1076
                        {
1077
                                if (oneSpot1)
1078
                                {
11280 jghali 1079
                                        PutStream("/C1 [0 0 0 0 "+ToStr(colorShades[c] / 100.0)+"]\n");
1080
                                        PutStream("/C0 ["+Colors[c+1]+" 0 ]\n");
6485 fschmid 1081
                                }
1082
                                else if (oneSpot2)
1083
                                {
11280 jghali 1084
                                        PutStream("/C1 ["+Colors[c]+" 0 ]\n");
1085
                                        PutStream("/C0 [0 0 0 0 "+ToStr(colorShades[c+1] / 100.0)+"]\n");
6485 fschmid 1086
                                }
1087
                                else if (twoSpot)
1088
                                {
11280 jghali 1089
                                        PutStream("/C1 ["+ToStr(colorShades[c] / 100.0)+" 0]\n");
1090
                                        PutStream("/C0 [0 "+ToStr(colorShades[c+1] / 100.0)+"]\n");
6485 fschmid 1091
                                }
1092
                                else
1093
                                {
11280 jghali 1094
                                        PutStream("/C1 ["+Colors[c]+"]\n");
1095
                                        PutStream("/C0 ["+Colors[c+1]+"]\n");
6485 fschmid 1096
                                }
1097
                        }
1098
                        else
1099
                        {
11280 jghali 1100
                                PutStream("/C1 ["+Colors[c]+"]\n");
1101
                                PutStream("/C0 ["+Colors[c+1]+"]\n");
6485 fschmid 1102
                        }
3136 fschmid 1103
                }
11280 jghali 1104
                PutStream("/N 1\n");
1105
                PutStream(">>\n");
1106
                PutStream(">>\n");
1107
                PutStream("shfill\n");
3136 fschmid 1108
                first = false;
1109
        }
11280 jghali 1110
        PutStream("cliprestore\n");
3136 fschmid 1111
}
1112
 
9803 fschmid 1113
void PSLib::PS_MultiLinGradient(double w, double h, QList<double> Stops, QStringList Colors, QStringList colorNames, QList<int> colorShades)
3136 fschmid 1114
{
1115
        bool first = true;
6485 fschmid 1116
        bool oneSpot1 = false;
1117
        bool oneSpot2 = false;
1118
        bool twoSpot = false;
9740 fschmid 1119
        int cc = 0;
1120
        int mc = 0;
1121
        int yc = 0;
1122
        int kc = 0;
9619 jghali 1123
        CMYKColor cmykValues;
11280 jghali 1124
        PutStream( "clipsave\n" );
1125
        PutStream("eoclip\n");
8575 jghali 1126
        for (int c = 0; c < Colors.count()-1; ++c)
3136 fschmid 1127
        {
6485 fschmid 1128
                oneSpot1 = false;
1129
                oneSpot2 = false;
1130
                twoSpot = false;
1131
                QRegExp badchars("[\\s\\/\\{\\[\\]\\}\\<\\>\\(\\)\\%]");
1132
                QString spot1 = colorNames[c];
1133
                QString spot2 = colorNames[c+1];
11280 jghali 1134
                PutStream("<<\n");
1135
                PutStream("/ShadingType 2\n");
6485 fschmid 1136
                if (DoSep)
11280 jghali 1137
                        PutStream("/ColorSpace /DeviceGray\n");
6485 fschmid 1138
                else
1139
                {
1140
                        if (spotMap.contains(colorNames[c]))
1141
                                oneSpot1 = true;
1142
                        else if  (spotMap.contains(colorNames[c+1]))
1143
                                oneSpot2 = true;
1144
                        if ((spotMap.contains(colorNames[c])) && (spotMap.contains(colorNames[c+1])))
1145
                        {
1146
                                oneSpot1 = false;
1147
                                oneSpot2 = false;
1148
                                twoSpot = true;
1149
                        }
6691 fschmid 1150
                        if ((!oneSpot1) && (!oneSpot2) && (!twoSpot) || (!useSpotColors) || (GraySc))
1151
                        {
1152
                                if (GraySc)
11280 jghali 1153
                                        PutStream("/ColorSpace /DeviceGray\n");
6691 fschmid 1154
                                else
11280 jghali 1155
                                        PutStream("/ColorSpace /DeviceCMYK\n");
6691 fschmid 1156
                        }
6485 fschmid 1157
                        else
1158
                        {
11280 jghali 1159
                                PutStream("/ColorSpace [ /DeviceN [");
6485 fschmid 1160
                                if (oneSpot1)
1161
                                {
11280 jghali 1162
                                        PutStream(" /Cyan /Magenta /Yellow /Black ("+spot1+") ]\n");
9619 jghali 1163
                                        ScColorEngine::getCMYKValues(m_Doc->PageColors[colorNames[c]], m_Doc, cmykValues);
1164
                                        cmykValues.getValues(cc, mc, yc, kc);
6485 fschmid 1165
                                }
1166
                                else if (oneSpot2)
1167
                                {
11280 jghali 1168
                                        PutStream(" /Cyan /Magenta /Yellow /Black ("+spot2+") ]\n");
9619 jghali 1169
                                        ScColorEngine::getCMYKValues(m_Doc->PageColors[colorNames[c+1]], m_Doc, cmykValues);
1170
                                        cmykValues.getValues(cc, mc, yc, kc);
6485 fschmid 1171
                                }
1172
                                else if (twoSpot)
1173
                                {
11280 jghali 1174
                                        PutStream(" ("+spot1+") ("+spot2+") ]\n");
6485 fschmid 1175
                                }
11280 jghali 1176
                                PutStream("/DeviceCMYK\n");
1177
                                PutStream("{\n");
6485 fschmid 1178
                                if (twoSpot)
1179
                                {
9619 jghali 1180
                                        ScColorEngine::getCMYKValues(m_Doc->PageColors[colorNames[c]], m_Doc, cmykValues);
1181
                                        cmykValues.getValues(cc, mc, yc, kc);
11280 jghali 1182
                                        PutStream("exch\n");
1183
                                        PutStream("dup "+ToStr(static_cast<double>(cc) / 255.0)+" mul exch\n");
1184
                                        PutStream("dup "+ToStr(static_cast<double>(mc) / 255.0)+" mul exch\n");
1185
                                        PutStream("dup "+ToStr(static_cast<double>(yc) / 255.0)+" mul exch\n");
1186
                                        PutStream("dup "+ToStr(static_cast<double>(kc) / 255.0)+" mul exch pop 5 -1 roll\n");
9619 jghali 1187
                                        ScColorEngine::getCMYKValues(m_Doc->PageColors[colorNames[c+1]], m_Doc, cmykValues);
1188
                                        cmykValues.getValues(cc, mc, yc, kc);
11280 jghali 1189
                                        PutStream("dup "+ToStr(static_cast<double>(cc) / 255.0)+" mul 6 -1 roll add dup 1.0 gt {pop 1.0} if 5 1 roll\n");
1190
                                        PutStream("dup "+ToStr(static_cast<double>(mc) / 255.0)+" mul 5 -1 roll add dup 1.0 gt {pop 1.0} if 4 1 roll\n");
1191
                                        PutStream("dup "+ToStr(static_cast<double>(yc) / 255.0)+" mul 4 -1 roll add dup 1.0 gt {pop 1.0} if 3 1 roll\n");
1192
                                        PutStream("dup "+ToStr(static_cast<double>(kc) / 255.0)+" mul 3 -1 roll add dup 1.0 gt {pop 1.0} if 2 1 roll pop\n");
6485 fschmid 1193
                                }
1194
                                else
1195
                                {
11280 jghali 1196
                                        PutStream("dup "+ToStr(static_cast<double>(cc) / 255.0)+" mul 6 -1 roll add dup 1.0 gt {pop 1.0} if 5 1 roll\n");
1197
                                        PutStream("dup "+ToStr(static_cast<double>(mc) / 255.0)+" mul 5 -1 roll add dup 1.0 gt {pop 1.0} if 4 1 roll\n");
1198
                                        PutStream("dup "+ToStr(static_cast<double>(yc) / 255.0)+" mul 4 -1 roll add dup 1.0 gt {pop 1.0} if 3 1 roll\n");
1199
                                        PutStream("dup "+ToStr(static_cast<double>(kc) / 255.0)+" mul 3 -1 roll add dup 1.0 gt {pop 1.0} if 2 1 roll pop\n");
6485 fschmid 1200
                                }
11280 jghali 1201
                                PutStream("} ]\n");
6485 fschmid 1202
                        }
1203
                }
11280 jghali 1204
                PutStream("/BBox [0 "+ToStr(h)+" "+ToStr(w)+" 0]\n");
3136 fschmid 1205
                if (Colors.count() == 2)
11280 jghali 1206
                        PutStream("/Extend [true true]\n");
3136 fschmid 1207
                else
1208
                {
1209
                        if (first)
11280 jghali 1210
                                PutStream("/Extend [true false]\n");
3136 fschmid 1211
                        else
1212
                        {
1213
                                if (c == Colors.count()-2)
11280 jghali 1214
                                        PutStream("/Extend [false true]\n");
3136 fschmid 1215
                                else
11280 jghali 1216
                                        PutStream("/Extend [false false]\n");
3136 fschmid 1217
                        }
1218
                }
1219
                first = false;
11280 jghali 1220
                PutStream("/Coords ["+ToStr(Stops.at(c*2))+"  "+ToStr(Stops.at(c*2+1))+" "+ToStr(Stops.at(c*2+2))+" "+ToStr(Stops.at(c*2+3))+"]\n");
1221
                PutStream("/Function\n");
1222
                PutStream("<<\n");
1223
                PutStream("/FunctionType 2\n");
1224
                PutStream("/Domain [0 1]\n");
3136 fschmid 1225
                if (DoSep)
1226
                {
1227
                        int pla = Plate - 1 < 0 ? 3 : Plate - 1;
10603 fschmid 1228
                        QStringList cols1 = Colors[c].split(" ", QString::SkipEmptyParts);
1229
                        QStringList cols2 = Colors[c+1].split(" ", QString::SkipEmptyParts);
11280 jghali 1230
                        PutStream("/C1 ["+ToStr(1-cols1[pla].toDouble())+"]\n");
1231
                        PutStream("/C0 ["+ToStr(1-cols2[pla].toDouble())+"]\n");
3136 fschmid 1232
                }
1233
                else
1234
                {
6485 fschmid 1235
                        if (useSpotColors)
1236
                        {
1237
                                if (oneSpot1)
1238
                                {
11280 jghali 1239
                                        PutStream("/C0 [0 0 0 0 "+ToStr(colorShades[c] / 100.0)+"]\n");
1240
                                        PutStream("/C1 ["+Colors[c+1]+" 0 ]\n");
6485 fschmid 1241
                                }
1242
                                else if (oneSpot2)
1243
                                {
11280 jghali 1244
                                        PutStream("/C0 ["+Colors[c]+" 0 ]\n");
1245
                                        PutStream("/C1 [0 0 0 0 "+ToStr(colorShades[c+1] / 100.0)+"]\n");
6485 fschmid 1246
                                }
1247
                                else if (twoSpot)
1248
                                {
11280 jghali 1249
                                        PutStream("/C0 ["+ToStr(colorShades[c] / 100.0)+" 0]\n");
1250
                                        PutStream("/C1 [0 "+ToStr(colorShades[c+1] / 100.0)+"]\n");
6485 fschmid 1251
                                }
1252
                                else
1253
                                {
11280 jghali 1254
                                        PutStream("/C0 ["+Colors[c]+"]\n");
1255
                                        PutStream("/C1 ["+Colors[c+1]+"]\n");
6485 fschmid 1256
                                }
1257
                        }
1258
                        else
1259
                        {
11280 jghali 1260
                                PutStream("/C0 ["+Colors[c]+"]\n");
1261
                                PutStream("/C1 ["+Colors[c+1]+"]\n");
6485 fschmid 1262
                        }
3136 fschmid 1263
                }
11280 jghali 1264
                PutStream("/N 1\n");
1265
                PutStream(">>\n");
1266
                PutStream(">>\n");
1267
                PutStream("shfill\n");
3136 fschmid 1268
        }
11280 jghali 1269
        PutStream("cliprestore\n");
3136 fschmid 1270
}
1271
 
6163 avox 1272
void PSLib::PS_show_xyG(QString font, uint glyph, double x, double y, bool spot)
3136 fschmid 1273
{
1274
        QString Name;
6163 avox 1275
        Name = GlyphsOfFont[font].contains(glyph) ? GlyphsOfFont[font][glyph].second : QString(".notdef");
3555 fschmid 1276
        if (spot)
11280 jghali 1277
                PutStream("/"+Name+" "+ToStr(x)+" "+ToStr(y)+" shgsp\n");
3555 fschmid 1278
        else
11280 jghali 1279
                PutStream("/"+Name+" "+ToStr(x)+" "+ToStr(y)+" "+StrokeColor+" shg\n");
3136 fschmid 1280
}
1281
 
1282
void PSLib::PS_show(double x, double y)
1283
{
1284
        PS_moveto(x, y);
11280 jghali 1285
        PutStream("/hyphen glyphshow\n");
3136 fschmid 1286
}
1287
 
1288
void PSLib::PS_showSub(uint chr, QString font, double size, bool stroke)
1289
{
11280 jghali 1290
        PutStream(" (G"+IToStr(chr)+") "+font+" "+ToStr(size / 10.0)+" ");
1291
        PutStream(stroke ? "shgs\n" : "shgf\n");
3136 fschmid 1292
}
1293
 
11060 jghali 1294
bool PSLib::PS_ImageData(PageItem *c, QString fn, QString Name, QString Prof, bool UseEmbedded, bool UseProf)
3136 fschmid 1295
{
1296
        bool dummy;
9535 fschmid 1297
        QByteArray tmp;
3136 fschmid 1298
        QFileInfo fi = QFileInfo(fn);
10553 fschmid 1299
        QString ext = fi.suffix().toLower();
6808 fschmid 1300
        if (ext.isEmpty())
1301
                ext = getImageType(fn);
10136 cbradney 1302
        if (extensionIndicatesEPS(ext) && (c->pixm.imgInfo.type != 7))
3136 fschmid 1303
        {
5234 fschmid 1304
                if (loadRawText(fn, tmp))
3136 fschmid 1305
                {
11280 jghali 1306
                        PutStream("currentfile 1 (%ENDEPSDATA) /SubFileDecode filter /ReusableStreamDecode filter\n");
1307
                        PutStream("%%BeginDocument: " + fi.fileName() + "\n");
5234 fschmid 1308
                        if (getDouble(QString(tmp.mid(0, 4)), true) == 0xC5D0D3C6)
3136 fschmid 1309
                        {
5234 fschmid 1310
                                char* data = tmp.data();
1311
                                uint startPos = getDouble(QString(tmp.mid(4, 4)), false);
1312
                                uint length = getDouble(QString(tmp.mid(8, 4)), false);
11280 jghali 1313
                                PutStream(data+startPos, length, false);
3136 fschmid 1314
                        }
1315
                        else
11280 jghali 1316
                                PutStream(tmp, false);
1317
                        PutStream("\n%ENDEPSDATA\n");
1318
                        PutStream("%%EndDocument\n");
1319
                        PutStream("/"+PSEncode(Name)+"Bild exch def\n");
11060 jghali 1320
                        return true;
3136 fschmid 1321
                }
11060 jghali 1322
                return false;
3136 fschmid 1323
        }
1324
        ScImage image;
5234 fschmid 1325
        QByteArray imgArray;
3136 fschmid 1326
        image.imgInfo.valid = false;
1327
        image.imgInfo.clipPath = "";
1328
        image.imgInfo.PDSpathData.clear();
1329
        image.imgInfo.layerInfo.clear();
1330
        image.imgInfo.RequestProps = c->pixm.imgInfo.RequestProps;
1331
        image.imgInfo.isRequest = c->pixm.imgInfo.isRequest;
5959 jghali 1332
        CMSettings cms(c->doc(), Prof, c->IRender);
11060 jghali 1333
        if (!image.LoadPicture(fn, cms, UseEmbedded, UseProf, ScImage::CMYKData, 300, &dummy))
1334
        {
1335
                PS_Error_ImageLoadFailure(fn);
1336
                return false;
1337
        }
3136 fschmid 1338
        image.applyEffect(c->effectsInUse, colorsToUse, true);
5234 fschmid 1339
        imgArray = image.ImageToCMYK_PS(-1, true);
11060 jghali 1340
        if (imgArray.isNull()) // Memory allocation failure
1341
        {
1342
                PS_Error_InsufficientMemory();
1343
                return false;
1344
        }
11317 jghali 1345
        QByteArray compImage = CompressArray(imgArray);
1346
        if (compImage.size() > 0)
3136 fschmid 1347
        {
11280 jghali 1348
                PutStream("currentfile /ASCII85Decode filter /FlateDecode filter /ReusableStreamDecode filter\n");
11317 jghali 1349
                PutStream(compImage, true);
1350
                compImage.resize(0);
3136 fschmid 1351
        }
1352
        else
11317 jghali 1353
        {
11280 jghali 1354
                PutStream("currentfile /ASCII85Decode filter /ReusableStreamDecode filter\n");
11317 jghali 1355
                PutStream(imgArray, true);
1356
        }
11280 jghali 1357
        PutStream("/"+PSEncode(Name)+"Bild exch def\n");
5234 fschmid 1358
        imgArray.resize(0);
11317 jghali 1359
        QByteArray maskArray = image.getAlpha(fn, false, false, 300);
6660 fschmid 1360
        if ((maskArray.size() > 0) && (c->pixm.imgInfo.type != 7))
3136 fschmid 1361
        {
11317 jghali 1362
                QByteArray compMask = CompressArray(maskArray);
1363
                if (compMask.size() > 0)
3136 fschmid 1364
                {
11280 jghali 1365
                        PutStream("currentfile /ASCII85Decode filter /FlateDecode filter /ReusableStreamDecode filter\n");
11317 jghali 1366
                        PutStream(compMask, true);
3136 fschmid 1367
                }
1368
                else
11317 jghali 1369
                {
11280 jghali 1370
                        PutStream("currentfile /ASCII85Decode filter /ReusableStreamDecode filter\n");
11317 jghali 1371
                        PutStream(maskArray, true);
1372
                }
11280 jghali 1373
                PutStream("/"+PSEncode(Name)+"Mask exch def\n");
3136 fschmid 1374
        }
11060 jghali 1375
        return true;
3136 fschmid 1376
}
1377
 
11060 jghali 1378
bool PSLib::PS_image(PageItem *c, double x, double y, QString fn, double scalex, double scaley, QString Prof, bool UseEmbedded, bool UseProf, QString Name)
3136 fschmid 1379
{
1380
        bool dummy;
9535 fschmid 1381
        QByteArray tmp;
3136 fschmid 1382
        QFileInfo fi = QFileInfo(fn);
10553 fschmid 1383
        QString ext = fi.suffix().toLower();
6808 fschmid 1384
        if (ext.isEmpty())
1385
                ext = getImageType(fn);
10136 cbradney 1386
        if (extensionIndicatesEPS(ext) && (c->pixm.imgInfo.type != 7))
3136 fschmid 1387
        {
5234 fschmid 1388
                if (loadRawText(fn, tmp))
3136 fschmid 1389
                {
11280 jghali 1390
                        PutStream("bEPS\n");
1391
                        PutStream(ToStr(PrefsManager::instance()->appPrefs.gs_Resolution / 72.0 * scalex) + " " + ToStr(PrefsManager::instance()->appPrefs.gs_Resolution / 72.0 * scaley) + " sc\n");
1392
                        PutStream(ToStr(-c->BBoxX+x * scalex) + " " + ToStr(y * scalex) + " tr\n");
3136 fschmid 1393
                        if (!Name.isEmpty())
1394
                        {
11280 jghali 1395
                                PutStream(PSEncode(Name)+"Bild cvx exec\n");
1396
                                PutStream(PSEncode(Name)+"Bild resetfile\n");
3136 fschmid 1397
                        }
1398
                        else
1399
                        {
11280 jghali 1400
                                PutStream("%%BeginDocument: " + fi.fileName() + "\n");
5234 fschmid 1401
                                        if (getDouble(QString(tmp.mid(0, 4)), true) == 0xC5D0D3C6)
3136 fschmid 1402
                                        {
5234 fschmid 1403
                                                char* data = tmp.data();
3136 fschmid 1404
                                                uint startPos = getDouble(tmp.mid(4, 4), false);
1405
                                                uint length = getDouble(tmp.mid(8, 4), false);
11280 jghali 1406
                                                PutStream(data+startPos, length, false);
3136 fschmid 1407
                                        }
1408
                                        else
11280 jghali 1409
                                                PutStream(tmp);
1410
                                        PutStream("\n%%EndDocument\n");
3136 fschmid 1411
                        }
11280 jghali 1412
                        PutStream("eEPS\n");
11060 jghali 1413
                        return true;
3136 fschmid 1414
                }
11060 jghali 1415
                return false;
3136 fschmid 1416
        }
1417
        else
1418
        {
1419
                ScImage image;
5234 fschmid 1420
                QByteArray imgArray;
3136 fschmid 1421
                image.imgInfo.valid = false;
1422
                image.imgInfo.clipPath = "";
1423
                image.imgInfo.PDSpathData.clear();
1424
                image.imgInfo.layerInfo.clear();
1425
                image.imgInfo.RequestProps = c->pixm.imgInfo.RequestProps;
1426
                image.imgInfo.isRequest = c->pixm.imgInfo.isRequest;
5959 jghali 1427
                CMSettings cms(c->doc(), Prof, c->IRender);
11060 jghali 1428
                int resolution = (c->pixm.imgInfo.type == 7) ? 72 : 300;
1429
                if ( !image.LoadPicture(fn, cms, UseEmbedded, UseProf, ScImage::CMYKData, resolution, &dummy) )
1430
                {
1431
                        PS_Error_ImageLoadFailure(fn);
1432
                        return false;
1433
                }
3136 fschmid 1434
                image.applyEffect(c->effectsInUse, colorsToUse, true);
1435
                int w = image.width();
1436
                int h = image.height();
10141 cbradney 1437
                if (extensionIndicatesPDF(ext))
3136 fschmid 1438
                {
4335 fschmid 1439
                        scalex *= PrefsManager::instance()->appPrefs.gs_Resolution / 300.0;
1440
                        scaley *= PrefsManager::instance()->appPrefs.gs_Resolution / 300.0;
3136 fschmid 1441
                }
11280 jghali 1442
                PutStream(ToStr(x*scalex) + " " + ToStr(y*scaley) + " tr\n");
1443
                PutStream(ToStr(qRound(scalex*w)) + " " + ToStr(qRound(scaley*h)) + " sc\n");
1444
                PutStream(((!DoSep) && (!GraySc)) ? "/DeviceCMYK setcolorspace\n" : "/DeviceGray setcolorspace\n");
5234 fschmid 1445
                QByteArray maskArray;
3136 fschmid 1446
                ScImage img2;
6873 fschmid 1447
                img2.imgInfo.clipPath = "";
1448
                img2.imgInfo.PDSpathData.clear();
1449
                img2.imgInfo.layerInfo.clear();
1450
                img2.imgInfo.RequestProps = c->pixm.imgInfo.RequestProps;
1451
                img2.imgInfo.isRequest = c->pixm.imgInfo.isRequest;
6661 fschmid 1452
                if (c->pixm.imgInfo.type != 7)
1453
                        maskArray = img2.getAlpha(fn, false, false, 300);
6660 fschmid 1454
                if ((maskArray.size() > 0) && (c->pixm.imgInfo.type != 7))
3136 fschmid 1455
                {
1456
                        if (DoSep)
5234 fschmid 1457
                                imgArray = image.ImageToCMYK_PS(Plate, true);
3136 fschmid 1458
                        else
5234 fschmid 1459
                                imgArray = GraySc ? image.ImageToCMYK_PS( -2, true) : image.ImageToCMYK_PS(-1, true);
11060 jghali 1460
                        if (imgArray.isNull())
1461
                        {
1462
                                PS_Error_InsufficientMemory();
1463
                                return false;
1464
                        }
3136 fschmid 1465
                        if (Name.isEmpty())
1466
                        {
11317 jghali 1467
                                QByteArray compImage = CompressArray(imgArray);
1468
                                if (compImage.size() > 0)
3136 fschmid 1469
                                {
11317 jghali 1470
                                        imgArray.resize(0);
11280 jghali 1471
                                        PutStream("currentfile /ASCII85Decode filter /FlateDecode filter /ReusableStreamDecode filter\n");
11317 jghali 1472
                                        PutStream(compImage, true);
1473
                                        compImage.resize(0);
3136 fschmid 1474
                                }
1475
                                else
11317 jghali 1476
                                {
11280 jghali 1477
                                        PutStream("currentfile /ASCII85Decode filter /ReusableStreamDecode filter\n");
11317 jghali 1478
                                        PutStream(imgArray, true);
1479
                                        imgArray.resize(0);
1480
                                }
11280 jghali 1481
                                PutStream("/Bild exch def\n");
11317 jghali 1482
                                QByteArray compMask = CompressArray(maskArray);
1483
                                if (compMask.size() > 0)
3136 fschmid 1484
                                {
11280 jghali 1485
                                        PutStream("currentfile /ASCII85Decode filter /FlateDecode filter /ReusableStreamDecode filter\n");
11317 jghali 1486
                                        PutStream(compMask, true);
3136 fschmid 1487
                                }
1488
                                else
11317 jghali 1489
                                {
11280 jghali 1490
                                        PutStream("currentfile /ASCII85Decode filter /ReusableStreamDecode filter\n");
11317 jghali 1491
                                        PutStream(maskArray, true);
1492
                                }
11280 jghali 1493
                                PutStream("/Mask exch def\n");
3136 fschmid 1494
                        }
11280 jghali 1495
                        PutStream("<<\n");
1496
                        PutStream("  /PaintType   1\n");
1497
                        PutStream("  /PatternType 1\n");
1498
                        PutStream("  /TilingType  3\n");
1499
                        PutStream("  /BBox        [ 0 0 1 1 ]\n");
1500
                        PutStream("  /XStep       2\n");
1501
                        PutStream("  /YStep       2\n");
1502
                        PutStream("  /PaintProc   {\n");
1503
                        PutStream("   pop\n");
1504
                        PutStream("   1 1 1 1 setcmykcolor\n");
1505
                        PutStream("   <<\n");
1506
                        PutStream("   /ImageType 1\n");
1507
                        PutStream("   /Height    " + IToStr(h) + "\n");
1508
                        PutStream("   /Width     " + IToStr(w) + "\n");
1509
                        PutStream("   /ImageMatrix [" + IToStr(w) + " 0 0 " + IToStr(-h) + " 0 " + IToStr(h)
3136 fschmid 1510
                                +"]\n");
1511
                        if (DoSep)
11280 jghali 1512
                                PutStream("   /Decode [1 0]\n");
3136 fschmid 1513
                        else
11280 jghali 1514
                                PutStream( GraySc ? "   /Decode [1 0]\n" : "   /Decode [0 1 0 1 0 1 0 1]\n" );
1515
                        PutStream("   /BitsPerComponent 8\n");
1516
                        PutStream("   /DataSource "+PSEncode(Name)+"Bild\n");
1517
                        PutStream("   >>\n");
1518
                        PutStream("   image\n");
1519
                        PutStream("   }\n");
1520
                        PutStream(">> matrix makepattern setpattern\n");
1521
                        PutStream("<< /ImageType 1\n");
1522
                        PutStream("   /Width " + IToStr(w) + "\n");
1523
                        PutStream("   /Height " + IToStr(h) + "\n");
1524
                        PutStream("   /BitsPerComponent 1\n");
1525
                        PutStream("   /Decode [1 0]\n");
1526
                        PutStream("   /ImageMatrix [" + IToStr(w) + " 0 0 " + IToStr(-h) + " 0 " + IToStr(h) + "]\n");
1527
                        PutStream("   /DataSource "+PSEncode(Name)+"Mask\n");
1528
                        PutStream(">>\n");
1529
                        PutStream("imagemask\n");
11317 jghali 1530
                        /* JG - Experimental code using Type3 image instead of patterns
1531
                        PutStream("<< /ImageType 3\n");
1532
                        PutStream("   /DataDict <<\n");
1533
                        PutStream("      /ImageType 1\n");
1534
                        PutStream("      /Width  " + IToStr(w) + "\n");
1535
                        PutStream("      /Height " + IToStr(h) + "\n");
1536
                        PutStream("      /BitsPerComponent 8\n");
1537
                        PutStream( (GraySc || DoSep) ? "      /Decode [1 0]\n" : "      /Decode [0 1 0 1 0 1 0 1]\n");
1538
                        PutStream("      /ImageMatrix [" + IToStr(w) + " 0 0 " + IToStr(-h) + " 0 " + IToStr(h) + "]\n");
1539
                        PutStream("      /DataSource "+PSEncode(Name)+"Bild\n");
1540
                        PutStream("      >>\n");
1541
                        PutStream("   /MaskDict <<\n");
1542
                        PutStream("      /ImageType 1\n");
1543
                        PutStream("      /Width  " + IToStr(w) + "\n");
1544
                        PutStream("      /Height " + IToStr(h) + "\n");
1545
                        PutStream("      /BitsPerComponent 1\n");
1546
                        PutStream("      /Decode [1 0]\n");
1547
                        PutStream("      /ImageMatrix [" + IToStr(w) + " 0 0 " + IToStr(-h) + " 0 " + IToStr(h) + "]\n");
1548
                        PutStream("      /DataSource "+PSEncode(Name)+"Mask\n");
1549
                        PutStream("      >>\n");
1550
                        PutStream("   /InterleaveType 3\n");
1551
                        PutStream(">>\n");
1552
                        PutStream("image\n");*/
3136 fschmid 1553
                        if (!Name.isEmpty())
1554
                        {
11280 jghali 1555
                                PutStream(PSEncode(Name)+"Bild resetfile\n");
1556
                                PutStream(PSEncode(Name)+"Mask resetfile\n");
3136 fschmid 1557
                        }
1558
                }
1559
                else
1560
                {
11280 jghali 1561
                        PutStream("<< /ImageType 1\n");
1562
                        PutStream("   /Width " + IToStr(w) + "\n");
1563
                        PutStream("   /Height " + IToStr(h) + "\n");
1564
                        PutStream("   /BitsPerComponent 8\n");
3136 fschmid 1565
                        if (DoSep)
11280 jghali 1566
                                PutStream("   /Decode [1 0]\n");
3136 fschmid 1567
                        else
11280 jghali 1568
                                PutStream( GraySc ? "   /Decode [1 0]\n" : "   /Decode [0 1 0 1 0 1 0 1]\n");
11317 jghali 1569
                        PutStream("   /ImageMatrix [" + IToStr(w) + " 0 0 " + IToStr(-h) + " 0 " + IToStr(h) + "]\n");
3136 fschmid 1570
                        if (!Name.isEmpty())
1571
                        {
11280 jghali 1572
                                PutStream("   /DataSource "+PSEncode(Name)+"Bild >>\n");
1573
                                PutStream("image\n");
1574
                                PutStream(PSEncode(Name)+"Bild resetfile\n");
3136 fschmid 1575
                        }
1576
                        else
1577
                        {
1578
                                if (DoSep)
5234 fschmid 1579
                                        imgArray = image.ImageToCMYK_PS(Plate, true);
3136 fschmid 1580
                                else
5234 fschmid 1581
                                        imgArray = GraySc ? image.ImageToCMYK_PS(-2, true) : image.ImageToCMYK_PS(-1, true);
11060 jghali 1582
                                if (imgArray.isNull())
1583
                                {
1584
                                        PS_Error_InsufficientMemory();
1585
                                        return false;
1586
                                }
11317 jghali 1587
                                QByteArray compImage = CompressArray(imgArray);
1588
                                if (compImage.size() > 0)
1589
                                {
1590
                                        PutStream("   /DataSource currentfile /ASCII85Decode filter /FlateDecode filter >>\n");
1591
                                        PutStream("image\n");
1592
                                        PutStream(compImage, true);
1593
                                }
1594
                                else
1595
                                {
1596
                                        PutStream("   /DataSource currentfile /ASCII85Decode filter >>\n");
1597
                                        PutStream("image\n");
1598
                                        PutStream(imgArray, true);
1599
                                }
3136 fschmid 1600
                        }
1601
                }
1602
        }
11060 jghali 1603
        return true;
3136 fschmid 1604
}
1605
 
1606
 
1607
void PSLib::PS_plate(int nr, QString name)
1608
{
1609
        switch (nr)
1610
        {
1611
                case 0:
11280 jghali 1612
                        PutStream("%%PlateColor Black\n");
1613
                        PutStream("/setcmykcolor {exch pop exch pop exch pop 1 exch sub oldsetgray} bind def\n");
1614
                        PutStream("/setrgbcolor {pop pop pop 1 oldsetgray} bind def\n");
3136 fschmid 1615
                        break;
1616
                case 1:
11280 jghali 1617
                        PutStream("%%PlateColor Cyan\n");
1618
                        PutStream("/setcmykcolor {pop pop pop 1 exch sub oldsetgray} bind def\n");
1619
                        PutStream("/setrgbcolor {pop pop oldsetgray} bind def\n");
3136 fschmid 1620
                        break;
1621
                case 2:
11280 jghali 1622
                        PutStream("%%PlateColor Magenta\n");
1623
                        PutStream("/setcmykcolor {pop pop exch pop 1 exch sub oldsetgray} bind def\n");
1624
                        PutStream("/setrgbcolor {pop exch pop oldsetgray} bind def\n");
3136 fschmid 1625
                        break;
1626
                case 3:
11280 jghali 1627
                        PutStream("%%PlateColor Yellow\n");
1628
                        PutStream("/setcmykcolor {pop exch pop exch pop 1 exch sub oldsetgray} bind def\n");
1629
                        PutStream("/setrgbcolor {exch pop exch pop oldsetgray} bind def\n");
3136 fschmid 1630
                        break;
1631
                default:
11280 jghali 1632
                        PutStream("%%PlateColor "+name+"\n");
1633
                        PutStream("/setcmykcolor {exch 0.11 mul add exch 0.59 mul add exch 0.3 mul add dup 1 gt {pop 1} if 1 exch sub oldsetgray} bind def\n");
1634
                        PutStream("/setrgbcolor {0.11 mul exch 0.59 mul add exch 0.3 mul add oldsetgray} bind def\n");
3136 fschmid 1635
                        break;
1636
        }
1637
        Plate = nr;
1638
        currentSpot = name;
1639
        DoSep = true;
1640
}
1641
 
1642
void PSLib::PS_setGray()
1643
{
1644
        GraySc = true;
1645
}
1646
 
1647
void PSLib::PDF_Bookmark(QString text, uint Seite)
1648
{
11280 jghali 1649
        PutStream("[/Title ("+text+") /Page "+IToStr(Seite)+" /View [/Fit]\n");
1650
        PutStream("/OUT pdfmark\n");
3136 fschmid 1651
        isPDF = true;
1652
}
1653
 
1654
void PSLib::PDF_Annotation(QString text, double x, double y, double b, double h)
1655
{
11280 jghali 1656
        PutStream("[ /Rect [ "+ToStr(static_cast<int>(x))+" "+ToStr(static_cast<int>(y))
3136 fschmid 1657
                        +" "+ToStr(static_cast<int>(b))+" "+ToStr(static_cast<int>(h))+" ]\n");
11280 jghali 1658
        PutStream("  /Contents ("+text+")\n  /Open false\n");
1659
        PutStream("/ANN pdfmark\n");
3136 fschmid 1660
        isPDF = true;
1661
}
1662
 
1663
 
1664
void PSLib::PS_close()
1665
{
11280 jghali 1666
        PutStream("%%Trailer\n");
1667
//      PutStream("end\n");
1668
        PutStream("%%EOF\n");
3136 fschmid 1669
        Spool.close();
1670
}
1671
 
1672
void PSLib::PS_insert(QString i)
1673
{
11280 jghali 1674
        PutStream(i);
3136 fschmid 1675
}
1676
 
11060 jghali 1677
void PSLib::PS_Error(const QString& message)
1678
{
1679
        ErrorMessage = message;
1680
        if (!ScCore->usingGUI())
1681
                qDebug(message.toLocal8Bit().data());
1682
}
1683
 
1684
void PSLib::PS_Error_ImageLoadFailure(const QString& fileName)
1685
{
1686
        PS_Error( tr("Failed to load an image : %1").arg(fileName) );
1687
}
1688
 
1689
void PSLib::PS_Error_InsufficientMemory(void)
1690
{
1691
        PS_Error( tr("Insufficient memory for processing an image"));
1692
}
1693
 
6954 fschmid 1694
int PSLib::CreatePS(ScribusDoc* Doc, PrintOptions &options)
3136 fschmid 1695
{
11060 jghali 1696
        bool errorOccured = false;
6954 fschmid 1697
        Options = options;
1698
        std::vector<int> &pageNs = options.pageNumbers;
1699
        bool sep = options.outputSeparations;
1700
        QString SepNam = options.separationName;
1701
        QStringList spots = options.allSeparations;
1702
        bool farb = options.useColor;
1703
        bool Hm = options.mirrorH;
1704
        bool Vm = options.mirrorV;
1705
        bool Ic = options.useICC;
1706
        bool gcr = options.doGCR;
1707
        bool doDev = options.setDevParam;
1708
        bool doClip = options.doClip;
1709
        bool over = options.doOverprint;
9922 fschmid 1710
        QStack<PageItem*> groupStack;
3136 fschmid 1711
        int sepac;
1712
        int pagemult;
5320 fschmid 1713
        doOverprint = over;
3136 fschmid 1714
        if ((sep) && (SepNam == QObject::tr("All")))
1715
                pagemult = spots.count();
1716
        else
3230 fschmid 1717
                pagemult = 1;
9797 avox 1718
        QList<double> dum;
7978 fschmid 1719
        double gx = 0.0;
1720
        double gy = 0.0;
1721
        double gw = 0.0;
1722
        double gh = 0.0;;
3136 fschmid 1723
        dum.clear();
1724
        PS_set_Info("Author", Doc->documentInfo.getAuthor());
1725
        PS_set_Info("Title", Doc->documentInfo.getTitle());
1726
        if (!farb)
1727
                PS_setGray();
6671 fschmid 1728
        applyICC = Ic;
1729
        if ((Doc->HasCMS) && (ScCore->haveCMS()) && (applyICC))
1730
                solidTransform = cmsCreateTransform(Doc->DocInputCMYKProf, TYPE_CMYK_16, Doc->DocPrinterProf, TYPE_CMYK_16, Doc->IntentColors, 0);
1731
        else
1732
                applyICC = false;
4037 cbradney 1733
        if (usingGUI)
1734
        {
1735
                QString title=QObject::tr("Exporting PostScript File");
1736
                if (Art)
1737
                        title=QObject::tr("Printing File");
10508 cbradney 1738
                progressDialog=new MultiProgressDialog(title, CommonStrings::tr_Cancel, Doc->scMW());
4037 cbradney 1739
                if (progressDialog==0)
1740
                        usingGUI=false;
1741
                else
1742
                {
1743
                        QStringList barNames, barTexts;
1744
                        barNames << "EMP" << "EP";
5370 cbradney 1745
                        barTexts << tr("Processing Master Page:") << tr("Exporting Page:");
9803 fschmid 1746
                        QList<bool> barsNumeric;
5370 cbradney 1747
                        barsNumeric << true << true;
1748
                        progressDialog->addExtraProgressBars(barNames, barTexts, barsNumeric);
4037 cbradney 1749
                        progressDialog->setOverallTotalSteps(pageNs.size()+Doc->MasterPages.count());
1750
                        progressDialog->setTotalSteps("EMP", Doc->MasterPages.count());
1751
                        progressDialog->setTotalSteps("EP", pageNs.size());
1752
                        progressDialog->setOverallProgress(0);
1753
                        progressDialog->setProgress("EMP", 0);
1754
                        progressDialog->setProgress("EP", 0);
1755
                        progressDialog->show();
8619 subik 1756
                        connect(progressDialog, SIGNAL(canceled()), this, SLOT(cancelRequested()));
4037 cbradney 1757
                        ScQApp->processEvents();
1758
                }
1759
        }
3934 cbradney 1760
        //if ((!Art) && (view->SelItem.count() != 0))
4847 cbradney 1761
        uint docSelectionCount=Doc->m_Selection->count();
3934 cbradney 1762
        if ((!Art) && (docSelectionCount != 0))
3136 fschmid 1763
        {
3394 fschmid 1764
                double minx = 99999.9;
1765
                double miny = 99999.9;
1766
                double maxx = -99999.9;
1767
                double maxy = -99999.9;
3934 cbradney 1768
                for (uint ep = 0; ep < docSelectionCount; ++ep)
3394 fschmid 1769
                {
3934 cbradney 1770
                        //PageItem* currItem = view->SelItem.at(ep);
4847 cbradney 1771
                        PageItem* currItem = Doc->m_Selection->itemAt(ep);
3394 fschmid 1772
                        double lw = currItem->lineWidth() / 2.0;
3934 cbradney 1773
                        if (currItem->rotation() != 0)
3394 fschmid 1774
                        {
1775
                                FPointArray pb;
1776
                                pb.resize(0);
3903 cbradney 1777
                                pb.addPoint(FPoint(currItem->xPos()-lw, currItem->yPos()-lw));
3934 cbradney 1778
                                pb.addPoint(FPoint(currItem->width()+lw*2.0, -lw, currItem->xPos()-lw, currItem->yPos()-lw, currItem->rotation(), 1.0, 1.0));
1779
                                pb.addPoint(FPoint(currItem->width()+lw*2.0, currItem->height()+lw*2.0, currItem->xPos()-lw, currItem->yPos()-lw, currItem->rotation(), 1.0, 1.0));
1780
                                pb.addPoint(FPoint(-lw, currItem->height()+lw*2.0, currItem->xPos()-lw, currItem->yPos()-lw, currItem->rotation(), 1.0, 1.0));
3394 fschmid 1781
                                for (uint pc = 0; pc < 4; ++pc)
1782
                                {
8562 jghali 1783
                                        minx = qMin(minx, pb.point(pc).x());
1784
                                        miny = qMin(miny, pb.point(pc).y());
1785
                                        maxx = qMax(maxx, pb.point(pc).x());
1786
                                        maxy = qMax(maxy, pb.point(pc).y());
3394 fschmid 1787
                                }
1788
                        }
1789
                        else
1790
                        {
8562 jghali 1791
                                minx = qMin(minx, currItem->xPos()-lw);
1792
                                miny = qMin(miny, currItem->yPos()-lw);
1793
                                maxx = qMax(maxx, currItem->xPos()-lw + currItem->width()+lw*2.0);
1794
                                maxy = qMax(maxy, currItem->yPos()-lw + currItem->height()+lw*2.0);
3394 fschmid 1795
                        }
1796
                }
1797
                gx = minx;
1798
                gy = miny;
1799
                gw = maxx - minx;
1800
                gh = maxy - miny;
3136 fschmid 1801
                int pgNum = pageNs[0]-1;
3724 cbradney 1802
                gx -= Doc->Pages->at(pgNum)->xOffset();
1803
                gy -= Doc->Pages->at(pgNum)->yOffset();
11060 jghali 1804
                errorOccured = !PS_begin_doc(Doc, gx, Doc->pageHeight - (gy+gh), gx + gw, Doc->pageHeight - gy, 1*pagemult, false, sep, farb, Ic, gcr, over);
3136 fschmid 1805
        }
1806
        else
4037 cbradney 1807
        {
8450 fschmid 1808
                uint a;
1809
                double maxWidth = 0.0;
1810
                double maxHeight = 0.0;
8467 avox 1811
                for (uint aa = 0; aa < pageNs.size(); ++aa)
8450 fschmid 1812
                {
1813
                        a = pageNs[aa]-1;
8562 jghali 1814
                        maxWidth = qMax(Doc->Pages->at(a)->width(), maxWidth);
1815
                        maxHeight = qMax(Doc->Pages->at(a)->height(), maxHeight);
8450 fschmid 1816
                }
11060 jghali 1817
                errorOccured = !PS_begin_doc(Doc, 0.0, 0.0, maxWidth, maxHeight, pageNs.size()*pagemult, doDev, sep, farb, Ic, gcr, over);
4037 cbradney 1818
        }
10018 fschmid 1819
        int ap=0;
11060 jghali 1820
        for (; ap < Doc->MasterPages.count() && !abortExport && !errorOccured; ++ap)
3136 fschmid 1821
        {
4037 cbradney 1822
                progressDialog->setOverallProgress(ap);
1823
                progressDialog->setProgress("EMP", ap);
1824
                ScQApp->processEvents();
3136 fschmid 1825
                if (Doc->MasterItems.count() != 0)
1826
                {
1827
                        int Lnr = 0;
10140 jghali 1828
                        ScLayer ll;
3136 fschmid 1829
                        ll.isPrintable = false;
1830
                        ll.LNr = 0;
8575 jghali 1831
                        for (int lam = 0; lam < Doc->Layers.count(); ++lam)
3136 fschmid 1832
                        {
10140 jghali 1833
                                Doc->Layers.levelToLayer(ll, Lnr);
3136 fschmid 1834
                                if (ll.isPrintable)
1835
                                {
9856 fschmid 1836
                                        for (int api = 0; api < Doc->MasterItems.count(); ++api)
3136 fschmid 1837
                                        {
1838
                                                QString tmps;
1839
                                                PageItem *it = Doc->MasterItems.at(api);
4698 cbradney 1840
                                                if ((it->LayerNr != ll.LNr) || (!it->printEnabled()))
3136 fschmid 1841
                                                        continue;
7449 fschmid 1842
/*                                              int x = static_cast<int>(Doc->MasterPages.at(ap)->xOffset());
3200 cbradney 1843
                                                int y = static_cast<int>(Doc->MasterPages.at(ap)->yOffset());
1844
                                                int w = static_cast<int>(Doc->MasterPages.at(ap)->width());
1845
                                                int h = static_cast<int>(Doc->MasterPages.at(ap)->height());
4580 cbradney 1846
                                                double ilw=it->lineWidth();
1847
                                                int x2 = static_cast<int>(it->BoundingX - ilw / 2.0);
1848
                                                int y2 = static_cast<int>(it->BoundingY - ilw / 2.0);
1849
                                                int w2 = static_cast<int>(it->BoundingW + ilw);
1850
                                                int h2 = static_cast<int>(it->BoundingH + ilw);
3136 fschmid 1851
                                                if (!QRect(x, y, w, h).intersects(QRect(x2, y2, w2, h2)))
7449 fschmid 1852
                                                        continue; */
1853
                                                double x = Doc->MasterPages.at(ap)->xOffset();
1854
                                                double y = Doc->MasterPages.at(ap)->yOffset();
1855
                                                double w = Doc->MasterPages.at(ap)->width();
1856
                                                double h1 = Doc->MasterPages.at(ap)->height();
1857
                                                double ilw = it->lineWidth();
1858
                                                double x2 = it->BoundingX - ilw / 2.0;
1859
                                                double y2 = it->BoundingY - ilw / 2.0;
1860
                                                double w2 = it->BoundingW + ilw;
1861
                                                double h2 = it->BoundingH + ilw;
8562 jghali 1862
                                                if (!( qMax( x, x2 ) <= qMin( x+w, x2+w2 ) && qMax( y, y2 ) <= qMin( y+h1, y2+h2 )))
3136 fschmid 1863
                                                        continue;
3200 cbradney 1864
                                                if ((it->OwnPage != static_cast<int>(Doc->MasterPages.at(ap)->pageNr())) && (it->OwnPage != -1))
3136 fschmid 1865
                                                        continue;
4698 cbradney 1866
                                                if ((it->asImageFrame()) && (it->PicAvail) && (!it->Pfile.isEmpty()) && (it->printEnabled()) && (!sep) && (farb))
11060 jghali 1867
                                                {
1868
                                                        errorOccured = !PS_ImageData(it, it->Pfile, it->itemName(), it->IProfile, it->UseEmbedded, Ic);
1869
                                                        if (errorOccured) break;
1870
                                                }
5685 cbradney 1871
                                                PS_TemplateStart(Doc->MasterPages.at(ap)->pageName() + tmps.setNum(it->ItemNr));
3136 fschmid 1872
                                                ProcessItem(Doc, Doc->MasterPages.at(ap), it, ap+1, sep, farb, Ic, gcr, true);
1873
                                                PS_TemplateEnd();
1874
                                        }
1875
                                }
1876
                                Lnr++;
11060 jghali 1877
                                if (errorOccured) break;
3136 fschmid 1878
                        }
1879
                }
11060 jghali 1880
                if (errorOccured) break;
3136 fschmid 1881
        }
1882
        sepac = 0;
1883
        uint aa = 0;
5781 cbradney 1884
        uint a;
11280 jghali 1885</