Subversion Repositories Scribus

Rev

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