Subversion Repositories Scribus

Rev

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

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