Subversion Repositories Scribus

Rev

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