Subversion Repositories Scribus

Rev

Rev 2185 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
3 paul 1
/***************************************************************************
2
                          pslib.cpp  -  description
3
                             -------------------
4
    begin                : Sat May 26 2001
5
    copyright            : (C) 2001 by Franz Schmid
6
    email                : Franz.Schmid@altmuehlnet.de
7
 ***************************************************************************/
8
 
9
/***************************************************************************
10
 *                                                                         *
11
 *   This program is free software; you can redistribute it and/or modify  *
12
 *   it under the terms of the GNU General Public License as published by  *
13
 *   the Free Software Foundation; either version 2 of the License, or     *
14
 *   (at your option) any later version.                                   *
15
 *                                                                         *
16
 ***************************************************************************/
17
#include <qfileinfo.h>
18
#include <qtextstream.h>
19
#include <qimage.h>
20
#include <qcolor.h>
21
#include <qcstring.h>
22
#include <qfontinfo.h>
23
#include <cstdlib>
24
#include <qregexp.h>
128 Franz 25
 
617 cbradney 26
#ifdef _MSC_VER
27
 #if (_MSC_VER >= 1200)
28
  #include "win-config.h"
29
 #endif
128 Franz 30
#else
31
 #include "config.h"
32
#endif
33
 
3 paul 34
#include "pslib.h"
838 cbradney 35
#include "scribusdoc.h"
36
#include "scribusview.h"
3 paul 37
#include "scfonts.h"
38
#include <cmath>
39
 
456 fschmid 40
extern void Level2Layer(ScribusDoc *doc, struct Layer *ll, int Level);
1109 fschmid 41
extern uint getDouble(QString in, bool raw);
1789 fschmid 42
extern double Cwidth(ScribusDoc *doc, Foi* name, QString ch, int Siz, QString ch2 = " ");
3 paul 43
extern bool loadText(QString nam, QString *Buffer);
44
extern QString CompressStr(QString *in);
45
extern char *toHex( uchar u );
46
extern QString String2Hex(QString *in, bool lang = true);
47
 
1065 cbradney 48
extern "C" void* Run(bool psart, SCFonts &AllFonts, QMap<QString,QFont> DocFonts, ColorList DocColors, bool pdf);
3 paul 49
 
1065 cbradney 50
void* Run(bool psart, SCFonts &AllFonts, QMap<QString,QFont> DocFonts, ColorList DocColors, bool pdf)
3 paul 51
{
52
        PSLib *dia = new PSLib(psart, AllFonts, DocFonts, DocColors, pdf);
53
        return dia;
54
}
55
 
1065 cbradney 56
PSLib::PSLib(bool psart, SCFonts &AllFonts, QMap<QString,QFont> DocFonts, ColorList DocColors, bool pdf)
3 paul 57
{
58
        QString tmp, tmp2, tmp3, tmp4, CHset;
59
        QStringList wt;
60
        Seiten = 0;
61
        User = "";
456 fschmid 62
        Creator = "Scribus 1.3.0cvs";
3 paul 63
        Titel = "";
64
        FillColor = "0.0 0.0 0.0 0.0";
65
        StrokeColor = "0.0 0.0 0.0 0.0";
80 Franz 66
        Header = psart ? "%!PS-Adobe-3.0\n" : "%!PS-Adobe-3.0 EPSF-3.0\n";
3 paul 67
        BBox = "";
68
        BBoxH = "";
69
        Art = psart;
70
        isPDF = pdf;
71
        UsedFonts.clear();
72
        Fonts = "";
73
        FontDesc = "";
74
        GraySc = false;
75
        DoSep = false;
76
#ifdef HAVE_LIBZ
77
        CompAvail = true;
78
#else
79
        CompAvail = false;
80
#endif
81
        GrayCalc =  "/setcmykcolor {exch 0.11 mul add exch 0.59 mul add exch 0.3 mul add\n";
82
        GrayCalc += "               dup 1 gt {pop 1} if 1 exch sub oldsetgray} bind def\n";
83
        GrayCalc += "/setrgbcolor {0.11 mul exch 0.59 mul add exch 0.3 mul add\n";
84
        GrayCalc += "              oldsetgray} bind def\n";
85
        Farben = "%%CMYKCustomColor: ";
86
        FNamen = "%%DocumentCustomColors: ";
1065 cbradney 87
        ColorList::Iterator itf;
3 paul 88
        int c, m, y, k;
89
        bool erst = true;
90
        for (itf = DocColors.begin(); itf != DocColors.end(); ++itf)
188 Franz 91
        {
1847 subik 92
                if ((itf.key() != "Cyan") && (itf.key() != "Magenta") && (itf.key() != "Yellow") &&
188 Franz 93
                        (itf.key() != "Black"))
3 paul 94
                {
95
                        DocColors[itf.key()].getCMYK(&c, &m, &y, &k);
96
                        if (!erst)
188 Franz 97
                        {
3 paul 98
                                Farben += "%%+ ";
99
                                FNamen += "%%+ ";
188 Franz 100
                        }
1847 subik 101
                        Farben += ToStr(static_cast<double>(c) / 255) + " " +
188 Franz 102
                                        ToStr(static_cast<double>(m) / 255) + " ";
1847 subik 103
                        Farben += ToStr(static_cast<double>(y) / 255) + " " +
188 Franz 104
                                        ToStr(static_cast<double>(k) / 255) + " (" + itf.key() + ")\n";
3 paul 105
                        FNamen += "(" + itf.key() + ")\n";
106
                        erst = false;
107
                }
188 Franz 108
        }
3 paul 109
        QMap<QString,QFont>::Iterator it;
110
        int a = 0;
111
        for (it = DocFonts.begin(); it != DocFonts.end(); ++it)
188 Franz 112
        {
173 Franz 113
/* Subset all TTF Fonts until the bug in the TTF-Embedding Code is fixed */
114
                QFileInfo fd = QFileInfo(AllFonts[it.key()]->Datei);
115
                QString fext = fd.extension(false).lower();
116
 
117
                if ((fext == "ttf") || (AllFonts[it.key()]->isOTF) || (AllFonts[it.key()]->Subset))
188 Franz 118
                {
921 fschmid 119
                        FontDesc += "/"+AllFonts[it.key()]->RealName().simplifyWhiteSpace().replace( QRegExp("\\s"), "" )+
188 Franz 120
                                        " "+IToStr(AllFonts[it.key()]->RealGlyphs.count()+1)+" dict def\n";
921 fschmid 121
                        FontDesc += AllFonts[it.key()]->RealName().simplifyWhiteSpace().replace( QRegExp("\\s"), "" )+" begin\n";
68 Franz 122
                        QMap<uint,FPointArray>::Iterator ig;
1847 subik 123
                        for (ig = AllFonts[it.key()]->RealGlyphs.begin();
188 Franz 124
                                ig != AllFonts[it.key()]->RealGlyphs.end(); ++ig)
125
                        {
68 Franz 126
                                FontDesc += "/G"+IToStr(ig.key())+" { newpath\n";
127
                                FPoint np, np1, np2;
128
                                bool nPath = true;
129
                                if (ig.data().size() > 3)
188 Franz 130
                                {
131
                                        for (uint poi = 0; poi < ig.data().size()-3; poi += 4)
68 Franz 132
                                        {
188 Franz 133
                                                if (ig.data().point(poi).x() > 900000)
68 Franz 134
                                                {
135
                                                        FontDesc += "cl\n";
136
                                                        nPath = true;
137
                                                        continue;
188 Franz 138
                                                }
68 Franz 139
                                                if (nPath)
188 Franz 140
                                                {
68 Franz 141
                                                        np = ig.data().point(poi);
142
                                                        FontDesc += ToStr(np.x()) + " " + ToStr(-np.y()) + " m\n";
143
                                                        nPath = false;
188 Franz 144
                                                }
68 Franz 145
                                                np = ig.data().point(poi+1);
146
                                                np1 = ig.data().point(poi+3);
147
                                                np2 = ig.data().point(poi+2);
1847 subik 148
                                                FontDesc += ToStr(np.x()) + " " + ToStr(-np.y()) + " " +
149
                                                                ToStr(np1.x()) + " " + ToStr(-np1.y()) + " " +
188 Franz 150
                                                                ToStr(np2.x()) + " " + ToStr(-np2.y()) + " cu\n";
68 Franz 151
                                        }
188 Franz 152
                                }
68 Franz 153
                                FontDesc += "cl\n} bind def\n";
188 Franz 154
                        }
68 Franz 155
                        FontDesc += "end\n";
156
                        AllFonts[it.key()]->RealGlyphs.clear();
188 Franz 157
                }
68 Franz 158
                else
188 Franz 159
                {
68 Franz 160
                        UsedFonts.insert(it.key(), "/Fo"+IToStr(a));
921 fschmid 161
                        Fonts += "/Fo"+IToStr(a)+" /"+AllFonts[it.key()]->RealName().simplifyWhiteSpace().replace( QRegExp("\\s"), "" )+" findfont definefont pop\n";
68 Franz 162
                        if (AllFonts[it.key()]->EmbedPS)
188 Franz 163
                        {
68 Franz 164
                                QString tmp;
165
                                if(AllFonts[it.key()]->EmbedFont(tmp))
188 Franz 166
                                {
921 fschmid 167
                                        FontDesc += "%%BeginFont: " + AllFonts[it.key()]->RealName().simplifyWhiteSpace().replace( QRegExp("\\s"), "" ) + "\n";
68 Franz 168
                                        FontDesc += tmp + "\n%%EndFont\n";
3 paul 169
                                }
188 Franz 170
                        }
68 Franz 171
                        GListe gl;
172
                        AllFonts[it.key()]->GlNames(&gl);
173
                        GlyphsOfFont.insert(it.key(), gl);
174
                        a++;
3 paul 175
                }
188 Franz 176
        }
3 paul 177
        Prolog = "%%BeginProlog\n";
178
        Prolog += "/Scribusdict 100 dict def\n";
179
        Prolog += "Scribusdict begin\n";
180
        Prolog += "/sp {showpage} bind def\n";
181
        Prolog += "/oldsetgray /setgray load def\n";
182
        Prolog += "/cmyk {setcmykcolor} def\n";
183
        Prolog += "/m {moveto} bind def\n";
68 Franz 184
        Prolog += "/l {lineto} bind def\n";
3 paul 185
        Prolog += "/li {lineto} bind def\n";
68 Franz 186
        Prolog += "/cu {curveto} bind def\n";
3 paul 187
        Prolog += "/cl {closepath} bind def\n";
188
        Prolog += "/gs {gsave} bind def\n";
189
        Prolog += "/gr {grestore} bind def\n";
190
        Prolog += "/tr {translate} bind def\n";
191
        Prolog += "/ro {rotate} bind def\n";
192
        Prolog += "/sh {show} bind def\n";
193
        Prolog += "/shg {setcmykcolor moveto glyphshow} def\n";
194
        Prolog += "/sc {scale} bind def\n";
195
        Prolog += "/se {selectfont} bind def\n";
196
        Prolog += "/sf {setfont} bind def\n";
197
        Prolog += "/sw {setlinewidth} bind def\n";
198
        Prolog += "/f  {findfont} bind def\n";
199
        Prolog += "/fi {fill} bind def\n";
200
        Prolog += "/st {stroke} bind def\n";
122 Franz 201
        Prolog += "/shgf {gs dup scale begin cvx exec fill end gr} bind def\n";
68 Franz 202
        Prolog += "/shgs {gs dup 1 exch div currentlinewidth mul sw dup scale\n";
203
        Prolog += "       begin cvx exec st end gr} bind def\n";
3 paul 204
        Prolog += "/bEPS {\n";
205
        Prolog += "    /b4_Inc_state save def\n";
206
        Prolog += "    /dict_count countdictstack def\n";
207
        Prolog += "    /op_count count 1 sub def\n";
208
        Prolog += "    userdict begin\n";
209
        Prolog += "    /showpage { } def\n";
210
        Prolog += "    0 setgray 0 setlinecap\n";
211
        Prolog += "    1 setlinewidth 0 setlinejoin\n";
212
        Prolog += "    10 setmiterlimit [ ] 0 setdash newpath\n";
213
        Prolog += "    /languagelevel where\n";
214
        Prolog += "    {pop languagelevel\n";
215
        Prolog += "    1 ne\n";
216
        Prolog += "    {false setstrokeadjust false setoverprint\n";
217
        Prolog += "    } if } if } bind def\n";
218
        Prolog += "/eEPS { count op_count sub {pop} repeat\n";
219
        Prolog += "    countdictstack dict_count sub {end} repeat\n";
220
        Prolog += "    b4_Inc_state restore } bind def\n";
221
        Prolog += "    end\n";
222
        Prolog += "%%EndProlog\n";
223
}
224
 
225
void PSLib::PutSeite(QString c)
226
{
227
        QTextStream t(&Spool);
228
        t.writeRawBytes(c, c.length());
229
}
230
 
231
void PSLib::PutDoc(QString c)
232
{
233
        QTextStream t(&Spool);
234
        t.writeRawBytes(c, c.length());
235
}
236
 
80 Franz 237
QString PSLib::ToStr(double c)
3 paul 238
{
239
        QString cc;
240
        return cc.setNum(c);
241
}
242
 
243
QString PSLib::IToStr(int c)
244
{
245
        QString cc;
246
        return cc.setNum(c);
247
}
248
 
249
void PSLib::PS_set_Info(QString art, QString was)
250
{
251
        if (art == "Author")
252
                User = was;
253
        if (art == "Creator")
254
                Creator = was;
255
        if (art == "Title")
256
                Titel = was;
257
}
258
 
259
bool PSLib::PS_set_file(QString fn)
260
{
261
        Spool.setName(fn);
262
        return Spool.open(IO_WriteOnly);
263
}
264
 
1861 fschmid 265
void PSLib::PS_begin_doc(int, double x, double y, double breite, double hoehe, int numpage, bool doDev)
3 paul 266
{
267
        PutDoc(Header);
268
        PutDoc("%%For: " + User + "\n");
269
        PutDoc("%%Title: " + Titel + "\n");
270
        PutDoc("%%Creator: " + Creator + "\n");
271
        PutDoc("%%Pages: " + IToStr(numpage) + "\n");
331 Franz 272
        BBox = "%%BoundingBox: " + IToStr(qRound(x)) + " " + IToStr(qRound(y)) + " " + IToStr(qRound(breite)) + " " + IToStr(qRound(hoehe)) + "\n";
273
        BBoxH = "%%HiResBoundingBox: " + ToStr(x) + " " + ToStr(y) + " " + ToStr(breite) + " " + ToStr(hoehe) + "\n";
188 Franz 274
        if (!Art)
275
        {
3 paul 276
                PutDoc(BBox);
277
                PutDoc(BBoxH);
188 Franz 278
        }
3 paul 279
        PutDoc(FNamen);
280
        PutDoc(Farben);
281
        PutDoc("%%LanguageLevel: 3\n");
282
        PutDoc("%%EndComments\n");
283
        PutDoc(Prolog);
284
        PutDoc("%%BeginSetup\n");
285
        PutDoc("/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse\n");
286
        if (FontDesc != "")
287
                PutDoc(FontDesc);
288
        PutDoc("Scribusdict begin\n");
289
        PutDoc(Fonts);
290
        if (GraySc)
291
                PutDoc(GrayCalc);
1861 fschmid 292
        if ((Art) && (doDev))
3 paul 293
        {
294
                PutSeite("<< /PageSize [ "+ToStr(breite)+" "+ToStr(hoehe)+" ]\n");
295
                PutSeite(">> setpagedevice\n");
1861 fschmid 296
        }
297
        PutDoc("%%EndSetup\n");
3 paul 298
        Prolog = "";
299
        FontDesc = "";
300
}
301
 
302
QString PSLib::PSEncode(QString in)
303
{
304
        QString tmp = "";
305
        QString cc;
306
        for (uint d = 0; d < in.length(); ++d)
188 Franz 307
        {
3 paul 308
                cc = in.at(d);
309
                if ((cc == "(") || (cc == ")") || (cc == "\\"))
310
                        tmp += "\\";
311
                tmp += cc;
188 Franz 312
        }
3 paul 313
        tmp = tmp.simplifyWhiteSpace().replace( QRegExp("\\s"), "" );
314
        return tmp;
315
}
316
 
1847 subik 317
void PSLib::PS_TemplateStart(QString Name, double /*breite*/, double /*hoehe*/)
3 paul 318
{
910 fschmid 319
        PutDoc("/"+PSEncode(Name)+"\n{\n");
3 paul 320
}
321
 
322
void PSLib::PS_UseTemplate(QString Name)
323
{
910 fschmid 324
        PutDoc(PSEncode(Name)+"\n");
3 paul 325
}
326
 
327
void PSLib::PS_TemplateEnd()
328
{
910 fschmid 329
        PutDoc("} bind def\n");
3 paul 330
}
331
 
1065 cbradney 332
void PSLib::PS_begin_page(double breite, double hoehe, struct MarginStruct* Ma, bool Clipping)
3 paul 333
{
222 Franz 334
        if (Clipping)
335
        {
336
                PDev = ToStr(Ma->Left) + " " + ToStr(Ma->Bottom) + " m\n";
337
                PDev += ToStr(breite - Ma->Right) + " " + ToStr(Ma->Bottom) + " li\n";
338
                PDev += ToStr(breite - Ma->Right) + " " + ToStr(hoehe - Ma->Top) + " li\n";
339
                PDev += ToStr(Ma->Left) + " " + ToStr(hoehe - Ma->Top) + " li cl clip newpath\n";
340
        }
3 paul 341
        Seiten++;
222 Franz 342
        PutSeite("%%Page: " + IToStr(Seiten) + " " + IToStr(Seiten) + "\nsave\n");
343
        if (Clipping)
344
                PutSeite(PDev);
188 Franz 345
        PutSeite("/DeviceCMYK setcolorspace\n");
3 paul 346
}
347
 
348
void PSLib::PS_end_page()
349
{
350
        PutSeite("%%PageTrailer\nrestore\nsp\n");
351
}
352
 
80 Franz 353
void PSLib::PS_curve(double x1, double y1, double x2, double y2, double x3, double y3)
3 paul 354
{
1847 subik 355
        PutSeite(ToStr(x1) + " " + ToStr(y1) + " " + ToStr(x2) + " " + ToStr(y2) + " " + ToStr(x3) + " " +
188 Franz 356
                        ToStr(y3) + " curveto\n");
3 paul 357
}
358
 
80 Franz 359
void PSLib::PS_moveto(double x, double y)
3 paul 360
{
361
        PutSeite(ToStr(x) + " " + ToStr(y) + " m\n");
362
}
363
 
80 Franz 364
void PSLib::PS_lineto(double x, double y)
3 paul 365
{
366
        PutSeite(ToStr(x) + " " + ToStr(y) + " li\n");
367
}
368
 
369
void PSLib::PS_closepath()
370
{
371
        PutSeite("cl\n");
372
}
373
 
80 Franz 374
void PSLib::PS_translate(double x, double y)
3 paul 375
{
376
        PutSeite(ToStr(x) + " " + ToStr(y) + " tr\n");
377
}
378
 
80 Franz 379
void PSLib::PS_scale(double x, double y)
3 paul 380
{
381
        PutSeite(ToStr(x) + " " + ToStr(y) + " sc\n");
382
}
383
 
80 Franz 384
void PSLib::PS_rotate(double x)
3 paul 385
{
386
        PutSeite(ToStr(x) + " ro\n");
387
}
388
 
389
void PSLib::PS_clip(bool mu)
390
{
80 Franz 391
        PutSeite( mu ? "eoclip newpath\n" : "clip newpath\n" );
3 paul 392
}
393
 
394
void PSLib::PS_save()
395
{
396
        PutSeite("gs\n");
397
}
398
 
399
void PSLib::PS_restore()
400
{
401
        PutSeite("gr\n");
402
}
403
 
80 Franz 404
void PSLib::PS_setcmykcolor_fill(double c, double m, double y, double k)
3 paul 405
{
406
        FillColor = ToStr(c) + " " + ToStr(m) + " " + ToStr(y) + " " + ToStr(k);
407
}
408
 
409
void PSLib::PS_setcmykcolor_dummy()
410
{
411
        PutSeite("0 0 0 0 cmyk\n");
412
}
413
 
80 Franz 414
void PSLib::PS_setcmykcolor_stroke(double c, double m, double y, double k)
3 paul 415
{
416
        StrokeColor = ToStr(c) + " " + ToStr(m) + " " + ToStr(y) + " " + ToStr(k);
417
}
418
 
80 Franz 419
void PSLib::PS_setlinewidth(double w)
3 paul 420
{
421
        PutSeite(ToStr(w) + " sw\n");
422
        LineW = w;
423
}
424
 
292 Franz 425
void PSLib::PS_setdash(Qt::PenStyle st, double offset, QValueList<double> dash)
3 paul 426
{
292 Franz 427
        QString Dt = ToStr(QMAX(2*LineW, 1));
428
        QString Da = ToStr(QMAX(6*LineW, 1));
429
        if (dash.count() != 0)
188 Franz 430
        {
292 Franz 431
                PutSeite("[ ");
432
                QValueList<double>::iterator it;
433
                for ( it = dash.begin(); it != dash.end(); ++it )
434
                {
435
                        PutSeite(IToStr(static_cast<int>(*it))+" ");
436
                }
437
                PutSeite("] "+IToStr(static_cast<int>(offset))+" setdash\n");
188 Franz 438
        }
292 Franz 439
        else
440
        {
441
                switch (st)
442
                {
443
                        case Qt::SolidLine:
444
                                PutSeite("[] 0 setdash\n");
445
                                break;
446
                        case Qt::DashLine:
447
                                PutSeite("["+Da+" "+Dt+"] 0 setdash\n");
448
                                break;
449
                        case Qt::DotLine:
450
                                PutSeite("["+Dt+"] 0 setdash\n");
451
                                break;
452
                        case Qt::DashDotLine:
453
                                PutSeite("["+Da+" "+Dt+" "+Dt+" "+Dt+"] 0 setdash\n");
454
                                break;
455
                        case Qt::DashDotDotLine:
456
                                PutSeite("["+Da+" "+Dt+" "+Dt+" "+Dt+" "+Dt+" "+Dt+"] 0 setdash\n");
457
                                break;
458
                        default:
459
                                PutSeite("[] 0 setdash\n");
460
                                break;
461
                }
462
        }
463
}
464
void PSLib::PS_setcapjoin(Qt::PenCapStyle ca, Qt::PenJoinStyle jo)
465
{
3 paul 466
        switch (ca)
467
                {
468
                case Qt::FlatCap:
469
                        PutSeite("0 setlinecap\n");
470
                        break;
471
                case Qt::SquareCap:
472
                        PutSeite("2 setlinecap\n");
473
                        break;
474
                case Qt::RoundCap:
475
                        PutSeite("1 setlinecap\n");
476
                        break;
477
                default:
478
                        PutSeite("0 setlinecap\n");
479
                        break;
480
                }
481
        switch (jo)
482
                {
483
                case Qt::MiterJoin:
484
                        PutSeite("0 setlinejoin\n");
485
                        break;
486
                case Qt::BevelJoin:
487
                        PutSeite("2 setlinejoin\n");
488
                        break;
489
                case Qt::RoundJoin:
490
                        PutSeite("1 setlinejoin\n");
491
                        break;
492
                default:
493
                        PutSeite("0 setlinejoin\n");
494
                        break;
495
                }
496
}
497
 
111 Franz 498
void PSLib::PS_selectfont(QString f, double s)
3 paul 499
{
111 Franz 500
        PutSeite(UsedFonts[f] + " " + ToStr(s) + " se\n");
3 paul 501
}
502
 
271 Franz 503
void PSLib::PS_fill()
3 paul 504
{
271 Franz 505
        PutSeite(FillColor + " cmyk eofill\n");
3 paul 506
}
507
 
508
void PSLib::PS_stroke()
509
{
510
        PutSeite(StrokeColor + " cmyk st\n");
511
}
512
 
271 Franz 513
void PSLib::PS_fill_stroke()
3 paul 514
{
515
        PS_save();
271 Franz 516
        PS_fill();
3 paul 517
        PS_restore();
518
        PS_stroke();
519
}
520
 
521
void PSLib::PS_newpath()
522
{
523
        PutSeite("newpath\n");
524
}
525
 
297 Franz 526
void PSLib::PS_MultiRadGradient(double w, double h, double x, double y, QValueList<double> Stops, QStringList Colors)
295 Franz 527
{
528
        bool first = true;
529
        PutSeite( "clipsave\n" );
530
        PutSeite("eoclip\n");
531
        for (uint c = 0; c < Colors.count()-1; ++c)
532
        {
533
                PutSeite("<<\n");
534
                PutSeite("/ShadingType 3\n");
535
                PutSeite( DoSep ? "/ColorSpace /DeviceGray\n" : "/ColorSpace /DeviceCMYK\n" );
536
                PutSeite("/BBox [0 "+ToStr(h)+" "+ToStr(w)+" 0]\n");
326 Franz 537
                if (Colors.count() == 2)
538
                        PutDoc("/Extend [true true]\n");
295 Franz 539
                else
540
                {
326 Franz 541
                        if (first)
542
                                PutSeite("/Extend [false true]\n");
295 Franz 543
                        else
326 Franz 544
                        {
545
                                if (c == Colors.count()-2)
546
                                        PutSeite("/Extend [true false]\n");
547
                                else
548
                                        PutSeite("/Extend [false false]\n");
549
                        }
295 Franz 550
                }
297 Franz 551
                PutSeite("/Coords ["+ToStr(x)+" "+ToStr(y)+" "+ToStr((*Stops.at(c+1)))+" "+ToStr(x)+" "+ToStr(y)+" "+ToStr((*Stops.at(c)))+"]\n");
295 Franz 552
                PutSeite("/Function\n");
553
                PutSeite("<<\n");
554
                PutSeite("/FunctionType 2\n");
555
                PutSeite("/Domain [0 1]\n");
556
                if (DoSep)
557
                {
558
                        int pla = Plate - 1 < 0 ? 3 : Plate - 1;
559
                        QStringList cols1 = QStringList::split(" ", Colors[c+1]);
560
                        QStringList cols2 = QStringList::split(" ", Colors[c]);
561
                        PutSeite("/C1 ["+ToStr(1-cols1[pla].toDouble())+"]\n");
562
                        PutSeite("/C0 ["+ToStr(1-cols2[pla].toDouble())+"]\n");
563
                }
564
                else
565
                {
566
                        PutSeite("/C0 ["+Colors[c+1]+"]\n");
567
                        PutSeite("/C1 ["+Colors[c]+"]\n");
568
                }
569
                PutSeite("/N 1\n");
570
                PutSeite(">>\n");
571
                PutSeite(">>\n");
572
                PutSeite("shfill\n");
573
                first = false;
574
        }
575
        PutSeite("cliprestore\n");
576
}
577
 
578
void PSLib::PS_MultiLinGradient(double w, double h, QValueList<double> Stops, QStringList Colors)
579
{
580
        bool first = true;
581
        PutSeite( "clipsave\n" );
582
        PutSeite("eoclip\n");
583
        for (uint c = 0; c < Colors.count()-1; ++c)
584
        {
585
                PutSeite("<<\n");
586
                PutSeite("/ShadingType 2\n");
587
                PutSeite( DoSep ? "/ColorSpace /DeviceGray\n" : "/ColorSpace /DeviceCMYK\n" );
588
                PutSeite("/BBox [0 "+ToStr(h)+" "+ToStr(w)+" 0]\n");
328 Franz 589
                if (Colors.count() == 2)
590
                        PutDoc("/Extend [true true]\n");
295 Franz 591
                else
592
                {
328 Franz 593
                        if (first)
594
                                PutSeite("/Extend [true false]\n");
295 Franz 595
                        else
328 Franz 596
                        {
597
                                if (c == Colors.count()-2)
598
                                        PutSeite("/Extend [false true]\n");
599
                                else
600
                                        PutSeite("/Extend [false false]\n");
601
                        }
295 Franz 602
                }
603
                first = false;
604
                PutSeite("/Coords ["+ToStr((*Stops.at(c*2)))+"  "+ToStr((*Stops.at(c*2+1)))+" "+ToStr((*Stops.at(c*2+2)))+" "+ToStr((*Stops.at(c*2+3)))+"]\n");
605
                PutSeite("/Function\n");
606
                PutSeite("<<\n");
607
                PutSeite("/FunctionType 2\n");
608
                PutSeite("/Domain [0 1]\n");
609
                if (DoSep)
610
                {
611
                        int pla = Plate - 1 < 0 ? 3 : Plate - 1;
612
                        QStringList cols1 = QStringList::split(" ", Colors[c]);
613
                        QStringList cols2 = QStringList::split(" ", Colors[c+1]);
614
                        PutSeite("/C1 ["+ToStr(1-cols1[pla].toDouble())+"]\n");
615
                        PutSeite("/C0 ["+ToStr(1-cols2[pla].toDouble())+"]\n");
616
                }
617
                else
618
                {
619
                        PutSeite("/C0 ["+Colors[c]+"]\n");
620
                        PutSeite("/C1 ["+Colors[c+1]+"]\n");
621
                }
622
                PutSeite("/N 1\n");
623
                PutSeite(">>\n");
624
                PutSeite(">>\n");
625
                PutSeite("shfill\n");
626
        }
627
        PutSeite("cliprestore\n");
628
}
629
 
80 Franz 630
void PSLib::PS_show_xyG(QString font, QString ch, double x, double y)
3 paul 631
{
632
        QString Name;
633
        uint cc = ch[0].unicode();
80 Franz 634
        Name = GlyphsOfFont[font].contains(cc) ? GlyphsOfFont[font][cc] : QString(".notdef");
3 paul 635
        PutSeite("/"+Name+" "+ToStr(x)+" "+ToStr(y)+" "+StrokeColor+" shg\n");
636
}
637
 
80 Franz 638
void PSLib::PS_show(double x, double y)
3 paul 639
{
640
        PS_moveto(x, y);
641
        PutSeite("/hyphen glyphshow\n");
642
}
643
 
111 Franz 644
void PSLib::PS_showSub(uint chr, QString font, double size, bool stroke)
68 Franz 645
{
646
        PutSeite(FillColor + " cmyk (G"+IToStr(chr)+") "+font+" "+ToStr(size / 10.0)+" ");
80 Franz 647
        PutSeite(stroke ? "shgs\n" : "shgf\n");
68 Franz 648
}
649
 
2061 fschmid 650
void PSLib::PS_ImageData(PageItem *c, QString fn, QString Name, QString Prof, bool UseEmbedded, bool UseProf)
3 paul 651
{
1735 fschmid 652
        bool dummy;
3 paul 653
        QString tmp;
654
        QFileInfo fi = QFileInfo(fn);
655
        QString ext = fi.extension(false).lower();
656
        if (ext == "eps")
188 Franz 657
        {
658
                if (loadText(fn, &tmp))
3 paul 659
                {
660
                        PutSeite("currentfile 1 (%ENDEPSDATA) /SubFileDecode filter /ReusableStreamDecode filter\n");
1109 fschmid 661
                        PutSeite("%%BeginDocument: " + fi.fileName() + "\n");
662
                        if (getDouble(tmp.mid(0, 4), true) == 0xC5D0D3C6)
663
                        {
664
                                uint startPos = getDouble(tmp.mid(4, 4), false);
665
                                uint length = getDouble(tmp.mid(8, 4), false);
666
                                PutSeite(tmp.mid(startPos, length)+"\n");
667
                        }
668
                        else
669
                                PutSeite(tmp+"\n");
670
                        PutSeite("%ENDEPSDATA\n");
671
                        PutSeite("%%EndDocument\n");
3 paul 672
                        PutSeite("/"+PSEncode(Name)+"Bild exch def\n");
188 Franz 673
                }
3 paul 674
                return;
188 Franz 675
        }
676
        QString ImgStr = "";
2004 fschmid 677
        ScImage image;
678
        image.imgInfo.valid = false;
679
        image.imgInfo.clipPath = "";
680
        image.imgInfo.PDSpathData.clear();
681
        image.imgInfo.layerInfo.clear();
682
        image.imgInfo.RequestProps = c->pixm.imgInfo.RequestProps;
683
        image.imgInfo.isRequest = c->pixm.imgInfo.isRequest;
684
        image.LoadPicture(fn, Prof, 0, UseEmbedded, UseProf, 0, 300, &dummy);
2074 fschmid 685
        image.applyEffect(c->effectsInUse, c->Doc->PageColors, true);
2004 fschmid 686
        ImgStr = image.ImageToCMYK_PS(-1, true);
3 paul 687
        if (CompAvail)
188 Franz 688
        {
3 paul 689
                PutSeite("currentfile /ASCIIHexDecode filter /FlateDecode filter /ReusableStreamDecode filter\n");
690
                ImgStr = CompressStr(&ImgStr);
188 Franz 691
        }
3 paul 692
        else
693
                PutSeite("currentfile /ASCIIHexDecode filter /ReusableStreamDecode filter\n");
694
        ImgStr = String2Hex(&ImgStr);
695
        PutSeite(ImgStr);
696
        PutSeite("\n>\n");
697
        PutSeite("/"+PSEncode(Name)+"Bild exch def\n");
698
        ImgStr = "";
1505 fschmid 699
        QString iMask = "";
2004 fschmid 700
        iMask = image.getAlpha(fn, false, false);
1505 fschmid 701
        if (iMask != "")
1488 fschmid 702
        {
3 paul 703
                if (CompAvail)
188 Franz 704
                {
3 paul 705
                        PutSeite("currentfile /ASCIIHexDecode filter /FlateDecode filter /ReusableStreamDecode filter\n");
1505 fschmid 706
                        iMask = CompressStr(&iMask);
188 Franz 707
                }
3 paul 708
                else
709
                        PutSeite("currentfile /ASCIIHexDecode filter /ReusableStreamDecode filter\n");
1505 fschmid 710
                iMask = String2Hex(&iMask);
711
                PutSeite(iMask);
3 paul 712
                PutSeite("\n>\n");
713
                PutSeite("/"+PSEncode(Name)+"Mask exch def\n");
188 Franz 714
        }
3 paul 715
}
716
 
2061 fschmid 717
void PSLib::PS_image(PageItem *c, double x, double y, QString fn, double scalex, double scaley, QString Prof, bool UseEmbedded, bool UseProf, QString Name)
3 paul 718
{
1735 fschmid 719
        bool dummy;
3 paul 720
        QString tmp;
721
        QFileInfo fi = QFileInfo(fn);
722
        QString ext = fi.extension(false).lower();
723
        if (ext == "eps")
188 Franz 724
        {
725
                if (loadText(fn, &tmp))
3 paul 726
                {
188 Franz 727
                        PutSeite("bEPS\n");
728
                        PutSeite(ToStr(scalex) + " " + ToStr(scaley) + " sc\n");
729
                        PutSeite(ToStr(x) + " " + ToStr(y) + " tr\n");
730
                        if (Name != "")
3 paul 731
                        {
188 Franz 732
                                PutSeite(PSEncode(Name)+"Bild cvx exec\n");
733
                                PutSeite(PSEncode(Name)+"Bild resetfile\n");
3 paul 734
                        }
188 Franz 735
                        else
736
                        {
737
                                PutSeite("%%BeginDocument: " + fi.fileName() + "\n");
1109 fschmid 738
                                        if (getDouble(tmp.mid(0, 4), true) == 0xC5D0D3C6)
739
                                        {
740
                                                uint startPos = getDouble(tmp.mid(4, 4), false);
741
                                                uint length = getDouble(tmp.mid(8, 4), false);
742
                                                PutSeite(tmp.mid(startPos, length)+"\n");
743
                                        }
744
                                        else
745
                                                PutSeite(tmp+"\n");
746
                                        PutSeite("%%EndDocument\n");
188 Franz 747
                        }
748
                        PutSeite("eEPS\n");
3 paul 749
                }
188 Franz 750
        }
3 paul 751
        else
188 Franz 752
        {
1488 fschmid 753
                QString ImgStr = "";
2004 fschmid 754
                ScImage image;
755
                image.imgInfo.valid = false;
756
                image.imgInfo.clipPath = "";
757
                image.imgInfo.PDSpathData.clear();
758
                image.imgInfo.layerInfo.clear();
759
                image.imgInfo.RequestProps = c->pixm.imgInfo.RequestProps;
760
                image.imgInfo.isRequest = c->pixm.imgInfo.isRequest;
761
                image.LoadPicture(fn, Prof, 0, UseEmbedded, UseProf, 0, 300, &dummy);
2074 fschmid 762
                image.applyEffect(c->effectsInUse, c->Doc->PageColors, true);
3 paul 763
                int w = image.width();
764
                int h = image.height();
1488 fschmid 765
                if (ext == "pdf")
766
                {
767
                        scalex *= 72.0 / 300.0;
768
                        scaley *= 72.0 / 300.0;
769
                }
770
                PutSeite(ToStr(x*scalex) + " " + ToStr(y*scaley) + " tr\n");
771
                PutSeite(ToStr(scalex*w) + " " + ToStr(scaley*h) + " sc\n");
772
                PutSeite(((!DoSep) && (!GraySc)) ? "/DeviceCMYK setcolorspace\n" : "/DeviceGray setcolorspace\n");
1505 fschmid 773
                QString iMask = "";
2004 fschmid 774
                ScImage img2;
775
                iMask = img2.getAlpha(fn, false, false);
1505 fschmid 776
                if (iMask != "")
1488 fschmid 777
                {
3 paul 778
                        if (DoSep)
2004 fschmid 779
                                ImgStr = image.ImageToCMYK_PS(Plate, true);
3 paul 780
                        else
2004 fschmid 781
                                ImgStr = GraySc ? image.ImageToCMYK_PS( -2, true) : image.ImageToCMYK_PS(-1, true);
3 paul 782
                        if (Name == "")
188 Franz 783
                        {
784
                                if (CompAvail)
3 paul 785
                                {
786
                                        PutSeite("currentfile /ASCIIHexDecode filter /FlateDecode filter /ReusableStreamDecode filter\n");
787
                                        ImgStr = CompressStr(&ImgStr);
188 Franz 788
                                }
3 paul 789
                                else
790
                                        PutSeite("currentfile /ASCIIHexDecode filter /ReusableStreamDecode filter\n");
791
                                ImgStr = String2Hex(&ImgStr);
792
                                PutSeite(ImgStr);
793
                                ImgStr = "";
794
                                PutSeite("\n>\n");
795
                                PutSeite("/Bild exch def\n");
796
                                if (CompAvail)
188 Franz 797
                                {
3 paul 798
                                        PutSeite("currentfile /ASCIIHexDecode filter /FlateDecode filter /ReusableStreamDecode filter\n");
1505 fschmid 799
                                        iMask = CompressStr(&iMask);
188 Franz 800
                                }
3 paul 801
                                else
802
                                        PutSeite("currentfile /ASCIIHexDecode filter /ReusableStreamDecode filter\n");
1505 fschmid 803
                                iMask = String2Hex(&iMask);
804
                                PutSeite(iMask);
3 paul 805
                                PutSeite("\n>\n");
806
                                PutSeite("/Mask exch def\n");
188 Franz 807
                        }
3 paul 808
                        PutSeite("<<\n");
809
                        PutSeite("  /PaintType   1\n");
810
                        PutSeite("  /PatternType 1\n");
811
                        PutSeite("  /TilingType  3\n");
812
                        PutSeite("  /BBox        [ 0 0 1 1 ]\n");
813
                        PutSeite("  /XStep       2\n");
814
                        PutSeite("  /YStep       2\n");
815
                        PutSeite("  /PaintProc   {\n");
816
                        PutSeite("   pop\n");
817
                        PutSeite("   1 1 1 1 setcmykcolor\n");
818
                        PutSeite("   <<\n");
819
                        PutSeite("   /ImageType 1\n");
820
                        PutSeite("   /Height    " + IToStr(h) + "\n");
821
                        PutSeite("   /Width     " + IToStr(w) + "\n");
1847 subik 822
                        PutSeite("   /ImageMatrix [" + IToStr(w) + " 0 0 " + IToStr(-h) + " 0 " + IToStr(h)
188 Franz 823
                                +"]\n");
3 paul 824
                        if (DoSep)
825
                                PutSeite("   /Decode [1 0]\n");
826
                        else
80 Franz 827
                                PutSeite( GraySc ? "   /Decode [1 0]\n" : "   /Decode [0 1 0 1 0 1 0 1]\n" );
3 paul 828
                        PutSeite("   /BitsPerComponent 8\n");
829
                        PutSeite("   /DataSource "+PSEncode(Name)+"Bild\n");
830
                        PutSeite("   >>\n");
831
                        PutSeite("   image\n");
832
                        PutSeite("   }\n");
833
                        PutSeite(">> matrix makepattern setpattern\n");
80 Franz 834
                        PutSeite("<< /ImageType 1\n");
3 paul 835
                        PutSeite("   /Width " + IToStr(w) + "\n");
836
                        PutSeite("   /Height " + IToStr(h) + "\n");
837
                        PutSeite("   /BitsPerComponent 1\n");
838
                        PutSeite("   /Decode [1 0]\n");
234 Franz 839
                        PutSeite("   /ImageMatrix [" + IToStr(w) + " 0 0 " + IToStr(-h) + " 0 " + IToStr(h) + "]\n");
3 paul 840
                        PutSeite("   /DataSource "+PSEncode(Name)+"Mask\n");
841
                        PutSeite(">>\n");
842
                        PutSeite("imagemask\n");
843
                        if (Name != "")
188 Franz 844
                        {
3 paul 845
                                PutSeite(PSEncode(Name)+"Bild resetfile\n");
846
                                PutSeite(PSEncode(Name)+"Mask resetfile\n");
847
                        }
188 Franz 848
                }
3 paul 849
                else
188 Franz 850
                {
80 Franz 851
                        PutSeite("<< /ImageType 1\n");
3 paul 852
                        PutSeite("   /Width " + IToStr(w) + "\n");
853
                        PutSeite("   /Height " + IToStr(h) + "\n");
854
                        PutSeite("   /BitsPerComponent 8\n");
855
                        if (DoSep)
856
                                PutSeite("   /Decode [1 0]\n");
857
                        else
80 Franz 858
                                PutSeite( GraySc ? "   /Decode [1 0]\n" : "   /Decode [0 1 0 1 0 1 0 1]\n");
1847 subik 859
                        PutSeite("   /ImageMatrix [" + IToStr(w) + " 0 0 " + IToStr(-h) + " 0 " + IToStr(h) +
188 Franz 860
                                        "]\n");
3 paul 861
                        if (Name != "")
188 Franz 862
                        {
3 paul 863
                                PutSeite("   /DataSource "+PSEncode(Name)+"Bild >>\n");
864
                                PutSeite("image\n");
865
                                PutSeite(PSEncode(Name)+"Bild resetfile\n");
188 Franz 866
                        }
3 paul 867
                        else
234 Franz 868
                        {
80 Franz 869
                                PutSeite ( CompAvail ? "   /DataSource currentfile /ASCIIHexDecode filter /FlateDecode filter >>\n" :
188 Franz 870
                                                        "   /DataSource currentfile /ASCIIHexDecode filter >>\n");
3 paul 871
                                PutSeite("image\n");
872
                                if (DoSep)
2004 fschmid 873
                                        ImgStr = image.ImageToCMYK_PS(Plate, true);
3 paul 874
                                else
2004 fschmid 875
                                        ImgStr = GraySc ? image.ImageToCMYK_PS(-2, true) : image.ImageToCMYK_PS(-1, true);
3 paul 876
                                if (CompAvail)
877
                                        ImgStr = CompressStr(&ImgStr);
878
                                ImgStr = String2Hex(&ImgStr);
879
                                PutSeite(ImgStr);
880
                                PutSeite("\n>\n");
881
                        }
188 Franz 882
                }
234 Franz 883
        }
3 paul 884
}
885
 
80 Franz 886
 
3 paul 887
void PSLib::PS_plate(int nr)
888
{
889
        switch (nr)
188 Franz 890
        {
3 paul 891
                case 0:
892
                        PutSeite("%%PlateColor Black\n");
893
                        PutSeite("/setcmykcolor {exch pop exch pop exch pop 1 exch sub oldsetgray} bind def\n");
894
                        PutSeite("/setrgbcolor {pop pop pop 1 oldsetgray} bind def\n");
895
                        break;
896
                case 1:
897
                        PutSeite("%%PlateColor Cyan\n");
898
                        PutSeite("/setcmykcolor {pop pop pop 1 exch sub oldsetgray} bind def\n");
899
                        PutSeite("/setrgbcolor {pop pop oldsetgray} bind def\n");
900
                        break;
901
                case 2:
902
                        PutSeite("%%PlateColor Magenta\n");
903
                        PutSeite("/setcmykcolor {pop pop exch pop 1 exch sub oldsetgray} bind def\n");
904
                        PutSeite("/setrgbcolor {pop exch pop oldsetgray} bind def\n");
905
                        break;
906
                case 3:
907
                        PutSeite("%%PlateColor Yellow\n");
908
                        PutSeite("/setcmykcolor {pop exch pop exch pop 1 exch sub oldsetgray} bind def\n");
909
                        PutSeite("/setrgbcolor {exch pop exch pop oldsetgray} bind def\n");
910
                        break;
188 Franz 911
        }
3 paul 912
        Plate = nr;
913
        DoSep = true;
914
}
915
 
916
void PSLib::PS_setGray()
917
{
918
        GraySc = true;
919
}
920
 
921
void PSLib::PDF_Bookmark(QString text, uint Seite)
922
{
923
        PutSeite("[/Title ("+text+") /Page "+IToStr(Seite)+" /View [/Fit]\n");
924
        PutSeite("/OUT pdfmark\n");
925
        isPDF = true;
926
}
927
 
80 Franz 928
void PSLib::PDF_Annotation(QString text, double x, double y, double b, double h)
3 paul 929
{
188 Franz 930
        PutSeite("[ /Rect [ "+ToStr(static_cast<int>(x))+" "+ToStr(static_cast<int>(y))
931
                        +" "+ToStr(static_cast<int>(b))+" "+ToStr(static_cast<int>(h))+" ]\n");
3 paul 932
        PutSeite("  /Contents ("+text+")\n  /Open false\n");
933
        PutSeite("/ANN pdfmark\n");
934
        isPDF = true;
935
}
936
 
937
 
938
void PSLib::PS_close()
939
{
940
        PutDoc("%%Trailer\n");
941
        PutDoc("end\n");
942
        PutDoc("%%EOF\n");
943
        Spool.close();
944
}
68 Franz 945
 
946
 
947
void PSLib::PS_insert(QString i)
948
{
949
        PutDoc(i);
950
}
456 fschmid 951
 
1861 fschmid 952
void PSLib::CreatePS(ScribusDoc* Doc, ScribusView* view, std::vector<int> &pageNs, bool sep, QString SepNam, bool farb, bool Hm, bool Vm, bool Ic, bool gcr, bool doDev)
456 fschmid 953
{
954
        uint a;
955
        int sepac;
741 fschmid 956
        double wideR = 0;
456 fschmid 957
        QValueList<double> dum;
958
        double gx, gy, gw, gh;
959
        dum.clear();
2024 cbradney 960
        PS_set_Info("Author", Doc->documentInfo.getAuthor());
961
        PS_set_Info("Title", Doc->documentInfo.getTitle());
456 fschmid 962
        if (!farb)
963
                PS_setGray();
964
        if ((!Art) && (view->SelItem.count() != 0))
965
        {
966
                view->setGroupRect();
967
                view->getGroupRect(&gx, &gy, &gw, &gh);
968
                int pgNum = pageNs[0];
969
                gx -= Doc->Pages.at(pgNum)->Xoffset;
970
                gy -= Doc->Pages.at(pgNum)->Yoffset;
2142 cbradney 971
                PS_begin_doc(Doc->PageOri, gx, Doc->pageHeight - (gy+gh), gx + gw, Doc->pageHeight - gy, 1, false);
456 fschmid 972
        }
973
        else
2142 cbradney 974
                PS_begin_doc(Doc->PageOri, 0.0, 0.0, Doc->pageWidth, Doc->pageHeight, pageNs.size(), doDev);
456 fschmid 975
        for (uint ap = 0; ap < Doc->MasterPages.count(); ++ap)
976
        {
977
                if (Doc->MasterItems.count() != 0)
978
                {
910 fschmid 979
                        int Lnr = 0;
980
                        struct Layer ll;
1065 cbradney 981
                        ll.isPrintable = false;
910 fschmid 982
                        ll.LNr = 0;
983
                        for (uint lam = 0; lam < Doc->Layers.count(); ++lam)
456 fschmid 984
                        {
910 fschmid 985
                                Level2Layer(Doc, &ll, Lnr);
1065 cbradney 986
                                if (ll.isPrintable)
456 fschmid 987
                                {
910 fschmid 988
                                        for (uint api = 0; api < Doc->MasterItems.count(); ++api)
989
                                        {
990
                                                QString tmps;
991
                                                PageItem *it = Doc->MasterItems.at(api);
1507 fschmid 992
                                                if ((it->LayerNr != ll.LNr) || (!it->isPrintable))
993
                                                        continue;
910 fschmid 994
                                                int x = static_cast<int>(Doc->MasterPages.at(ap)->Xoffset);
995
                                                int y = static_cast<int>(Doc->MasterPages.at(ap)->Yoffset);
996
                                                int w = static_cast<int>(Doc->MasterPages.at(ap)->Width);
997
                                                int h = static_cast<int>(Doc->MasterPages.at(ap)->Height);
998
                                                int x2 = static_cast<int>(it->BoundingX - it->Pwidth / 2.0);
999
                                                int y2 = static_cast<int>(it->BoundingY - it->Pwidth / 2.0);
1000
                                                int w2 = static_cast<int>(it->BoundingW + it->Pwidth);
1001
                                                int h2 = static_cast<int>(it->BoundingH + it->Pwidth);
1002
                                                if (!QRect(x, y, w, h).intersects(QRect(x2, y2, w2, h2)))
1003
                                                        continue;
1004
                                                if ((it->OwnPage != static_cast<int>(Doc->MasterPages.at(ap)->PageNr)) && (it->OwnPage != -1))
1005
                                                        continue;
1460 cbradney 1006
                                                if ((it->itemType() == PageItem::ImageFrame) && (it->PicAvail) && (it->Pfile != "") && (it->isPrintable) && (!sep) && (farb))
2061 fschmid 1007
                                                        PS_ImageData(it, it->Pfile, it->itemName(), it->IProfile, it->UseEmbedded, Ic);
2142 cbradney 1008
                                                PS_TemplateStart(Doc->MasterPages.at(ap)->PageNam + tmps.setNum(it->ItemNr), Doc->pageWidth, Doc->pageHeight);
910 fschmid 1009
                                                ProcessItem(Doc, Doc->MasterPages.at(ap), it, ap+1, sep, farb, Ic, gcr, true);
1010
                                                PS_TemplateEnd();
1011
                                        }
456 fschmid 1012
                                }
1507 fschmid 1013
                                Lnr++;
456 fschmid 1014
                        }
1015
                }
1016
        }
1017
        sepac = 0;
1018
        uint aa = 0;
1019
        while (aa < pageNs.size())
1020
        {
1021
                a = pageNs[aa]-1;
1022
                if ((!Art) && (view->SelItem.count() != 0))
1023
                {
1065 cbradney 1024
                        struct MarginStruct Ma;
456 fschmid 1025
                        Ma.Left = gx;
1026
                        Ma.Top = gy;
2142 cbradney 1027
                        Ma.Bottom = Doc->pageHeight - (gy + gh);
1028
                        Ma.Right = Doc->pageWidth - (gx + gw);
1029
                        PS_begin_page(Doc->pageWidth, Doc->pageHeight, &Ma, true);
456 fschmid 1030
                }
1031
                else
2142 cbradney 1032
                        PS_begin_page(Doc->pageWidth, Doc->pageHeight, &Doc->Pages.at(a)->Margins, view->Prefs->ClipMargin);
456 fschmid 1033
                if (Hm)
1034
                {
2142 cbradney 1035
                        PS_translate(Doc->pageWidth, 0);
456 fschmid 1036
                        PS_scale(-1, 1);
1037
                }
1038
                if (Vm)
1039
                {
2142 cbradney 1040
                        PS_translate(0, Doc->pageHeight);
456 fschmid 1041
                        PS_scale(1, -1);
1042
                }
1043
                if (sep)
1044
                {
1045
                        if (SepNam == "Black")
1046
                                PS_plate(0);
1047
                        if (SepNam == "Cyan")
1048
                                PS_plate(1);
1049
                        if (SepNam == "Magenta")
1050
                                PS_plate(2);
1051
                        if (SepNam == "Yellow")
1052
                                PS_plate(3);
1053
                        if (SepNam == QObject::tr("All"))
1054
                                PS_plate(sepac);
1055
                }
1056
                if (Doc->Pages.at(a)->MPageNam != "")
1057
                {
1058
                        int h, s, v, k, tsz;
1059
                        QCString chxc;
1060
                        QString chx;
1065 cbradney 1061
                        struct ScText *hl;
456 fschmid 1062
                        int Lnr = 0;
1063
                        struct Layer ll;
1065 cbradney 1064
                        ll.isPrintable = false;
456 fschmid 1065
                        ll.LNr = 0;
1066
                        Page* mPage = Doc->MasterPages.at(Doc->MasterNames[Doc->Pages.at(a)->MPageNam]);
1067
                        if (Doc->MasterItems.count() != 0)
1068
                        {
1069
                                for (uint lam = 0; lam < Doc->Layers.count(); ++lam)
1070
                                {
1071
                                        Level2Layer(Doc, &ll, Lnr);
1065 cbradney 1072
                                        if (ll.isPrintable)
456 fschmid 1073
                                        {
1074
                                                for (uint am = 0; am < Doc->Pages.at(a)->FromMaster.count(); ++am)
1075
                                                {
910 fschmid 1076
                                                        QString tmps;
456 fschmid 1077
                                                        PageItem *ite = Doc->Pages.at(a)->FromMaster.at(am);
1078
                                                        if ((ite->LayerNr != ll.LNr) || (!ite->isPrintable))
1079
                                                                continue;
1460 cbradney 1080
                                                        if ((ite->itemType() != PageItem::TextFrame) && (ite->itemType() != PageItem::ImageFrame))
910 fschmid 1081
                                                                PS_UseTemplate(Doc->Pages.at(a)->MPageNam + tmps.setNum(ite->ItemNr));
1460 cbradney 1082
                                                        else if (ite->itemType() == PageItem::ImageFrame)
456 fschmid 1083
                                                        {
1084
                                                                PS_save();
2142 cbradney 1085
                                                                PS_translate(ite->Xpos - mPage->Xoffset, Doc->pageHeight -(ite->Ypos) - mPage->Yoffset);
456 fschmid 1086
                                                                if (ite->Rot != 0)
1087
                                                                        PS_rotate(-ite->Rot);
1394 cbradney 1088
                                                                if (ite->fillColor() != "None")
456 fschmid 1089
                                                                {
1394 cbradney 1090
                                                                        SetFarbe(Doc, ite->fillColor(), ite->fillShade(), &h, &s, &v, &k, gcr);
456 fschmid 1091
                                                                        PS_setcmykcolor_fill(h / 255.0, s / 255.0, v / 255.0, k / 255.0);
1092
                                                                        SetClipPath(&ite->PoLine);
1093
                                                                        PS_closepath();
1094
                                                                        PS_fill();
1095
                                                                }
1096
                                                                else
1097
                                                                        PS_setcmykcolor_dummy();
2040 fschmid 1098
                                                                if (ite->imageClip.size() != 0)
1099
                                                                        SetClipPath(&ite->imageClip);
1100
                                                                else
1101
                                                                        SetClipPath(&ite->PoLine);
456 fschmid 1102
                                                                PS_closepath();
1103
                                                                PS_clip(false);
1104
                                                                PS_save();
1392 cbradney 1105
                                                                if (ite->imageFlippedH())
456 fschmid 1106
                                                                {
1107
                                                                        PS_translate(ite->Width, 0);
1108
                                                                        PS_scale(-1, 1);
1109
                                                                }
1392 cbradney 1110
                                                                if (ite->imageFlippedV())
456 fschmid 1111
                                                                {
1112
                                                                        PS_translate(0, -ite->Height);
1113
                                                                        PS_scale(1, -1);
1114
                                                                }
1115
                                                                if ((ite->PicAvail) && (ite->Pfile != ""))
1116
                                                                {
1117
                                                                        PS_translate(0, -ite->BBoxH*ite->LocalScY);
910 fschmid 1118
                                                                        if ((!sep) && (farb))
2061 fschmid 1119
                                                                                PS_image(ite, -ite->BBoxX+ite->LocalX, -ite->LocalY, ite->Pfile, ite->LocalScX, ite->LocalScY, ite->IProfile, ite->UseEmbedded, Ic, ite->itemName());
910 fschmid 1120
                                                                        else
2061 fschmid 1121
                                                                                PS_image(ite, -ite->BBoxX+ite->LocalX, -ite->LocalY, ite->Pfile, ite->LocalScX, ite->LocalScY, ite->IProfile, ite->UseEmbedded, Ic);
456 fschmid 1122
                                                                }
1123
                                                                PS_restore();
1394 cbradney 1124
                                                                if (((ite->lineColor() != "None") || (ite->NamedLStyle != "")) && (!ite->isTableItem))
456 fschmid 1125
                                                                {
1126
                                                                        if ((ite->NamedLStyle == "") && (ite->Pwidth != 0.0))
1127
                                                                        {
1394 cbradney 1128
                                                                                SetFarbe(Doc, ite->lineColor(), ite->lineShade(), &h, &s, &v, &k, gcr);
456 fschmid 1129
                                                                                PS_setcmykcolor_stroke(h / 255.0, s / 255.0, v / 255.0, k / 255.0);
1130
                                                                                PS_setlinewidth(ite->Pwidth);
1131
                                                                                PS_setcapjoin(ite->PLineEnd, ite->PLineJoin);
1132
                                                                                PS_setdash(ite->PLineArt, ite->DashOffset, ite->DashValues);
1133
                                                                                SetClipPath(&ite->PoLine);
1134
                                                                                PS_closepath();
1135
                                                                                PS_stroke();
1136
                                                                        }
1137
                                                                        else
1138
                                                                        {
1139
                                                                                multiLine ml = Doc->MLineStyles[ite->NamedLStyle];
1140
                                                                                for (int it = ml.size()-1; it > -1; it--)
1141
                                                                                {
1142
                                                                                        SetFarbe(Doc, ml[it].Color, ml[it].Shade, &h, &s, &v, &k, gcr);
1143
                                                                                        PS_setcmykcolor_stroke(h / 255.0, s / 255.0, v / 255.0, k / 255.0);
1144
                                                                                        PS_setlinewidth(ml[it].Width);
1145
                                                                                        PS_setcapjoin(static_cast<Qt::PenCapStyle>(ml[it].LineEnd), static_cast<Qt::PenJoinStyle>(ml[it].LineJoin));
1146
                                                                                        PS_setdash(static_cast<Qt::PenStyle>(ml[it].Dash), 0, dum);
1147
                                                                                        SetClipPath(&ite->PoLine);
1148
                                                                                        PS_closepath();
1149
                                                                                        PS_stroke();
1150
                                                                                }
1151
                                                                        }
1152
                                                                }
1153
                                                                PS_restore();
1154
                                                        }
1460 cbradney 1155
                                                        else if (ite->itemType() == PageItem::TextFrame)
456 fschmid 1156
                                                        {
1157
                                                                PS_save();
1394 cbradney 1158
                                                                if (ite->fillColor() != "None")
456 fschmid 1159
                                                                {
1394 cbradney 1160
                                                                        SetFarbe(Doc, ite->fillColor(), ite->fillShade(), &h, &s, &v, &k, gcr);
456 fschmid 1161
                                                                        PS_setcmykcolor_fill(h / 255.0, s / 255.0, v / 255.0, k / 255.0);
1162
                                                                }
2142 cbradney 1163
                                                                PS_translate(ite->Xpos - mPage->Xoffset, Doc->pageHeight - (ite->Ypos - mPage->Yoffset));
456 fschmid 1164
                                                                if (ite->Rot != 0)
1165
                                                                        PS_rotate(-ite->Rot);
1394 cbradney 1166
                                                                if ((ite->fillColor() != "None") || (ite->GrType != 0))
456 fschmid 1167
                                                                {
1168
                                                                        SetClipPath(&ite->PoLine);
1169
                                                                        PS_closepath();
1170
                                                                        PS_fill();
1171
                                                                }
1392 cbradney 1172
                                                                if (ite->imageFlippedH())
456 fschmid 1173
                                                                {
1174
                                                                        PS_translate(ite->Width, 0);
1175
                                                                        PS_scale(-1, 1);
1176
                                                                }
1392 cbradney 1177
                                                                if (ite->imageFlippedV())
456 fschmid 1178
                                                                {
1179
                                                                        PS_translate(0, -ite->Height);
1180
                                                                        PS_scale(1, -1);
1181
                                                                }
1182
                                                                for (uint d = 0; d < ite->MaxChars; ++d)
1183
                                                                {
1065 cbradney 1184
                                                                        hl = ite->itemText.at(d);
456 fschmid 1185
                                                                        if ((hl->ch == QChar(13)) || (hl->ch == QChar(10)) || (hl->ch == QChar(9)) || (hl->ch == QChar(28)))
1186
                                                                                continue;
2185 fschmid 1187
                                                                        if (hl->cstyle & 4096)
456 fschmid 1188
                                                                                continue;
1189
                                                                        if (hl->yp == 0)
1190
                                                                                continue;
1191
                                                                        tsz = hl->csize;
1192
                                                                        chx = hl->ch;
1193
                                                                        if (hl->ch == QChar(29))
1194
                                                                                chx = " ";
908 fschmid 1195
                                                                        if (hl->ch == QChar(0xA0))
1196
                                                                                chx = " ";
456 fschmid 1197
                                                                        if (hl->ch == QChar(30))
1198
                                                                        {
1199
                                                                                if (Doc->MasterP)
1200
                                                                                        chx = "#";
1201
                                                                                else
1202
                                                                                {
1203
                                                                                        uint zae = 0;
1204
                                                                                        uint za2 = d;
1205
                                                                                        do
1206
                                                                                        {
1207
                                                                                                if (za2 == 0)
1208
                                                                                                        break;
1209
                                                                                                za2--;
1210
                                                                                        }
1065 cbradney 1211
                                                                                        while (ite->itemText.at(za2)->ch == QChar(30));
1212
                                                                                        if (ite->itemText.at(za2)->ch != QChar(30))
456 fschmid 1213
                                                                                                za2++;
1065 cbradney 1214
                                                                                        while (ite->itemText.at(za2+zae)->ch == QChar(30))
456 fschmid 1215
                                                                                        {
1216
                                                                                                zae++;
1217
                                                                                                if (za2+zae == ite->MaxChars)
1218
                                                                                                        break;
1219
                                                                                        }
1220
                                                                                        QString out="%1";
1221
                                                                                        QString out2;
1222
                                                                                        out2 = out.arg(a+Doc->FirstPnum, -zae);
1223
                                                                                        chx = out2.mid(d-za2, 1);
1224
                                                                                }
1225
                                                                        }
2185 fschmid 1226
                                                                        if (hl->cstyle & 32)
1227
                                                                        {
1228
                                                                                if (chx.upper() != chx)
1229
                                                                                        chx = chx.upper();
1230
                                                                        }
456 fschmid 1231
                                                                        if (hl->cstyle & 64)
1232
                                                                        {
1233
                                                                                if (chx.upper() != chx)
1234
                                                                                {
823 fschmid 1235
                                                                                        tsz = hl->csize * Doc->typographicSetttings.valueSmallCaps / 100;
456 fschmid 1236
                                                                                        chx = chx.upper();
1237
                                                                                }
1238
                                                                        }
1239
                                                                        if (hl->cstyle & 1)
823 fschmid 1240
                                                                                tsz = hl->csize * Doc->typographicSetttings.scalingSuperScript / 100;
456 fschmid 1241
                                                                        if (hl->cstyle & 2)
823 fschmid 1242
                                                                                tsz = hl->csize * Doc->typographicSetttings.scalingSuperScript / 100;
456 fschmid 1243
                                                                        /* Subset all TTF Fonts until the bug in the TTF-Embedding Code is fixed */
1789 fschmid 1244
                                                                        QFileInfo fd = QFileInfo(hl->cfont->Datei);
456 fschmid 1245
                                                                        QString fext = fd.extension(false).lower();
1789 fschmid 1246
                                                                        if ((fext == "ttf") || (hl->cfont->isOTF) || (hl->cfont->Subset))
456 fschmid 1247
                                                                        {
1248
                                                                                uint chr = chx[0].unicode();
1789 fschmid 1249
                                                                                if ((hl->cfont->CharWidth.contains(chr)) && (chr != 32))
456 fschmid 1250
                                                                                {
1251
                                                                                        PS_save();
1252
                                                                                        if (ite->Reverse)
1253
                                                                                        {
1254
                                                                                                PS_translate(hl->xp, (hl->yp - (tsz / 10.0)) * -1);
1255
                                                                                                PS_scale(-1, 1);
1256
                                                                                                if (d < ite->MaxChars-1)
1257
                                                                                                {
1065 cbradney 1258
                                                                                                        QString ctx = ite->itemText.at(d+1)->ch;
456 fschmid 1259
                                                                                                        if (ctx == QChar(29))
1260
                                                                                                                ctx = " ";
908 fschmid 1261
                                                                                                        if (ctx == QChar(0xA0))
1262
                                                                                                                ctx = " ";
456 fschmid 1263
                                                                                                        wideR = -Cwidth(Doc, hl->cfont, chx, tsz, ctx) * (hl->cscale / 100.0);
1264
                                                                                                }
1265
                                                                                                else
1266
                                                                                                        wideR = -Cwidth(Doc, hl->cfont, chx, tsz) * (hl->cscale / 100.0);
1267
                                                                                                PS_translate(wideR, 0);
1268
                                                                                        }
1269
                                                                                        else
1270
                                                                                                PS_translate(hl->xp, (hl->yp - (tsz / 10.0)) * -1);
1271
                                                                                        if (hl->cscale != 100)
1272
                                                                                                PS_scale(hl->cscale / 100.0, 1);
1273
                                                                                        if (hl->ccolor != "None")
1274
                                                                                        {
1275
                                                                                                SetFarbe(Doc, hl->ccolor, hl->cshade, &h, &s, &v, &k, gcr);
1276
                                                                                                PS_setcmykcolor_fill(h / 255.0, s / 255.0, v / 255.0, k / 255.0);
1789 fschmid 1277
                                                                                                PS_showSub(chr, hl->cfont->RealName().simplifyWhiteSpace().replace( QRegExp("\\s"), "" ), tsz / 10.0, false);
456 fschmid 1278
                                                                                        }
1279
                                                                                        PS_restore();
1280
                                                                                }
1281
                                                                        }
1282
                                                                        else
1283
                                                                        {
1789 fschmid 1284
                                                                                PS_selectfont(hl->cfont->SCName, tsz / 10.0);
456 fschmid 1285
                                                                                if (hl->ccolor != "None")
1286
                                                                                {
1287
                                                                                        SetFarbe(Doc, hl->ccolor, hl->cshade, &h, &s, &v, &k, gcr);
1288
                                                                                        PS_setcmykcolor_stroke(h / 255.0, s / 255.0, v / 255.0, k / 255.0);
1289
                                                                                }
1290
                                                                                PS_save();
1291
                                                                                if (ite->Reverse)
1292
                                                                                {
1293
                                                                                        int chs = hl->csize;
1294
                                                                                        ite->SetZeichAttr(hl, &chs, &chx);
1295
                                                                                        PS_translate(hl->xp, -hl->yp);
1296
                                                                                        PS_scale(-1, 1);
1297
                                                                                        if (d < ite->MaxChars-1)
1298
                                                                                        {
1065 cbradney 1299
                                                                                                QString ctx = ite->itemText.at(d+1)->ch;
456 fschmid 1300
                                                                                                if (ctx == QChar(29))
1301
                                                                                                        ctx = " ";
908 fschmid 1302
                                                                                                if (ctx == QChar(0xA0))
1303
                                                                                                        ctx = " ";
456 fschmid 1304
                                                                                                wideR = -Cwidth(Doc, hl->cfont, chx, chs, ctx) * (hl->cscale / 100.0);
1305
                                                                                                PS_translate(wideR, 0);
1306
                                                                                        }
1307
                                                                                        else
1308
                                                                                        {
1309
                                                                                                wideR = -Cwidth(Doc, hl->cfont, chx, chs) * (hl->cscale / 100.0);
1310
                                                                                                PS_translate(wideR, 0);
1311
                                                                                        }
1312
                                                                                        if (hl->cscale != 100)
1313
                                                                                                PS_scale(hl->cscale / 100.0, 1);
1789 fschmid 1314
                                                                                        PS_show_xyG(hl->cfont->SCName, chx, 0, 0);
456 fschmid 1315
                                                                                }
1316
                                                                                else
1317
                                                                                {
1318
                                                                                        PS_translate(hl->xp, -hl->yp);
1319
                                                                                        if (hl->cscale != 100)
1320
                                                                                                PS_scale(hl->cscale / 100.0, 1);
1789 fschmid 1321
                                                                                        PS_show_xyG(hl->cfont->SCName, chx, 0, 0);
456 fschmid 1322
                                                                                }
1323
                                                                                PS_restore();
1324
                                                                        }
1325
                                                                        if ((hl->cstyle & 4) && (chx != QChar(13)))
1326
                                                                        {
1327
                                                                                uint chr = chx[0].unicode();
1789 fschmid 1328
                                                                                if (hl->cfont->CharWidth.contains(chr))
456 fschmid 1329
                                                                                {
1789 fschmid 1330
                                                                                        FPointArray gly = hl->cfont->GlyphArray[chr].Outlines.copy();
456 fschmid 1331
                                                                                        QWMatrix chma;
1332
                                                                                        chma.scale(tsz / 100.0, tsz / 100.0);
1333
                                                                                        gly.map(chma);
1334
                                                                                        chma = QWMatrix();
1335
                                                                                        chma.scale(hl->cscale / 100.0, 1);
1336
                                                                                        gly.map(chma);
1337
                                                                                        if (ite->Reverse)
1338
                                                                                        {
1339
                                                                                                chma = QWMatrix();
1340
                                                                                                chma.scale(-1, 1);
1341
                                                                                                chma.translate(wideR, 0);
1342
                                                                                                gly.map(chma);
1343
                                                                                        }
1344
                                                                                        if (hl->cstroke != "None")
1345
                                                                                        {
1346
                                                                                                PS_save();
1789 fschmid 1347
                                                                                                PS_setlinewidth(QMAX(hl->cfont->strokeWidth / 2 * (tsz / 10.0), 1));
456 fschmid 1348
                                                                                                PS_setcapjoin(Qt::FlatCap, Qt::MiterJoin);
1349
                                                                                                PS_setdash(Qt::SolidLine, 0, dum);
1350
                                                                                                PS_translate(hl->xp, (hl->yp - tsz) * -1);
1351
                                                                                                SetFarbe(Doc, hl->cstroke, hl->cshade2, &h, &s, &v, &k, gcr);
1352
                                                                                                PS_setcmykcolor_stroke(h / 255.0, s / 255.0, v / 255.0, k / 255.0);
1353
                                                                                                SetClipPath(&gly);
1354
                                                                                                PS_closepath();
1355
                                                                                                PS_stroke();
1356
                                                                                                PS_restore();
1357
                                                                                        }
1358
                                                                                }
1359
                                                                        }
1360
                                                                        if ((hl->cstyle & 16) && (chx != QChar(13)))
1361
                                                                        {
1362
                                                                                double Ulen = Cwidth(Doc, hl->cfont, chx, hl->csize) * (hl->cscale / 100.0);
2176 fschmid 1363
                                                                                double Upos, lw, kern;
2185 fschmid 1364
                                                                                if (hl->cstyle & 16384)
2176 fschmid 1365
                                                                                        kern = 0;
1366
                                                                                else
1367
                                                                                        kern = hl->cextra;
1368
                                                                                if ((Doc->typographicSetttings.valueStrikeThruPos != -1) || (Doc->typographicSetttings.valueStrikeThruWidth != -1))
1369
                                                                                {
1370
                                                                                        if (Doc->typographicSetttings.valueStrikeThruPos != -1)
2185 fschmid 1371
                                                                                                Upos = (Doc->typographicSetttings.valueStrikeThruPos / 100.0) * (hl->cfont->numAscent * (hl->csize / 10.0));
2176 fschmid 1372
                                                                                        else
2185 fschmid 1373
                                                                                                Upos = hl->cfont->strikeout_pos * (hl->csize / 10.0);
2176 fschmid 1374
                                                                                        if (Doc->typographicSetttings.valueStrikeThruWidth != -1)
2185 fschmid 1375
                                                                                                lw = (Doc->typographicSetttings.valueStrikeThruWidth / 100.0) * (hl->csize / 10.0);
2176 fschmid 1376
                                                                                        else
2185 fschmid 1377
                                                                                                lw = QMAX(hl->cfont->strokeWidth * (hl->csize / 10.0), 1);
2176 fschmid 1378
                                                                                }
1379
                                                                                else
1380
                                                                                {
2185 fschmid 1381
                                                                                        Upos = hl->cfont->strikeout_pos * (hl->csize / 10.0);
1382
                                                                                        lw = QMAX(hl->cfont->strokeWidth * (hl->csize / 10.0), 1);
2176 fschmid 1383
                                                                                }
456 fschmid 1384
                                                                                if (hl->ccolor != "None")
1385
                                                                                {
1386
                                                                                        PS_setcapjoin(Qt::FlatCap, Qt::MiterJoin);
1387
                                                                                        PS_setdash(Qt::SolidLine, 0, dum);
1388
                                                                                        SetFarbe(Doc, hl->ccolor, hl->cshade, &h, &s, &v, &k, gcr);
1389
                                                                                        PS_setcmykcolor_stroke(h / 255.0, s / 255.0, v / 255.0, k / 255.0);
1390
                                                                                }
2176 fschmid 1391
                                                                                PS_setlinewidth(lw);
1392
                                                                                PS_moveto(hl->xp-kern, -hl->yp+Upos);
456 fschmid 1393
                                                                                PS_lineto(hl->xp+Ulen, -hl->yp+Upos);
1394
                                                                                PS_stroke();
1395
                                                                        }
2188 fschmid 1396
                                                                        if (((hl->cstyle & 8) && (chx != QChar(13)))  || ((hl->cstyle & 512) && (!chx[0].isSpace())))
456 fschmid 1397
                                                                        {
1398
                                                                                double Ulen = Cwidth(Doc, hl->cfont, chx, hl->csize) * (hl->cscale / 100.0);
2174 fschmid 1399
                                                                                double Upos, lw, kern;
2185 fschmid 1400
                                                                                if (hl->cstyle & 16384)
2174 fschmid 1401
                                                                                        kern = 0;
1402
                                                                                else
1403
                                                                                        kern = hl->cextra;
1404
                                                                                if ((Doc->typographicSetttings.valueUnderlinePos != -1) || (Doc->typographicSetttings.valueUnderlineWidth != -1))
1405
                                                                                {
1406
                                                                                        if (Doc->typographicSetttings.valueUnderlinePos != -1)
2185 fschmid 1407
                                                                                                Upos = (Doc->typographicSetttings.valueUnderlinePos / 100.0) * (hl->cfont->numDescender * (hl->csize / 10.0));
2174 fschmid 1408
                                                                                        else
2185 fschmid 1409
                                                                                                Upos = hl->cfont->underline_pos * (hl->csize / 10.0);
2174 fschmid 1410
                                                                                        if (Doc->typographicSetttings.valueUnderlineWidth != -1)
2185 fschmid 1411
                                                                                                lw = (Doc->typographicSetttings.valueUnderlineWidth / 100.0) * (hl->csize / 10.0);
2174 fschmid 1412
                                                                                        else
2185 fschmid 1413
                                                                                                lw = QMAX(hl->cfont->strokeWidth * (hl->csize / 10.0), 1);
2174 fschmid 1414
                                                                                }
1415
                                                                                else
1416
                                                                                {
2185 fschmid 1417
                                                                                        Upos = hl->cfont->underline_pos * (hl->csize / 10.0);
1418
                                                                                        lw = QMAX(hl->cfont->strokeWidth * (hl->csize / 10.0), 1);
2174 fschmid 1419
                                                                                }
456 fschmid 1420
                                                                                if (hl->ccolor != "None")
1421
                                                                                {
1422
                                                                                        PS_setcapjoin(Qt::FlatCap, Qt::MiterJoin);
1423
                                                                                        PS_setdash(Qt::SolidLine, 0, dum);
1424
                                                                                        SetFarbe(Doc, hl->ccolor, hl->cshade, &h, &s, &v, &k, gcr);
1425
                                                                                        PS_setcmykcolor_stroke(h / 255.0, s / 255.0, v / 255.0, k / 255.0);
1426
                                                                                }
2174 fschmid 1427
                                                                                PS_setlinewidth(lw);
1428
                                                                                PS_moveto(hl->xp-kern, -hl->yp+Upos);
456 fschmid 1429
                                                                                PS_lineto(hl->xp+Ulen, -hl->yp+Upos);
1430
                                                                                PS_stroke();
1431
                                                                        }
2185 fschmid 1432
                                                                        if (hl->cstyle & 8192)
456 fschmid 1433
                                                                        {
1434
                                                                                int chs = hl->csize;
1435
                                                                                ite->SetZeichAttr(hl, &chs, &chx);
1436
                                                                                double wide = Cwidth(Doc, hl->cfont, chx, chs);
1437
                                                                                chx = "-";
1438
                                                                                uint chr = chx[0].unicode();
1789 fschmid 1439
                                                                                if (hl->cfont->CharWidth.contains(chr))
456 fschmid 1440
                                                                                {
1789 fschmid 1441
                                                                                        FPointArray gly = hl->cfont->GlyphArray[chr].Outlines.copy();
456 fschmid 1442
                                                                                        QWMatrix chma;
1443
                                                                                        chma.scale(tsz / 100.0, tsz / 100.0);
1444
                                                                                        gly.map(chma);
1445
                                                                                        chma = QWMatrix();
1446
                                                                                        chma.scale(hl->cscale / 100.0, 1);
1447
                                                                                        gly.map(chma);
1448
                                                                                        if (hl->ccolor != "None")
1449
                                                                                        {
1450
                                                                                                PS_save();
1451
                                                                                                PS_newpath();
1452
                                                                                                PS_translate(hl->xp+wide, (hl->yp - (tsz / 10.0)) * -1);
1453
                                                                                                SetFarbe(Doc, hl->ccolor, hl->cshade, &h, &s, &v, &k, gcr);
1454
                                                                                                PS_setcmykcolor_fill(h / 255.0, s / 255.0, v / 255.0, k / 255.0);
1455
                                                                                                SetClipPath(&gly);
1456
                                                                                                PS_closepath();
1457
                                                                                                PS_fill();
1458
                                                                                                PS_restore();
1459
                                                                                        }
1460
                                                                                }
1461
                                                                        }
1462
                                                                }
1394 cbradney 1463
                                                                if (((ite->lineColor() != "None") || (ite->NamedLStyle != "")) && (!ite->isTableItem))
456 fschmid 1464
                                                                {
1465
                                                                        if ((ite->NamedLStyle == "") && (ite->Pwidth != 0.0))
1466
                                                                        {
1394 cbradney 1467
                                                                                SetFarbe(Doc, ite->lineColor(), ite->lineShade(), &h, &s, &v, &k, gcr);
456 fschmid 1468
                                                                                PS_setcmykcolor_stroke(h / 255.0, s / 255.0, v / 255.0, k / 255.0);
1469
                                                                                PS_setlinewidth(ite->Pwidth);
1470
                                                                                PS_setcapjoin(ite->PLineEnd, ite->PLineJoin);
1471
                                                                                PS_setdash(ite->PLineArt, ite->DashOffset, ite->DashValues);
1472
                                                                                SetClipPath(&ite->PoLine);
1473
                                                                                PS_closepath();
1474
                                                                                PS_stroke();
1475
                                                                        }
1476
                                                                        else
1477
                                                                        {
1478
                                                                                multiLine ml = Doc->MLineStyles[ite->NamedLStyle];
1479
                                                                                for (int it = ml.size()-1; it > -1; it--)
1480
                                                                                {
1481
                                                                                        SetFarbe(Doc, ml[it].Color, ml[it].Shade, &h, &s, &v, &k, gcr);
1482
                                                                                        PS_setcmykcolor_stroke(h / 255.0, s / 255.0, v / 255.0, k / 255.0);
1483
                                                                                        PS_setlinewidth(ml[it].Width);
1484
                                                                                        PS_setcapjoin(static_cast<Qt::PenCapStyle>(ml[it].LineEnd), static_cast<Qt::PenJoinStyle>(ml[it].LineJoin));
1485
                                                                                        PS_setdash(static_cast<Qt::PenStyle>(ml[it].Dash), 0, dum);
1486
                                                                                        SetClipPath(&ite->PoLine);
1487
                                                                                        PS_closepath();
1488
                                                                                        PS_stroke();
1489
                                                                                }
1490
                                                                        }
1491
                                                                }
1492
                                                                PS_restore();
1493
                                                        }
1494
                                                }
1495
                                        }
1496
                                        for (uint am = 0; am < Doc->Pages.at(a)->FromMaster.count(); ++am)
1497
                                        {
1498
                                                PageItem *ite = Doc->Pages.at(a)->FromMaster.at(am);
910 fschmid 1499
                                                if (!ite->isTableItem)
456 fschmid 1500
                                                        continue;
1501
                                                if (ite->isPrintable)
1502
                                                {
1503
                                                        PS_save();
1394 cbradney 1504
                                                        if (ite->lineColor() != "None")
456 fschmid 1505
                                                        {
1394 cbradney 1506
                                                                SetFarbe(Doc, ite->lineColor(), ite->lineShade(), &h, &s, &v, &k, gcr);
456 fschmid 1507
                                                                PS_setcmykcolor_stroke(h / 255.0, s / 255.0, v / 255.0, k / 255.0);
1508
                                                        }
1509
                                                        PS_setlinewidth(ite->Pwidth);
1510
                                                        PS_setcapjoin(ite->PLineEnd, ite->PLineJoin);
1511
                                                        PS_setdash(ite->PLineArt, ite->DashOffset, ite->DashValues);
2142 cbradney 1512
                                                        PS_translate(ite->Xpos - mPage->Xoffset, Doc->pageHeight - (ite->Ypos - mPage->Yoffset));
456 fschmid 1513
                                                        if (ite->Rot != 0)
1514
                                                                PS_rotate(-ite->Rot);
910 fschmid 1515
                                                        if ((ite->TopLine) || (ite->RightLine) || (ite->BottomLine) || (ite->LeftLine))
456 fschmid 1516
                                                        {
910 fschmid 1517
                                                                if (ite->TopLine)
456 fschmid 1518
                                                                {
910 fschmid 1519
                                                                        PS_moveto(0, 0);
1520
                                                                        PS_lineto(ite->Width, 0);
456 fschmid 1521
                                                                }
910 fschmid 1522
                                                                if (ite->RightLine)
1523
                                                                {
1524
                                                                        PS_moveto(ite->Width, 0);
1525
                                                                        PS_lineto(ite->Width, -ite->Height);
1526
                                                                }
1527
                                                                if (ite->BottomLine)
1528
                                                                {
1529
                                                                        PS_moveto(0, -ite->Height);
1530
                                                                        PS_lineto(ite->Width, -ite->Height);
1531
                                                                }
1532
                                                                if (ite->LeftLine)
1533
                                                                {
1534
                                                                        PS_moveto(0, 0);
1535
                                                                        PS_lineto(0, -ite->Height);
1536
                                                                }
1537
                                                                PS_stroke();
456 fschmid 1538
                                                        }
1539
                                                        PS_restore();
1540
                                                }
1541
                                        }
1542
                                        Lnr++;
1543
                                }
1544
                        }
1545
                }
1546
                ProcessPage(Doc, view, Doc->Pages.at(a), a+1, sep, farb, Ic, gcr);
1547
                PS_end_page();
1548
                if (sep)
1549
                {
1550
                        if (SepNam != QObject::tr("All"))
1551
                                aa++;
1552
                        else
1553
                        {
1554
                                if (sepac == 3)
1555
                                {
1556
                                        aa++;
1557
                                        sepac = 0;
1558
                                }
1559
                                else
1560
                                        sepac++;
1561
                        }
1562
                }
1563
                else
1564
                        aa++;
1565
        }
1566
        PS_close();
1567
}
1568
 
910 fschmid 1569
void PSLib::ProcessItem(ScribusDoc* Doc, Page* a, PageItem* c, uint PNr, bool sep, bool farb, bool ic, bool gcr, bool master)
456 fschmid 1570
{
1571
        int h, s, v, k, tsz;
910 fschmid 1572
        uint d;
1573
        double wideR;
1065 cbradney 1574
        struct ScText *hl;
456 fschmid 1575
        QValueList<double> dum;
1576
        dum.clear();
910 fschmid 1577
        QString tmps, chx;
1578
        if (c->isPrintable)
456 fschmid 1579
        {
910 fschmid 1580
                PS_save();
1394 cbradney 1581
                if (c->fillColor() != "None")
456 fschmid 1582
                {
1394 cbradney 1583
                        SetFarbe(Doc, c->fillColor(), c->fillShade(), &h, &s, &v, &k, gcr);
910 fschmid 1584
                        PS_setcmykcolor_fill(h / 255.0, s / 255.0, v / 255.0, k / 255.0);
1585
                }
1394 cbradney 1586
                if (c->lineColor() != "None")
910 fschmid 1587
                {
1394 cbradney 1588
                        SetFarbe(Doc, c->lineColor(), c->lineShade(), &h, &s, &v, &k, gcr);
910 fschmid 1589
                        PS_setcmykcolor_stroke(h / 255.0, s / 255.0, v / 255.0, k / 255.0);
1590
                }
1591
                PS_setlinewidth(c->Pwidth);
1592
                PS_setcapjoin(c->PLineEnd, c->PLineJoin);
1593
                PS_setdash(c->PLineArt, c->DashOffset, c->DashValues);
2142 cbradney 1594
                PS_translate(c->Xpos - a->Xoffset, Doc->pageHeight - (c->Ypos - a->Yoffset));
910 fschmid 1595
                if (c->Rot != 0)
1596
                        PS_rotate(-c->Rot);
1460 cbradney 1597
                switch (c->itemType())
910 fschmid 1598
                {
1460 cbradney 1599
                case PageItem::ImageFrame:
910 fschmid 1600
                        if (master)
1601
                                break;
1394 cbradney 1602
                        if ((c->fillColor() != "None") || (c->GrType != 0))
456 fschmid 1603
                        {
910 fschmid 1604
                                SetClipPath(&c->PoLine);
1605
                                PS_closepath();
1606
                                if ((c->GrType != 0) && (a->PageNam == ""))
1607
                                        HandleGradient(Doc, c, c->Width, c->Height, gcr);
1608
                                else
1609
                                        PS_fill();
1610
                                PS_newpath();
1611
                        }
1612
                        PS_save();
2040 fschmid 1613
                        if (c->imageClip.size() != 0)
1614
                                SetClipPath(&c->imageClip);
1615
                        else
1616
                                SetClipPath(&c->PoLine);
910 fschmid 1617
                        PS_closepath();
1618
                        PS_clip(true);
1392 cbradney 1619
                        if (c->imageFlippedH())
910 fschmid 1620
                        {
1621
                                PS_translate(c->Width, 0);
1622
                                PS_scale(-1, 1);
1623
                        }
1392 cbradney 1624
                        if (c->imageFlippedV())
910 fschmid 1625
                        {
1626
                                PS_translate(0, -c->Height);
1627
                                PS_scale(1, -1);
1628
                        }
1629
                        if ((c->PicAvail) && (c->Pfile != ""))
1630
                        {
1631
                                PS_translate(0, -c->BBoxH*c->LocalScY);
1632
                                if ((a->PageNam != "") && (!sep) && (farb))
2061 fschmid 1633
                                        PS_image(c, -c->BBoxX+c->LocalX, -c->LocalY, c->Pfile, c->LocalScX, c->LocalScY, c->IProfile, c->UseEmbedded, ic, c->itemName());
910 fschmid 1634
                                else
2061 fschmid 1635
                                        PS_image(c, -c->BBoxX+c->LocalX, -c->LocalY, c->Pfile, c->LocalScX, c->LocalScY, c->IProfile, c->UseEmbedded, ic);
910 fschmid 1636
                        }
1637
                        PS_restore();
1394 cbradney 1638
                        if (((c->lineColor() != "None") || (c->NamedLStyle != "")) && (!c->isTableItem))
910 fschmid 1639
                        {
1640
                                if ((c->NamedLStyle == "") && (c->Pwidth != 0.0))
1641
                                {
1394 cbradney 1642
                                        SetFarbe(Doc, c->lineColor(), c->lineShade(), &h, &s, &v, &k, gcr);
910 fschmid 1643
                                        PS_setcmykcolor_stroke(h / 255.0, s / 255.0, v / 255.0, k / 255.0);
1644
                                        PS_setlinewidth(c->Pwidth);
1645
                                        PS_setcapjoin(c->PLineEnd, c->PLineJoin);
1646
                                        PS_setdash(c->PLineArt, c->DashOffset, c->DashValues);
1647
                                        SetClipPath(&c->PoLine);
1648
                                        PS_closepath();
1649
                                        PS_stroke();
1650
                                }
1651
                                else
1652
                                {
1653
                                        multiLine ml = Doc->MLineStyles[c->NamedLStyle];
1654
                                        for (int it = ml.size()-1; it > -1; it--)
1655
                                        {
1656
                                                SetFarbe(Doc, ml[it].Color, ml[it].Shade, &h, &s, &v, &k, gcr);
1657
                                                PS_setcmykcolor_stroke(h / 255.0, s / 255.0, v / 255.0, k / 255.0);
1658
                                                PS_setlinewidth(ml[it].Width);
1659
                                                PS_setcapjoin(static_cast<Qt::PenCapStyle>(ml[it].LineEnd), static_cast<Qt::PenJoinStyle>(ml[it].LineJoin));
1660
                                                PS_setdash(static_cast<Qt::PenStyle>(ml[it].Dash), 0, dum);
1661
                                                SetClipPath(&c->PoLine);
1662
                                                PS_closepath();
1663
                                                PS_stroke();
1664
                                        }
1665
                                }
1666
                        }
1667
                        break;
1460 cbradney 1668
                case PageItem::TextFrame:
910 fschmid 1669
                        if (master)
1670
                                break;
1671
                        if (c->isBookmark)
1672
                        {
1673
                                QString bm = "";
1674
                                QString cc;
1065 cbradney 1675
                                for (d = 0; d < c->itemText.count(); ++d)
910 fschmid 1676
                                {
1065 cbradney 1677
                                        if ((c->itemText.at(d)->ch == QChar(13)) || (c->itemText.at(d)->ch == QChar(10)) || (c->itemText.at(d)->ch == QChar(28)))
910 fschmid 1678
                                                break;
1065 cbradney 1679
                                        bm += "\\"+cc.setNum(QMAX(c->itemText.at(d)->ch.at(0).unicode(), 32), 8);
910 fschmid 1680
                                }
1681
                                PDF_Bookmark(bm, a->PageNr+1);
1682
                        }
1683
                        if (c->isAnnotation)
1684
                        {
1685
                                QString bm = "";
1686
                                QString cc;
1065 cbradney 1687
                                for (d = 0; d < c->itemText.count(); ++d)
910 fschmid 1688
                                {
1065 cbradney 1689
                                        bm += "\\"+cc.setNum(QMAX(c->itemText.at(d)->ch.at(0).unicode(), 32), 8);
910 fschmid 1690
                                }
1691
                                PDF_Annotation(bm, 0, 0, c->Width, -c->Height);
1692
                                break;
1693
                        }
1394 cbradney 1694
                        if ((c->fillColor() != "None") || (c->GrType != 0))
910 fschmid 1695
                        {
1696
                                SetClipPath(&c->PoLine);
1697
                                PS_closepath();
1698
                                if ((c->GrType != 0) && (a->PageNam == ""))
1699
                                        HandleGradient(Doc, c, c->Width, c->Height, gcr);
1700
                                else
1701
                                        PS_fill();
1702
                        }
1392 cbradney 1703
                        if (c->imageFlippedH())
910 fschmid 1704
                        {
1705
                                PS_translate(c->Width, 0);
1706
                                PS_scale(-1, 1);
1707
                        }
1392 cbradney 1708
                        if (c->imageFlippedV())
910 fschmid 1709
                        {
1710
                                PS_translate(0, -c->Height);
1711
                                PS_scale(1, -1);
1712
                        }
1713
                        for (d = 0; d < c->MaxChars; ++d)
1714
                        {
1065 cbradney 1715
                                hl = c->itemText.at(d);
910 fschmid 1716
                                if ((hl->ch == QChar(13)) || (hl->ch == QChar(10)) || (hl->ch == QChar(9)) || (hl->ch == QChar(28)))
456 fschmid 1717
                                        continue;
2185 fschmid 1718
                                if (hl->cstyle & 4096)
456 fschmid 1719
                                        continue;
910 fschmid 1720
                                if (hl->yp == 0)
456 fschmid 1721
                                        continue;
910 fschmid 1722
                                tsz = hl->csize;
1723
                                chx = hl->ch;
1724
                                if (hl->ch == QChar(29))
1725
                                        chx = " ";
1726
                                if (hl->ch == QChar(0xA0))
1727
                                        chx = " ";
1728
                                if (hl->ch == QChar(30))
456 fschmid 1729
                                {
910 fschmid 1730
                                        if (Doc->MasterP)
1731
                                                chx = "#";
1732
                                        else
456 fschmid 1733
                                        {
910 fschmid 1734
                                                uint zae = 0;
1735
                                                uint za2 = d;
1736
                                                do
1737
                          &nbs