Subversion Repositories Scribus

Rev

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