Subversion Repositories Scribus

Rev

Rev 292 | Rev 297 | Go to most recent revision | 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
 
26
#if (_MSC_VER >= 1200)
27
 #include "win-config.h"
28
#else
29
 #include "config.h"
30
#endif
31
 
3 paul 32
#include "pslib.h"
33
#include "scfonts.h"
34
#include <cmath>
35
 
36
extern bool loadText(QString nam, QString *Buffer);
201 Franz 37
extern QImage LoadPict(QString fn, bool *gray = 0);
3 paul 38
extern QString CompressStr(QString *in);
39
extern QString ImageToCMYK_PS(QImage *im, int pl, bool pre);
40
extern QString MaskToTxt(QImage *im, bool PDF = true);
41
extern char *toHex( uchar u );
42
extern QString String2Hex(QString *in, bool lang = true);
43
#ifdef HAVE_CMS
44
extern bool CMSuse;
45
extern QImage LoadPictCol(QString fn, QString Prof, bool UseEmbedded, bool *realCMYK);
46
#endif
47
 
48
extern "C" void* Run(bool psart, SCFonts &AllFonts, QMap<QString,QFont> DocFonts, CListe DocColors, bool pdf);
49
 
50
void* Run(bool psart, SCFonts &AllFonts, QMap<QString,QFont> DocFonts, CListe DocColors, bool pdf)
51
{
52
        PSLib *dia = new PSLib(psart, AllFonts, DocFonts, DocColors, pdf);
53
        return dia;
54
}
55
 
56
PSLib::PSLib(bool psart, SCFonts &AllFonts, QMap<QString,QFont> DocFonts, CListe DocColors, bool pdf)
57
{
58
        QString tmp, tmp2, tmp3, tmp4, CHset;
59
        QStringList wt;
188 Franz 60
        QString Epfad = PREL;
3 paul 61
        Seiten = 0;
62
        User = "";
271 Franz 63
        Creator = "Scribus 1.2cvs";
3 paul 64
        Titel = "";
65
        FillColor = "0.0 0.0 0.0 0.0";
66
        StrokeColor = "0.0 0.0 0.0 0.0";
80 Franz 67
        Header = psart ? "%!PS-Adobe-3.0\n" : "%!PS-Adobe-3.0 EPSF-3.0\n";
3 paul 68
        BBox = "";
69
        BBoxH = "";
70
        Art = psart;
71
        isPDF = pdf;
72
        UsedFonts.clear();
73
        Fonts = "";
74
        FontDesc = "";
75
        GraySc = false;
76
        DoSep = false;
77
#ifdef HAVE_LIBZ
78
        CompAvail = true;
79
#else
80
        CompAvail = false;
81
#endif
82
        GrayCalc =  "/setcmykcolor {exch 0.11 mul add exch 0.59 mul add exch 0.3 mul add\n";
83
        GrayCalc += "               dup 1 gt {pop 1} if 1 exch sub oldsetgray} bind def\n";
84
        GrayCalc += "/setrgbcolor {0.11 mul exch 0.59 mul add exch 0.3 mul add\n";
85
        GrayCalc += "              oldsetgray} bind def\n";
86
        Farben = "%%CMYKCustomColor: ";
87
        FNamen = "%%DocumentCustomColors: ";
88
        CListe::Iterator itf;
89
        int c, m, y, k;
90
        bool erst = true;
91
        for (itf = DocColors.begin(); itf != DocColors.end(); ++itf)
188 Franz 92
        {
93
                if ((itf.key() != "Cyan") && (itf.key() != "Magenta") && (itf.key() != "Yellow") &&
94
                        (itf.key() != "Black"))
3 paul 95
                {
96
                        DocColors[itf.key()].getCMYK(&c, &m, &y, &k);
97
                        if (!erst)
188 Franz 98
                        {
3 paul 99
                                Farben += "%%+ ";
100
                                FNamen += "%%+ ";
188 Franz 101
                        }
102
                        Farben += ToStr(static_cast<double>(c) / 255) + " " +  
103
                                        ToStr(static_cast<double>(m) / 255) + " ";
104
                        Farben += ToStr(static_cast<double>(y) / 255) + " " +  
105
                                        ToStr(static_cast<double>(k) / 255) + " (" + itf.key() + ")\n";
3 paul 106
                        FNamen += "(" + itf.key() + ")\n";
107
                        erst = false;
108
                }
188 Franz 109
        }
3 paul 110
        QMap<QString,QFont>::Iterator it;
111
        int a = 0;
112
        for (it = DocFonts.begin(); it != DocFonts.end(); ++it)
188 Franz 113
        {
173 Franz 114
/* Subset all TTF Fonts until the bug in the TTF-Embedding Code is fixed */
115
                QFileInfo fd = QFileInfo(AllFonts[it.key()]->Datei);
116
                QString fext = fd.extension(false).lower();
117
 
118
                if ((fext == "ttf") || (AllFonts[it.key()]->isOTF) || (AllFonts[it.key()]->Subset))
188 Franz 119
                {
120
                        FontDesc += "/"+AllFonts[it.key()]->RealName()+
121
                                        " "+IToStr(AllFonts[it.key()]->RealGlyphs.count()+1)+" dict def\n";
68 Franz 122
                        FontDesc += AllFonts[it.key()]->RealName()+" begin\n";
123
                        QMap<uint,FPointArray>::Iterator ig;
188 Franz 124
                        for (ig = AllFonts[it.key()]->RealGlyphs.begin();
125
                                ig != AllFonts[it.key()]->RealGlyphs.end(); ++ig)
126
                        {
68 Franz 127
                                FontDesc += "/G"+IToStr(ig.key())+" { newpath\n";
128
                                FPoint np, np1, np2;
129
                                bool nPath = true;
130
                                if (ig.data().size() > 3)
188 Franz 131
                                {
132
                                        for (uint poi = 0; poi < ig.data().size()-3; poi += 4)
68 Franz 133
                                        {
188 Franz 134
                                                if (ig.data().point(poi).x() > 900000)
68 Franz 135
                                                {
136
                                                        FontDesc += "cl\n";
137
                                                        nPath = true;
138
                                                        continue;
188 Franz 139
                                                }
68 Franz 140
                                                if (nPath)
188 Franz 141
                                                {
68 Franz 142
                                                        np = ig.data().point(poi);
143
                                                        FontDesc += ToStr(np.x()) + " " + ToStr(-np.y()) + " m\n";
144
                                                        nPath = false;
188 Franz 145
                                                }
68 Franz 146
                                                np = ig.data().point(poi+1);
147
                                                np1 = ig.data().point(poi+3);
148
                                                np2 = ig.data().point(poi+2);
188 Franz 149
                                                FontDesc += ToStr(np.x()) + " " + ToStr(-np.y()) + " " +
150
                                                                ToStr(np1.x()) + " " + ToStr(-np1.y()) + " " +
151
                                                                ToStr(np2.x()) + " " + ToStr(-np2.y()) + " cu\n";
68 Franz 152
                                        }
188 Franz 153
                                }
68 Franz 154
                                FontDesc += "cl\n} bind def\n";
188 Franz 155
                        }
68 Franz 156
                        FontDesc += "end\n";
157
                        AllFonts[it.key()]->RealGlyphs.clear();
188 Franz 158
                }
68 Franz 159
                else
188 Franz 160
                {
68 Franz 161
                        UsedFonts.insert(it.key(), "/Fo"+IToStr(a));
3 paul 162
                        Fonts += "/Fo"+IToStr(a)+" /"+AllFonts[it.key()]->RealName()+" findfont definefont pop\n";
68 Franz 163
                        if (AllFonts[it.key()]->EmbedPS)
188 Franz 164
                        {
68 Franz 165
                                QString tmp;
166
                                if(AllFonts[it.key()]->EmbedFont(tmp))
188 Franz 167
                                {
68 Franz 168
                                        FontDesc += "%%BeginFont: " + AllFonts[it.key()]->RealName() + "\n";
169
                                        FontDesc += tmp + "\n%%EndFont\n";
3 paul 170
                                }
188 Franz 171
                        }
68 Franz 172
                        GListe gl;
173
                        AllFonts[it.key()]->GlNames(&gl);
174
                        GlyphsOfFont.insert(it.key(), gl);
175
                        a++;
3 paul 176
                }
188 Franz 177
        }
3 paul 178
        Prolog = "%%BeginProlog\n";
179
        Prolog += "/Scribusdict 100 dict def\n";
180
        Prolog += "Scribusdict begin\n";
181
        Prolog += "/sp {showpage} bind def\n";
182
        Prolog += "/oldsetgray /setgray load def\n";
183
        Prolog += "/cmyk {setcmykcolor} def\n";
184
        Prolog += "/m {moveto} bind def\n";
68 Franz 185
        Prolog += "/l {lineto} bind def\n";
3 paul 186
        Prolog += "/li {lineto} bind def\n";
68 Franz 187
        Prolog += "/cu {curveto} bind def\n";
3 paul 188
        Prolog += "/cl {closepath} bind def\n";
189
        Prolog += "/gs {gsave} bind def\n";
190
        Prolog += "/gr {grestore} bind def\n";
191
        Prolog += "/tr {translate} bind def\n";
192
        Prolog += "/ro {rotate} bind def\n";
193
        Prolog += "/sh {show} bind def\n";
194
        Prolog += "/shg {setcmykcolor moveto glyphshow} def\n";
195
        Prolog += "/sc {scale} bind def\n";
196
        Prolog += "/se {selectfont} bind def\n";
197
        Prolog += "/sf {setfont} bind def\n";
198
        Prolog += "/sw {setlinewidth} bind def\n";
199
        Prolog += "/f  {findfont} bind def\n";
200
        Prolog += "/fi {fill} bind def\n";
201
        Prolog += "/st {stroke} bind def\n";
122 Franz 202
        Prolog += "/shgf {gs dup scale begin cvx exec fill end gr} bind def\n";
68 Franz 203
        Prolog += "/shgs {gs dup 1 exch div currentlinewidth mul sw dup scale\n";
204
        Prolog += "       begin cvx exec st end gr} bind def\n";
3 paul 205
        Prolog += "/bEPS {\n";
206
        Prolog += "    /b4_Inc_state save def\n";
207
        Prolog += "    /dict_count countdictstack def\n";
208
        Prolog += "    /op_count count 1 sub def\n";
209
        Prolog += "    userdict begin\n";
210
        Prolog += "    /showpage { } def\n";
211
        Prolog += "    0 setgray 0 setlinecap\n";
212
        Prolog += "    1 setlinewidth 0 setlinejoin\n";
213
        Prolog += "    10 setmiterlimit [ ] 0 setdash newpath\n";
214
        Prolog += "    /languagelevel where\n";
215
        Prolog += "    {pop languagelevel\n";
216
        Prolog += "    1 ne\n";
217
        Prolog += "    {false setstrokeadjust false setoverprint\n";
218
        Prolog += "    } if } if } bind def\n";
219
        Prolog += "/eEPS { count op_count sub {pop} repeat\n";
220
        Prolog += "    countdictstack dict_count sub {end} repeat\n";
221
        Prolog += "    b4_Inc_state restore } bind def\n";
222
        Prolog += "    end\n";
223
        Prolog += "%%EndProlog\n";
224
}
225
 
226
void PSLib::PutSeite(QString c)
227
{
228
        QTextStream t(&Spool);
229
        t.writeRawBytes(c, c.length());
230
}
231
 
232
void PSLib::PutDoc(QString c)
233
{
234
        QTextStream t(&Spool);
235
        t.writeRawBytes(c, c.length());
236
}
237
 
80 Franz 238
QString PSLib::ToStr(double c)
3 paul 239
{
240
        QString cc;
241
        return cc.setNum(c);
242
}
243
 
244
QString PSLib::IToStr(int c)
245
{
246
        QString cc;
247
        return cc.setNum(c);
248
}
249
 
250
void PSLib::PS_set_Info(QString art, QString was)
251
{
252
        if (art == "Author")
253
                User = was;
254
        if (art == "Creator")
255
                Creator = was;
256
        if (art == "Title")
257
                Titel = was;
258
}
259
 
260
bool PSLib::PS_set_file(QString fn)
261
{
262
        Spool.setName(fn);
263
        return Spool.open(IO_WriteOnly);
264
}
265
 
80 Franz 266
void PSLib::PS_begin_doc(int Ori, double breite, double hoehe, int numpage)
3 paul 267
{
268
        PutDoc(Header);
269
        PutDoc("%%For: " + User + "\n");
270
        PutDoc("%%Title: " + Titel + "\n");
271
        PutDoc("%%Creator: " + Creator + "\n");
272
        PutDoc("%%Pages: " + IToStr(numpage) + "\n");
273
        BBox = "%%BoundingBox: 0 0 " + IToStr(qRound(breite)) + " " + IToStr(qRound(hoehe)) + "\n";
274
        BBoxH = "%%HiResBoundingBox: 0 0 " + ToStr(breite) + " " + ToStr(hoehe) + "\n";
188 Franz 275
        if (!Art)
276
        {
3 paul 277
                PutDoc(BBox);
278
                PutDoc(BBoxH);
188 Franz 279
        }
3 paul 280
        PutDoc(FNamen);
281
        PutDoc(Farben);
282
        PutDoc("%%LanguageLevel: 3\n");
283
        PutDoc("%%EndComments\n");
284
        PutDoc(Prolog);
285
        PutDoc("%%BeginSetup\n");
286
        PutDoc("/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse\n");
287
        if (FontDesc != "")
288
                PutDoc(FontDesc);
289
        PutDoc("Scribusdict begin\n");
290
        PutDoc(Fonts);
291
        if (GraySc)
292
                PutDoc(GrayCalc);
293
        PutDoc("%%EndSetup\n");
45 Franz 294
/*  if ((Art) && (Ori != 0))
3 paul 295
        {
296
                PutSeite("<< /PageSize [ "+ToStr(breite)+" "+ToStr(hoehe)+" ]\n");
297
                PutSeite("/Orientation 3\n");
298
                PutSeite(">> setpagedevice\n");
45 Franz 299
                }                    */
3 paul 300
        Prolog = "";
301
        FontDesc = "";
302
}
303
 
304
QString PSLib::PSEncode(QString in)
305
{
306
        QString tmp = "";
307
        QString cc;
308
        for (uint d = 0; d < in.length(); ++d)
188 Franz 309
        {
3 paul 310
                cc = in.at(d);
311
                if ((cc == "(") || (cc == ")") || (cc == "\\"))
312
                        tmp += "\\";
313
                tmp += cc;
188 Franz 314
        }
3 paul 315
        tmp = tmp.simplifyWhiteSpace().replace( QRegExp("\\s"), "" );
316
        return tmp;
317
}
318
 
80 Franz 319
void PSLib::PS_TemplateStart(QString Name, double breite, double hoehe)
3 paul 320
{
321
        PutDoc("/"+PSEncode(Name)+"\n<<\n");
322
        PutDoc("/FormType 1\n");
323
        PutDoc("/BBox [0 0 "+ToStr(breite)+" "+ToStr(hoehe)+"]\n");
324
        PutDoc("/Matrix [1 0 0 1 0 0]\n");
325
        PutDoc("/PaintProc\n{\n");
326
}
327
 
328
void PSLib::PS_UseTemplate(QString Name)
329
{
330
        PutDoc(PSEncode(Name)+" execform\n");
331
}
332
 
333
void PSLib::PS_TemplateEnd()
334
{
335
        PutDoc("pop } bind\n");
336
        PutDoc(">> def\n");
337
}
338
 
222 Franz 339
void PSLib::PS_begin_page(double breite, double hoehe, struct Margs* Ma, bool Clipping)
3 paul 340
{
222 Franz 341
        if (Clipping)
342
        {
343
                PDev = ToStr(Ma->Left) + " " + ToStr(Ma->Bottom) + " m\n";
344
                PDev += ToStr(breite - Ma->Right) + " " + ToStr(Ma->Bottom) + " li\n";
345
                PDev += ToStr(breite - Ma->Right) + " " + ToStr(hoehe - Ma->Top) + " li\n";
346
                PDev += ToStr(Ma->Left) + " " + ToStr(hoehe - Ma->Top) + " li cl clip newpath\n";
347
        }
3 paul 348
        Seiten++;
222 Franz 349
        PutSeite("%%Page: " + IToStr(Seiten) + " " + IToStr(Seiten) + "\nsave\n");
350
        if (Clipping)
351
                PutSeite(PDev);
188 Franz 352
        PutSeite("/DeviceCMYK setcolorspace\n");
3 paul 353
}
354
 
355
void PSLib::PS_end_page()
356
{
357
        PutSeite("%%PageTrailer\nrestore\nsp\n");
358
}
359
 
80 Franz 360
void PSLib::PS_curve(double x1, double y1, double x2, double y2, double x3, double y3)
3 paul 361
{
188 Franz 362
        PutSeite(ToStr(x1) + " " + ToStr(y1) + " " + ToStr(x2) + " " + ToStr(y2) + " " + ToStr(x3) + " " +
363
                        ToStr(y3) + " curveto\n");
3 paul 364
}
365
 
80 Franz 366
void PSLib::PS_moveto(double x, double y)
3 paul 367
{
368
        PutSeite(ToStr(x) + " " + ToStr(y) + " m\n");
369
}
370
 
80 Franz 371
void PSLib::PS_lineto(double x, double y)
3 paul 372
{
373
        PutSeite(ToStr(x) + " " + ToStr(y) + " li\n");
374
}
375
 
376
void PSLib::PS_closepath()
377
{
378
        PutSeite("cl\n");
379
}
380
 
80 Franz 381
void PSLib::PS_translate(double x, double y)
3 paul 382
{
383
        PutSeite(ToStr(x) + " " + ToStr(y) + " tr\n");
384
}
385
 
80 Franz 386
void PSLib::PS_scale(double x, double y)
3 paul 387
{
388
        PutSeite(ToStr(x) + " " + ToStr(y) + " sc\n");
389
}
390
 
80 Franz 391
void PSLib::PS_rotate(double x)
3 paul 392
{
393
        PutSeite(ToStr(x) + " ro\n");
394
}
395
 
396
void PSLib::PS_clip(bool mu)
397
{
80 Franz 398
        PutSeite( mu ? "eoclip newpath\n" : "clip newpath\n" );
3 paul 399
}
400
 
401
void PSLib::PS_save()
402
{
403
        PutSeite("gs\n");
404
}
405
 
406
void PSLib::PS_restore()
407
{
408
        PutSeite("gr\n");
409
}
410
 
80 Franz 411
void PSLib::PS_setcmykcolor_fill(double c, double m, double y, double k)
3 paul 412
{
413
        FillColor = ToStr(c) + " " + ToStr(m) + " " + ToStr(y) + " " + ToStr(k);
414
}
415
 
416
void PSLib::PS_setcmykcolor_dummy()
417
{
418
        PutSeite("0 0 0 0 cmyk\n");
419
}
420
 
80 Franz 421
void PSLib::PS_setcmykcolor_stroke(double c, double m, double y, double k)
3 paul 422
{
423
        StrokeColor = ToStr(c) + " " + ToStr(m) + " " + ToStr(y) + " " + ToStr(k);
424
}
425
 
80 Franz 426
void PSLib::PS_setlinewidth(double w)
3 paul 427
{
428
        PutSeite(ToStr(w) + " sw\n");
429
        LineW = w;
430
}
431
 
292 Franz 432
void PSLib::PS_setdash(Qt::PenStyle st, double offset, QValueList<double> dash)
3 paul 433
{
292 Franz 434
        QString Dt = ToStr(QMAX(2*LineW, 1));
435
        QString Da = ToStr(QMAX(6*LineW, 1));
436
        if (dash.count() != 0)
188 Franz 437
        {
292 Franz 438
                PutSeite("[ ");
439
                QValueList<double>::iterator it;
440
                for ( it = dash.begin(); it != dash.end(); ++it )
441
                {
442
                        PutSeite(IToStr(static_cast<int>(*it))+" ");
443
                }
444
                PutSeite("] "+IToStr(static_cast<int>(offset))+" setdash\n");
188 Franz 445
        }
292 Franz 446
        else
447
        {
448
                switch (st)
449
                {
450
                        case Qt::SolidLine:
451
                                PutSeite("[] 0 setdash\n");
452
                                break;
453
                        case Qt::DashLine:
454
                                PutSeite("["+Da+" "+Dt+"] 0 setdash\n");
455
                                break;
456
                        case Qt::DotLine:
457
                                PutSeite("["+Dt+"] 0 setdash\n");
458
                                break;
459
                        case Qt::DashDotLine:
460
                                PutSeite("["+Da+" "+Dt+" "+Dt+" "+Dt+"] 0 setdash\n");
461
                                break;
462
                        case Qt::DashDotDotLine:
463
                                PutSeite("["+Da+" "+Dt+" "+Dt+" "+Dt+" "+Dt+" "+Dt+"] 0 setdash\n");
464
                                break;
465
                        default:
466
                                PutSeite("[] 0 setdash\n");
467
                                break;
468
                }
469
        }
470
}
471
void PSLib::PS_setcapjoin(Qt::PenCapStyle ca, Qt::PenJoinStyle jo)
472
{
3 paul 473
        switch (ca)
474
                {
475
                case Qt::FlatCap:
476
                        PutSeite("0 setlinecap\n");
477
                        break;
478
                case Qt::SquareCap:
479
                        PutSeite("2 setlinecap\n");
480
                        break;
481
                case Qt::RoundCap:
482
                        PutSeite("1 setlinecap\n");
483
                        break;
484
                default:
485
                        PutSeite("0 setlinecap\n");
486
                        break;
487
                }
488
        switch (jo)
489
                {
490
                case Qt::MiterJoin:
491
                        PutSeite("0 setlinejoin\n");
492
                        break;
493
                case Qt::BevelJoin:
494
                        PutSeite("2 setlinejoin\n");
495
                        break;
496
                case Qt::RoundJoin:
497
                        PutSeite("1 setlinejoin\n");
498
                        break;
499
                default:
500
                        PutSeite("0 setlinejoin\n");
501
                        break;
502
                }
503
}
504
 
111 Franz 505
void PSLib::PS_selectfont(QString f, double s)
3 paul 506
{
111 Franz 507
        PutSeite(UsedFonts[f] + " " + ToStr(s) + " se\n");
3 paul 508
}
509
 
271 Franz 510
void PSLib::PS_fill()
3 paul 511
{
271 Franz 512
        PutSeite(FillColor + " cmyk eofill\n");
3 paul 513
}
514
 
515
void PSLib::PS_stroke()
516
{
517
        PutSeite(StrokeColor + " cmyk st\n");
518
}
519
 
271 Franz 520
void PSLib::PS_fill_stroke()
3 paul 521
{
522
        PS_save();
271 Franz 523
        PS_fill();
3 paul 524
        PS_restore();
525
        PS_stroke();
526
}
527
 
528
void PSLib::PS_newpath()
529
{
530
        PutSeite("newpath\n");
531
}
532
 
80 Franz 533
void PSLib::PS_GradientCol1(double c, double m, double y, double k)
3 paul 534
{
535
        GrColor1 = ToStr(c) + " " + ToStr(m) + " " + ToStr(y) + " " + ToStr(k);
536
}
537
 
80 Franz 538
void PSLib::PS_GradientCol2(double c, double m, double y, double k)
3 paul 539
{
540
        GrColor2 = ToStr(c) + " " + ToStr(m) + " " + ToStr(y) + " " + ToStr(k);
541
}
542
 
295 Franz 543
void PSLib::PS_MultiRadGradient(double w, double h, QValueList<double> Stops, QStringList Colors)
544
{
545
        double w2, h2;
546
        w2 = w / 2.0;
547
        h2 = h / 2.0;
548
        bool first = true;
549
        PutSeite( "clipsave\n" );
550
        PutSeite("eoclip\n");
551
        for (uint c = 0; c < Colors.count()-1; ++c)
552
        {
553
                PutSeite("<<\n");
554
                PutSeite("/ShadingType 3\n");
555
                PutSeite( DoSep ? "/ColorSpace /DeviceGray\n" : "/ColorSpace /DeviceCMYK\n" );
556
                PutSeite("/BBox [0 "+ToStr(h)+" "+ToStr(w)+" 0]\n");
557
                if (first)
558
                        PutSeite("/Extend [false true]\n");
559
                else
560
                {
561
                        if (c == Colors.count()-2)
562
                                PutSeite("/Extend [true false]\n");
563
                        else
564
                                PutSeite("/Extend [false false]\n");
565
                }
566
                PutSeite("/Coords ["+ToStr(w2)+" "+ToStr(h2)+" "+ToStr((*Stops.at(c+1)))+" "+ToStr(w2)+" "+ToStr(h2)+" "+ToStr((*Stops.at(c)))+"]\n");
567
                PutSeite("/Function\n");
568
                PutSeite("<<\n");
569
                PutSeite("/FunctionType 2\n");
570
                PutSeite("/Domain [0 1]\n");
571
                if (DoSep)
572
                {
573
                        int pla = Plate - 1 < 0 ? 3 : Plate - 1;
574
                        QStringList cols1 = QStringList::split(" ", Colors[c+1]);
575
                        QStringList cols2 = QStringList::split(" ", Colors[c]);
576
                        PutSeite("/C1 ["+ToStr(1-cols1[pla].toDouble())+"]\n");
577
                        PutSeite("/C0 ["+ToStr(1-cols2[pla].toDouble())+"]\n");
578
                }
579
                else
580
                {
581
                        PutSeite("/C0 ["+Colors[c+1]+"]\n");
582
                        PutSeite("/C1 ["+Colors[c]+"]\n");
583
                }
584
                PutSeite("/N 1\n");
585
                PutSeite(">>\n");
586
                PutSeite(">>\n");
587
                PutSeite("shfill\n");
588
                first = false;
589
        }
590
        PutSeite("cliprestore\n");
591
}
592
 
593
void PSLib::PS_MultiLinGradient(double w, double h, QValueList<double> Stops, QStringList Colors)
594
{
595
        bool first = true;
596
        PutSeite( "clipsave\n" );
597
        PutSeite("eoclip\n");
598
        for (uint c = 0; c < Colors.count()-1; ++c)
599
        {
600
                PutSeite("<<\n");
601
                PutSeite("/ShadingType 2\n");
602
                PutSeite( DoSep ? "/ColorSpace /DeviceGray\n" : "/ColorSpace /DeviceCMYK\n" );
603
                PutSeite("/BBox [0 "+ToStr(h)+" "+ToStr(w)+" 0]\n");
604
                if (first)
605
                        PutSeite("/Extend [true false]\n");
606
                else
607
                {
608
                        if (c == Colors.count()-2)
609
                                PutSeite("/Extend [false true]\n");
610
                        else
611
                                PutSeite("/Extend [false false]\n");
612
                }
613
                first = false;
614
                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");
615
                PutSeite("/Function\n");
616
                PutSeite("<<\n");
617
                PutSeite("/FunctionType 2\n");
618
                PutSeite("/Domain [0 1]\n");
619
                if (DoSep)
620
                {
621
                        int pla = Plate - 1 < 0 ? 3 : Plate - 1;
622
                        QStringList cols1 = QStringList::split(" ", Colors[c]);
623
                        QStringList cols2 = QStringList::split(" ", Colors[c+1]);
624
                        PutSeite("/C1 ["+ToStr(1-cols1[pla].toDouble())+"]\n");
625
                        PutSeite("/C0 ["+ToStr(1-cols2[pla].toDouble())+"]\n");
626
                }
627
                else
628
                {
629
                        PutSeite("/C0 ["+Colors[c]+"]\n");
630
                        PutSeite("/C1 ["+Colors[c+1]+"]\n");
631
                }
632
                PutSeite("/N 1\n");
633
                PutSeite(">>\n");
634
                PutSeite(">>\n");
635
                PutSeite("shfill\n");
636
        }
637
        PutSeite("cliprestore\n");
638
}
639
 
292 Franz 640
void PSLib::PS_LinGradient(double w, double h, double x1, double y1, double x2, double y2, int item, int grad)
3 paul 641
{
288 Franz 642
        PutSeite( "clipsave\n" );
271 Franz 643
        PutSeite("eoclip\n");
3 paul 644
        PutSeite("<<\n");
645
        PutSeite("/ShadingType 2\n");
80 Franz 646
        PutSeite( DoSep ? "/ColorSpace /DeviceGray\n" : "/ColorSpace /DeviceCMYK\n" );
295 Franz 647
        PutSeite("/Coords ["+ToStr(x1)+"  "+ToStr(y1)+" "+ToStr(x2)+" "+ToStr(y2)+"]\n");
3 paul 648
        PutSeite("/BBox [0 "+ToStr(h)+" "+ToStr(w)+" 0]\n");
292 Franz 649
        if (grad == 6)
650
                PutSeite("/Extend [true true]\n");
651
        else
652
                PutSeite("/Extend [false false]\n");
3 paul 653
        PutSeite("/Function\n");
654
        PutSeite("<<\n");
655
        PutSeite("/FunctionType 2\n");
656
        PutSeite("/Domain [0 1]\n");
657
        if (DoSep)
188 Franz 658
        {
111 Franz 659
                int pla = Plate - 1 < 0 ? 3 : Plate - 1;
3 paul 660
                QStringList cols1 = QStringList::split(" ", GrColor2);
661
                QStringList cols2 = QStringList::split(" ", GrColor1);
295 Franz 662
                PutSeite("/C1 ["+ToStr(1-cols1[pla].toDouble())+"]\n");
663
                PutSeite("/C0 ["+ToStr(1-cols2[pla].toDouble())+"]\n");
188 Franz 664
        }
3 paul 665
        else
188 Franz 666
        {
295 Franz 667
                PutSeite("/C0 ["+GrColor1+"]\n");
668
                PutSeite("/C1 ["+GrColor2+"]\n");
188 Franz 669
        }
3 paul 670
        PutSeite("/N 1\n");
671
        PutSeite(">>\n");
672
        PutSeite(">>\n");
288 Franz 673
        PutSeite("shfill\ncliprestore\n");
3 paul 674
}
675
 
271 Franz 676
void PSLib::PS_RadGradient(double w, double h, int item)
3 paul 677
{
80 Franz 678
        double w2, h2, rad;
3 paul 679
        w2 = w / 2.0;
680
        h2 = h / 2.0;
295 Franz 681
        rad = QMAX(w, fabs(h)) / 2.0;
288 Franz 682
        PutSeite( "clipsave\n" );
271 Franz 683
        PutSeite("eoclip\n");
3 paul 684
        PutSeite("<<\n");
685
        PutSeite("/ShadingType 3\n");
80 Franz 686
        PutSeite( DoSep ? "/ColorSpace /DeviceGray\n" : "/ColorSpace /DeviceCMYK\n" );
3 paul 687
        PutSeite("/Coords ["+ToStr(w2)+" "+ToStr(h2)+" 0 "+ToStr(w2)+" "+ToStr(h2)+" "+ToStr(rad)+"]\n");
688
        PutSeite("/BBox [0 "+ToStr(h)+" "+ToStr(w)+" 0]\n");
689
        PutSeite("/Extend [true true]\n");
690
        PutSeite("/Function\n");
691
        PutSeite("<<\n");
692
        PutSeite("/FunctionType 2\n");
693
        PutSeite("/Domain [0 1]\n");
694
        if (DoSep)
188 Franz 695
        {
111 Franz 696
                int pla = Plate - 1 < 0 ? 3 : Plate - 1;
295 Franz 697
                QStringList cols1 = QStringList::split(" ", GrColor1);
698
                QStringList cols2 = QStringList::split(" ", GrColor2);
80 Franz 699
                PutSeite("/C0 ["+ToStr(1-cols1[pla].toDouble())+"]\n");
700
                PutSeite("/C1 ["+ToStr(1-cols2[pla].toDouble())+"]\n");
188 Franz 701
        }
3 paul 702
        else
188 Franz 703
        {
295 Franz 704
                PutSeite("/C0 ["+GrColor1+"]\n");
705
                PutSeite("/C1 ["+GrColor2+"]\n");
188 Franz 706
        }
3 paul 707
        PutSeite("/N 1\n");
708
        PutSeite(">>\n");
709
        PutSeite(">>\n");
288 Franz 710
        PutSeite("shfill\ncliprestore\n");
3 paul 711
}
712
 
80 Franz 713
void PSLib::PS_show_xyG(QString font, QString ch, double x, double y)
3 paul 714
{
715
        QString Name;
716
        uint cc = ch[0].unicode();
80 Franz 717
        Name = GlyphsOfFont[font].contains(cc) ? GlyphsOfFont[font][cc] : QString(".notdef");
3 paul 718
        PutSeite("/"+Name+" "+ToStr(x)+" "+ToStr(y)+" "+StrokeColor+" shg\n");
719
}
720
 
80 Franz 721
void PSLib::PS_show(double x, double y)
3 paul 722
{
723
        PS_moveto(x, y);
724
        PutSeite("/hyphen glyphshow\n");
725
}
726
 
111 Franz 727
void PSLib::PS_showSub(uint chr, QString font, double size, bool stroke)
68 Franz 728
{
729
        PutSeite(FillColor + " cmyk (G"+IToStr(chr)+") "+font+" "+ToStr(size / 10.0)+" ");
80 Franz 730
        PutSeite(stroke ? "shgs\n" : "shgf\n");
68 Franz 731
}
732
 
20 Franz 733
void PSLib::PS_ImageData(bool inver, QString fn, QString Name, QString Prof, bool UseEmbedded, bool UseProf)
3 paul 734
{
735
        QString tmp;
736
        QFileInfo fi = QFileInfo(fn);
737
        QString ext = fi.extension(false).lower();
738
        if (ext == "eps")
188 Franz 739
        {
740
                if (loadText(fn, &tmp))
3 paul 741
                {
742
                        PutSeite("currentfile 1 (%ENDEPSDATA) /SubFileDecode filter /ReusableStreamDecode filter\n");
188 Franz 743
                        PutSeite("%%BeginDocument: " + fi.fileName() + "\n");
744
                        PutSeite(tmp+"\n");
745
                        PutSeite("%ENDEPSDATA\n");
746
                        PutSeite("%%EndDocument\n");
3 paul 747
                        PutSeite("/"+PSEncode(Name)+"Bild exch def\n");
188 Franz 748
                }
3 paul 749
                return;
188 Franz 750
        }
751
        QString ImgStr = "";
3 paul 752
        QImage image;
753
#ifdef HAVE_CMS
754
        QImage image2;
755
        bool cmy = false;
756
        if ((CMSuse) && (UseProf))
188 Franz 757
        {
3 paul 758
                image = LoadPict(fn);
759
                image = image.convertDepth(32);
760
                image2 = LoadPictCol(fn, Prof, UseEmbedded, &cmy);
20 Franz 761
                if (inver)
188 Franz 762
                {
20 Franz 763
                        image.invertPixels();
764
                        image2.invertPixels();
188 Franz 765
                }
3 paul 766
                ImgStr = ImageToCMYK_PS(&image2, -1, cmy);
188 Franz 767
        }
3 paul 768
        else
188 Franz 769
        {
3 paul 770
                image = LoadPict(fn);
20 Franz 771
                if (inver)
772
                        image.invertPixels();
3 paul 773
                ImgStr = ImageToCMYK_PS(&image, -1, false);
188 Franz 774
        }
3 paul 775
#else
776
        image = LoadPict(fn);
777
  image = image.convertDepth(32);
20 Franz 778
        if (inver)
779
                image.invertPixels();
3 paul 780
        ImgStr = ImageToCMYK_PS(&image, -1, false);
781
#endif
782
        if (CompAvail)
188 Franz 783
        {
3 paul 784
                PutSeite("currentfile /ASCIIHexDecode filter /FlateDecode filter /ReusableStreamDecode filter\n");
785
                ImgStr = CompressStr(&ImgStr);
188 Franz 786
        }
3 paul 787
        else
788
                PutSeite("currentfile /ASCIIHexDecode filter /ReusableStreamDecode filter\n");
789
        ImgStr = String2Hex(&ImgStr);
790
        PutSeite(ImgStr);
791
        PutSeite("\n>\n");
792
        PutSeite("/"+PSEncode(Name)+"Bild exch def\n");
793
        ImgStr = "";
794
  if (image.hasAlphaBuffer())
795
        {
796
                QImage iMask = image.createAlphaMask();
797
                ImgStr = MaskToTxt(&iMask, false);
798
                if (CompAvail)
188 Franz 799
                {
3 paul 800
                        PutSeite("currentfile /ASCIIHexDecode filter /FlateDecode filter /ReusableStreamDecode filter\n");
801
                        ImgStr = CompressStr(&ImgStr);
188 Franz 802
                }
3 paul 803
                else
804
                        PutSeite("currentfile /ASCIIHexDecode filter /ReusableStreamDecode filter\n");
805
                ImgStr = String2Hex(&ImgStr);
806
                PutSeite(ImgStr);
807
                PutSeite("\n>\n");
808
                PutSeite("/"+PSEncode(Name)+"Mask exch def\n");
188 Franz 809
        }
3 paul 810
}
811
 
80 Franz 812
void PSLib::PS_image(bool inver, double x, double y, QString fn, double scalex, double scaley, QString Prof, bool UseEmbedded, bool UseProf, QString Name)
3 paul 813
{
814
        QString tmp;
815
        QFileInfo fi = QFileInfo(fn);
816
        QString ext = fi.extension(false).lower();
817
        if (ext == "eps")
188 Franz 818
        {
819
                if (loadText(fn, &tmp))
3 paul 820
                {
188 Franz 821
                        PutSeite("bEPS\n");
822
                        PutSeite(ToStr(scalex) + " " + ToStr(scaley) + " sc\n");
823
                        PutSeite(ToStr(x) + " " + ToStr(y) + " tr\n");
824
                        if (Name != "")
3 paul 825
                        {
188 Franz 826
                                PutSeite(PSEncode(Name)+"Bild cvx exec\n");
827
                                PutSeite(PSEncode(Name)+"Bild resetfile\n");
3 paul 828
                        }
188 Franz 829
                        else
830
                        {
831
                                PutSeite("%%BeginDocument: " + fi.fileName() + "\n");
832
                                PutSeite(tmp+"\n");
833
                                PutSeite("%%EndDocument\n");
834
                        }
835
                        PutSeite("eEPS\n");
3 paul 836
                }
188 Franz 837
        }
3 paul 838
        else
188 Franz 839
        {
840
                QString ImgStr = "";
3 paul 841
                QImage image;
842
#ifdef HAVE_CMS
843
                QImage image2;
844
                bool cmy = false;
188 Franz 845
                image = LoadPict(fn);
111 Franz 846
                image = image.convertDepth(32);
188 Franz 847
                if ((CMSuse) && (UseProf))
3 paul 848
                        image2 = LoadPictCol(fn, Prof, UseEmbedded, &cmy);
20 Franz 849
                if (inver)
188 Franz 850
                {
20 Franz 851
                        image.invertPixels();
852
                        image2.invertPixels();
188 Franz 853
                }
3 paul 854
#else
855
                image = LoadPict(fn);
188 Franz 856
                image = image.convertDepth(32);
20 Franz 857
                if (inver)
858
                        image.invertPixels();
3 paul 859
#endif
860
                int w = image.width();
861
                int h = image.height();
188 Franz 862
                PutSeite(ToStr(x*scalex) + " " + ToStr(y*scaley) + " tr\n");
863
                PutSeite(ToStr(scalex*w) + " " + ToStr(scaley*h) + " sc\n");
864
                PutSeite(((!DoSep) && (!GraySc)) ? "/DeviceCMYK setcolorspace\n" : "/DeviceGray setcolorspace\n");
865
                if (image.hasAlphaBuffer())
866
                {
3 paul 867
                        QImage iMask = image.createAlphaMask();
868
#ifdef HAVE_CMS
869
                        if ((CMSuse) && (UseProf))
188 Franz 870
                        {
3 paul 871
                                if (DoSep)
872
                                        ImgStr = ImageToCMYK_PS(&image2, Plate, cmy);
873
                                else
188 Franz 874
                                        ImgStr = GraySc ? ImageToCMYK_PS(&image2, -2, cmy) :
875
                                                                ImageToCMYK_PS(&image2, -1, cmy);
876
                        }
3 paul 877
                        else
188 Franz 878
                        {
3 paul 879
                                if (DoSep)
880
                                        ImgStr = ImageToCMYK_PS(&image, Plate, false);
881
                                else
188 Franz 882
                                        ImgStr = GraySc ? ImageToCMYK_PS(&image, -2, false) :
883
                                                                ImageToCMYK_PS(&image, -1, false);
884
                        }
3 paul 885
#else
886
                        if (DoSep)
887
                                ImgStr = ImageToCMYK_PS(&image, Plate, false);
888
                        else
188 Franz 889
                                ImgStr = GraySc ? ImageToCMYK_PS(&image, -2, false) : ImageToCMYK_PS(&image, -1,
890
                                                                                                        false);
3 paul 891
#endif
892
                        if (Name == "")
188 Franz 893
                        {
894
                                if (CompAvail)
3 paul 895
                                {
896
                                        PutSeite("currentfile /ASCIIHexDecode filter /FlateDecode filter /ReusableStreamDecode filter\n");
897
                                        ImgStr = CompressStr(&ImgStr);
188 Franz 898
                                }
3 paul 899
                                else
900
                                        PutSeite("currentfile /ASCIIHexDecode filter /ReusableStreamDecode filter\n");
901
                                ImgStr = String2Hex(&ImgStr);
902
                                PutSeite(ImgStr);
903
                                ImgStr = "";
904
                                PutSeite("\n>\n");
905
                                PutSeite("/Bild exch def\n");
906
                                ImgStr = MaskToTxt(&iMask, false);
907
                                if (CompAvail)
188 Franz 908
                                {
3 paul 909
                                        PutSeite("currentfile /ASCIIHexDecode filter /FlateDecode filter /ReusableStreamDecode filter\n");
910
                                        ImgStr = CompressStr(&ImgStr);
188 Franz 911
                                }
3 paul 912
                                else
913
                                        PutSeite("currentfile /ASCIIHexDecode filter /ReusableStreamDecode filter\n");
914
                                ImgStr = String2Hex(&ImgStr);
915
                                PutSeite(ImgStr);
916
                                PutSeite("\n>\n");
917
                                PutSeite("/Mask exch def\n");
188 Franz 918
                        }
3 paul 919
                        PutSeite("<<\n");
920
                        PutSeite("  /PaintType   1\n");
921
                        PutSeite("  /PatternType 1\n");
922
                        PutSeite("  /TilingType  3\n");
923
                        PutSeite("  /BBox        [ 0 0 1 1 ]\n");
924
                        PutSeite("  /XStep       2\n");
925
                        PutSeite("  /YStep       2\n");
926
                        PutSeite("  /PaintProc   {\n");
927
                        PutSeite("   pop\n");
928
                        PutSeite("   1 1 1 1 setcmykcolor\n");
929
                        PutSeite("   <<\n");
930
                        PutSeite("   /ImageType 1\n");
931
                        PutSeite("   /Height    " + IToStr(h) + "\n");
932
                        PutSeite("   /Width     " + IToStr(w) + "\n");
188 Franz 933
                        PutSeite("   /ImageMatrix [" + IToStr(w) + " 0 0 " + IToStr(-h) + " 0 " + IToStr(h)
934
                                +"]\n");
3 paul 935
                        if (DoSep)
936
                                PutSeite("   /Decode [1 0]\n");
937
                        else
80 Franz 938
                                PutSeite( GraySc ? "   /Decode [1 0]\n" : "   /Decode [0 1 0 1 0 1 0 1]\n" );
3 paul 939
                        PutSeite("   /BitsPerComponent 8\n");
940
                        PutSeite("   /DataSource "+PSEncode(Name)+"Bild\n");
941
                        PutSeite("   >>\n");
942
                        PutSeite("   image\n");
943
                        PutSeite("   }\n");
944
                        PutSeite(">> matrix makepattern setpattern\n");
80 Franz 945
                        PutSeite("<< /ImageType 1\n");
3 paul 946
                        PutSeite("   /Width " + IToStr(w) + "\n");
947
                        PutSeite("   /Height " + IToStr(h) + "\n");
948
                        PutSeite("   /BitsPerComponent 1\n");
949
                        PutSeite("   /Decode [1 0]\n");
234 Franz 950
                        PutSeite("   /ImageMatrix [" + IToStr(w) + " 0 0 " + IToStr(-h) + " 0 " + IToStr(h) + "]\n");
3 paul 951
                        PutSeite("   /DataSource "+PSEncode(Name)+"Mask\n");
952
                        PutSeite(">>\n");
953
                        PutSeite("imagemask\n");
954
                        if (Name != "")
188 Franz 955
                        {
3 paul 956
                                PutSeite(PSEncode(Name)+"Bild resetfile\n");
957
                                PutSeite(PSEncode(Name)+"Mask resetfile\n");
958
                        }
188 Franz 959
                }
3 paul 960
                else
188 Franz 961
                {
80 Franz 962
                        PutSeite("<< /ImageType 1\n");
3 paul 963
                        PutSeite("   /Width " + IToStr(w) + "\n");
964
                        PutSeite("   /Height " + IToStr(h) + "\n");
965
                        PutSeite("   /BitsPerComponent 8\n");
966
                        if (DoSep)
967
                                PutSeite("   /Decode [1 0]\n");
968
                        else
80 Franz 969
                                PutSeite( GraySc ? "   /Decode [1 0]\n" : "   /Decode [0 1 0 1 0 1 0 1]\n");
188 Franz 970
                        PutSeite("   /ImageMatrix [" + IToStr(w) + " 0 0 " + IToStr(-h) + " 0 " + IToStr(h) +
971
                                        "]\n");
3 paul 972
                        if (Name != "")
188 Franz 973
                        {
3 paul 974
                                PutSeite("   /DataSource "+PSEncode(Name)+"Bild >>\n");
975
                                PutSeite("image\n");
976
                                PutSeite(PSEncode(Name)+"Bild resetfile\n");
188 Franz 977
                        }
3 paul 978
                        else
234 Franz 979
                        {
80 Franz 980
                                PutSeite ( CompAvail ? "   /DataSource currentfile /ASCIIHexDecode filter /FlateDecode filter >>\n" :
188 Franz 981
                                                        "   /DataSource currentfile /ASCIIHexDecode filter >>\n");
3 paul 982
                                PutSeite("image\n");
983
#ifdef HAVE_CMS
984
                                if ((CMSuse) && (UseProf))
188 Franz 985
                                {
3 paul 986
                                        if (DoSep)
987
                                                ImgStr = ImageToCMYK_PS(&image2, Plate, cmy);
988
                                        else
188 Franz 989
                                                ImgStr = GraySc ? ImageToCMYK_PS(&image2, -2, cmy) :
990
                                                                        ImageToCMYK_PS(&image2, -1, cmy);
991
                                }
3 paul 992
                                else
188 Franz 993
                                {
3 paul 994
                                        if (DoSep)
995
                                                ImgStr = ImageToCMYK_PS(&image, Plate, false);
996
                                        else
188 Franz 997
                                                ImgStr = GraySc ? ImageToCMYK_PS(&image, -2, false) :
998
                                                                        ImageToCMYK_PS(&image, -1, false);
999
                                }
3 paul 1000
#else
1001
                                if (DoSep)
1002
                                        ImgStr = ImageToCMYK_PS(&image, Plate, false);
1003
                                else
188 Franz 1004
                                        ImgStr = GraySc ? ImageToCMYK_PS(&image, -2, false) :          
1005
                                                                ImageToCMYK_PS(&image, -1, false);
3 paul 1006
#endif
1007
                                if (CompAvail)
1008
                                        ImgStr = CompressStr(&ImgStr);
1009
                                ImgStr = String2Hex(&ImgStr);
1010
                                PutSeite(ImgStr);
1011
                                PutSeite("\n>\n");
1012
                        }
188 Franz 1013
                }
234 Franz 1014
        }
3 paul 1015
}
1016
 
80 Franz 1017
 
3 paul 1018
void PSLib::PS_plate(int nr)
1019
{
1020
        switch (nr)
188 Franz 1021
        {
3 paul 1022
                case 0:
1023
                        PutSeite("%%PlateColor Black\n");
1024
                        PutSeite("/setcmykcolor {exch pop exch pop exch pop 1 exch sub oldsetgray} bind def\n");
1025
                        PutSeite("/setrgbcolor {pop pop pop 1 oldsetgray} bind def\n");
1026
                        break;
1027
                case 1:
1028
                        PutSeite("%%PlateColor Cyan\n");
1029
                        PutSeite("/setcmykcolor {pop pop pop 1 exch sub oldsetgray} bind def\n");
1030
                        PutSeite("/setrgbcolor {pop pop oldsetgray} bind def\n");
1031
                        break;
1032
                case 2:
1033
                        PutSeite("%%PlateColor Magenta\n");
1034
                        PutSeite("/setcmykcolor {pop pop exch pop 1 exch sub oldsetgray} bind def\n");
1035
                        PutSeite("/setrgbcolor {pop exch pop oldsetgray} bind def\n");
1036
                        break;
1037
                case 3:
1038
                        PutSeite("%%PlateColor Yellow\n");
1039
                        PutSeite("/setcmykcolor {pop exch pop exch pop 1 exch sub oldsetgray} bind def\n");
1040
                        PutSeite("/setrgbcolor {exch pop exch pop oldsetgray} bind def\n");
1041
                        break;
188 Franz 1042
        }
3 paul 1043
        Plate = nr;
1044
        DoSep = true;
1045
}
1046
 
1047
void PSLib::PS_setGray()
1048
{
1049
        GraySc = true;
1050
}
1051
 
1052
void PSLib::PDF_Bookmark(QString text, uint Seite)
1053
{
1054
        PutSeite("[/Title ("+text+") /Page "+IToStr(Seite)+" /View [/Fit]\n");
1055
        PutSeite("/OUT pdfmark\n");
1056
        isPDF = true;
1057
}
1058
 
80 Franz 1059
void PSLib::PDF_Annotation(QString text, double x, double y, double b, double h)
3 paul 1060
{
188 Franz 1061
        PutSeite("[ /Rect [ "+ToStr(static_cast<int>(x))+" "+ToStr(static_cast<int>(y))
1062
                        +" "+ToStr(static_cast<int>(b))+" "+ToStr(static_cast<int>(h))+" ]\n");
3 paul 1063
        PutSeite("  /Contents ("+text+")\n  /Open false\n");
1064
        PutSeite("/ANN pdfmark\n");
1065
        isPDF = true;
1066
}
1067
 
1068
 
1069
void PSLib::PS_close()
1070
{
1071
        PutDoc("%%Trailer\n");
1072
        PutDoc("end\n");
1073
        PutDoc("%%EOF\n");
1074
        Spool.close();
1075
}
68 Franz 1076
 
1077
 
1078
void PSLib::PS_insert(QString i)
1079
{
1080
        PutDoc(i);
1081
}