Subversion Repositories Scribus

Rev

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