Subversion Repositories Scribus

Rev

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